[Pkg-cli-libs-commits] [SCM] nunit branch, upstream, updated. upstream/2.4.7+dfsg-1-g5c750c1

Julian Taylor jtaylor.debian at googlemail.com
Mon Jun 13 18:18:27 UTC 2011


The following commit has been merged in the upstream branch:
commit 5c750c14e23d5c9ba0442b4a683c19a5957ef1df
Author: Julian Taylor <jtaylor.debian at googlemail.com>
Date:   Mon Jun 13 14:43:59 2011 +0200

    Imported Upstream version 2.5.10.11092+dfsg

diff --git a/src/NUnitFitTests.html b/NUnitFitTests.html
similarity index 100%
rename from src/NUnitFitTests.html
rename to NUnitFitTests.html
diff --git a/NUnitTests.config b/NUnitTests.config
new file mode 100644
index 0000000..9487c07
--- /dev/null
+++ b/NUnitTests.config
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+<!--
+	 This is the configuration file for the NUnitTests.nunit test project. You may
+	 need to create a similar configuration file for your own test project. 
+ -->	 
+
+<!--
+	 The <NUnit> section is only needed if you want to use a non-default value
+	 for any of the settings. It is commented out below. If you are going to use
+   it, you must deifne the NUnit section group and the sections you need.
+ 
+   The syntax shown here works for most runtimes. If NUnit fails at startup, you
+   can try specifying the name of the assembly containing the NameValueSectionHandler:
+   
+      <section name="TestCaseBuilder" type="System.Configuration.NameValueSectionHandler, System" />
+      
+   If that fails, try the fully qualified name of the assembly:
+   
+      <section name="TestCaseBuilder" type="System.Configuration.NameValueSectionHandler, System, 
+             Version=2.0.50727.832, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+             
+   Unfortunately, this last approach makes your config file non-portable across runtimes.
+   -->
+
+<!--
+  <configSections>
+		<sectionGroup name="NUnit">
+			<section name="TestCaseBuilder" type="System.Configuration.NameValueSectionHandler"/>
+			<section name="TestRunner" type="System.Configuration.NameValueSectionHandler"/>
+		</sectionGroup>
+	</configSections>
+ -->
+
+  <appSettings>
+		<!--   User application and configured property settings go here.-->
+		<!--   Example: <add key="settingName" value="settingValue"/> -->
+		<add key="test.setting" value="54321" />
+	</appSettings>
+
+<!-- Sample NUnit section group showing all default values -->
+<!--
+	<NUnit>
+		<TestCaseBuilder>
+			<add key="OldStyleTestCases" value="false" />
+		</TestCaseBuilder>
+		<TestRunner>
+			<add key="ApartmentState" value="MTA" />
+			<add key="ThreadPriority" value="Normal" />
+      <add key="DefaultLogThreshold" value="Info" />
+		</TestRunner>
+	</NUnit>
+-->
+  
+   <!--
+    The following <runtime> section allows running nunit tests under 
+    .NET 1.0 by redirecting assemblies. The appliesTo attribute
+    causes the section to be ignored except under .NET 1.0.
+   --> 
+	<runtime>
+		<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
+				appliesTo="v1.0.3705">
+			<dependentAssembly>
+				<assemblyIdentity name="System" publicKeyToken="b77a5c561934e089" culture="" />
+				<bindingRedirect oldVersion="1.0.5000.0" newVersion="1.0.3300.0" />
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="System.Data" publicKeyToken="b77a5c561934e089" culture="" />
+				<bindingRedirect oldVersion="1.0.5000.0" newVersion="1.0.3300.0" />
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="System.Drawing" publicKeyToken="b03f5f7f11d50a3a" culture="" />
+				<bindingRedirect oldVersion="1.0.5000.0" newVersion="1.0.3300.0" />
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="System.Windows.Forms" publicKeyToken="b77a5c561934e089" culture="" />
+				<bindingRedirect oldVersion="1.0.5000.0" newVersion="1.0.3300.0" />
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="System.Xml" publicKeyToken="b77a5c561934e089" culture="" />
+				<bindingRedirect oldVersion="1.0.5000.0" newVersion="1.0.3300.0" />
+			</dependentAssembly>
+		</assemblyBinding>
+	</runtime>
+</configuration> 
diff --git a/NUnitTests.nunit b/NUnitTests.nunit
new file mode 100644
index 0000000..8fd6a03
--- /dev/null
+++ b/NUnitTests.nunit
@@ -0,0 +1,25 @@
+<NUnitProject>
+  <Settings activeconfig="Debug" autoconfig="true" />
+  <Config name="Debug" binpath="bin/Debug/lib;bin/Debug/tests;bin/Debug/framework" runtimeFramework="v2.0.50727">
+    <assembly path="bin/Debug/tests/nunit.framework.tests.dll" />
+    <assembly path="bin/Debug/tests/nunit.core.tests.dll" />
+    <assembly path="bin/Debug/tests/nunit.util.tests.dll" />
+    <assembly path="bin/Debug/tests/nunit.mocks.tests.dll" />
+    <assembly path="bin/Debug/tests/nunit-console.tests.dll" />
+    <assembly path="bin/Debug/tests/nunit.uikit.tests.dll" />
+    <assembly path="bin/Debug/tests/nunit.uiexception.tests.dll" />
+    <assembly path="bin/Debug/tests/nunit-gui.tests.dll" />
+    <assembly path="bin/Debug/tests/nunit.fixtures.tests.dll" />
+  </Config>
+  <Config name="Release" binpath="bin/Release/lib;bin/Release/tests;bin/Release/framework">
+    <assembly path="bin/Release/tests/nunit.framework.tests.dll" />
+    <assembly path="bin/Release/tests/nunit.core.tests.dll" />
+    <assembly path="bin/Release/tests/nunit.util.tests.dll" />
+    <assembly path="bin/Release/tests/nunit.mocks.tests.dll" />
+    <assembly path="bin/Release/tests/nunit-console.tests.dll" />
+    <assembly path="bin/Release/tests/nunit.uikit.tests.dll" />
+    <assembly path="bin/Release/tests/nunit.uiexception.tests.dll" />
+    <assembly path="bin/Release/tests/nunit-gui.tests.dll" />
+    <assembly path="bin/Release/tests/nunit.fixtures.tests.dll" />
+  </Config>
+</NUnitProject>
\ No newline at end of file
diff --git a/NUnitTests.v1.nunit b/NUnitTests.v1.nunit
new file mode 100644
index 0000000..786cf23
--- /dev/null
+++ b/NUnitTests.v1.nunit
@@ -0,0 +1,11 @@
+<NUnitProject>
+  <Settings appbase="."/>
+  <Config name="Default" binpath="lib;tests;framework">
+    <assembly path="tests/nunit.framework.tests.dll" />
+    <assembly path="tests/nunit.core.tests.dll" />
+    <assembly path="tests/nunit.util.tests.dll" />
+    <assembly path="tests/nunit.mocks.tests.dll" />
+    <assembly path="tests/nunit-console.tests.dll" />
+    <assembly path="tests/nunit.fixtures.tests.dll" />
+  </Config>
+</NUnitProject>
diff --git a/NUnitTests.v2.nunit b/NUnitTests.v2.nunit
new file mode 100644
index 0000000..5875026
--- /dev/null
+++ b/NUnitTests.v2.nunit
@@ -0,0 +1,14 @@
+<NUnitProject>
+  <Settings appbase="."/>
+  <Config name="Default" binpath="lib;tests;framework" runtimeFramework="v${runtime.version}">
+    <assembly path="tests/nunit.framework.tests.dll" />
+    <assembly path="tests/nunit.core.tests.dll" />
+    <assembly path="tests/nunit.util.tests.dll" />
+    <assembly path="tests/nunit.mocks.tests.dll" />
+    <assembly path="tests/nunit-console.tests.dll" />
+    <assembly path="tests/nunit.uiexception.tests.dll" />
+    <assembly path="tests/nunit.uikit.tests.dll" />
+    <assembly path="tests/nunit-gui.tests.dll" />
+    <assembly path="tests/nunit.fixtures.tests.dll" />
+  </Config>
+</NUnitProject>
diff --git a/doc/addinsDialog.html b/doc/addinsDialog.html
index bbdaa76..67634dc 100644
--- a/doc/addinsDialog.html
+++ b/doc/addinsDialog.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -29,44 +29,80 @@
 <p>The Addins Dialog is displayed using the Tools | Addins menu item on the main
 menu. It lists all addins that have been found and loaded by NUnit.</p>
 
-<div class="screenshot-left">
+<div class="screenshot-right">
    <img src="img/addinsDialog.jpg"></div>
 
+<h3>Addin</h3>
+
+<p>This column lists the name of the addin, as defined by its author.
+
+<h3>Status</h3>
+
+<p>This column shows the status of each addin. Possible values are
+<ul>
+<li>Unknown
+<li>Enabled
+<li>Disabled
+<li>Loaded
+<li>Error
+</ul>
+
+<h3>Description</h3>
+
+<p>If the author of an addin has provided a description, it is
+shown here when the addin is selected.
+
+<h3>Message</h3>
+
+<p>If the addin failed to load, its status will be shown as Error
+and any error message displayed here when that addin is selected.
+
 </div>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<ul>
-<li><a href="guiCommandLine.html">Command-Line</a></li>
-<li><a href="mainMenu.html">Main Menu</a></li>
-<li><a href="contextMenu.html">Context Menu</a></li>
-<li><a href="optionsDialog.html">Options Dialog</a></li>
-<li id="current"><a href="addinsDialog.html">Addins Dialog</a></li>
-<li><a href="testProperties.html">Test Properties</a></li>
-<li><a href="configEditor.html">Configuration Editor</a></li>
-<li><a href="projectEditor.html">Project Editor</a></li>
-</ul>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<ul>
+<li><a href="nunit-console.html">Console Runner</a></li>
+<li><a href="nunit-gui.html">Gui Runner</a></li>
+<ul>
+<li><a href="guiCommandLine.html">Command-Line</a></li>
+<li><a href="mainMenu.html">Main Menu</a></li>
+<li><a href="contextMenu.html">Context Menu</a></li>
+<li><a href="settingsDialog.html">Settings Dialog</a></li>
+<li id="current"><a href="addinsDialog.html">Addins Dialog</a></li>
+<li><a href="testProperties.html">Test Properties</a></li>
+<li><a href="configEditor.html">Configuration Editor</a></li>
+<li><a href="projectEditor.html">Project Editor</a></li>
+</ul>
+<li><a href="pnunit.html">PNUnit Runner</a></li>
+<li><a href="nunit-agent.html">NUnit Agent</a></li>
+<li><a href="runtimeSelection.html">Runtime Selection</a></li>
+<li><a href="assemblyIsolation.html">Assembly Isolation</a></li>
+<li><a href="configFiles.html">Configuration Files</a></li>
+<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/assemblyIsolation.html b/doc/assemblyIsolation.html
new file mode 100644
index 0000000..7516370
--- /dev/null
+++ b/doc/assemblyIsolation.html
@@ -0,0 +1,112 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - AssemblyIsolation</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>Assembly Isolation</h3>
+
+<p>NUnit isolates test assemblies from its own code and from one another
+   by use of separate AppDomains and/or Processes.
+   
+<p>By default, NUnit loads a test assembly into a separate <b>AppDomain</b>, 
+   while its own code runs in the primary <b>AppDomain</b>.
+   
+<p>When multiple assemblies are run at the same time, NUnit loads them differently 
+   depending on how they were specified. For assemblies that are part of an
+   NUnit project, then a single <b>AppDomain</b> is used. If the assemblies 
+   were specified on the console runner command line, then a separate 
+   <b>AppDomain</b> is used for each of them.
+   
+<p>If greater separation is desired, test assemblies may be loaded into
+   a separate <b>Process</b> or into multiple processes. This is done
+   automatically by NUnit in the case where the tests are to be run under
+   a different runtime from the one that NUnit is currently using. Tests
+   running in a separate process are executed under the control of the
+   <a href="nunit-agent.html">nunit-agent</a> program.
+   
+<h3>Controlling Isolation</h3>
+
+<p>Beyond the NUnit default behavior, the user may control the level of isolation
+   through the command line or through NUnit's general settings. Process and AppDomain
+   isolation may also be specified as part of the settings of an NUnit project.
+   
+<h4>Command Line</h4>
+
+<p>Assembly Isolation may be specified on the console runner commandline using
+   the <b>/process</b> and <b>/domain</b> options. See 
+   <a href="consoleCommandLine.html">NUnit-Console Command Line Options</a>   for more information.
+   
+<h4>General Settings</h4>
+
+<p>The built-in NUnit defaults may be overridden using the <b>Assembly Isolation</b>
+   panel of the NUnit <b>Settings Dialog</b>. Settings made here are saved and become
+   the new default values for all executions of NUnit until changed. For more info,
+   see the <a href="settingsDialog.html">Settings Dialog</a> page.
+
+<h4>Project Settings</h4>
+
+<p>Isolation settings may be specified for an individual NUnit project using the
+   <a href="projectEditor.html">Project Editor</a>.
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<ul>
+<li><a href="nunit-console.html">Console Runner</a></li>
+<li><a href="nunit-gui.html">Gui Runner</a></li>
+<li><a href="pnunit.html">PNUnit Runner</a></li>
+<li><a href="nunit-agent.html">NUnit Agent</a></li>
+<li><a href="runtimeSelection.html">Runtime Selection</a></li>
+<li id="current"><a href="assemblyIsolation.html">Assembly Isolation</a></li>
+<li><a href="configFiles.html">Configuration Files</a></li>
+<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/assertions.html b/doc/assertions.html
index eed9c0b..b6638ba 100644
--- a/doc/assertions.html
+++ b/doc/assertions.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -42,48 +42,62 @@
 <h3>Two Models</h3>
 
 <p>Before NUnit 2.4, a separate method of the Assert class was used for each
-   different assertion. We call this the 
-   <a href="classicModel.html">classic model</a>. It
+   different assertion. We call this the "Classic Model." It
    continues to be supported in NUnit, since many people prefer it.</p>
 
-<p>Beginning with NUnit 2.4, a new 
-   <a href="constraintModel.html">constraint-based model</a> is being 
+<p>Beginning with NUnit 2.4, a new "Constraint-based" model was 
    introduced. This approach uses a single method of the Assert class
-   for all assertions, passing a <b>constraint</b> object that specifies the
-   test to be performed.
+   for all assertions, passing a <a href="constraintModel.html">Constraint</a>   object that specifies the test to be performed.
 
 <p>This constraint-based model is now used internally by NUnit
    for all assertions. The methods of the classic approach have been 
    re-implemented on top of this new model.
+   
+   <!--
+<h4>See Also...</h4>
+<ul>
+<li>
+</ul>
+-->
+
 </div>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li id="current"><a href="assertions.html">Assertions</a></li>
-<ul>
-<li><a href="classicModel.html">Classic Model</a></li>
-<li><a href="constraintModel.html">Constraint Model</a></li>
-</ul>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li id="current"><a href="assertions.html">Assertions</a></li>
+<ul>
+<li><a href="equalityAsserts.html">Equality Asserts</a></li>
+<li><a href="identityAsserts.html">Identity Asserts</a></li>
+<li><a href="conditionAsserts.html">Condition Asserts</a></li>
+<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
+<li><a href="typeAsserts.html">Type Asserts</a></li>
+<li><a href="exceptionAsserts.html">Exception Asserts</a></li>
+<li><a href="utilityAsserts.html">Utility Methods</a></li>
+<li><a href="stringAssert.html">String Assert</a></li>
+<li><a href="collectionAssert.html">Collection Assert</a></li>
+<li><a href="fileAssert.html">File Assert</a></li>
+<li><a href="directoryAssert.html">Directory Assert</a></li>
+</ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/attributes.html b/doc/attributes.html
index e8b48b1..55456c2 100644
--- a/doc/attributes.html
+++ b/doc/attributes.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -36,52 +36,71 @@
 	file that contains tests must include a using statement for that namespace and 
 	the project must reference the framework assembly, nunit.framework.dll.</p>
 <p>Beginning with NUnit 2.4.6, NUnit's attributes are no longer sealed and any
-    attributes that derive from them will be recogized by NUnit.
+    attributes that derive from them will be recognized by NUnit.
  
 </div>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li id="current"><a href="attributes.html">Attributes</a></li>
-<ul>
-<li><a href="category.html">Category</a></li>
-<li><a href="culture.html">Culture</a></li>
-<li><a href="description.html">Description</a></li>
-<li><a href="exception.html">Expected Exception</a></li>
-<li><a href="explicit.html">Explicit</a></li>
-<li><a href="ignore.html">Ignore</a></li>
-<li><a href="platform.html">Platform</a></li>
-<li><a href="property.html">Property</a></li>
-<li><a href="setCulture.html">SetCulture</a></li>
-<li><a href="setup.html">Setup</a></li>
-<li><a href="setupFixture.html">SetUp Fixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testFixture.html">Test Fixture</a></li>
-<li><a href="fixtureSetup.html">Test Fixture SetUp</a></li>
-<li><a href="fixtureTeardown.html">Test Fixture </a></li>
-</ul>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li id="current"><a href="attributes.html">Attributes</a></li>
+<ul>
+<li><a href="category.html">Category</a></li>
+<li><a href="combinatorial.html">Combinatorial</a></li>
+<li><a href="culture.html">Culture</a></li>
+<li><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/category.html b/doc/category.html
index b591f39..efba2fe 100644
--- a/doc/category.html
+++ b/doc/category.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -218,46 +218,65 @@ public void MyTest()
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<ul>
-<li id="current"><a href="category.html">Category</a></li>
-<li><a href="culture.html">Culture</a></li>
-<li><a href="description.html">Description</a></li>
-<li><a href="exception.html">Expected Exception</a></li>
-<li><a href="explicit.html">Explicit</a></li>
-<li><a href="ignore.html">Ignore</a></li>
-<li><a href="platform.html">Platform</a></li>
-<li><a href="property.html">Property</a></li>
-<li><a href="setCulture.html">SetCulture</a></li>
-<li><a href="setup.html">Setup</a></li>
-<li><a href="setupFixture.html">SetUp Fixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testFixture.html">Test Fixture</a></li>
-<li><a href="fixtureSetup.html">Test Fixture SetUp</a></li>
-<li><a href="fixtureTeardown.html">Test Fixture </a></li>
-</ul>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li id="current"><a href="category.html">Category</a></li>
+<li><a href="combinatorial.html">Combinatorial</a></li>
+<li><a href="culture.html">Culture</a></li>
+<li><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/classicModel.html b/doc/classicModel.html
deleted file mode 100644
index 69a5677..0000000
--- a/doc/classicModel.html
+++ /dev/null
@@ -1,92 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - ClassicModel</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<link rel="stylesheet" type="text/css" href="nunit.css">
-<link rel="shortcut icon" href="favicon.ico">
-</head>
-<!-- End Standard Head Part -->
-
-<body>
-
-<!-- Standard Header for NUnit.org -->
-<div id="header">
-  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
-  <div id="nav">
-    <a href="http://www.nunit.org">NUnit</a>
-    <a class="active" href="index.html">Documentation</a>
-  </div>
-</div>
-<!-- End of Header -->
-
-<div id="content">
-
-<h2>Classic Assert Model</h2>
-
-<p>The classic Assert model uses a separate method to express each 
-   individual assertion of which it is capable.
-   
-<p>Here's a simple assert using the classic model:
-<pre>      StringAssert.AreEqualIgnoringCase( "Hello", myString );</pre>
-   
-<p>The Assert class provides the most commonly used assertions. It provides
-   For convenience of presentation, we group Assert methods as follows:
-   <ul>
-     <li><a href="equalityAsserts.html">Equality Asserts</a>     <li><a href="identityAsserts.html">Identity Asserts</a>     <li><a href="comparisonAsserts.html">Comparison Asserts</a>     <li><a href="typeAsserts.html">Type Asserts</a> 	 <li><a href="conditionAsserts.html">Condition tests</a>	 <li><a href="utilityAsserts.html">Utility methods</a></ul></p>
- 
-<p>Beyond the basic facilities of Assert, additional assertions are provided by 
-   the following classes:
-   <ul>
-     <li><a href="stringAssert.html">StringAssert</a>	 <li><a href="collectionAssert.html">CollectionAssert</a>	 <li><a href="fileAssert.html">FileAssert</a></ul></p>
-
-<p><b>See also:</b> the 
-<a href="constraintModel.html">constraint-based model</a> of assertions.
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<ul>
-<li id="current"><a href="classicModel.html">Classic Model</a></li>
-<ul>
-<li><a href="equalityAsserts.html">Equality Asserts</a></li>
-<li><a href="identityAsserts.html">Identity Asserts</a></li>
-<li><a href="conditionAsserts.html">Condition Tests</a></li>
-<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
-<li><a href="typeAsserts.html">Type Asserts</a></li>
-<li><a href="utilityAsserts.html">Utility Methods</a></li>
-<li><a href="stringAssert.html">String Assert</a></li>
-<li><a href="collectionAssert.html">Collection Assert</a></li>
-<li><a href="fileAssert.html">File Assert</a></li>
-</ul>
-<li><a href="constraintModel.html">Constraint Model</a></li>
-</ul>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
-</div>
-<!-- End of Submenu -->
-
-
-<!-- Standard Footer for NUnit.org -->
-<div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
-</div>
-<!-- End of Footer -->
-
-</body>
-</html>
diff --git a/doc/collectionAssert.html b/doc/collectionAssert.html
index 038b62c..b10b94c 100644
--- a/doc/collectionAssert.html
+++ b/doc/collectionAssert.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -24,13 +24,14 @@
 
 <div id="content">
 
-<h2>CollectionAssert (NUnit 2.4)</h2>
+<h2>CollectionAssert (NUnit 2.4 / 2.5)</h2>
 <p>The CollectionAssert class provides a number of methods that are useful 
 when examining collections and their contents or for comparing two collections.</p>
 
-<p>The <b>AreEqual</b> overloads succeed if the two collections contain the same objects,
-in the same order. <b>AreEquivalent</b> tests whether the collections contain the same
-objects, without regard to order.</p>
+<p>The <b>AreEqual</b> overloads succeed if the corresponding elements of the two 
+collections are equal. <b>AreEquivalent</b> tests whether the collection contents
+are equal, but without regard to order. In both cases, elements are compared using 
+NUnit's default equality comparison.</p>
 
 <p>Beginning with NUnit 2.4.6, these methods may be used on any object that
 implements IEnumerable. Prior to 2.4.6, only true collections were supported.
@@ -112,49 +113,62 @@ CollectionAssert.IsEmpty( IEnumerable collection, string message,
 CollectionAssert.IsNotEmpty( IEnumerable collection );
 CollectionAssert.IsNotEmpty( IEnumerable collection, string message );
 CollectionAssert.IsNotEmpty( IEnumerable collection, string message,
-          params object[] args );</pre>
-</div>
+          params object[] args );
+</pre></div>
+		 
+<p>The following methods are available beginning with NUnit 2.5
+
+<div class="code" style="width: 38em"><pre>
+CollectionAssert.IsOrdered( IEnumerable collection );
+CollectionAssert.IsOrdered( IEnumerable collection, string message );
+CollectionAssert.IsOrdered( IEnumerable collection, string message,
+          params object[] args );
+		  
+CollectionAssert.IsOrdered( IEnumerable collection, IComparer comparer );
+CollectionAssert.IsOrdered( IEnumerable collection, IComparer comparer,
+          string message );
+CollectionAssert.IsOrdered( IEnumerable collection, IComparer comparer,
+          string message, params object[] args );
+</pre></div>
 
 </div>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<ul>
-<li><a href="classicModel.html">Classic Model</a></li>
-<ul>
-<li><a href="equalityAsserts.html">Equality Asserts</a></li>
-<li><a href="identityAsserts.html">Identity Asserts</a></li>
-<li><a href="conditionAsserts.html">Condition Tests</a></li>
-<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
-<li><a href="typeAsserts.html">Type Asserts</a></li>
-<li><a href="utilityAsserts.html">Utility Methods</a></li>
-<li><a href="stringAssert.html">String Assert</a></li>
-<li id="current"><a href="collectionAssert.html">Collection Assert</a></li>
-<li><a href="fileAssert.html">File Assert</a></li>
-</ul>
-<li><a href="constraintModel.html">Constraint Model</a></li>
-</ul>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<ul>
+<li><a href="equalityAsserts.html">Equality Asserts</a></li>
+<li><a href="identityAsserts.html">Identity Asserts</a></li>
+<li><a href="conditionAsserts.html">Condition Asserts</a></li>
+<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
+<li><a href="typeAsserts.html">Type Asserts</a></li>
+<li><a href="exceptionAsserts.html">Exception Asserts</a></li>
+<li><a href="utilityAsserts.html">Utility Methods</a></li>
+<li><a href="stringAssert.html">String Assert</a></li>
+<li id="current"><a href="collectionAssert.html">Collection Assert</a></li>
+<li><a href="fileAssert.html">File Assert</a></li>
+<li><a href="directoryAssert.html">Directory Assert</a></li>
+</ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/collectionConstraints.html b/doc/collectionConstraints.html
index 2ebd1df..a2a0696 100644
--- a/doc/collectionConstraints.html
+++ b/doc/collectionConstraints.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -24,105 +24,308 @@
 
 <div id="content">
 
-<h2>Collection Constraints (NUnit 2.4)</h2>
+<h2>Collection Constraints (NUnit 2.4 / 2.5)</h2>
 
 <p>Collection constraints perform tests that are specific to collections.
-   The following collection constraints are provided.
+   The following collection constraints are provided. Before NUnit 2.4.6,
+   these constraints only operated on true Collections. Beginning with 2.4.6,
+   they can work with any object that implements IEnumerable.
    
-<table class="constraints">
-<tr><th>Syntax Helper</th><th>Constructor</th><th>Operation</th></tr>
-<tr><td>Is.All...<br>Has.All...</td><td>AllItemsConstraint( Constraint )</td></td><td>applies a constraint to each item in a collection, succeeding only if all of them succeed</td></tr>
-<tr><td>Has.Some...</td><td>SomeItemsConstraint( Constraint )</td></td><td>applies a constraint to each item in a collection, succeeding if at least one of them succeeds</td></tr>
-<tr><td>Has.None...</td><td>NoItemConstraint( Constraint )</td></td><td>applies a constraint to each item in a collection, succeeding only if all of them fail</td></tr>
-<tr><td>Is.Unique</td><td>UniqueItemsConstraint()</td></td><td>tests that a collection contains only unique items</td></tr>
-<tr><td>Has.Member( object )</td><td>CollectionContainsConstraint( object )</td></td><td>tests that a collection contains an object</td></tr>
-<tr><td>Is.EquivalentTo( IEnumerable )</td><td>CollectionEquivalentConstraint( ICollection )</td></td><td>tests that two collections are equivalent</td></tr>
-<tr><td>Is.SubsetOf( IEnumerable )</td><td>CollectionSubsetConstraint( ICollection )</td></td><td>tests that one collection is a subset of another</td></tr>
-</table>
+<p>Beginning with NUnit 2.4.2, use of an improper argument type caused tests
+   to fail. Later releases give an error rather than a failure, so that negated
+   constraints will not appear to succeed. 
+   
+<p>For example, both of the following statements give an error in later releases, 
+   but the second would have succeeded in earlier versions of NUnit.
+   
+<div class="code"><pre>
+int[] iarray = new int[] { 1, 2, 3 };
 
-<h4>Notes</h4>
+Assert.That( 5, Is.SubsetOf( iarray ) );  // Fails in early releases
+Assert.That( 5, Is.Not.SubsetOf( iarray ) ); /
+</pre></div>
 
-<ol>
-<li>Two collections are equivalent if they contain the same items, in any order.
-<li>To compare collections for equality, use Is.EqualTo().
-<li>Has.Member uses object equality to find an object in a collection. To check
-for an object equal to an item the collection, use Has.Some.EqualTo().
-<li>Beginning with NUnit 2.4.2, use of a collection constraint with a non-collection
-argument causes an error rather than a test failure. This avoids false positives
-when the collection constraint is negated.
-<li>Beginning with NUnit 2.4.6, you may use any object implementing IEnumerable
-in place of a collection.
-</ol>
+<h3>AllItemsConstraint</h3>
 
-<h4>Examples of Use</h4>
+<h4>Action</h4>
+<p>Applies a constraint to each item in a collection, succeeding only if all of them succeed.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+AllItemsConstraint(Constraint itemConstraint)
+</pre></div>
 
-<div class="code" style="width: 38em"><pre>
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.All...
+Has.All...
+</pre></div>
+
+<h4>Examples of Use</h4>
+<div class="code"><pre>
 int[] iarray = new int[] { 1, 2, 3 };
 string[] sarray = new string[] { "a", "b", "c" };
 
 Assert.That( iarray, Is.All.Not.Null );
-Assert.That( sarray, Is.All.InstanceOfType(typeof(string)) );
+Assert.That( sarray, Is.All.InstanceOf<string>() );
 Assert.That( iarray, Is.All.GreaterThan(0) );
-                 
+Assert.That( iarray, Has.All.GreaterThan(0) );
+</pre></div>
+
+<h3>SomeItemsConstraint</h3>
+
+<h4>Action</h4>
+<p>Applies a constraint to each item in a collection, succeeding if at least one of them succeeds.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+SomeItemsConstraint(Constraint itemConstraint)
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Has.Some...
+</pre></div>
+
+<h4>Examples of Use</h4>
+<div class="code"><pre>
+int[] iarray = new int[] { 1, 2, 3 };
+string[] sarray = new string[] { "a", "b", "c" };
+
+Assert.That( iarray, Has.Some.GreaterThan(2) );
+Assert.That( sarray, Has.Some.Length(1) );
+</pre></div>
+
+<h3>NoItemConstraint</h3>
+
+<h4>Action</h4>
+<p>Applies a constraint to each item in a collection, succeeding only if all of them fail.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+NoItemConstraint(Constraint itemConstraint)
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Has.None...
+Has.No...
+</pre></div>
+
+<h4>Examples of Use</h4>
+<div class="code"><pre>
+int[] iarray = new int[] { 1, 2, 3 };
+string[] sarray = new string[] { "a", "b", "c" };
+
+Assert.That( iarray, Has.None.Null );
+Assert.That( iarray, Has.No.Null );
+Assert.That( sarray, Has.None.EqualTo("d") );
+Assert.That( iarray, Has.None.LessThan(0) );
+</pre></div>
+
+<h3>UniqueItemsConstraint</h3>
+
+<h4>Action</h4>
+<p>Tests that a collection contains only unique items.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+UniqueItemsConstraint()
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.Unique
+</pre></div>
+
+<h4>Example of Use</h4>
+<div class="code"><pre>
+string[] sarray = new string[] { "a", "b", "c" };
+
 Assert.That( sarray, Is.Unique );
+</pre></div>
+
+<h4>Notes</h4>
+<ol>
+<li>??
+</ol>
+
+<h3>CollectionContainsConstraint</h3>
+
+<h4>Action</h4>
+<p>Tests that a collection contains an object. 
 
-Assert.That( iarray, List.Contains(3) );
-Assert.That( sarray, List.Contains("b") );
-Assert.That( sarray, List.Not.Contains("x") );
+<h4>Constructor</h4>
+<div class="code"><pre>
+CollectionContainsConstraint( object )
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Has.Member( object )
+Contains.Item( object )
+</pre></div>
+
+<h4>Modifiers</h4>
+<div class="code"><pre>
+...Using(IComparer comparer)
+...Using<T>(IComparer<T> comparer)
+...Using<T>(Comparison<T> comparer)
+</pre></div>
+
+<h4>Examples of Use</h4>
+<div class="code"><pre>
+int[] iarray = new int[] { 1, 2, 3 };
+string[] sarray = new string[] { "a", "b", "c" };
+
+Assert.That( iarray, Has.Member(3) );
+Assert.That( sarray, Has.Member("b") );
+Assert.That( sarray, Contains.Item("c") );
+Assert.That( sarray, Has.No.Member("x") );
+</pre></div>
+
+<h4>Notes</h4>
+<ol>
+<li>For references, <b>Has.Member</b> uses object equality to find a member in a 
+collection. To check for an object equal to an item the collection, use 
+<b>Has.Some.EqualTo(...)</b>.
+</ol>
+
+<h3>CollectionEquivalentConstraint</h3>
+
+<h4>Action</h4>
+<p>Tests that two collections are equivalent - that they contain 
+the same items, in any order.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+CollectionEquivalentConstraint( IEnumerable other )
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.EquivalentTo( IEnumerable other )
+</pre></div>
+
+<h4>Examples of Use</h4>
+<div class="code"><pre>
+int[] iarray = new int[] { 1, 2, 3 };
+string[] sarray = new string[] { "a", "b", "c" };
 
 Assert.That( new string[] { "c", "a", "b" }, Is.EquivalentTo( sarray ) );
 Assert.That( new int[] { 1, 2, 2 }, Is.Not.EquivalentTo( iarray ) );
+</pre></div>
+
+<h4>Notes</h4>
+<ol>
+<li>To compare collections for equality, use Is.EqualTo().
+</ol>
+
+<h3>CollectionSubsetConstraint</h3>
+
+<h4>Action</h4>
+<p>Tests that one collection is a subset of another.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+CollectionSubsetConstraint( ICollection )
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.SubsetOf( IEnumerable )
+</pre></div>
+
+<h4>Example of Use</h4>
+<div class="code"><pre>
+int[] iarray = new int[] { 1, 2, 3 };
+
 Assert.That( new int[] { 1, 3 }, Is.SubsetOf( iarray ) );
+</pre></div>
+
+<h3>CollectionOrderedConstraint (NUnit 2.5)</h3>
 
-// Using inheritance
-Expect( iarray, All.GreaterThan( 0 ) );
-Expect( sarray, Contains("b") );
-Expect( new int[] { 1, 3 }, SubsetOf( iarray ) );
+<h4>Action</h4>
+<p>Tests that a collection is ordered.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+CollectionOrderedConstraint()
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.Ordered
 </pre></div>
 
+<h4>Modifiers</h4>
+<div class="code"><pre>
+...Descending
+...By(string propertyName)
+...Using(IComparer comparer)
+...Using<T>(IComparer<T> comparer)
+...Using<T>(Comparison<T> comparer)
+</pre></div>
+
+<h4>Examples of Use</h4>
+<div class="code"><pre>
+int[] iarray = new int[] { 1, 2, 3 };
+string[] sarray = new string[] { "c", "b", "a" };
+string[] sarray2 = new string[] ( "a", "aa", "aaa" );
+
+Assert.That( iarray, Is.Ordered );
+Assert.That( sarray, Is.Ordered.Descending );
+Assert.That( sarray2, Is.Ordered.By("Length");
+</pre></div>
+
+<h4>Notes</h4>
+<ol>
+<li>Modifiers may be combined and may appear in any order. If the
+same modifier is used more than once, the result is undefined.
+<li>The syntax of Is.Ordered has changed from earlier betas.
+</ol>
 
 </div>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<ul>
-<li><a href="classicModel.html">Classic Model</a></li>
-<li><a href="constraintModel.html">Constraint Model</a></li>
-<ul>
-<li><a href="equalConstraint.html">Equal Constraint</a></li>
-<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
-<li><a href="conditionConstraints.html">Condition Constraints</a></li>
-<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
-<li><a href="typeConstraints.html">Type Constraints</a></li>
-<li><a href="stringConstraints.html">String Constraints</a></li>
-<li id="current"><a href="collectionConstraints.html">Collection Constraints</a></li>
-<li><a href="propertyConstraint.html">Property Constraint</a></li>
-<li><a href="compoundConstraints.html">Compound Constraints</a></li>
-<li><a href="customConstraints.html">Custom Constraints</a></li>
-<li><a href="listMapper.html">List Mapper</a></li>
-</ul>
-</ul>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<ul>
+<li><a href="equalConstraint.html">Equal Constraint</a></li>
+<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
+<li><a href="conditionConstraints.html">Condition Constraints</a></li>
+<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
+<li><a href="pathConstraints.html">Path Constraints</a></li>
+<li><a href="typeConstraints.html">Type Constraints</a></li>
+<li><a href="stringConstraints.html">String Constraints</a></li>
+<li id="current"><a href="collectionConstraints.html">Collection Constraints</a></li>
+<li><a href="propertyConstraint.html">Property Constraint</a></li>
+<li><a href="throwsConstraint.html">Throws Constraint</a></li>
+<li><a href="compoundConstraints.html">Compound Constraints</a></li>
+<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
+<li><a href="listMapper.html">List Mapper</a></li>
+<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
+</ul>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/combinatorial.html b/doc/combinatorial.html
new file mode 100644
index 0000000..c676db6
--- /dev/null
+++ b/doc/combinatorial.html
@@ -0,0 +1,126 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - Combinatorial</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>CombinatorialAttribute (NUnit 2.5)</h3>
+
+<p>The <b>CombinatorialAttribute</b> is used on a test to specify that NUnit should
+   generate test cases for all possible combinations of the individual
+   data items provided for the parameters of a test. Since this is the
+   default, use of this attribute is optional.
+   
+<h4>Example</h4>
+
+<p>The following test will be executed six times, as follows:
+<pre>
+	MyTest(1, "A")
+	MyTest(1, "B")
+	MyTest(2, "A")
+	MyTest(2, "B")
+	MyTest(3, "A")
+	MyTest(3, "B")
+</pre>
+<div class="code"><pre>
+[Test, Combinatorial]
+public void MyTest(
+    [Values(1,2,3)] int x,
+    [Values("A","B")] string s)
+{
+    ...
+}
+</pre></div>
+
+<h4>See also...</h4>
+<ul>
+<li><a href="sequential.html">SequentialAttribute</a><li><a href="pairwise.html">PairwiseAttribute</a></ul>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li><a href="category.html">Category</a></li>
+<li id="current"><a href="combinatorial.html">Combinatorial</a></li>
+<li><a href="culture.html">Culture</a></li>
+<li><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/comparisonAsserts.html b/doc/comparisonAsserts.html
index b9d5d63..e8e64ed 100644
--- a/doc/comparisonAsserts.html
+++ b/doc/comparisonAsserts.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -228,42 +228,40 @@ Assert.LessOrEqual( IComparable arg1, IComparable arg2, string message,
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<ul>
-<li><a href="classicModel.html">Classic Model</a></li>
-<ul>
-<li><a href="equalityAsserts.html">Equality Asserts</a></li>
-<li><a href="identityAsserts.html">Identity Asserts</a></li>
-<li><a href="conditionAsserts.html">Condition Tests</a></li>
-<li id="current"><a href="comparisonAsserts.html">Comparison Asserts</a></li>
-<li><a href="typeAsserts.html">Type Asserts</a></li>
-<li><a href="utilityAsserts.html">Utility Methods</a></li>
-<li><a href="stringAssert.html">String Assert</a></li>
-<li><a href="collectionAssert.html">Collection Assert</a></li>
-<li><a href="fileAssert.html">File Assert</a></li>
-</ul>
-<li><a href="constraintModel.html">Constraint Model</a></li>
-</ul>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<ul>
+<li><a href="equalityAsserts.html">Equality Asserts</a></li>
+<li><a href="identityAsserts.html">Identity Asserts</a></li>
+<li><a href="conditionAsserts.html">Condition Asserts</a></li>
+<li id="current"><a href="comparisonAsserts.html">Comparison Asserts</a></li>
+<li><a href="typeAsserts.html">Type Asserts</a></li>
+<li><a href="exceptionAsserts.html">Exception Asserts</a></li>
+<li><a href="utilityAsserts.html">Utility Methods</a></li>
+<li><a href="stringAssert.html">String Assert</a></li>
+<li><a href="collectionAssert.html">Collection Assert</a></li>
+<li><a href="fileAssert.html">File Assert</a></li>
+<li><a href="directoryAssert.html">Directory Assert</a></li>
+</ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/comparisonConstraints.html b/doc/comparisonConstraints.html
index 56dc570..742e738 100644
--- a/doc/comparisonConstraints.html
+++ b/doc/comparisonConstraints.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -24,84 +24,214 @@
 
 <div id="content">
 
-<h2>Comparison Constraints (NUnit 2.4)</h2>
+<h2>Comparison Constraints (NUnit 2.4 / 2.5)</h2>
 
 <p>Comparison constraints are able to test whether one value
 is greater or less than another. Comparison constraints work
-on numeric values, as well as other objects that implement IComparable.
-
-<table class="constraints">
-<tr><th>Syntax Helper</th><th>Constructor</th><th>Operation</th></tr>
-<tr><td>Is.GreaterThan( IComparable )</td><td>GreaterThanConstraint( IComparable )</td></td><td>tests that one value is greater than another</td></tr>
-<tr><td>Is.GreaterThanOrEqualTo( IComparable )</td><td>GreaterThanOrEqualConstraint( IComparable )</td></td><td>tests that one value is greater than or equal to another</td></tr>
-<tr><td>Is.AtLeast( IComparable )</td><td>GreaterThanOrEqualConstraint( IComparable )</td></td><td>tests that one value is greater than or equal to another</td></tr>
-<tr><td>Is.LessThan( IComparable )</td><td>LessThanConstraint( IComparable )</td></td><td>tests that one value is less than another</td></tr>
-<tr><td>Is.LessThanOrEqualTo( IComparable )</td><td>LessThanOrEqualConstraint( IComparable )</td></td><td>tests that one value is less than or equal to another</td></tr>
-<tr><td>Is.AtMost( IComparable )</td><td>LessThanOrEqualConstraint( IComparable )</td></td><td>tests that one value is less than or equal to another</td></tr>
-</table>
+on numeric values, as well as other objects that implement the
+<b>IComparable</b> interface or - beginning with NUnit 2.5 - 
+<b>IComparable<T></b>.
 
-<h4>Examples of Use</h4>
+<p>Beginning with NUnit 2.5, you may supply your own comparison
+algorithm through the <b>Using</b> modifier.
+
+<h3>GreaterThanConstraint</h3>
+
+<h4>Action</h4>
+<p>Tests that one value is greater than another.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+GreaterThanConstraint(object expected)
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.GreaterThan(object expected)
+</pre></div>
 
+<h4>Modifiers</h4>
+<div class="code"><pre>
+...Using(IComparer comparer)
+...Using<T>(IComparer<T> comparer)
+...Using<T>(Comparison<T> comparer)
+</pre></div>
+
+<h4>Examples of Use</h4>
 <div class="code"><pre>
 Assert.That(7, Is.GreaterThan(3));
+Assert.That(myOwnObject, 
+    Is.GreaterThan(theExpected).Using(myComparer));
+</pre></div>
+
+<h3>GreaterThanOrEqualConstraint</h3>
+
+<h4>Action</h4>
+<p>Tests that one value is greater than or equal to another.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+GreaterThanOrEqualConstraint(object expected)
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.GreaterThanOrEqualTo(object expected)
+Is.AtLeast(object expected)
+</pre></div>
+
+<h4>Modifiers</h4>
+<div class="code"><pre>
+...Using(IComparer comparer)
+...Using<T>(IComparer<T> comparer)
+...Using<T>(Comparison<T> comparer)
+</pre></div>
+
+<h4>Examples of Use</h4>
+<div class="code"><pre>
 Assert.That(7, Is.GreaterThanOrEqualTo(3));
 Assert.That(7, Is.AtLeast(3));
 Assert.That(7, Is.GreaterThanOrEqualTo(7));
 Assert.That(7, Is.AtLeast(7));
+Assert.That(myOwnObject, 
+    Is.GreaterThanOrEqualTo(theExpected).Using(myComparer));
+</pre></div>
+
+<h3>LessThanConstraint</h3>
+
+<h4>Action</h4>
+<p>Tests that one value is less than another.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+LessThanConstraint(object expected)
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.LessThan(object expected)
+</pre></div>
 
+<h4>Modifiers</h4>
+<div class="code"><pre>
+...Using(IComparer comparer)
+...Using<T>(IComparer<T> comparer)
+...Using<T>(Comparison<T> comparer)
+</pre></div>
+
+<h4>Examples of Use</h4>
+<div class="code"><pre>
 Assert.That(3, Is.LessThan(7));
+Assert.That(myOwnObject, 
+    Is.LessThan(theExpected).Using(myComparer));
+</pre></div>
+
+<h3>LessThanOrEqualConstraint</h3>
+
+<h4>Action</h4>
+<p>Tests that one value is less than or equal to another.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+LessThanOrEqualConstraint(object expected)
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.LessThanOrEqualTo(object expected)
+Is.AtMost(object expected)
+</pre></div>
+
+<h4>Modifiers</h4>
+<div class="code"><pre>
+...Using(IComparer comparer)
+...Using<T>(IComparer<T> comparer)
+...Using<T>(Comparison<T> comparer)
+</pre></div>
+
+<h4>Examples of Use</h4>
+<div class="code"><pre>
 Assert.That(3, Is.LessThanOrEqualTo(7));
 Assert.That(3, Is.AtMost(7));
 Assert.That(3, Is.LessThanOrEqualTo(3));
 Assert.That(3, Is.AtMost(3));
+Assert.That(myOwnObject, 
+    Is.LessThanOrEqualTo(theExpected).Using(myComparer));
+</pre></div>
+
+<h3>RangeConstraint</h3>
+
+<h4>Action</h4>
+<p>
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+RangeConstraint(IComparable from, IComparable to)
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.InRange(IComparable from, IComparable to)
+</pre></div>
+
+<h4>Modifiers</h4>
+<div class="code"><pre>
+...Using(IComparer comparer)
+...Using<T>(IComparer<T> comparer)
+...Using<T>(Comparison<T> comparer)
+</pre></div>
+
+<h4>Examples of Use</h4>
+<div class="code"><pre>
+int[] iarray = new int[] { 1, 2, 3 }
 
-// Using Inheritance
-Expect( 7, GreaterThan(3));
-Expect( 3, AtMost(7));
+Assert.That( 42, Is.InRange(1, 100) );
+Assert.That( iarray, Is.All.InRange(1, 3) );
+Assert.That(myOwnObject, 
+    Is.InRange(lowExpected, highExpected).Using(myComparer));
 </pre></div>
 
 </div>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<ul>
-<li><a href="classicModel.html">Classic Model</a></li>
-<li><a href="constraintModel.html">Constraint Model</a></li>
-<ul>
-<li><a href="equalConstraint.html">Equal Constraint</a></li>
-<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
-<li><a href="conditionConstraints.html">Condition Constraints</a></li>
-<li id="current"><a href="comparisonConstraints.html">Comparison Constrants</a></li>
-<li><a href="typeConstraints.html">Type Constraints</a></li>
-<li><a href="stringConstraints.html">String Constraints</a></li>
-<li><a href="collectionConstraints.html">Collection Constraints</a></li>
-<li><a href="propertyConstraint.html">Property Constraint</a></li>
-<li><a href="compoundConstraints.html">Compound Constraints</a></li>
-<li><a href="customConstraints.html">Custom Constraints</a></li>
-<li><a href="listMapper.html">List Mapper</a></li>
-</ul>
-</ul>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<ul>
+<li><a href="equalConstraint.html">Equal Constraint</a></li>
+<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
+<li><a href="conditionConstraints.html">Condition Constraints</a></li>
+<li id="current"><a href="comparisonConstraints.html">Comparison Constrants</a></li>
+<li><a href="pathConstraints.html">Path Constraints</a></li>
+<li><a href="typeConstraints.html">Type Constraints</a></li>
+<li><a href="stringConstraints.html">String Constraints</a></li>
+<li><a href="collectionConstraints.html">Collection Constraints</a></li>
+<li><a href="propertyConstraint.html">Property Constraint</a></li>
+<li><a href="throwsConstraint.html">Throws Constraint</a></li>
+<li><a href="compoundConstraints.html">Compound Constraints</a></li>
+<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
+<li><a href="listMapper.html">List Mapper</a></li>
+<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
+</ul>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/compoundConstraints.html b/doc/compoundConstraints.html
index 88a213f..a5aca7d 100644
--- a/doc/compoundConstraints.html
+++ b/doc/compoundConstraints.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -52,44 +52,43 @@ Expect( 2.3, GreaterThan( 2.0 ) & LessThan( 3.0 ) );
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<ul>
-<li><a href="classicModel.html">Classic Model</a></li>
-<li><a href="constraintModel.html">Constraint Model</a></li>
-<ul>
-<li><a href="equalConstraint.html">Equal Constraint</a></li>
-<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
-<li><a href="conditionConstraints.html">Condition Constraints</a></li>
-<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
-<li><a href="typeConstraints.html">Type Constraints</a></li>
-<li><a href="stringConstraints.html">String Constraints</a></li>
-<li><a href="collectionConstraints.html">Collection Constraints</a></li>
-<li><a href="propertyConstraint.html">Property Constraint</a></li>
-<li id="current"><a href="compoundConstraints.html">Compound Constraints</a></li>
-<li><a href="customConstraints.html">Custom Constraints</a></li>
-<li><a href="listMapper.html">List Mapper</a></li>
-</ul>
-</ul>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<ul>
+<li><a href="equalConstraint.html">Equal Constraint</a></li>
+<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
+<li><a href="conditionConstraints.html">Condition Constraints</a></li>
+<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
+<li><a href="pathConstraints.html">Path Constraints</a></li>
+<li><a href="typeConstraints.html">Type Constraints</a></li>
+<li><a href="stringConstraints.html">String Constraints</a></li>
+<li><a href="collectionConstraints.html">Collection Constraints</a></li>
+<li><a href="propertyConstraint.html">Property Constraint</a></li>
+<li><a href="throwsConstraint.html">Throws Constraint</a></li>
+<li id="current"><a href="compoundConstraints.html">Compound Constraints</a></li>
+<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
+<li><a href="listMapper.html">List Mapper</a></li>
+<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
+</ul>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/conditionAsserts.html b/doc/conditionAsserts.html
index a3727db..5ef492c 100644
--- a/doc/conditionAsserts.html
+++ b/doc/conditionAsserts.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -24,28 +24,44 @@
 
 <div id="content">
 
-<h2>Condition Tests</h2>
+<h2>Condition Asserts</h2>
 
 <p>Methods that test a specific condition are named for the condition they test and 
 	take the value tested as their first argument and, optionally a message as the 
 	second. The following methods are provided:</p>
 <div class="code" style="width: 36em">
-	<pre>Assert.IsTrue( bool condition );
+<pre>Assert.IsTrue( bool condition );
 Assert.IsTrue( bool condition, string message );
 Assert.IsTrue( bool condition, string message, object[] parms );
 
+Assert.True( bool condition );
+Assert.True( bool condition, string message );
+Assert.True( bool condition, string message, object[] parms );
+
 Assert.IsFalse( bool condition);
 Assert.IsFalse( bool condition, string message );
 Assert.IsFalse( bool condition, string message, object[] parms );
 
+Assert.False( bool condition);
+Assert.False( bool condition, string message );
+Assert.False( bool condition, string message, object[] parms );
+
 Assert.IsNull( object anObject );
 Assert.IsNull( object anObject, string message );
 Assert.IsNull( object anObject, string message, object[] parms );
 
+Assert.Null( object anObject );
+Assert.Null( object anObject, string message );
+Assert.Null( object anObject, string message, object[] parms );
+
 Assert.IsNotNull( object anObject );
 Assert.IsNotNull( object anObject, string message );
 Assert.IsNotNull( object anObject, string message, object[] parms );
 
+Assert.NotNull( object anObject );
+Assert.NotNull( object anObject, string message );
+Assert.NotNull( object anObject, string message, object[] parms );
+
 Assert.IsNaN( double aDouble );
 Assert.IsNaN( double aDouble, string message );
 Assert.IsNaN( double aDouble, string message, object[] parms );
@@ -71,7 +87,12 @@ Assert.IsNotEmpty( ICollection collection, string message,
           params object[] args );</pre>
 </div>
 
-<p>Note that Assert.IsEmpty and Assert.IsNotEmpty may be used to test either a string
+<p>Two forms are provided for the True, False, Null and NotNull
+conditions. The "Is" forms are compatible with earlier versions
+of the NUnit framework, while those without "Is" are provided
+for compatibility with NUnitLite.
+
+<p>Assert.IsEmpty and Assert.IsNotEmpty may be used to test either a string
 or a collection.</p>
 
 
@@ -80,42 +101,40 @@ or a collection.</p>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<ul>
-<li><a href="classicModel.html">Classic Model</a></li>
-<ul>
-<li><a href="equalityAsserts.html">Equality Asserts</a></li>
-<li><a href="identityAsserts.html">Identity Asserts</a></li>
-<li id="current"><a href="conditionAsserts.html">Condition Tests</a></li>
-<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
-<li><a href="typeAsserts.html">Type Asserts</a></li>
-<li><a href="utilityAsserts.html">Utility Methods</a></li>
-<li><a href="stringAssert.html">String Assert</a></li>
-<li><a href="collectionAssert.html">Collection Assert</a></li>
-<li><a href="fileAssert.html">File Assert</a></li>
-</ul>
-<li><a href="constraintModel.html">Constraint Model</a></li>
-</ul>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<ul>
+<li><a href="equalityAsserts.html">Equality Asserts</a></li>
+<li><a href="identityAsserts.html">Identity Asserts</a></li>
+<li id="current"><a href="conditionAsserts.html">Condition Asserts</a></li>
+<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
+<li><a href="typeAsserts.html">Type Asserts</a></li>
+<li><a href="exceptionAsserts.html">Exception Asserts</a></li>
+<li><a href="utilityAsserts.html">Utility Methods</a></li>
+<li><a href="stringAssert.html">String Assert</a></li>
+<li><a href="collectionAssert.html">Collection Assert</a></li>
+<li><a href="fileAssert.html">File Assert</a></li>
+<li><a href="directoryAssert.html">Directory Assert</a></li>
+</ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/conditionConstraints.html b/doc/conditionConstraints.html
index e3020db..c20893a 100644
--- a/doc/conditionConstraints.html
+++ b/doc/conditionConstraints.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -30,75 +30,182 @@
    they test. They verify that the actual value satisfies the condition. The
    following condition helpers are provided.
    
-<table class="constraints">
-<tr><th>Syntax Helper</th><th>Constructor</th><th>Operation</th></tr>
-<tr><td>Is.Null</td><td>EqualConstraint( null )</td></td><td>tests for null</td></tr>
-<tr><td>Is.True</td><td>EqualConstraint( true )</td></td><td>tests for <b>true</b></td></tr>
-<tr><td>Is.False</td><td>EqualConstraint( false )</td></td><td>tests for <b>false</b></td></tr>
-<tr><td>Is.NaN</td><td>EqualConstraint( double.NaN )<br>EqualConstraint( float.NaN )</td></td><td>tests for floating NaN</td></tr>
-<tr><td>Is.Empty</td><td>EmptyConstraint()</td></td><td>tests for empty string or collection</td></tr>
-<tr><td>Is.Unique</td><td>UniqueItemsConstraint()</td></td><td>tests that collection contains unique items</td></tr>
-</table>
-
-<h4>Examples</h4>
- 
+<h3>NullConstraint</h3>
+
+<h4>Action</h4>
+<p>Tests that a value is Null.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+NullConstraint()
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.Null
+</pre></div>
+
+<h4>Examples of Use</h4>
 <div class="code"><pre>
 Assert.That( anObject, Is.Null );
 Assert.That( anObject, Is.Not.Null );
+</pre></div>
+
+<h3>TrueConstraint</h3>
+
+<h4>Action</h4>
+<p>Tests that a value is true.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+TrueConstraint()
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.True
+</pre></div>
+
+<h4>Example of Use</h4>
+<div class="code"><pre>
 Assert.That( condition, Is.True );
+</pre></div>
+
+<h3>FalseConstraint</h3>
+
+<h4>Action</h4>
+<p>Tests that a value is false.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+FalseConstraint()
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.False
+</pre></div>
+
+<h4>Example of Use</h4>
+<div class="code"><pre>
 Assert.That( condition, Is.False );
+</pre></div>
+
+<h3>NaNConstraint</h3>
+
+<h4>Action</h4>
+<p>Tests that a value is floating-point NaN.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+NaNConstraint()
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.NaN
+</pre></div>
+
+<h4>Examples of Use</h4>
+<div class="code"><pre>
 Assert.That( aDouble, Is.NaN );
 Assert.That( aDouble, Is.Not.NaN );
+</pre></div>
+
+<h3>EmptyConstraint</h3>
+
+<h4>Action</h4>
+<p>Tests that an object is an empty string, directory or collection.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+EmptyConstraint()
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.Empty
+</pre></div>
+
+<h4>Examples of Use</h4>
+<div class="code"><pre>
 Assert.That( aString, Is.Empty );
+Assert.Thst( dirInfo, Is.Empty );
 Assert.That( collection, Is.Empty );
-Assert.That( collection, Is.Unique );
+</pre></div>
+
+<h4>Notes</h4>
+<ol>
+<li><b>EmptyConstraint</b> creates and uses either an <b>EmptyStringConstraint</b>,
+<b>EmptyDirectoryConstraint</b> or <b>EmptyCollectionConstraint</b> depending on 
+the argument tested.
+<li>A <b>DirectoryInfo</b> argument is required in order to test for an empty directory.
+To test whether a string represents a directory path, you must first construct
+a <b>DirectoryInfo</b>.
+</ol>
+
+<h3>UniqueItemsConstraint</h3>
+
+<h4>Action</h4>
+<p>Tests that an array, collection or other IEnumerable is composed
+of unique items with no duplicates.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+UniqueItemsConstraint()
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.Unique
+</pre></div>
+
+<h4>Example of Use</h4>
 
-// Using inheritance
-Expect( aDouble, NaN );
-Expect( collection, Unique );
+<div class="code"><pre>
+Assert.That( collection, Is.Unique );
 </pre></div>
 </div>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<ul>
-<li><a href="classicModel.html">Classic Model</a></li>
-<li><a href="constraintModel.html">Constraint Model</a></li>
-<ul>
-<li><a href="equalConstraint.html">Equal Constraint</a></li>
-<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
-<li id="current"><a href="conditionConstraints.html">Condition Constraints</a></li>
-<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
-<li><a href="typeConstraints.html">Type Constraints</a></li>
-<li><a href="stringConstraints.html">String Constraints</a></li>
-<li><a href="collectionConstraints.html">Collection Constraints</a></li>
-<li><a href="propertyConstraint.html">Property Constraint</a></li>
-<li><a href="compoundConstraints.html">Compound Constraints</a></li>
-<li><a href="customConstraints.html">Custom Constraints</a></li>
-<li><a href="listMapper.html">List Mapper</a></li>
-</ul>
-</ul>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<ul>
+<li><a href="equalConstraint.html">Equal Constraint</a></li>
+<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
+<li id="current"><a href="conditionConstraints.html">Condition Constraints</a></li>
+<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
+<li><a href="pathConstraints.html">Path Constraints</a></li>
+<li><a href="typeConstraints.html">Type Constraints</a></li>
+<li><a href="stringConstraints.html">String Constraints</a></li>
+<li><a href="collectionConstraints.html">Collection Constraints</a></li>
+<li><a href="propertyConstraint.html">Property Constraint</a></li>
+<li><a href="throwsConstraint.html">Throws Constraint</a></li>
+<li><a href="compoundConstraints.html">Compound Constraints</a></li>
+<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
+<li><a href="listMapper.html">List Mapper</a></li>
+<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
+</ul>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/configEditor.html b/doc/configEditor.html
index b2c4140..e4db3ee 100644
--- a/doc/configEditor.html
+++ b/doc/configEditor.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -55,37 +55,48 @@ existing configuration to use as a template.</p>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<ul>
-<li><a href="guiCommandLine.html">Command-Line</a></li>
-<li><a href="mainMenu.html">Main Menu</a></li>
-<li><a href="contextMenu.html">Context Menu</a></li>
-<li><a href="optionsDialog.html">Options Dialog</a></li>
-<li><a href="addinsDialog.html">Addins Dialog</a></li>
-<li><a href="testProperties.html">Test Properties</a></li>
-<li id="current"><a href="configEditor.html">Configuration Editor</a></li>
-<li><a href="projectEditor.html">Project Editor</a></li>
-</ul>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<ul>
+<li><a href="nunit-console.html">Console Runner</a></li>
+<li><a href="nunit-gui.html">Gui Runner</a></li>
+<ul>
+<li><a href="guiCommandLine.html">Command-Line</a></li>
+<li><a href="mainMenu.html">Main Menu</a></li>
+<li><a href="contextMenu.html">Context Menu</a></li>
+<li><a href="settingsDialog.html">Settings Dialog</a></li>
+<li><a href="addinsDialog.html">Addins Dialog</a></li>
+<li><a href="testProperties.html">Test Properties</a></li>
+<li id="current"><a href="configEditor.html">Configuration Editor</a></li>
+<li><a href="projectEditor.html">Project Editor</a></li>
+</ul>
+<li><a href="pnunit.html">PNUnit Runner</a></li>
+<li><a href="nunit-agent.html">NUnit Agent</a></li>
+<li><a href="runtimeSelection.html">Runtime Selection</a></li>
+<li><a href="assemblyIsolation.html">Assembly Isolation</a></li>
+<li><a href="configFiles.html">Configuration Files</a></li>
+<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/configFiles.html b/doc/configFiles.html
index ad87cc9..f3f868b 100644
--- a/doc/configFiles.html
+++ b/doc/configFiles.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -121,33 +121,38 @@ level must be one that is defined by log4net.
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<ul>
-<li id="current"><a href="configFiles.html">Configuration Files</a></li>
-<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
-<li><a href="vsSupport.html">Visual Studio Support</a></li>
-<li><a href="extensibility.html">Extensibility</a></li>
-</ul>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<ul>
+<li><a href="nunit-console.html">Console Runner</a></li>
+<li><a href="nunit-gui.html">Gui Runner</a></li>
+<li><a href="pnunit.html">PNUnit Runner</a></li>
+<li><a href="nunit-agent.html">NUnit Agent</a></li>
+<li><a href="runtimeSelection.html">Runtime Selection</a></li>
+<li><a href="assemblyIsolation.html">Assembly Isolation</a></li>
+<li id="current"><a href="configFiles.html">Configuration Files</a></li>
+<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/consoleCommandLine.html b/doc/consoleCommandLine.html
index 42eb92e..eb600f9 100644
--- a/doc/consoleCommandLine.html
+++ b/doc/consoleCommandLine.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -37,24 +37,29 @@
 	take values may use an equal sign, a colon or a space to separate the option 
 	from its value.</p>
 <h4>Specifying an Assembly</h4>
-The console program must always have an assembly or project specified. To run 
-the tests contained in the nunit.tests.dll use the following command:
+<p>The console program must always have an assembly or project specified. To run 
+the tests contained in the nunit.tests.dll use the following command:</p>
 <pre class="programtext">        nunit-console nunit.tests.dll</pre>
-</p>
-<p>To run the tests in nunit.tests.dll through the Visual Studio project, use:
+
+<p>To run the tests in nunit.tests.dll through the Visual Studio project, use:</p>
 	<pre class="programtext">        nunit-console nunit.tests.csproj</pre>
-</p>
-<p>To run the same tests through an NUnit test project you have defined, use:
+
+<p>To run the same tests through an NUnit test project you have defined, use:</p>
 	<pre class="programtext">        nunit-console nunit.tests.nunit</pre>
-</p>
+
 <h4>Specifying an Assembly and a Test to be Run</h4>
-<p>You may specify a test to be run by proviig the full name of the test along
+<p>You may specify a test to be run by providing the full name of the test along
 with the containing assembly. For example to run NUnit.Tests.AssertionTests
 in the nunit.tests assembly use the following command:
 <pre class="programtext">        nunit-console /run:NUnit.Tests.AssertionTests nunit.tests.dll</pre>
 
 <p>The name of the test to be run may be that of a test case, test fixture or
-a namespace. Unlike the <b>/fixture</b> option, this option affects the running
+a namespace. 
+
+<p>You can specify multiple tests by separating names with commas (without spaces). For example:
+<pre class="programtext">        nunit-console /run:NUnit.Tests.AssertionTests,NUnit.Tests.ConstraintTests nunit.tests.dll</pre>
+
+<p>Unlike the <b>/fixture</b> option, this option affects the running
 rather than the loading of the tests. Consequently it supports much broader use,
 including situations involving SetUpFixtures, which are not run if the class
 in question is not loaded. You should use <b>/run</b> in lieu of <b>/fixture</b>
@@ -73,32 +78,30 @@ in most cases.
 <p>This option is provided for backward compatibility. In most cases, you will
 be better served by using the <b>/run</b> option.
 	
-<h4>Specifying the Version of the CLR</h4>
+<h4>Specifying the .NET Framework Version</h4>
 
 <p>Most applications are written to run under a specific version of the CLR.
 A few are designed to operate correctly under multiple versions. In either case,
 it is important to be able to specify the CLR version to be used for testing.</p>
 
-<p>When only one version of the CLR is used, the config files for nunit-gui and
-nunit-console may be set up to specify that version. As a more convenient
-alternative when switching CLRs, you may use the provided <b>clr.bat</b>
-command to specify the version under which NUnit should run.</p>
-
-<p>For example, to run the tests in nunit.tests.dll under the RTM version of 
-the .Net 2.0 framework, use:</p>
+<p>Prior to version 2.5, it was necessary to run the console program itself using
+the CLR version under which you wanted to run tests. This was done either by 
+editing the nunit-console.exe.config file or by setting the COMPLUS_Version
+environment variable before running the program.
 
-<pre class="programtext">       clr net-2.0 nunit-console nunit.tests.dll</pre>
+<p>Under NUnit 2.5 and later versions, you may still use either of these approaches, 
+but a simpler method is available.
 
-<p>The <b>clr.bat</b> file is located in the NUnit <b>bin</b> directory. You may
-put this on your path, or copy it to a convenient location. Enter <b>clr /?</b> 
-for a list of options.</p>
+<p>The <b>/framework</b> option allows you to specify the version of the runtime
+    to be used in executing tests. If that version specified is different from the
+    one being used by NUnit, the tests are run in a separate process. For example,
+    you may enter
+    <pre class="programtext">        nunit-console myassembly.dll /framework:net-1.1</pre>
+</p>
 	
-<p><b>Note:</b> If you use a <startup> section in the config file, it takes
-precedence over this option.</p>
-
-<p><b>Note:</b> This command is specific to the Microsoft .Net 
-framework. The Mono framework provides other means to specify the version
-to be used when running a command.</p>
+<p>This command will run tests under .NET 1.1 even if you are running the .NET 2.0
+	build of the nunit-console. Beginning with version 2.5.3, all versions of .NET 
+	through 4.0 as well	as Mono profiles 1.0, 2.0 and 3.5 are supported.
 
 <h4>Specifying Test Categories to Include or Exclude</h4>
 <p>NUnit provides CategoryAttribute for use in marking tests as belonging to 
@@ -145,21 +148,34 @@ of evaluation is as follows:
 <li>Low-precedence union operator (|)
 </ol>
 
+<p><b>Note:</b> Because the operator characters have special meaning,
+you should avoid creating a category that uses any of them in it's name.
+For example, the category "db-tests" could not be used on the command
+line, since it appears to means "run category db, except for category tests."
+The same limitation applies to characters that have special meaning for
+the shell you are using.
    
 <p>For a clear understanding of how category 
 	selection works, review the documentation for both the 
 	<a href="category.html">Category Attribute</a> and the 
 	<a href="explicit.html">Explicit Attribute</a>.</p>
 <h4>Redirecting Output</h4>
-<p>The output that is normally shown on the console may be redirected to a file. 
-	This includes output created by the test program as well as what NUnit itself 
-	creates. The following command redirects standard output to the TestResult.txt 
-	file:
+<p>Output created by the test, which is normally shown on the console, may be 
+    redirected to a file. The following command redirects standard output to the 
+	file TestResult.txt:
 	<pre class="programtext">        nunit-console nunit.tests.dll /out:TestResult.txt</pre>
 </p>
 <p>The following command redirects standard error output to the StdErr.txt file.
 	<pre class="programtext">        nunit-console nunit.tests.dll /err:StdErr.txt</pre>
 </p>
+
+<p><b>Note:</b>This option only redirects output produced <b>by the tests</b>,
+    together with selected NUnit output that is interspersed with the test output.
+	It does not redirect <b>all</b> console output. If you want to redirect <b>all</b>
+	output to a file, you should use command line redirection as supported by the
+	shell you are using. This option exists for the purpose of separating test
+	output from other output, such as the NUnit summary report.
+
 <h4>Labeling Test Output</h4>
 <p>The output from each test normally follows right after that of the preceding 
 	test. You may use the <b>/labels</b> option to cause an identifying label to be 
@@ -170,18 +186,10 @@ of evaluation is as follows:
 	"console-test.xml" use the following command line option:
 	<pre class="programtext">        nunit-console /xml:console-test.xml nunit.tests.dll</pre>
 </p>
-<h4>Specifying the Transform file</h4>
-<p>The console interface uses XSLT to transform the test results from the XML file 
-	to what is printed to the screen when the program executes. The console 
-	interface has a default transformation that is part of the executable. To 
-	specify your own transformation named "myTransform.xslt" use the 
-	following command line option:
-	<pre class="programtext">        nunit-console /transform:myTransform.xslt nunit.tests.dll</pre>
-</p>
 <p><b>Note:</b> For additional information see the XML schema for the test results. 
 	This file is in the same directory as the executable and is called
 	<a href="files/Results.xsd">Results.xsd</a>. 
-	The default transform <a href="files/Summary.xslt">Summary.xslt</a>	is located in the core source directory.</p>
+
 <h4>Specifying which Configuration to run</h4>
 <p>When running tests from a Visual Studio or NUnit project, the first 
 	configuration found will be loaded by default. Usually this is Debug. The 
@@ -209,6 +217,18 @@ of evaluation is as follows:
 	option, when used with multiple assemblies, will run tests matching the 
 	fixture name in all the assemblies. In earlier versions, only the first
 	test found was executed.</p>
+<h4>Controlling the Use of Processes</h4>
+<p>The <b>/process</b> option controls how NUnit loads tests in processes. The
+   following values are recognized.
+   <dl style="margin-left: 2em">
+   <dt><b>Single</b>
+   <dd>All the tests are run in the nunit-console process. This is the default.
+   <dt><b>Separate</b>
+   <dd>A separate process is created to run the tests.
+   <dt><b>Multiple</b>
+   <dd>A separate process is created for each test assembly, whether specified
+   on the command line or listed in an NUnit project file.
+   </dl>
 <h4>Controlling the Use of AppDomains</h4>
 <p>The <b>/domain</b> option controls of the creation of AppDomains for running tests.
     The following values are recognized:</p>
@@ -223,19 +243,24 @@ of evaluation is as follows:
 	</dl>
 <p>The default is to use multiple domains if multiple assemblies are listed on 
 	the command line. Otherwise a single domain is used.</p>
+	
+<h4>Specifying a Default Timeout Value</h4>
+<p>The <b>/timeout</b> option takes an int value representing the default timeout
+to be used for test cases in this run. If any test exceeds the timeout value,
+it is cancelled and reported as an error. The default value may be overridden
+for selected tests by use of <b>TimeoutAttribute</b>.
+
+<p><b>Note:</b> If you do not use this option, no timeout is set and tests
+may run for any amount of time.
+
 <h4>Other Options</h4>
+<p>The <b>/trace</b> option allows you to control the amount of information that NUnit
+	writes to its internal trace log. Valid values are Off, Error, Warning,Info
+	and Debug. The default is Off.
 <p>The <b>/noshadow</b> option disables shadow copying of the assembly in order to 
 	provide improved performance.</p>
-<p>The <b>/thread</b> option causes a separate thread to be created for running the 
-	tests. This is necessary in cases where the tests must run in a particular type 
-	of apartment. By running in a separate thread, the ApartmentState and 
-	ThreadPriority settings under the
-	<TestRunner>
-	element of the config file will be honored. If no thread is created, these are 
-	ignored and the apartment will be the same as that of the console program.</p>
-<p><b>Note:</b>The apartment state of the console program may change from release 
-	to release, so users requiring a particular apartment should take advantage of 
-	this setting rather than relying on the default.</p>
+<p>The <b>/nothread</b> option suppresses use of a separate thread for running the 
+	tests and uses the main thread instead.</p>
 <p>The <b>/wait</b> option causes the program to wait for user input before 
 	exiting. This is useful when running nunit-console from a shortcut.</p>
 <p>The <b>/xmlconsole</b> option displays raw XML output on the console rather than 
@@ -248,30 +273,41 @@ of evaluation is as follows:
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<ul>
-<li id="current"><a href="consoleCommandLine.html">Command-Line</a></li>
-</ul>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<ul>
+<li><a href="nunit-console.html">Console Runner</a></li>
+<ul>
+<li id="current"><a href="consoleCommandLine.html">Command-Line</a></li>
+</ul>
+<li><a href="nunit-gui.html">Gui Runner</a></li>
+<li><a href="pnunit.html">PNUnit Runner</a></li>
+<li><a href="nunit-agent.html">NUnit Agent</a></li>
+<li><a href="runtimeSelection.html">Runtime Selection</a></li>
+<li><a href="assemblyIsolation.html">Assembly Isolation</a></li>
+<li><a href="configFiles.html">Configuration Files</a></li>
+<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/constraintModel.html b/doc/constraintModel.html
index 369ea97..c010714 100644
--- a/doc/constraintModel.html
+++ b/doc/constraintModel.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -42,28 +42,62 @@ to create an <b>EqualConstraint</b>. The same assertion could also be made in th
    Assert.That() method, which has a number of overloads...
    
 <div class="code" style="width: 36em">
-<pre>Assert.That( object actual, IConstraint constraint )
-Assert.That( object actual, IConstraint constraint, string message )
-Assert.That( object actual, IConstraint constraint, string message, 
-             object[] parms )
+<pre>
+Assert.That( object actual, IResolveConstraint constraint )
+Assert.That( object actual, IResolveConstraint constraint, 
+             string message )
+Assert.That( object actual, IResolveConstraint constraint,
+             string message, object[] parms )
+			 
+Assert.That( ActualValueDelegate del, IResolveConstraint constraint )
+Assert.That( ActualValueDelegate del, IResolveConstraint constraint, 
+             string message )
+Assert.That( ActualValueDelegate del, IResolveConstraint constraint,
+             string message, object[] parms )
+			 
+Assert.That<T>( ref T actual, IResolveConstraint constraint )
+Assert.That<T>( ref T actual, IResolveConstraint constraint, 
+             string message )
+Assert.That<T>( ref T actual, IResolveConstraint constraint,
+             string message, object[] parms )
 			 
 Assert.That( bool condition );
 Assert.That( bool condition, string message );
-Assert.That( bool condition, string message, object[] parms );</pre>
+Assert.That( bool condition, string message, object[] parms );
+
+Assert.That( TestDelegate del, IResolveConstraint constraint );
+</pre>
 </div>
 
 <p>If you derive your test fixture class from <b>AssertionHelper</b>, the
 Expect() method may be used in place of Assert.That()...
 
 <div class="code" style="width: 36em">
-<pre>Expect( object actual, IConstraint constraint )
-Expect( object actual, IConstraint constraint, string message )
-Expect( object actual, IConstraint constraint, string message, 
-             object[] parms )
+<pre>
+Expect( object actual, IResolveConstraint constraint )
+Expect( object actual, IResolveConstraint constraint, 
+             string message )
+Expect( object actual, IResolveConstraint constraint, 
+             string message, object[] parms )
+			 
+Expect( ActualValueDelegate del, IResolveConstraint constraint )
+Expect( ActualValueDelegate del, IResolveConstraint constraint, 
+             string message )
+Expect( ActualValueDelegate del, IResolveConstraint constraint,
+             string message, object[] parms )
+			 
+Expect<T>( ref T actual, IResolveConstraint constraint )
+Expect<T>( ref T actual, IResolveConstraint constraint, 
+             string message )
+Expect<T>( ref T actual, IResolveConstraint constraint,
+             string message, object[] parms )
 			 
 Expect( bool condition );
 Expect( bool condition, string message );
-Expect( bool condition, string message, object[] parms );</pre>
+Expect( bool condition, string message, object[] parms );
+
+Expect( TestDelegate del, IResolveConstraint constraint );
+</pre>
 </div>
 
 <p>The overloads that take a bool work exactly like Assert.IsTrue.
@@ -89,44 +123,43 @@ Expect( bool condition, string message, object[] parms );</pre>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<ul>
-<li><a href="classicModel.html">Classic Model</a></li>
-<li id="current"><a href="constraintModel.html">Constraint Model</a></li>
-<ul>
-<li><a href="equalConstraint.html">Equal Constraint</a></li>
-<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
-<li><a href="conditionConstraints.html">Condition Constraints</a></li>
-<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
-<li><a href="typeConstraints.html">Type Constraints</a></li>
-<li><a href="stringConstraints.html">String Constraints</a></li>
-<li><a href="collectionConstraints.html">Collection Constraints</a></li>
-<li><a href="propertyConstraint.html">Property Constraint</a></li>
-<li><a href="compoundConstraints.html">Compound Constraints</a></li>
-<li><a href="customConstraints.html">Custom Constraints</a></li>
-<li><a href="listMapper.html">List Mapper</a></li>
-</ul>
-</ul>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li id="current"><a href="constraintModel.html">Constraints</a></li>
+<ul>
+<li><a href="equalConstraint.html">Equal Constraint</a></li>
+<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
+<li><a href="conditionConstraints.html">Condition Constraints</a></li>
+<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
+<li><a href="pathConstraints.html">Path Constraints</a></li>
+<li><a href="typeConstraints.html">Type Constraints</a></li>
+<li><a href="stringConstraints.html">String Constraints</a></li>
+<li><a href="collectionConstraints.html">Collection Constraints</a></li>
+<li><a href="propertyConstraint.html">Property Constraint</a></li>
+<li><a href="throwsConstraint.html">Throws Constraint</a></li>
+<li><a href="compoundConstraints.html">Compound Constraints</a></li>
+<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
+<li><a href="listMapper.html">List Mapper</a></li>
+<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
+</ul>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/contextMenu.html b/doc/contextMenu.html
index 9968a99..d796b88 100644
--- a/doc/contextMenu.html
+++ b/doc/contextMenu.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -68,37 +68,48 @@ results in substantial reduction in load time.</p>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<ul>
-<li><a href="guiCommandLine.html">Command-Line</a></li>
-<li><a href="mainMenu.html">Main Menu</a></li>
-<li id="current"><a href="contextMenu.html">Context Menu</a></li>
-<li><a href="optionsDialog.html">Options Dialog</a></li>
-<li><a href="addinsDialog.html">Addins Dialog</a></li>
-<li><a href="testProperties.html">Test Properties</a></li>
-<li><a href="configEditor.html">Configuration Editor</a></li>
-<li><a href="projectEditor.html">Project Editor</a></li>
-</ul>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<ul>
+<li><a href="nunit-console.html">Console Runner</a></li>
+<li><a href="nunit-gui.html">Gui Runner</a></li>
+<ul>
+<li><a href="guiCommandLine.html">Command-Line</a></li>
+<li><a href="mainMenu.html">Main Menu</a></li>
+<li id="current"><a href="contextMenu.html">Context Menu</a></li>
+<li><a href="settingsDialog.html">Settings Dialog</a></li>
+<li><a href="addinsDialog.html">Addins Dialog</a></li>
+<li><a href="testProperties.html">Test Properties</a></li>
+<li><a href="configEditor.html">Configuration Editor</a></li>
+<li><a href="projectEditor.html">Project Editor</a></li>
+</ul>
+<li><a href="pnunit.html">PNUnit Runner</a></li>
+<li><a href="nunit-agent.html">NUnit Agent</a></li>
+<li><a href="runtimeSelection.html">Runtime Selection</a></li>
+<li><a href="assemblyIsolation.html">Assembly Isolation</a></li>
+<li><a href="configFiles.html">Configuration Files</a></li>
+<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/culture.html b/doc/culture.html
index 93465e9..9b403fa 100644
--- a/doc/culture.html
+++ b/doc/culture.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -199,50 +199,74 @@ public class SuccessTests
 
 </div>
 
+<h4>See also...</h4>
+<ul>
+<li><a href="setCulture.html">SetCultureAttribute</a></ul>
+
+
 </div>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<ul>
-<li><a href="category.html">Category</a></li>
-<li id="current"><a href="culture.html">Culture</a></li>
-<li><a href="description.html">Description</a></li>
-<li><a href="exception.html">Expected Exception</a></li>
-<li><a href="explicit.html">Explicit</a></li>
-<li><a href="ignore.html">Ignore</a></li>
-<li><a href="platform.html">Platform</a></li>
-<li><a href="property.html">Property</a></li>
-<li><a href="setCulture.html">SetCulture</a></li>
-<li><a href="setup.html">Setup</a></li>
-<li><a href="setupFixture.html">SetUp Fixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testFixture.html">Test Fixture</a></li>
-<li><a href="fixtureSetup.html">Test Fixture SetUp</a></li>
-<li><a href="fixtureTeardown.html">Test Fixture </a></li>
-</ul>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li><a href="category.html">Category</a></li>
+<li><a href="combinatorial.html">Combinatorial</a></li>
+<li id="current"><a href="culture.html">Culture</a></li>
+<li><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/customAsserts.html b/doc/customAsserts.html
deleted file mode 100644
index 8a166b5..0000000
--- a/doc/customAsserts.html
+++ /dev/null
@@ -1,115 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - CustomAsserts</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<link rel="stylesheet" type="text/css" href="nunit.css">
-<link rel="shortcut icon" href="favicon.ico">
-</head>
-<!-- End Standard Head Part -->
-
-<body>
-
-<!-- Standard Header for NUnit.org -->
-<div id="header">
-  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
-  <div id="nav">
-    <a href="http://www.nunit.org">NUnit</a>
-    <a class="active" href="index.html">Documentation</a>
-  </div>
-</div>
-<!-- End of Header -->
-
-<div id="content">
-
-<h2>Custom Asserts</h2>
-
-<div style="text-align: center; margin: 2em 10%; padding: 4px 0; border: 2px solid black">
-  <h4>Preliminary documentation, subject to change.</h4>
-</div>
-
-<p>Experienced developers using NUnit generally end up with a library of custom
-setup, teardown, test and support methods. Custom Asserts provide one way to
-re-package such methods, allowing the normal NUnit syntax to be used to
-invoke them and providing error messages that match the style and layout
-of standard NUnit messages.</p>
-
-<p>The standard NUnit Asserts create an object known as an <b>asserter</b> and
-pass it to the <b>DoAssert</b> method, which includes code similar to this...
-
-<pre>
-	if ( !asserter.Test() )
-		throw new AssertionException( asserter.Message );
-</pre></p>
-
-<p><b>Asserters</b> encapsulate the comparison to be performed as well as the
-objects being compared. They implement the <b>IAsserter</b> interface, 
-defined as follows:
-
-<pre>
-	public interface IAsserter
-	{
-		// Test the condition for the assertion.
-		bool Test();
-
-		// Return the message giving the failure reason.
-		string Message { get; }
-	}
-</pre></p>
-
-<p>When implementing an <b>asserter</b>, you will have to decide on an approach
-for creating the message. For complex tests, it may be necessary to create
-and cache the message - or info used to create it - while the test is
-being performed. For example, when NUnit compares arrays, it notes the
-point of failure for use in the message. Otherwise, it would have to 
-pass the entire array a second time.</p>
-
-<p>Generally, the constructor for the <b>asserter</b> will include any required
-parameters, the actual value and an optional user message. You may invoke
-the asserter directly, using <b>Assert.DoAssert</b>, but it is generally more 
-convenient and readable to create an class similar to NUNit's <b>Assert</b> class,
-which contains static methods that wrap the object creation. For an example of 
-how to do this, see the <b>StringAssert</b> class in the NUnit source.</p>
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<ul>
-<li><a href="configFiles.html">Configuration Files</a></li>
-<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
-<li><a href="vsSupport.html">Visual Studio Support</a></li>
-<li><a href="extensibility.html">Extensibility</a></li>
-<ul>
-<li id="current"><a href="customAsserts.html">Custom Asserts</a></li>
-<li><a href="nunitAddins.html">NUnit Addins</a></li>
-</ul>
-</ul>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
-</div>
-<!-- End of Submenu -->
-
-
-<!-- Standard Footer for NUnit.org -->
-<div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
-</div>
-<!-- End of Footer -->
-
-</body>
-</html>
diff --git a/doc/customConstraints.html b/doc/customConstraints.html
index 9ed09d6..b9bb25d 100644
--- a/doc/customConstraints.html
+++ b/doc/customConstraints.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -24,19 +24,21 @@
 
 <div id="content">
 
-<h2>Custom Constraints (NUnit 2.4)</h2>
+<h2>Custom Constraints (NUnit 2.4 / 2.5)</h2>
 
 <p>You can implement your own custom constraints by creating a class that 
 inherits from the <b>Constraint</b> abstract class, which supports performing a 
 test on an actual value and generating appropriate messages. The class includes
-two abstract methods, which you must override and two virtual methods which
-may be overridden as needed:
+two abstract methods, which you must override and four virtual methods with
+default implementation that may be overridden as needed:
    
 <div class="code" style="width: 36em">
 <pre>public abstract class Constraint
 {
  	...
     public abstract bool Matches( object actual );
+    public virtual bool Matches( ActualValueDelegate del );
+    public virtual bool Matches<T>( ref T actual );
     public abstract void WriteDescriptionTo( MessageWriter writer );
     public virtual void WriteMessageTo( MessageWriter writer );
     public virtual void WriteActualValueTo( MessageWriter writer );
@@ -49,51 +51,60 @@ field actual for later use.
 
 <p>The MessageWriter abstract class is implemented in the framework by
 TextMessageWriter. Examining the source for some of the builtin constraints
-should give you a good idea of how to use it.
+should give you a good idea of how to use it if you have special formatting
+requirements for error messages.
+
+<h3>Custom Constraint Syntax</h3>
+
+<p>NUnit includes classes that implement a special constraint syntax,
+allowing you to write things like...
+
+<div class="code">
+<pre>Assert.That( myArray, Is.All.InRange(1,100) );</pre>
+</div>
+
+<p>Of course, the NUnit constraint syntax will not be aware of your
+custom constraint unless you modify NUnit itself. As an alternative,
+you may use the <b>Matches(Constraint)</b> syntactic element in order
+to write code like...
+
+<div class="code">
+<pre>MyConstraint myConstraint = new MyConstraint();
+Assert.That( myArray, Has.Some.Matches(myConstraint) );</pre>
+</div>
+
 
 
 </div>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<ul>
-<li><a href="classicModel.html">Classic Model</a></li>
-<li><a href="constraintModel.html">Constraint Model</a></li>
-<ul>
-<li><a href="equalConstraint.html">Equal Constraint</a></li>
-<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
-<li><a href="conditionConstraints.html">Condition Constraints</a></li>
-<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
-<li><a href="typeConstraints.html">Type Constraints</a></li>
-<li><a href="stringConstraints.html">String Constraints</a></li>
-<li><a href="collectionConstraints.html">Collection Constraints</a></li>
-<li><a href="propertyConstraint.html">Property Constraint</a></li>
-<li><a href="compoundConstraints.html">Compound Constraints</a></li>
-<li id="current"><a href="customConstraints.html">Custom Constraints</a></li>
-<li><a href="listMapper.html">List Mapper</a></li>
-</ul>
-</ul>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<ul>
+<li id="current"><a href="customConstraints.html">Custom Constraints</a></li>
+<li><a href="nunitAddins.html">NUnit Addins</a></li>
+<li><a href="extensionTips.html">Tips for Extenders</a></li>
+</ul>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/datapoint.html b/doc/datapoint.html
new file mode 100644
index 0000000..d730a34
--- /dev/null
+++ b/doc/datapoint.html
@@ -0,0 +1,143 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - Datapoint</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>DatapointAttribute / DatapointsAttribute (NUnit 2.5) (Experimental)</h3>
+
+<p>The <b>Datapoint</b> and <b>Datapoints</b> attributes are used
+   to provide data for <b>Theories</b> and are ignored for ordinary
+   tests - including tests with parameters.
+   
+<h4>DataPointAttribute</h4>
+   
+<p>When a Theory is loaded, NUnit creates arguments for each
+   of its parameters by using any fields of the same type
+   as the parameter annotated with the <b>DatapointAttribute</b>.
+   Fields must be members of the class containing the Theory
+   and their Type must exactly match the argument for which
+   data is being supplied.
+   
+<h4>DataPointsAttribute</h4>
+   
+<p>In addition to specifying individual datapoints, collections of
+   datapoints may be provided by use of the <b>DatapointsAttribute</b>
+   - note the spelling. This attribute may be placed on methods or
+   properties in addition to fields. The returned value must be
+   either an array of the required type or (beginning with NUnit
+   2.5.5) an <b>IEnumerable<T></b> returning an enumeration
+   of the required type. The data Type must exactly match the argument 
+   for which data is being supplied.
+   
+<h4>Automatically Supplied Datapoints</h4>
+
+<p>It is normally not necessary to specify datapoints for 
+   <b>boolean</b> or <b>enum</b> arguments. Beginning with
+   version 2.5.4, NUnit automatically supplies values of <b>true</b> 
+   and <b>false</b> for <b>boolean</b> arguments and will supply all 
+   defined values of any enumeration.
+   
+<p>If for some reason you don't wish to use all possible values, you
+   can override this behavior by supplying your own datapoints. If you
+   supply any datapoints for an argument, automatic datapoint generation 
+   is suppressed.
+   
+<h4>Example</h4>
+
+<p>For an example of use, see <a href="theory.html">TheoryAttribute</a>.
+   
+<h4>See also...</h4>
+
+<ul>
+<li><a href="theory.html">TheoryAttribute</a><li><a href="parameterizedTests.html">Parameterized Tests</a></ul>
+   
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li><a href="category.html">Category</a></li>
+<li><a href="combinatorial.html">Combinatorial</a></li>
+<li><a href="culture.html">Culture</a></li>
+<li id="current"><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/datapointProviders.html b/doc/datapointProviders.html
new file mode 100644
index 0000000..586f503
--- /dev/null
+++ b/doc/datapointProviders.html
@@ -0,0 +1,124 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - DatapointProviders</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>DataPointProviders (NUnit 2.5)</h3>
+
+<h4>Purpose</h4>
+<p>DataPointProviders are used to supply data for an individual parameter
+of a parameterized test method.
+
+<h4>Extension Point</h4>
+<p>Addins use the host to access this extension point by name:
+
+<pre>
+	IExtensionPoint listeners = host.GetExtensionPoint( "DataPointProviders" );</pre>
+
+<h4>Interface</h4>
+<p>The extension object passed to Install must implement either the
+   <b>IDataPointProvider</b> or the <b>IDataPointProvider2</b> interface:
+
+<pre>
+	public interface IDataPointProvider
+	{
+		bool HasDataFor( ParameterInfo parameter );
+		IEnumerable GetDataFor( ParameterInfo parameter );
+	}
+	
+	public interface IDataPointProvider2 : IDatapointProvider
+	{
+		bool HasDataFor( ParameterInfo parameter, Test parentSuite );
+		IEnumerable GetDataFor( ParameterInfo parameter, Test parentSuite );
+	}
+</pre>
+
+<p>NUnit will call <b>IDataPointProvider2</b> if it is available. Otherwise
+   <b>IDataPointProvider</b> will be used.
+
+<p>The <b>HasDataFor</b> method should return true if the provider is able to
+   supply data for the specified parameter. If a provider only wants to be used 
+   on certain types of tests, it can examine the supplied ParameterInfo and
+   its associated MethodInfo and Type and/or the parent test suite.
+
+<p>The <b>GetDataFor</b> method should return a list of individual values to
+   use for the supplied parameter in running the test.
+   
+<h4>Notes:</h4>
+
+<ol>
+<li>Most providers will delegate one of the interface implementations
+    to the other if they implement both.
+<li>DataPointProviders that use data from the fixture class should use 
+    <b>IDataPointProvider2</b> interface so that they are able to access any 
+	arguments supplied for constructing the fixture object.
+<li>Providers that acquire data from outside the fixture will usually
+    be able to work with <b>IDataPointProvider</b> alone.
+<li>The <b>IDataPointProvider2</b> interface was added in the NUnit 2.5.1 release.
+</ol>
+   
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<ul>
+<li><a href="customConstraints.html">Custom Constraints</a></li>
+<li><a href="nunitAddins.html">NUnit Addins</a></li>
+<ul>
+<li><a href="suiteBuilders.html">SuiteBuilders</a></li>
+<li><a href="testcaseBuilders.html">TestcaseBuilders</a></li>
+<li><a href="testDecorators.html">TestDecorators</a></li>
+<li><a href="testcaseProviders.html">TestcaseProviders</a></li>
+<li id="current"><a href="datapointProviders.html">DatapointProviders</a></li>
+<li><a href="eventListeners.html">EventListeners</a></li>
+</ul>
+<li><a href="extensionTips.html">Tips for Extenders</a></li>
+</ul>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/delayedConstraint.html b/doc/delayedConstraint.html
new file mode 100644
index 0000000..c95cbcb
--- /dev/null
+++ b/doc/delayedConstraint.html
@@ -0,0 +1,94 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - DelayedConstraint</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Delayed Constraint (NUnit 2.5)</h2>
+
+<p><b>DelayedConstraint</b> delays the application of another constraint until a certain
+   amount of time has passed. In it's simplest form, it replaces use of a Sleep 
+   in the code but it also supports polling, which may allow use of a longer 
+   maximum time while still keeping the tests as fast as possible. 
+   
+<p>The <b>After</b> modifier is permitted on any constraint, and the delay applies to 
+   the entire expression up to the point where <b>After</b> appears. 
+
+<p>Use of a <b>DelayedConstraint</b> with a value argument makes no sense, since 
+   the value will be extracted at the point of call. It's intended use is with 
+   delegates and references. If a delegate is used with polling, it may be called 
+   multiple times so only methods without side effects should be used in this way. 
+
+<table class="constraints">
+<tr><th>Syntax Helper</th><th>Constructor</th><th>Operation</th></tr>
+<tr><td>After(int)</td><td>DelayedConstraint(Constraint, int)</td></td><td>tests that a constraint is satisfied after a delay.</tr>
+<tr><td>After(int, int)</td><td>DelayedConstraint(Constraint, int, int)</td></td><td>tests that a constraint is satisfied after a delay using polling.</tr>
+</table>
+
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<ul>
+<li><a href="equalConstraint.html">Equal Constraint</a></li>
+<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
+<li><a href="conditionConstraints.html">Condition Constraints</a></li>
+<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
+<li><a href="pathConstraints.html">Path Constraints</a></li>
+<li><a href="typeConstraints.html">Type Constraints</a></li>
+<li><a href="stringConstraints.html">String Constraints</a></li>
+<li><a href="collectionConstraints.html">Collection Constraints</a></li>
+<li><a href="propertyConstraint.html">Property Constraint</a></li>
+<li><a href="throwsConstraint.html">Throws Constraint</a></li>
+<li><a href="compoundConstraints.html">Compound Constraints</a></li>
+<li id="current"><a href="delayedConstraint.html">Delayed Constraint</a></li>
+<li><a href="listMapper.html">List Mapper</a></li>
+<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
+</ul>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/description.html b/doc/description.html
index 976b453..7f52f8a 100644
--- a/doc/description.html
+++ b/doc/description.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -131,46 +131,65 @@ new applciations. If both are used, the Description attribute takes precedence.<
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<ul>
-<li><a href="category.html">Category</a></li>
-<li><a href="culture.html">Culture</a></li>
-<li id="current"><a href="description.html">Description</a></li>
-<li><a href="exception.html">Expected Exception</a></li>
-<li><a href="explicit.html">Explicit</a></li>
-<li><a href="ignore.html">Ignore</a></li>
-<li><a href="platform.html">Platform</a></li>
-<li><a href="property.html">Property</a></li>
-<li><a href="setCulture.html">SetCulture</a></li>
-<li><a href="setup.html">Setup</a></li>
-<li><a href="setupFixture.html">SetUp Fixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testFixture.html">Test Fixture</a></li>
-<li><a href="fixtureSetup.html">Test Fixture SetUp</a></li>
-<li><a href="fixtureTeardown.html">Test Fixture </a></li>
-</ul>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li><a href="category.html">Category</a></li>
+<li><a href="combinatorial.html">Combinatorial</a></li>
+<li><a href="culture.html">Culture</a></li>
+<li><a href="datapoint.html">Datapoint(s)</a></li>
+<li id="current"><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/directoryAssert.html b/doc/directoryAssert.html
new file mode 100644
index 0000000..1db9de5
--- /dev/null
+++ b/doc/directoryAssert.html
@@ -0,0 +1,168 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - DirectoryAssert</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>DirectoryAssert (NUnit 2.5)</h2>
+<p>The DirectoryAssert class provides methods for making asserts about
+file system directories, which may be provided as DirectoryInfos or as strings 
+giving the path to each directory.</p>
+
+<p> <b>DirectoryAssert.AreEqual()</b> and <b>DirectoryAssert.AreNotEqual()</b>
+compare two directories for equality. Directories are considered equal if
+they have the same FullName, Attributes, CreationTime and LastAccessTime.
+
+<p><b>Note:</b> Two different directories containing the same files are not
+considered to be equal.
+
+<div class="code" style="width: 40em"><pre>
+
+DirectoryAssert.AreEqual( DirectoryInfo expected, DirectoryInfo actual );
+DirectoryAssert.AreEqual( DirectoryInfo expected, DirectoryInfo actual, 
+                string message );
+DirectoryAssert.AreEqual( DirectoryInfo expected, DirectoryInfo actual,
+                string message, params object[] args );
+
+DirectoryAssert.AreEqual( string expected, string actual );
+DirectoryAssert.AreEqual( string expected, string actual, 
+                string message );
+DirectoryAssert.AreEqual( string expected, string actual,
+                string message, params object[] args );
+
+DirectoryAssert.AreNotEqual( DirectoryInfo expected, DirectoryInfo actual );
+DirectoryAssert.AreNotEqual( DirectoryInfo expected, DirectoryInfo actual, 
+                string message );
+DirectoryAssert.AreNotEqual( DirectoryInfo expected, DirectoryInfo actual,
+                string message, params object[] args );
+
+DirectoryAssert.AreNotEqual( string expected, string actual );
+DirectoryAssert.AreNotEqual( string expected, string actual, 
+                string message );
+DirectoryAssert.AreNotEqual( string expected, string actual,
+                string message, params object[] args );
+
+</pre></div>
+
+<p><b>DirectoryAssert.IsEmpty()</b> and <b>DirectoryAssert.IsNotEmpty()</b>
+test whether the specified directory is empty.
+
+<div class="code" style="width: 40em"><pre>
+
+DirectoryAssert.IsEmpty( DirectoryInfo directory );
+DirectoryAssert.IsEmpty( DirectoryInfo directory, string message );
+DirectoryAssert.IsEmpty( DirectoryInfo directory,
+                string message, params object[] args );
+
+DirectoryAssert.IsEmpty( string directory );
+DirectoryAssert.IsEmpty( string directory, string message );
+DirectoryAssert.IsEmpty( string directory,
+                string message, params object[] args );
+
+DirectoryAssert.IsNotEmpty( DirectoryInfo directory );
+DirectoryAssert.IsNotEmpty( DirectoryInfo directory, string message );
+DirectoryAssert.IsNotEmpty( DirectoryInfo directory,
+                string message, params object[] args );
+
+DirectoryAssert.IsNotEmpty( string directory );
+DirectoryAssert.IsNotEmpty( string directory, string message );
+DirectoryAssert.IsNotEmpty( string directory,
+                string message, params object[] args );
+
+</pre></div>
+
+<p><b>DirectoryAssert.IsWithin()</b> and <b>DirectoryAssert.IsNotWithin()</b>
+test whether the second directory is a direct or indirect subdirectory
+of the first directory.
+
+<div class="code" style="width: 40em"><pre>
+
+DirectoryAssert.IsWithin( DirectoryInfo expected, DirectoryInfo actual );
+DirectoryAssert.IsWithin( DirectoryInfo expected, DirectoryInfo actual,
+                string message );
+DirectoryAssert.IsWithin( DirectoryInfo expected, DirectoryInfo actual,
+                string message, params object[] args );
+
+DirectoryAssert.IsWithin( string expected, string actual );
+DirectoryAssert.IsWithin( string expected, string actual,
+                string message );
+DirectoryAssert.IsWithin( string expected, string actual,
+                string message, params object[] args );
+
+DirectoryAssert.IsNotWithin( DirectoryInfo expected, DirectoryInfo actual );
+DirectoryAssert.IsNotWithin( DirectoryInfo expected, DirectoryInfo actual,
+                string message );
+DirectoryAssert.IsNotWithin( DirectoryInfo expected, DirectoryInfo actual,
+                string message, params object[] args );
+
+DirectoryAssert.IsNotWithin( string expected, string actual );
+DirectoryAssert.IsNotWithin( string expected, string actual,
+                string message );
+DirectoryAssert.IsNotWithin( string expected, string actual,
+                string message, params object[] args );
+
+</pre></div>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<ul>
+<li><a href="equalityAsserts.html">Equality Asserts</a></li>
+<li><a href="identityAsserts.html">Identity Asserts</a></li>
+<li><a href="conditionAsserts.html">Condition Asserts</a></li>
+<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
+<li><a href="typeAsserts.html">Type Asserts</a></li>
+<li><a href="exceptionAsserts.html">Exception Asserts</a></li>
+<li><a href="utilityAsserts.html">Utility Methods</a></li>
+<li><a href="stringAssert.html">String Assert</a></li>
+<li><a href="collectionAssert.html">Collection Assert</a></li>
+<li><a href="fileAssert.html">File Assert</a></li>
+<li id="current"><a href="directoryAssert.html">Directory Assert</a></li>
+</ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/equalConstraint.html b/doc/equalConstraint.html
index 6bd2b08..1dd32c1 100644
--- a/doc/equalConstraint.html
+++ b/doc/equalConstraint.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -24,63 +24,127 @@
 
 <div id="content">
 
-<h2>Equal Constraint (NUnit 2.4)</h2>
+<h2>Equal Constraint (NUnit 2.4 / 2.5)</h2>
 
 <p>An EqualConstraint is used to test whether an actual value
-   is equal to the expected value supplied in its constructor.
+   is equal to the expected value supplied in its constructor,
+   optionally within a specified tolerance.
 
-<table class="constraints">
-<tr><th>Syntax Helper</th><th>Constructor</th><th>Operation</th></tr>
-<tr><td>Is.EqualTo( object )</td><td>EqualConstraint( null )</td></td><td>tests that two objects are equal</td></tr>
-</table>
+<h4>Constructor</h4>
+<div class="code"><pre>
+EqualConstraint(object expected )
+</pre></div>
 
-<h4>Notes</h4>
-<ol>
-<li><p>Numerics of different types compare successfully if their values are equal.
-<li><p>Values of type float and double are normally compared using an additional
-	argument that indicates a tolerance within which they will be considered 
-	as equal. The <b>Within</b> modifier is used for this purpose. Beginning with
-	NUnit 2.4.2, a tolerance may be specified for other numeric types as well.
-<li><p>Beginning with NUnit 2.4.4, float and double comparisons for which no 
-	tolerance is specified use a default, use the value of
-	<b>GlobalSettings.DefaultFloatingPointTolerance</b>. If this is not
-	set, a tolerance of 0.0d is used.
-<li><p>Beginning with NUnit 2.4, equality comparisons of <b>DateTime</b> values
-	may use a <b>TimeSpan</b> as a tolerannce.
-<li><p>Unlike normal floating point arithmetic, floating NaN comparisons succeed
-    if both values are NaN. See the note on 
-	<a href="equalityAsserts.html">Equality Asserts</a>.
-<li><p>You may use this constraint to compare arrays with the same number of dimensions,
-   two collections or an single-dimensioned array and collection. If you want to 
-   treat the arrays being compared as simple collections, use the <b>AsCollection</b>
-   modifier, which causes the comparison to be made element by element, without
-   regard for the rank or dimensions of the array. Jagged arrays (arrays of arrays)
-   are compared recursively and must match in shape exactly for the comparison
-   to succeed.
-<li><p>In order to assert that two strings are equal ignoring case, use the <b>IgnoreCase</b>
-   modifier. It may also be used when comparing arrays or collections of strings.
-<li><p>When an equality test between two strings fails, the relevant portion of
-	of both strings is displayed in the error message, clipping the strings to
-	fit the length of the line as needed. Beginning with 2.4.4, this behavior
-	may be modified by use of the <b>NoClip</b> modifier on the constraint. In
-	addition, the maximum line length may be modified for all tests by setting
-	the value of <b>TextMessageWriter.MaximumLineLength</b> in the appropriate
-	level of setup.
-</ol>
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.EqualTo( object expected )
+</pre></div>
 
-<h4>Examples of Use</h4>
+<h4>Modifiers</h4>
+<div class="code"><pre>
+...IgnoreCase
+...AsCollection
+...NoClip
+...Within(object tolerance)
+      .Ulps
+      .Percent
+      .Days
+      .Hours
+      .Minutes
+      .Seconds
+      .Milliseconds
+      .Ticks
+...Using(IEqualityComparer comparer)
+...Using(IEqualityComparer<T> comparer)
+...Using(IComparer comparer)
+...Using<T>(IComparer<T> comparer)
+...Using<T>(Comparison<T> comparer)
+</pre></div>
 
-<div class="code" style="width: 40em"><pre>
-Assert.That(2 + 2, Is.EqualTo(4));
+<h4>Comparing Numerics</h4>
+<p>Numerics are compared based on their values. Different types
+   may be compared successfully if their values are equal.
+   
+<p>Using the <b>Within</b> modifier, numerics may be tested
+for equality within a fixed or percent tolerance.
+
+<div class="code"><pre>
+Assert.That(2 + 2, Is.EqualTo(4.0));
 Assert.That(2 + 2 == 4);
 Assert.That(2 + 2, Is.Not.EqualTo(5));
 Assert.That(2 + 2 != 5);
 Assert.That( 5.0, Is.EqualTo( 5 );
+Assert.That( 5.5, Is.EqualTo( 5 ).Within(0.075);
+Assert.That( 5.5, Is.EqualTo( 5 ).Within(1.5).Percent;
+</pre></div>
+
+<h4>Comparing Floating Point Values</h4>
+<p>Values of type float and double are normally compared using a tolerance
+specified by the <b>Within</b> modifier. The special values PositiveInfinity, 
+NegativeInfinity and NaN compare
+as equal to themselves.
+
+<p>With version 2.5, floating-point values may be compared using a tolerance
+in "Units in the Last Place" or ULPs. For certain types of numerical work,
+this is safer than a fixed tolerance because it automatically compensates
+for the added inaccuracy of larger numbers.
+
+<div class="code" style="width: 42em"><pre>
 Assert.That( 2.1 + 1.2, Is.EqualTo( 3.3 ).Within( .0005 );
 Assert.That( double.PositiveInfinity, Is.EqualTo( double.PositiveInfinity ) );
 Assert.That( double.NegativeInfinity, Is.EqualTo( double.NegativeInfinity ) );
 Assert.That( double.NaN, Is.EqualTo( double.NaN ) );
+Assert.That( 20000000000000004.0, Is.EqualTo(20000000000000000.0).Within(1).Ulps);
+</pre></div>
+
+<h4>Comparing Strings</h4>
+
+<p>String comparisons normally respect case. The <b>IgnoreCase</b> modifier 
+   causes the comparison to be case-insensitive. It may also be used when 
+   comparing arrays or collections of strings.
+
+<div class="code"><pre>
+Assert.That( "Hello!", Is.Not.EqualTo( "HELLO!" ) );
+Assert.That( "Hello!", Is.EqualTo( "HELLO!" ).IgnoreCase );
+
+string[] expected = new string[] { "Hello", World" };
+string[] actual = new string[] { "HELLO", "world" };
+Assert.That( actual, Is.EqualTo( expected ).IgnoreCase;
+</pre></div>
+
+<h4>Comparing DateTimes and TimeSpans</h4>
 
+<p><b>DateTimes</b> and <b>TimeSpans</b> may be compared either with or without
+   a tolerance. A tolerance is specified using <b>Within</b> with either a 
+   <b>TimeSpan</b> as an argument or with a numeric value followed by a one of 
+   the time conversion modifiers: <b>Days</b>, <b>Hours</b>, <b>Minutes</b>,
+   <b>Seconds</b>, <b>Milliseconds</b> or <b>Ticks</b>.
+
+<div class="code"><pre>
+DateTime now = DateTime.Now;
+DateTime later = now + TimeSpan.FromHours(1.0);
+
+Assert.That( now, Is.EqualTo(now) );
+Assert.That( later. Is.EqualTo(now).Within(TimeSpan.FromHours(3.0);
+Assert.That( later, Is.EqualTo(now).Within(3).Hours;
+</pre></div>
+
+<h4>Comparing Arrays and Collections</h4>
+
+<p>Since version 2.2, NUnit has been able to compare two single-dimensioned arrays.
+    Beginning with version 2.4, multi-dimensioned arrays, nested arrays (arrays of arrays)
+	and collections may be compared. With version 2.5, any IEnumerable is supported.
+	Two arrays, collections or IEnumerables are considered equal if they have the
+	the same dimensions and if each of the corresponding elements is equal.</p>
+	
+<p>If you want to treat two arrays of different shapes as simple collections 
+   for purposes of comparison, use the <b>AsCollection</b> modifier, which causes 
+   the comparison to be made element by element, without regard for the rank or 
+   dimensions of the array. Note that jagged arrays (arrays of arrays) do not
+   have a single underlying collection. The modifier would be applied
+   to each array separately, which has no effect in most cases. 
+
+<div class="code"><pre>
 int[] i3 = new int[] { 1, 2, 3 };
 double[] d3 = new double[] { 1.0, 2.0, 3.0 };
 int[] iunequal = new int[] { 1, 3, 2 };
@@ -89,62 +153,121 @@ Assert.That(i3, Is.Not.EqualTo(iunequal));
 
 int array2x2 = new int[,] { { 1, 2 } { 3, 4 } };
 int array4 = new int[] { 1, 2, 3, 4 };		
-Assert.That( array2x2, Is.EqualTo( array4 ) ); // Fails
-Assert.That( array2x2, Is.EqualTo( array4 ).AsCollection ); // Succeeds
+Assert.That( array2x2, Is.Not.EqualTo( array4 ) );
+Assert.That( array2x2, Is.EqualTo( array4 ).AsCollection );
+</pre></div>
 
-Assert.That( "Hello!", Is.EqualTo( "HELLO!" ).IgnoreCase );
+<h4>Comparing Dictionaries</h4>
 
-string[] expected = new string[] { "Hello", World" };
-string[] actual = new string[] { "HELLO", "world" };
-Assert.That( actual, Is.EqualTo( expected ).IgnoreCase;
+<p>Dictionaries implement <b>ICollection</b>, and NUnit has treated
+them as collections since version 2.4. However, this did not
+give useful results, since the dictionary entries had to be
+in the same order for the comparison to succeed and the 
+underlying implementation had to be the same.
+
+<p>Beginning with NUnit 2.5.6, NUnit has specific code for
+comparing dictionaries. Two dictionaries are considered equal if
+
+<ol>
+<li>The list of keys is the same - without regard to ordering.
+<li>The values associated with each key are equal.
+</ol>
+
+<p>You can use this capability to compare any two objects implementing
+<b>IDictionary</b>. Generic and non-generic dictionaries (Hashtables) 
+may be successfully compared.
+
+<h4>User-Specified Comparers</h4>
 
-// Using inheritance
-Expect( i3, EqualTo( d3 ) );
-Expect( i3, Not.EqualTo( iunequal ) );
+<p>If the default NUnit or .NET behavior for testing equality doesn't
+meet your needs, you can supply a comparer of your own through the
+<b>Using</b> modifier. When used with <b>EqualConstraint</b>, you
+may supply an <b>IEqualityComparer</b>, <b>IEqualityComparer<T></b>,
+<b>IComparer</b>, <b>IComparer<T&gt</b>; or <b>Comparison<T></b> 
+as the argument to <b>Using</b>.
+
+<div class="code"><pre>
+Assert.That( myObj1, Is.EqualTo( myObj2 ).Using( myComparer ) );
 </pre></div>
 
+<h4>Notes</h4>
+<ol>
+<li><p>When checking the equality of user-defined classes, NUnit makes use 
+    of the <b>Equals</b> override on the expected object. If you neglect to 
+	override <b>Equals</b>, you can expect failures non-identical objects. 
+	In particular, overriding <b>operator==</b> without overriding <b>Equals</b>
+	has no effect.
+<li><p>The <b>Within</b> modifier was originally designed for use with floating point
+    values only. Beginning with NUnit 2.4, comparisons of <b>DateTime</b> values 
+	may use a <b>TimeSpan</b> as a tolerance. Beginning with NUnit 2.4.2, 
+	non-float numeric comparisons may also specify a tolerance.
+<li><p>Beginning with NUnit 2.4.4, float and double comparisons for which no 
+	tolerance is specified use a default, use the value of
+	<b>GlobalSettings.DefaultFloatingPointTolerance</b>. If this is not
+	set, a tolerance of 0.0d is used.
+<li><p>Prior to NUnit 2.2.3, comparison of two NaN values would always fail,
+    as specified by IEEE floating point standards. The new behavior, was
+	introduced after some discussion becuase it seems more useful in tests. 
+	To avoid confusion, consider using <b>Is.NaN</b> where appropriate.
+<li><p>When an equality test between two strings fails, the relevant portion of
+	of both strings is displayed in the error message, clipping the strings to
+	fit the length of the line as needed. Beginning with 2.4.4, this behavior
+	may be modified by use of the <b>NoClip</b> modifier on the constraint. In
+	addition, the maximum line length may be modified for all tests by setting
+	the value of <b>TextMessageWriter.MaximumLineLength</b> in the appropriate
+	level of setup.
+<li><p>When used with arrays, collections or dictionaries, EqualConstraint 
+    operates recursively. Any modifiers are saved and used as they apply to 
+	individual items.
+<li><p>A user-specified comparer will not be called by <b>EqualConstraint</b>
+    if either or both arguments are null. If both are null, the Constraint
+	succeeds. If only one is null, it fails.
+<li><p>NUnit has special semantics for comparing <b>Streams</b> and
+<b>DirectoryInfos</b>. For a <b>Stream</b>, the contents are compared.
+For a <b>DirectoryInfo</b>, the first-level directory contents are compared.
+</ol>
+
 </div>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<ul>
-<li><a href="classicModel.html">Classic Model</a></li>
-<li><a href="constraintModel.html">Constraint Model</a></li>
-<ul>
-<li id="current"><a href="equalConstraint.html">Equal Constraint</a></li>
-<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
-<li><a href="conditionConstraints.html">Condition Constraints</a></li>
-<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
-<li><a href="typeConstraints.html">Type Constraints</a></li>
-<li><a href="stringConstraints.html">String Constraints</a></li>
-<li><a href="collectionConstraints.html">Collection Constraints</a></li>
-<li><a href="propertyConstraint.html">Property Constraint</a></li>
-<li><a href="compoundConstraints.html">Compound Constraints</a></li>
-<li><a href="customConstraints.html">Custom Constraints</a></li>
-<li><a href="listMapper.html">List Mapper</a></li>
-</ul>
-</ul>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<ul>
+<li id="current"><a href="equalConstraint.html">Equal Constraint</a></li>
+<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
+<li><a href="conditionConstraints.html">Condition Constraints</a></li>
+<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
+<li><a href="pathConstraints.html">Path Constraints</a></li>
+<li><a href="typeConstraints.html">Type Constraints</a></li>
+<li><a href="stringConstraints.html">String Constraints</a></li>
+<li><a href="collectionConstraints.html">Collection Constraints</a></li>
+<li><a href="propertyConstraint.html">Property Constraint</a></li>
+<li><a href="throwsConstraint.html">Throws Constraint</a></li>
+<li><a href="compoundConstraints.html">Compound Constraints</a></li>
+<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
+<li><a href="listMapper.html">List Mapper</a></li>
+<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
+</ul>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/equalityAsserts.html b/doc/equalityAsserts.html
index a4935ba..a65b9ca 100644
--- a/doc/equalityAsserts.html
+++ b/doc/equalityAsserts.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -144,42 +144,40 @@ values are tested for exact equality.
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<ul>
-<li><a href="classicModel.html">Classic Model</a></li>
-<ul>
-<li id="current"><a href="equalityAsserts.html">Equality Asserts</a></li>
-<li><a href="identityAsserts.html">Identity Asserts</a></li>
-<li><a href="conditionAsserts.html">Condition Tests</a></li>
-<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
-<li><a href="typeAsserts.html">Type Asserts</a></li>
-<li><a href="utilityAsserts.html">Utility Methods</a></li>
-<li><a href="stringAssert.html">String Assert</a></li>
-<li><a href="collectionAssert.html">Collection Assert</a></li>
-<li><a href="fileAssert.html">File Assert</a></li>
-</ul>
-<li><a href="constraintModel.html">Constraint Model</a></li>
-</ul>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<ul>
+<li id="current"><a href="equalityAsserts.html">Equality Asserts</a></li>
+<li><a href="identityAsserts.html">Identity Asserts</a></li>
+<li><a href="conditionAsserts.html">Condition Asserts</a></li>
+<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
+<li><a href="typeAsserts.html">Type Asserts</a></li>
+<li><a href="exceptionAsserts.html">Exception Asserts</a></li>
+<li><a href="utilityAsserts.html">Utility Methods</a></li>
+<li><a href="stringAssert.html">String Assert</a></li>
+<li><a href="collectionAssert.html">Collection Assert</a></li>
+<li><a href="fileAssert.html">File Assert</a></li>
+<li><a href="directoryAssert.html">Directory Assert</a></li>
+</ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/eventListeners.html b/doc/eventListeners.html
new file mode 100644
index 0000000..f7467bb
--- /dev/null
+++ b/doc/eventListeners.html
@@ -0,0 +1,105 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - EventListeners</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>EventListeners (NUnit 2.4.4)</h3>
+
+<h4>Purpose</h4>
+<p>EventListeners are able to respond to events that occur in the course
+of a test run, usually by recording information of some kind. Note that
+EventListeners called asynchronously with respect to test execution and
+are not able to affect the actual execution of the test.
+
+<h4>Extension Point</h4>
+<p>Addins use the host to access this extension point by name:
+
+<pre>
+	IExtensionPoint listeners = host.GetExtensionPoint( "EventListeners" );</pre>
+
+<h4>Interface</h4>
+<p>The extension object passed to Install must implement the EventListener interface:
+
+<pre>
+	public interface EventListener
+	{
+		void RunStarted( string name, int testCount );
+		void RunFinished( TestResult result );
+		void RunFinished( Exception exception );
+		void TestStarted(TestName testName);
+		void TestFinished(TestResult result);
+		void SuiteStarted(TestName testName);
+		void SuiteFinished(TestResult result);
+		void UnhandledException( Exception exception );
+		void TestOutput(TestOutput testOutput);
+	}
+</pre>
+
+<p>You must provide all the methods, but the body may be empty for any
+that you have no need of.
+
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<ul>
+<li><a href="customConstraints.html">Custom Constraints</a></li>
+<li><a href="nunitAddins.html">NUnit Addins</a></li>
+<ul>
+<li><a href="suiteBuilders.html">SuiteBuilders</a></li>
+<li><a href="testcaseBuilders.html">TestcaseBuilders</a></li>
+<li><a href="testDecorators.html">TestDecorators</a></li>
+<li><a href="testcaseProviders.html">TestcaseProviders</a></li>
+<li><a href="datapointProviders.html">DatapointProviders</a></li>
+<li id="current"><a href="eventListeners.html">EventListeners</a></li>
+</ul>
+<li><a href="extensionTips.html">Tips for Extenders</a></li>
+</ul>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/exception.html b/doc/exception.html
index 0e30185..13626d9 100644
--- a/doc/exception.html
+++ b/doc/exception.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -85,7 +85,9 @@ follows:</p>
     /// Expect a message containing the parameter string
     Contains,
     /// Match the regular expression provided as a parameter
-    Regex
+    Regex,
+    /// Expect a message starting with the parameter string
+    StartsWith
 }</pre></div>
 
 <p>The following example is for a test that passes only if an ArgumentException
@@ -249,46 +251,65 @@ namespace NUnitTests {
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<ul>
-<li><a href="category.html">Category</a></li>
-<li><a href="culture.html">Culture</a></li>
-<li><a href="description.html">Description</a></li>
-<li id="current"><a href="exception.html">Expected Exception</a></li>
-<li><a href="explicit.html">Explicit</a></li>
-<li><a href="ignore.html">Ignore</a></li>
-<li><a href="platform.html">Platform</a></li>
-<li><a href="property.html">Property</a></li>
-<li><a href="setCulture.html">SetCulture</a></li>
-<li><a href="setup.html">Setup</a></li>
-<li><a href="setupFixture.html">SetUp Fixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testFixture.html">Test Fixture</a></li>
-<li><a href="fixtureSetup.html">Test Fixture SetUp</a></li>
-<li><a href="fixtureTeardown.html">Test Fixture </a></li>
-</ul>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li><a href="category.html">Category</a></li>
+<li><a href="combinatorial.html">Combinatorial</a></li>
+<li><a href="culture.html">Culture</a></li>
+<li><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li id="current"><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/exceptionAsserts.html b/doc/exceptionAsserts.html
new file mode 100644
index 0000000..0a2718c
--- /dev/null
+++ b/doc/exceptionAsserts.html
@@ -0,0 +1,234 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - ExceptionAsserts</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Exception Asserts (NUnit 2.5)</h2>
+
+<p>The <b>Assert.Throws</b> method is pretty much in a class by itself. Rather than
+   comparing values, it attempts to invoke a code snippet, represented as
+   a delegate, in order to verify that it throws a particular exception.
+   
+<p>It's also in a class by itself in that it returns an Exception, rather
+    than void, if the Assert is successful. See the example below for
+	a few ways to use this.
+   
+<p><b>Assert.Throws</b> may be used with a constraint argument, which is applied
+   to the actual exception thrown, or with the Type of exception expected.
+   The Type format is available in both both a non-generic and (in the .NET 2.0 version)
+   generic form.
+   
+<p><b>Assert.DoesNotThrow</b> simply verifies that the delegate does not throw
+   an exception.
+   
+<p><b>Assert.Catch</b> is similar to <b>Assert.Throws</b> but will pass for an exception
+   that is derived from the one specified.
+   
+<div class="code" style="width: 40em"><pre>
+Exception Assert.Throws( Type expectedExceptionType, TestDelegate code );
+Exception Assert.Throws( Type expectedExceptionType, TestDelegate code, 
+		string message );
+Exception Assert.Throws( Type expectedExceptionType, TestDelegate code, 
+		string message, params object[] parms);
+
+Exception Assert.Throws( IResolveConstraint constraint, TestDelegate code );
+Exception Assert.Throws( IResolveConstraint constraint, TestDelegate code, 
+		string message );
+Exception Assert.Throws( IResolveConstraint constraint, TestDelegate code, 
+		string message, params object[] parms);
+
+T Assert.Throws<T>( TestDelegate code );
+T Assert.Throws<T>( TestDelegate code, string message );
+T Assert.Throws<T>( TestDelegate code, string message, 
+		params object[] parms);
+		
+void Assert.DoesNotThrow( TestDelegate code );
+void Assert.DoesNotThrow( TestDelegate code, string message );
+void Assert.DoesNotThrow( TestDelegate code, string message, 
+        params object[] parms);
+
+Exception Assert.Catch( TestDelegate code );
+Exception Assert.Catch( TestDelegate code, string message );
+Exception Assert.Catch( TestDelegate code, string message, 
+        params object[] parms);
+
+Exception Assert.Catch( Type expectedExceptionType, TestDelegate code );
+Exception Assert.Catch( Type expectedExceptionType, TestDelegate code, 
+		string message );
+Exception Assert.Catch( Type expectedExceptionType, TestDelegate code, 
+		string message, params object[] parms);
+
+T Assert.Catch<T>( TestDelegate code );
+T Assert.Catch<T>( TestDelegate code, string message );
+T Assert.Catch<T>( TestDelegate code, string message, 
+		params object[] parms);
+</pre></div>
+
+<p>In the above code <b>TestDelegate</b> is a delegate of the form
+<b>void TestDelegate()</b>, which is used to execute the code
+in question. Under .NET 2.0, this may be an anonymous delegate.
+If compiling under C# 3.0, it may be a lambda expression.
+
+<p>The following example shows different ways of writing the
+same test.
+
+<div class="code"><pre>
+[TestFixture]
+public class AssertThrowsTests
+{
+  [Test]
+  public void Tests()
+  {
+    // .NET 1.x
+    Assert.Throws( typeof(ArgumentException),
+      new TestDelegate(MethodThatThrows) );
+	  
+    // .NET 2.0
+    Assert.Throws<ArgumentException>( MethodThatThrows() );
+
+    Assert.Throws<ArgumentException>(
+	  delegate { throw new ArgumentException(); } );
+
+    // Using C# 3.0	  
+    Assert.Throws<ArgumentException>(
+      () => throw new ArgumentException(); } );
+  }
+  
+  void MethodThatThrows()
+  {
+    throw new ArgumentException();
+  }
+
+</pre></div>
+
+<p>This example shows use of the return value to perform
+additional verification of the exception.
+
+<div class="code"><pre>
+[TestFixture]
+public class UsingReturnValue
+{
+  [Test]
+  public void TestException()
+  {
+    MyException ex = Assert.Throws<MyException>(
+      delegate { throw new MyException( "message", 42 ); } );
+    Assert.That( ex.Message, Is.EqualTo( "message" ) );
+    Assert.That( ex.MyParam, Is.EqualTo( 42 ) ); 
+  }
+</pre></div>
+
+<p>This example does the same thing
+using the overload that includes a constraint.
+
+<div class="code"><pre>
+[TestFixture]
+public class UsingConstraint
+{
+  [Test]
+  public void TestException()
+  {
+    Assert.Throws( Is.Typeof<MyException>()
+                 .And.Message.EqualTo( "message" )
+                 .And.Property( "MyParam" ).EqualTo( 42 ),
+      delegate { throw new MyException( "message", 42 ); } );
+  }
+</pre></div>
+
+<p>Use the form that matches your style of coding.
+
+<h3>Exact Versus Derived Types</h3>
+
+<p>When used with a Type argument, <b>Assert.Throws</b> requires
+that exact type to be thrown. If you want to test for any
+derived Type, use one of the forms that allows specifying
+a constraint. Alternatively, you may use <b>Assert.Catch</b>,
+which differs from <b>Assert.Throws</b> in allowing derived
+types. See the following code for examples:
+
+<div class="code">
+<pre>
+// Require an ApplicationException - derived types fail!
+Assert.Throws( typeof(ApplicationException), code );
+Assert.Throws<ApplicationException>()( code );
+
+// Allow both ApplicationException and any derived type
+Assert.Throws( Is.InstanceOf( typeof(ApplicationException), code );
+Assert.Throws( Is.InstanceOf<ApplicationException>(), code );
+
+// Allow both ApplicationException and any derived type
+Assert.Catch<ApplicationException>( code );
+
+// Allow any kind of exception
+Assert.Catch( code );
+</pre>
+</div>
+
+<h4>See also...</h4>
+<ul>
+<li><a href="throwsConstraint.html">ThrowsConstraint</a></ul>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<ul>
+<li><a href="equalityAsserts.html">Equality Asserts</a></li>
+<li><a href="identityAsserts.html">Identity Asserts</a></li>
+<li><a href="conditionAsserts.html">Condition Asserts</a></li>
+<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
+<li><a href="typeAsserts.html">Type Asserts</a></li>
+<li id="current"><a href="exceptionAsserts.html">Exception Asserts</a></li>
+<li><a href="utilityAsserts.html">Utility Methods</a></li>
+<li><a href="stringAssert.html">String Assert</a></li>
+<li><a href="collectionAssert.html">Collection Assert</a></li>
+<li><a href="fileAssert.html">File Assert</a></li>
+<li><a href="directoryAssert.html">Directory Assert</a></li>
+</ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/explicit.html b/doc/explicit.html
index 3399339..652aadd 100644
--- a/doc/explicit.html
+++ b/doc/explicit.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -209,46 +209,65 @@ public class SuccessTests
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<ul>
-<li><a href="category.html">Category</a></li>
-<li><a href="culture.html">Culture</a></li>
-<li><a href="description.html">Description</a></li>
-<li><a href="exception.html">Expected Exception</a></li>
-<li id="current"><a href="explicit.html">Explicit</a></li>
-<li><a href="ignore.html">Ignore</a></li>
-<li><a href="platform.html">Platform</a></li>
-<li><a href="property.html">Property</a></li>
-<li><a href="setCulture.html">SetCulture</a></li>
-<li><a href="setup.html">Setup</a></li>
-<li><a href="setupFixture.html">SetUp Fixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testFixture.html">Test Fixture</a></li>
-<li><a href="fixtureSetup.html">Test Fixture SetUp</a></li>
-<li><a href="fixtureTeardown.html">Test Fixture </a></li>
-</ul>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li><a href="category.html">Category</a></li>
+<li><a href="combinatorial.html">Combinatorial</a></li>
+<li><a href="culture.html">Culture</a></li>
+<li><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li id="current"><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/extensibility.html b/doc/extensibility.html
index e9a1d8e..a8cc9a5 100644
--- a/doc/extensibility.html
+++ b/doc/extensibility.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -30,7 +30,7 @@
 
 <p>Extensions to the NUnit framework - the part of NUnit that is referenced
 by tests - usually take the form of 
-<a href="customAsserts.html">Custom Asserts</a>, written by users to 
+<a href="customConstraints.html">Custom Constraints</a>, written by users to 
 encapsulate tests that pertain to their specific projects.</p>
 
 <p>Extending the features found within NUnit itself depends on the use of
@@ -45,37 +45,32 @@ including the GUI.</p>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<ul>
-<li><a href="configFiles.html">Configuration Files</a></li>
-<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
-<li><a href="vsSupport.html">Visual Studio Support</a></li>
-<li id="current"><a href="extensibility.html">Extensibility</a></li>
-<ul>
-<li><a href="customAsserts.html">Custom Asserts</a></li>
-<li><a href="nunitAddins.html">NUnit Addins</a></li>
-</ul>
-</ul>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li id="current"><a href="extensibility.html">Extensibility</a></li>
+<ul>
+<li><a href="customConstraints.html">Custom Constraints</a></li>
+<li><a href="nunitAddins.html">NUnit Addins</a></li>
+<li><a href="extensionTips.html">Tips for Extenders</a></li>
+</ul>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/extensionTips.html b/doc/extensionTips.html
new file mode 100644
index 0000000..3c9b86e
--- /dev/null
+++ b/doc/extensionTips.html
@@ -0,0 +1,95 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - ExtensionTips</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>Tips for Writing Extensions</h3>
+
+<p>An Extenders Guide will be published in the future. At the moment, writing an
+extension is a bit of an adventure. Extension authors are advised to join the 
+nunit-developer list and post questions and comments there.
+
+<p>For the moment, the following tips may be of assistance.
+<ul>
+<li>The <b>nunit.core.interfaces</b> assembly is intended to be stable in the future
+while the <b>nunit.core</b> assembly will change from release to release. Right now,
+both assemblies are still in flux, but extensions that depend solely on the interfaces
+assembly will have a much better chance of surviving NUnit version changes. Unfortunately,
+this is rather difficult to do without duplicating a great deal of NUnit code. Most
+of the add-in samples provided with NUnit are currently version dependent.
+
+<li>If you place the definition of a custom attribute in the same assembly as your
+add-in, then user tests are dependent on the add-in assembly. If the add-in is 
+version-dependent, then the user tests will also be version-dependent. We suggest
+placing any types referenced by user tests in a separate assembly, particularly if
+your extension relies on nunit.core.
+
+<li>If using Visual Studio, set Copy Local to false for any references to nunit.core
+or nunit.core.interfaces. This is especially important if you are also building
+NUnit itself.
+
+<li>There is currently no mechanism to allow decorators to apply in a particular order.
+NUnit applies decorators in the order in which they are returned through reflection,
+which may vary among different runtimes.
+
+<li>Avoid trying to "stretch" the existing extension points to do more than they were
+intended to do. Rather, let us know what further extension points you would like to see!
+</ul>
+
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<ul>
+<li><a href="customConstraints.html">Custom Constraints</a></li>
+<li><a href="nunitAddins.html">NUnit Addins</a></li>
+<li id="current"><a href="extensionTips.html">Tips for Extenders</a></li>
+</ul>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/features.html b/doc/features.html
deleted file mode 100644
index 9cbb44b..0000000
--- a/doc/features.html
+++ /dev/null
@@ -1,75 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - Features</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<link rel="stylesheet" type="text/css" href="nunit.css">
-<link rel="shortcut icon" href="favicon.ico">
-</head>
-<!-- End Standard Head Part -->
-
-<body>
-
-<!-- Standard Header for NUnit.org -->
-<div id="header">
-  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
-  <div id="nav">
-    <a href="http://www.nunit.org">NUnit</a>
-    <a class="active" href="index.html">Documentation</a>
-  </div>
-</div>
-<!-- End of Header -->
-
-<div id="content">
-
-<h2>Other Features</h2>
-
-<p>If your application stores settings in <a href="configFiles.html">Configuration Files</a>,
-NUnit provides you with the ability to have settings for your test, which are different
-from those used in production.</p>
-
-<p>In addition to running tests in a single assembly, NUnit provides support for tests
-organized as <a href="multiAssembly.html">Multiple Assemblies</a> and for
-creating and running tests as <a href="multiAssembly.html">NUnit Test Projects</a>.
-
-<p>For those using NUnit on a Windows system with Visual Studio installed, 
-<a href="vsSupport.html">Visual Studio Support</a> is available.
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li id="current"><a href="features.html">Other Features</a></li>
-<ul>
-<li><a href="configFiles.html">Configuration Files</a></li>
-<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
-<li><a href="vsSupport.html">Visual Studio Support</a></li>
-<li><a href="extensibility.html">Extensibility</a></li>
-</ul>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
-</div>
-<!-- End of Submenu -->
-
-
-<!-- Standard Footer for NUnit.org -->
-<div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
-</div>
-<!-- End of Footer -->
-
-</body>
-</html>
diff --git a/doc/fileAssert.html b/doc/fileAssert.html
index 3f00d30..8a0cab2 100644
--- a/doc/fileAssert.html
+++ b/doc/fileAssert.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -71,42 +71,40 @@ FileAssert.AreNotEqual( string expected, string actual,
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<ul>
-<li><a href="classicModel.html">Classic Model</a></li>
-<ul>
-<li><a href="equalityAsserts.html">Equality Asserts</a></li>
-<li><a href="identityAsserts.html">Identity Asserts</a></li>
-<li><a href="conditionAsserts.html">Condition Tests</a></li>
-<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
-<li><a href="typeAsserts.html">Type Asserts</a></li>
-<li><a href="utilityAsserts.html">Utility Methods</a></li>
-<li><a href="stringAssert.html">String Assert</a></li>
-<li><a href="collectionAssert.html">Collection Assert</a></li>
-<li id="current"><a href="fileAssert.html">File Assert</a></li>
-</ul>
-<li><a href="constraintModel.html">Constraint Model</a></li>
-</ul>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<ul>
+<li><a href="equalityAsserts.html">Equality Asserts</a></li>
+<li><a href="identityAsserts.html">Identity Asserts</a></li>
+<li><a href="conditionAsserts.html">Condition Asserts</a></li>
+<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
+<li><a href="typeAsserts.html">Type Asserts</a></li>
+<li><a href="exceptionAsserts.html">Exception Asserts</a></li>
+<li><a href="utilityAsserts.html">Utility Methods</a></li>
+<li><a href="stringAssert.html">String Assert</a></li>
+<li><a href="collectionAssert.html">Collection Assert</a></li>
+<li id="current"><a href="fileAssert.html">File Assert</a></li>
+<li><a href="directoryAssert.html">Directory Assert</a></li>
+</ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/files/Results.xsd b/doc/files/Results.xsd
index 6d3d77b..3afb840 100644
--- a/doc/files/Results.xsd
+++ b/doc/files/Results.xsd
@@ -22,49 +22,87 @@
 	<xs:element name="test-results" type="resultType" />
 	<xs:complexType name="categoriesType">
 		<xs:sequence>
-			<xs:element name="category" type="categoryType" maxOccurs="unbounded" minOccurs="1"/>
+			<xs:element name="category" type="categoryType" maxOccurs="unbounded" minOccurs="1" />
 		</xs:sequence>
 	</xs:complexType>
 	<xs:complexType name="categoryType">
-		<xs:attribute name="name" type="xs:string" use="required"/>
+		<xs:attribute name="name" type="xs:string" use="required" />
+	</xs:complexType>
+	<xs:complexType name="propertiesType">
+		<xs:sequence>
+			<xs:element name="property" type="propertyType" maxOccurs="unbounded" minOccurs="1" />
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="propertyType">
+		<xs:attribute name="name" type="xs:string" use="required" />
+		<xs:attribute name="value" type="xs:string" use="required" />
+	</xs:complexType>
+	<xs:complexType name="environmentType">
+		<xs:attribute name="nunit-version" type="xs:string" use="required" />
+		<xs:attribute name="clr-version" type="xs:string" use="required" />
+		<xs:attribute name="os-version" type="xs:string" use="required" />
+		<xs:attribute name="platform" type="xs:string" use="required" />
+		<xs:attribute name="cwd" type="xs:string" use="required" />
+		<xs:attribute name="machine-name" type="xs:string" use="required" />
+		<xs:attribute name="user" type="xs:string" use="required" />
+		<xs:attribute name="user-domain" type="xs:string" use="required" />
+	</xs:complexType>
+	<xs:complexType name="culture-infoType">
+		<xs:attribute name="current-culture" type="xs:string" use="required" />
+		<xs:attribute name="current-uiculture" type="xs:string" use="required" />
 	</xs:complexType>
 	<xs:complexType name="resultType">
 		<xs:sequence>
+			<xs:element name="environment" type="environmentType" />
+			<xs:element name="culture-info" type="culture-infoType" />
 			<xs:element name="test-suite" type="test-suiteType" />
 		</xs:sequence>
 		<xs:attribute name="name" type="xs:string" use="required" />
 		<xs:attribute name="total" type="xs:decimal" use="required" />
-		<xs:attribute name="failures" type="xs:decimal" use="required" />
-		<xs:attribute name="not-run" type="xs:decimal" use="required" />
-		<xs:attribute name="date" type="xs:string" use="required" />
+    <xs:attribute name="errors" type="xs:decimal" use="required" />
+    <xs:attribute name="failures" type="xs:decimal" use="required" />
+    <xs:attribute name="inconclusive" type="xs:decimal" use="required" />
+    <xs:attribute name="not-run" type="xs:decimal" use="required" />
+    <xs:attribute name="ignored" type="xs:decimal" use="required" />
+    <xs:attribute name="skipped" type="xs:decimal" use="required" />
+    <xs:attribute name="invalid" type="xs:decimal" use="required" />
+    <xs:attribute name="date" type="xs:string" use="required" />
 		<xs:attribute name="time" type="xs:string" use="required" />
 	</xs:complexType>
 	<xs:complexType name="test-caseType">
 		<xs:sequence>
 			<xs:element name="categories" type="categoriesType" minOccurs="0" maxOccurs="1" />
+			<xs:element name="properties" type="propertiesType" minOccurs="0" maxOccurs="1" />
 			<xs:choice>
 				<xs:element name="failure" type="failureType" minOccurs="0" />
 				<xs:element name="reason" type="reasonType" minOccurs="0" />
 			</xs:choice>
 		</xs:sequence>
-			
 		<xs:attribute name="name" type="xs:string" use="required" />
 		<xs:attribute name="description" type="xs:string" use="optional" />
 		<xs:attribute name="success" type="xs:string" use="optional" />
 		<xs:attribute name="time" type="xs:string" use="optional" />
 		<xs:attribute name="executed" type="xs:string" use="required" />
 		<xs:attribute name="asserts" type="xs:string" use="optional" />
-	</xs:complexType>
+    <xs:attribute name="result" type="xs:string" use="required" />
+  </xs:complexType>
 	<xs:complexType name="test-suiteType">
 		<xs:sequence>
 			<xs:element name="categories" type="categoriesType" minOccurs="0" maxOccurs="1" />
-			<xs:element name="results" type="resultsType" />
+			<xs:element name="properties" type="propertiesType" minOccurs="0" maxOccurs="1" />
+			<xs:choice>
+				<xs:element name="failure" type="failureType" minOccurs="0" />
+				<xs:element name="reason" type="reasonType" minOccurs="0" />
+			</xs:choice>
+			<xs:element name="results" type="resultsType" minOccurs="0" maxOccurs="1"/>
 		</xs:sequence>
+    <xs:attribute name="type" type="xs:string" use="required" />
 		<xs:attribute name="name" type="xs:string" use="required" />
 		<xs:attribute name="description" type="xs:string" use="optional" />
-		<xs:attribute name="success" type="xs:string" use="required" />
-		<xs:attribute name="time" type="xs:string" use="required" />
+		<xs:attribute name="success" type="xs:string" use="optional" />
+    <xs:attribute name="time" type="xs:string" use="optional" />
+		<xs:attribute name="executed" type="xs:string" use="required" />
 		<xs:attribute name="asserts" type="xs:string" use="optional" />
-	</xs:complexType>
-
+    <xs:attribute name="result" type="xs:string" use="required" />
+  </xs:complexType>
 </xs:schema>
\ No newline at end of file
diff --git a/doc/files/TestResult.xml b/doc/files/TestResult.xml
index 127a66e..ef51744 100644
--- a/doc/files/TestResult.xml
+++ b/doc/files/TestResult.xml
@@ -1,95 +1,127 @@
 <?xml version="1.0" encoding="utf-8" standalone="no"?>
 <!--This file represents the results of running a test suite-->
-<test-results name="C:\Program Files\NUnit 2.2.8\bin\mock-assembly.dll" total="5" failures="0" not-run="6" date="2006-04-22" time="12:47:24">
-  <environment nunit-version="2.2.8.0" clr-version="1.1.4322.2032" os-version="Microsoft Windows NT 5.1.2600.0" platform="Win32NT" cwd="C:\Program Files\NUnit 2.2.8\bin" machine-name="FERRARI" user="Charlie" user-domain="FERRARI" />
+<test-results name="tests\mock-assembly.dll" total="8" errors="1" failures="1" not-run="7" ignored="4" skipped="0" invalid="3" date="2008-11-22" time="20:17:48">
+  <environment nunit-version="2.5.0.8327" clr-version="2.0.50727.1433" os-version="Microsoft Windows NT 5.1.2600 Service Pack 2" platform="Win32NT" cwd="C:\Program Files\NUnit 2.5\bin\net-2.0" machine-name="FERRARI" user="Charlie" user-domain="FERRARI" />
   <culture-info current-culture="en-US" current-uiculture="en-US" />
-  <test-suite name="C:\Program Files\NUnit 2.2.8\bin\mock-assembly.dll" success="True" time="0.016" asserts="0">
+  <test-suite name="tests\mock-assembly.dll" executed="True" success="False" time="0.125" asserts="0">
     <results>
-      <test-suite name="C:\Program Files\NUnit 2.2.8\bin\mock-assembly.dll" success="True" time="0.000" asserts="0">
+      <test-suite name="NUnit" executed="True" success="False" time="0.109" asserts="0">
         <results>
-          <test-suite name="NUnit" success="True" time="0.000" asserts="0">
+          <test-suite name="Tests" executed="True" success="False" time="0.109" asserts="0">
             <results>
-              <test-suite name="NUnit.Tests" success="True" time="0.000" asserts="0">
+              <test-suite name="Assemblies" executed="True" success="False" time="0.109" asserts="0">
                 <results>
-                  <test-suite name="NUnit.Tests.Assemblies" success="True" time="0.000" asserts="0">
+                  <test-suite name="MockTestFixture" description="Fake Test Fixture" executed="True" success="False" time="0.109" asserts="0">
+                    <categories>
+                      <category name="FixtureCategory" />
+                    </categories>
                     <results>
-                      <test-suite name="NUnit.Tests.Assemblies.MockTestFixture" description="Fake Test Fixture" success="True" time="0.000" asserts="0">
+                      <test-case name="NUnit.Tests.Assemblies.MockTestFixture.FailingTest" executed="True" success="False" time="0.047" asserts="0">
+                        <failure>
+                          <message><![CDATA[Intentional failure]]></message>
+                          <stack-trace><![CDATA[at NUnit.Tests.Assemblies.MockTestFixture.FailingTest()
+]]></stack-trace>
+                        </failure>
+                      </test-case>
+                      <test-case name="NUnit.Tests.Assemblies.MockTestFixture.MockTest1" description="Mock Test #1" executed="True" success="True" time="0.000" asserts="0" />
+                      <test-case name="NUnit.Tests.Assemblies.MockTestFixture.MockTest2" executed="True" success="True" time="0.000" asserts="0">
                         <categories>
-                          <category name="FixtureCategory" />
+                          <category name="MockCategory" />
+                        </categories>
+                        <properties>
+                          <property name="Severity" value="Critical" />
+                        </properties>
+                      </test-case>
+                      <test-case name="NUnit.Tests.Assemblies.MockTestFixture.MockTest3" executed="True" success="True" time="0.000" asserts="0">
+                        <categories>
+                          <category name="AnotherCategory" />
+                          <category name="MockCategory" />
+                        </categories>
+                      </test-case>
+                      <test-case name="NUnit.Tests.Assemblies.MockTestFixture.MockTest4" executed="False">
+                        <categories>
+                          <category name="Foo" />
                         </categories>
-                        <results>
-                          <test-case name="NUnit.Tests.Assemblies.MockTestFixture.ExplicitlyRunTest" executed="False">
-                            <categories>
-                              <category name="Special" />
-                            </categories>
-                            <reason>
-                              <message><![CDATA[Explicit selection required]]></message>
-                            </reason>
-                          </test-case>
-                          <test-case name="NUnit.Tests.Assemblies.MockTestFixture.MockTest1" description="Mock Test #1" executed="True" success="True" time="0.000" asserts="0" />
-                          <test-case name="NUnit.Tests.Assemblies.MockTestFixture.MockTest2" executed="True" success="True" time="0.000" asserts="0">
-                            <categories>
-                              <category name="MockCategory" />
-                            </categories>
-                          </test-case>
-                          <test-case name="NUnit.Tests.Assemblies.MockTestFixture.MockTest3" executed="True" success="True" time="0.000" asserts="0">
-                            <categories>
-                              <category name="MockCategory" />
-                              <category name="AnotherCategory" />
-                            </categories>
-                          </test-case>
-                          <test-case name="NUnit.Tests.Assemblies.MockTestFixture.MockTest4" executed="False">
-                            <categories>
-                              <category name="Foo" />
-                            </categories>
-                            <reason>
-                              <message><![CDATA[ignoring this test method for now]]></message>
-                            </reason>
-                          </test-case>
-                          <test-case name="NUnit.Tests.Assemblies.MockTestFixture.MockTest5" executed="False">
-                            <reason>
-                              <message><![CDATA[Method MockTest5's signature is not correct: it must be a public method.]]></message>
-                            </reason>
-                          </test-case>
-                        </results>
-                      </test-suite>
-                    </results>
-                  </test-suite>
-                  <test-suite name="NUnit.Tests.IgnoredFixture" success="True" time="0.000" asserts="0">
-                    <results>
-                      <test-case name="NUnit.Tests.IgnoredFixture.Test1" executed="False">
                         <reason>
-                          <message><![CDATA[]]></message>
+                          <message><![CDATA[ignoring this test method for now]]></message>
                         </reason>
                       </test-case>
-                      <test-case name="NUnit.Tests.IgnoredFixture.Test2" executed="False">
+                      <test-case name="NUnit.Tests.Assemblies.MockTestFixture.MockTest5" executed="False">
                         <reason>
-                          <message><![CDATA[]]></message>
+                          <message><![CDATA[Method is not public]]></message>
                         </reason>
                       </test-case>
-                      <test-case name="NUnit.Tests.IgnoredFixture.Test3" executed="False">
+                      <test-case name="NUnit.Tests.Assemblies.MockTestFixture.NotRunnableTest" executed="False">
                         <reason>
-                          <message><![CDATA[]]></message>
+                          <message><![CDATA[No arguments provided]]></message>
                         </reason>
                       </test-case>
+                      <test-case name="NUnit.Tests.Assemblies.MockTestFixture.TestWithException" executed="True" success="False" time="0.000" asserts="0">
+                        <failure>
+                          <message><![CDATA[System.ApplicationException : Intentional Exception]]></message>
+                          <stack-trace><![CDATA[at NUnit.Tests.Assemblies.MockTestFixture.MethodThrowsException()
+at NUnit.Tests.Assemblies.MockTestFixture.TestWithException()
+]]></stack-trace>
+                        </failure>
+                      </test-case>
+                      <test-case name="NUnit.Tests.Assemblies.MockTestFixture.TestWithManyProperties" executed="True" success="True" time="0.000" asserts="0">
+                        <properties>
+                          <property name="Size" value="5" />
+                          <property name="TargetMethod" value="SomeClassName" />
+                        </properties>
+                      </test-case>
                     </results>
                   </test-suite>
-                  <test-suite name="NUnit.Tests.Singletons" success="True" time="0.000" asserts="0">
+                </results>
+              </test-suite>
+              <test-suite name="BadFixture" executed="False">
+                <reason>
+                  <message><![CDATA[No suitable constructor was found]]></message>
+                </reason>
+                <results>
+                  <test-case name="NUnit.Tests.BadFixture.SomeTest" executed="False">
+                    <reason>
+                      <message><![CDATA[No suitable constructor was found]]></message>
+                    </reason>
+                  </test-case>
+                </results>
+              </test-suite>
+              <test-suite name="IgnoredFixture" executed="False">
+                <reason>
+                  <message><![CDATA[]]></message>
+                </reason>
+                <results>
+                  <test-case name="NUnit.Tests.IgnoredFixture.Test1" executed="False">
+                    <reason>
+                      <message><![CDATA[]]></message>
+                    </reason>
+                  </test-case>
+                  <test-case name="NUnit.Tests.IgnoredFixture.Test2" executed="False">
+                    <reason>
+                      <message><![CDATA[]]></message>
+                    </reason>
+                  </test-case>
+                  <test-case name="NUnit.Tests.IgnoredFixture.Test3" executed="False">
+                    <reason>
+                      <message><![CDATA[]]></message>
+                    </reason>
+                  </test-case>
+                </results>
+              </test-suite>
+              <test-suite name="Singletons" executed="True" success="True" time="0.000" asserts="0">
+                <results>
+                  <test-suite name="OneTestCase" executed="True" success="True" time="0.000" asserts="0">
                     <results>
-                      <test-suite name="NUnit.Tests.Singletons.OneTestCase" success="True" time="0.000" asserts="0">
-                        <results>
-                          <test-case name="NUnit.Tests.Singletons.OneTestCase.TestCase" executed="True" success="True" time="0.000" asserts="0" />
-                        </results>
-                      </test-suite>
+                      <test-case name="NUnit.Tests.Singletons.OneTestCase.TestCase" executed="True" success="True" time="0.000" asserts="0" />
                     </results>
                   </test-suite>
-                  <test-suite name="NUnit.Tests.TestAssembly" success="True" time="0.000" asserts="0">
+                </results>
+              </test-suite>
+              <test-suite name="TestAssembly" executed="True" success="True" time="0.000" asserts="0">
+                <results>
+                  <test-suite name="MockTestFixture" executed="True" success="True" time="0.000" asserts="0">
                     <results>
-                      <test-suite name="NUnit.Tests.TestAssembly.MockTestFixture" success="True" time="0.000" asserts="0">
-                        <results>
-                          <test-case name="NUnit.Tests.TestAssembly.MockTestFixture.MyTest" executed="True" success="True" time="0.000" asserts="0" />
-                        </results>
-                      </test-suite>
+                      <test-case name="NUnit.Tests.TestAssembly.MockTestFixture.MyTest" executed="True" success="True" time="0.000" asserts="0" />
                     </results>
                   </test-suite>
                 </results>
diff --git a/doc/files/Thumbs.db b/doc/files/Thumbs.db
deleted file mode 100644
index 5078aa3..0000000
Binary files a/doc/files/Thumbs.db and /dev/null differ
diff --git a/doc/fixtureSetup.html b/doc/fixtureSetup.html
index b372720..d8b58c6 100644
--- a/doc/fixtureSetup.html
+++ b/doc/fixtureSetup.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -26,13 +26,22 @@
 
 <script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
 
-<h3>TestFixtureSetUpAttribute (NUnit 2.1)</h3>
+<h3>TestFixtureSetUpAttribute (NUnit 2.1 / 2.5)</h3>
 
 <p>This attribute is used inside a TestFixture to provide a single set of 
 	functions that are performed once prior to executing any of the tests
-	in the fixture. A TestFixture can have only one TestFixtureSetUp method. 
-	If more than one is defined the TestFixture will compile successfully
-	but its tests will not run.</p>
+	in the fixture. 
+	
+<p><b>Before NUnit 2.5</b>, a TestFixture could have only one TestFixtureSetUp method
+	and it was required to be an instance method. 
+
+<p><b>Beginning with NUnit 2.5</b>, TestFixtureSetUp methods may be either static or
+   instance methods and you may define more than one of them in a fixture.
+   Normally, multiple TestFixtureSetUp methods are only defined at different levels
+   of an inheritance hierarchy, as explained below.
+
+<p>If a TestFixtueSetUp method fails or throws an exception, none of the tests
+   in the fixure are executed and a failure or error is reported.
 
 <h4>Example:</h4>
 
@@ -59,7 +68,7 @@
     [TestFixtureSetUp] public void Init()
     { /* ... */ }
 
-    [TestFixtureTearDown] public void Dispose()
+    [TestFixtureTearDown] public void Cleanup()
     { /* ... */ }
 
     [Test] public void Add()
@@ -78,7 +87,7 @@ Namespace Nunit.Tests
     ' ...
     End Sub
 
-    <TestFixtureTearDown()> Public Sub Dispose()
+    <TestFixtureTearDown()> Public Sub Cleanup()
     ' ...
     End Sub
 
@@ -99,7 +108,7 @@ namespace NUnitTests
   public __gc class SuccessTests
   {
     [TestFixtureSetUp] void Init();
-    [TestFixtureTearDown] void Dispose();
+    [TestFixtureTearDown] void Cleanup();
 
     [Test] void Add();
   };
@@ -126,7 +135,7 @@ public class SuccessTests
   { /* ... */ }
 
   /** @attribute NUnit.Framework.TestFixtureTearDown() */
-  public void Dispose()
+  public void Cleanup()
   { /* ... */ }
 
   /** @attribute NUnit.Framework.Test() */
@@ -137,59 +146,92 @@ public class SuccessTests
 
 </div>
 
-<h4>Inheritance</h4>
+<h3>Inheritance</h3>
 
 <p>The TestFixtureSetUp attribute is inherited from any base class. Therefore, if a base 
 	class has defined a SetFixtureSetUp method, that method will be called 
-	after each test method in the derived class. If you wish to add more 
-	functionality in a derived class you need to mark the method 
-	with the appropriate attribute and then call the base class method.</p>
-
+	after each test method in the derived class. 
+	
+<p>Before NUnit 2.5, you were permitted only one TestFixtureSetUp method. If you wanted to 
+   have some TestFixtureSetUp functionality in the base class and add more in the derived 
+   class you needed to call the base class method yourself.
+
+<p>With NUnit 2.5, you can achieve the same result by defining a TestFixtureSetUp method
+   in the base class and another in the derived class. NUnit will call base
+   class TestFixtureSetUp methods before those in the derived classes.
+   
+<p><b>Note:</b> Although it is possible to define multiple TestFixtureSetUp methods
+   in the same class, you should rarely do so. Unlike methods defined in
+   separate classes in the inheritance hierarchy, the order in which they
+   are executed is not guaranteed.
+
+<h4>See also...</h4>
+<ul>
+<li><a href="setup.html">SetUpAttribute</a><li><a href="teardown.html">TearDownAttribute</a><li><a href="fixtureTeardown.html">TestFixtureTearDownAttribute</a></ul>
 
 </div>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<ul>
-<li><a href="category.html">Category</a></li>
-<li><a href="culture.html">Culture</a></li>
-<li><a href="description.html">Description</a></li>
-<li><a href="exception.html">Expected Exception</a></li>
-<li><a href="explicit.html">Explicit</a></li>
-<li><a href="ignore.html">Ignore</a></li>
-<li><a href="platform.html">Platform</a></li>
-<li><a href="property.html">Property</a></li>
-<li><a href="setCulture.html">SetCulture</a></li>
-<li><a href="setup.html">Setup</a></li>
-<li><a href="setupFixture.html">SetUp Fixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testFixture.html">Test Fixture</a></li>
-<li id="current"><a href="fixtureSetup.html">Test Fixture SetUp</a></li>
-<li><a href="fixtureTeardown.html">Test Fixture </a></li>
-</ul>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li><a href="category.html">Category</a></li>
+<li><a href="combinatorial.html">Combinatorial</a></li>
+<li><a href="culture.html">Culture</a></li>
+<li><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li id="current"><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/fixtureTeardown.html b/doc/fixtureTeardown.html
index 4ecd2e2..96067e9 100644
--- a/doc/fixtureTeardown.html
+++ b/doc/fixtureTeardown.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -26,13 +26,18 @@
 
 <script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
 
-<h3>TestFixtureTearDownAttribute (NUnit 2.1)</h3>
+<h3>TestFixtureTearDownAttribute (NUnit 2.1 / 2.5)</h3>
 
 <p>This attribute is used inside a TestFixture to provide a single set of 
 	functions that are performed once after all tests are completed. 
-	A TestFixture can have only one TestFixtureTearDown method. If more than 
-	one is defined the TestFixture will compile successfully but its tests will 
-	not run.</p>
+	
+<p><b>Before NUnit 2.5</b>, a TestFixture could have only one SetUp method
+	and it was required to be an instance method. 
+
+<p><b>Beginning with NUnit 2.5</b>, TestFixtureTearDown methods may be either static or
+   instance methods and you may define more than one of them in a fixture.
+   Normally, multiple TestFixtureTearDown methods are only defined at different levels
+   of an inheritance hierarchy, as explained below.
 
 <p>So long as any TestFixtureSetUp method runs without error, the TestFixtureTearDown method is 
    guaranteed to run. It will not run if a TestFixtureSetUp method fails or throws an 
@@ -63,7 +68,7 @@
     [TestFixtureSetUp] public void Init()
     { /* ... */ }
 
-    [TestFixtureTearDown] public void Dispose()
+    [TestFixtureTearDown] public void Cleanup()
     { /* ... */ }
 
     [Test] public void Add()
@@ -82,7 +87,7 @@ Namespace Nunit.Tests
     ' ...
     End Sub
 
-    <TestFixtureTearDown()> Public Sub Dispose()
+    <TestFixtureTearDown()> Public Sub Cleanup()
     ' ...
     End Sub
 
@@ -103,7 +108,7 @@ namespace NUnitTests
   public __gc class SuccessTests
   {
     [TestFixtureSetUp] void Init();
-    [TestFixtureTearDown] void Dispose();
+    [TestFixtureTearDown] void Cleanup();
 
     [Test] void Add();
   };
@@ -130,7 +135,7 @@ public class SuccessTests
   { /* ... */ }
 
   /** @attribute NUnit.Framework.TestFixtureTearDown() */
-  public void Dispose()
+  public void Cleanup()
   { /* ... */ }
 
   /** @attribute NUnit.Framework.Test() */
@@ -141,58 +146,92 @@ public class SuccessTests
 
 </div>
 
-<h4>Inheritance</h4>
+<h3>Inheritance</h3>
 
 <p>The TestFixtureTearDown attribute is inherited from any base class. Therefore, if a base 
 	class has defined a TestFixtureTearDown method, that method will be called 
-	after each test method in the derived class. If you wish to add more 
-	functionality in a derived class you need to mark the method 
-	with the appropriate attribute and then call the base class method.</p>
+	after each test method in the derived class. 
+	
+<p>Before NUnit 2.5, you were permitted only one TestFixtureTearDown method. If you wanted to 
+   have some TestFixtureTearDown functionality in the base class and add more in the derived 
+   class you needed to call the base class method yourself.
+   
+<p>With NUnit 2.5, you can achieve the same result by defining a TestFixtureTearDown method
+   in the base class and another in the derived class. NUnit will call base
+   class TestFixtureTearDown methods after those in the derived classes.
+   
+<p><b>Note:</b> Although it is possible to define multiple TestFixtureTearDown methods
+   in the same class, you should rarely do so. Unlike methods defined in
+   separate classes in the inheritance hierarchy, the order in which they
+   are executed is not guaranteed.
+
+<h4>See also...</h4>
+<ul>
+<li><a href="setup.html">SetUpAttribute</a><li><a href="teardown.html">TearDownAttribute</a><li><a href="fixtureSetup.html">TestFixtureSetUpAttribute</a></ul>
 
 </div>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<ul>
-<li><a href="category.html">Category</a></li>
-<li><a href="culture.html">Culture</a></li>
-<li><a href="description.html">Description</a></li>
-<li><a href="exception.html">Expected Exception</a></li>
-<li><a href="explicit.html">Explicit</a></li>
-<li><a href="ignore.html">Ignore</a></li>
-<li><a href="platform.html">Platform</a></li>
-<li><a href="property.html">Property</a></li>
-<li><a href="setCulture.html">SetCulture</a></li>
-<li><a href="setup.html">Setup</a></li>
-<li><a href="setupFixture.html">SetUp Fixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testFixture.html">Test Fixture</a></li>
-<li><a href="fixtureSetup.html">Test Fixture SetUp</a></li>
-<li id="current"><a href="fixtureTeardown.html">Test Fixture </a></li>
-</ul>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li><a href="category.html">Category</a></li>
+<li><a href="combinatorial.html">Combinatorial</a></li>
+<li><a href="culture.html">Culture</a></li>
+<li><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li id="current"><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/getStarted.html b/doc/getStarted.html
index 0af499b..2ab2486 100644
--- a/doc/getStarted.html
+++ b/doc/getStarted.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -41,38 +41,38 @@
 	<a href="nunit-console.html">console runner</a>, nunit-console.exe, 
 	is the fastest to launch, but is not interactive. 
  	The <a href="nunit-gui.html">gui runner</a>, 
-	nunit-gui.exe, is a Windows Forms application that allows you to work 
+	nunit.exe, is a Windows Forms application that allows you to work 
 	selectively with your tests and provides graphical feedback.</p>
 
 </div>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li id="current"><a href="getStarted.html">Getting Started</a></li>
-<ul>
-<li><a href="quickStart.html">Quick Start</a></li>
-<li><a href="installation.html">Installation</a></li>
-</ul>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li id="current"><a href="getStarted.html">Getting Started</a></li>
+<ul>
+<li><a href="quickStart.html">Quick Start</a></li>
+<li><a href="installation.html">Installation</a></li>
+</ul>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/guiCommandLine.html b/doc/guiCommandLine.html
index d4df077..3d84ce4 100644
--- a/doc/guiCommandLine.html
+++ b/doc/guiCommandLine.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -145,37 +145,48 @@ option:
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<ul>
-<li id="current"><a href="guiCommandLine.html">Command-Line</a></li>
-<li><a href="mainMenu.html">Main Menu</a></li>
-<li><a href="contextMenu.html">Context Menu</a></li>
-<li><a href="optionsDialog.html">Options Dialog</a></li>
-<li><a href="addinsDialog.html">Addins Dialog</a></li>
-<li><a href="testProperties.html">Test Properties</a></li>
-<li><a href="configEditor.html">Configuration Editor</a></li>
-<li><a href="projectEditor.html">Project Editor</a></li>
-</ul>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<ul>
+<li><a href="nunit-console.html">Console Runner</a></li>
+<li><a href="nunit-gui.html">Gui Runner</a></li>
+<ul>
+<li id="current"><a href="guiCommandLine.html">Command-Line</a></li>
+<li><a href="mainMenu.html">Main Menu</a></li>
+<li><a href="contextMenu.html">Context Menu</a></li>
+<li><a href="settingsDialog.html">Settings Dialog</a></li>
+<li><a href="addinsDialog.html">Addins Dialog</a></li>
+<li><a href="testProperties.html">Test Properties</a></li>
+<li><a href="configEditor.html">Configuration Editor</a></li>
+<li><a href="projectEditor.html">Project Editor</a></li>
+</ul>
+<li><a href="pnunit.html">PNUnit Runner</a></li>
+<li><a href="nunit-agent.html">NUnit Agent</a></li>
+<li><a href="runtimeSelection.html">Runtime Selection</a></li>
+<li><a href="assemblyIsolation.html">Assembly Isolation</a></li>
+<li><a href="configFiles.html">Configuration Files</a></li>
+<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/identityAsserts.html b/doc/identityAsserts.html
index 2b77d98..0686795 100644
--- a/doc/identityAsserts.html
+++ b/doc/identityAsserts.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -56,42 +56,40 @@ Assert.Contains( object anObject, IList collection,
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<ul>
-<li><a href="classicModel.html">Classic Model</a></li>
-<ul>
-<li><a href="equalityAsserts.html">Equality Asserts</a></li>
-<li id="current"><a href="identityAsserts.html">Identity Asserts</a></li>
-<li><a href="conditionAsserts.html">Condition Tests</a></li>
-<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
-<li><a href="typeAsserts.html">Type Asserts</a></li>
-<li><a href="utilityAsserts.html">Utility Methods</a></li>
-<li><a href="stringAssert.html">String Assert</a></li>
-<li><a href="collectionAssert.html">Collection Assert</a></li>
-<li><a href="fileAssert.html">File Assert</a></li>
-</ul>
-<li><a href="constraintModel.html">Constraint Model</a></li>
-</ul>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<ul>
+<li><a href="equalityAsserts.html">Equality Asserts</a></li>
+<li id="current"><a href="identityAsserts.html">Identity Asserts</a></li>
+<li><a href="conditionAsserts.html">Condition Asserts</a></li>
+<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
+<li><a href="typeAsserts.html">Type Asserts</a></li>
+<li><a href="exceptionAsserts.html">Exception Asserts</a></li>
+<li><a href="utilityAsserts.html">Utility Methods</a></li>
+<li><a href="stringAssert.html">String Assert</a></li>
+<li><a href="collectionAssert.html">Collection Assert</a></li>
+<li><a href="fileAssert.html">File Assert</a></li>
+<li><a href="directoryAssert.html">Directory Assert</a></li>
+</ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/ignore.html b/doc/ignore.html
index a494c33..5dffca8 100644
--- a/doc/ignore.html
+++ b/doc/ignore.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -202,46 +202,65 @@ public class SuccessTests
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<ul>
-<li><a href="category.html">Category</a></li>
-<li><a href="culture.html">Culture</a></li>
-<li><a href="description.html">Description</a></li>
-<li><a href="exception.html">Expected Exception</a></li>
-<li><a href="explicit.html">Explicit</a></li>
-<li id="current"><a href="ignore.html">Ignore</a></li>
-<li><a href="platform.html">Platform</a></li>
-<li><a href="property.html">Property</a></li>
-<li><a href="setCulture.html">SetCulture</a></li>
-<li><a href="setup.html">Setup</a></li>
-<li><a href="setupFixture.html">SetUp Fixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testFixture.html">Test Fixture</a></li>
-<li><a href="fixtureSetup.html">Test Fixture SetUp</a></li>
-<li><a href="fixtureTeardown.html">Test Fixture </a></li>
-</ul>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li><a href="category.html">Category</a></li>
+<li><a href="combinatorial.html">Combinatorial</a></li>
+<li><a href="culture.html">Culture</a></li>
+<li><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li id="current"><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/img/addinsDialog.JPG b/doc/img/addinsDialog.JPG
deleted file mode 100644
index a0279cd..0000000
Binary files a/doc/img/addinsDialog.JPG and /dev/null differ
diff --git a/doc/img/addinsDialog.jpg b/doc/img/addinsDialog.jpg
new file mode 100644
index 0000000..01e2b15
Binary files /dev/null and b/doc/img/addinsDialog.jpg differ
diff --git a/doc/img/advancedSettings.jpg b/doc/img/advancedSettings.jpg
new file mode 100644
index 0000000..74b83d4
Binary files /dev/null and b/doc/img/advancedSettings.jpg differ
diff --git a/doc/img/assembliesTab.jpg b/doc/img/assembliesTab.jpg
index 537820f..cb20495 100644
Binary files a/doc/img/assembliesTab.jpg and b/doc/img/assembliesTab.jpg differ
diff --git a/doc/img/assemblyReloadOptions.JPG b/doc/img/assemblyReloadOptions.JPG
deleted file mode 100644
index 3074b8f..0000000
Binary files a/doc/img/assemblyReloadOptions.JPG and /dev/null differ
diff --git a/doc/img/assemblyReloadSettings.jpg b/doc/img/assemblyReloadSettings.jpg
new file mode 100644
index 0000000..42f1b0f
Binary files /dev/null and b/doc/img/assemblyReloadSettings.jpg differ
diff --git a/doc/img/configEditor.jpg b/doc/img/configEditor.jpg
index 40eba87..81b6f3d 100644
Binary files a/doc/img/configEditor.jpg and b/doc/img/configEditor.jpg differ
diff --git a/doc/img/console-mock.jpg b/doc/img/console-mock.jpg
index 778ff08..103cb5d 100644
Binary files a/doc/img/console-mock.jpg and b/doc/img/console-mock.jpg differ
diff --git a/doc/img/displayTab.jpg b/doc/img/displayTab.jpg
deleted file mode 100644
index 1424cb1..0000000
Binary files a/doc/img/displayTab.jpg and /dev/null differ
diff --git a/doc/img/generalOptions.jpg b/doc/img/generalOptions.jpg
deleted file mode 100644
index d547547..0000000
Binary files a/doc/img/generalOptions.jpg and /dev/null differ
diff --git a/doc/img/generalSettings.jpg b/doc/img/generalSettings.jpg
new file mode 100644
index 0000000..8a197e7
Binary files /dev/null and b/doc/img/generalSettings.jpg differ
diff --git a/doc/img/generalTab.jpg b/doc/img/generalTab.jpg
index fe8fc8d..0e2273c 100644
Binary files a/doc/img/generalTab.jpg and b/doc/img/generalTab.jpg differ
diff --git a/doc/img/gui-screenshot.jpg b/doc/img/gui-screenshot.jpg
index ca9b2b3..88224ce 100644
Binary files a/doc/img/gui-screenshot.jpg and b/doc/img/gui-screenshot.jpg differ
diff --git a/doc/img/gui-verify.jpg b/doc/img/gui-verify.jpg
index 079e616..d8cbc96 100644
Binary files a/doc/img/gui-verify.jpg and b/doc/img/gui-verify.jpg differ
diff --git a/doc/img/internalTraceSettings.jpg b/doc/img/internalTraceSettings.jpg
new file mode 100644
index 0000000..e47d1bb
Binary files /dev/null and b/doc/img/internalTraceSettings.jpg differ
diff --git a/doc/img/miniGui.jpg b/doc/img/miniGui.jpg
index c351f68..6c5e703 100644
Binary files a/doc/img/miniGui.jpg and b/doc/img/miniGui.jpg differ
diff --git a/doc/img/optionsDialog.jpg b/doc/img/optionsDialog.jpg
deleted file mode 100644
index 2a2fe85..0000000
Binary files a/doc/img/optionsDialog.jpg and /dev/null differ
diff --git a/doc/img/resultTab.jpg b/doc/img/resultTab.jpg
deleted file mode 100644
index 95ce9b7..0000000
Binary files a/doc/img/resultTab.jpg and /dev/null differ
diff --git a/doc/img/testLoadOptions.jpg b/doc/img/testLoadOptions.jpg
deleted file mode 100644
index 0a5861b..0000000
Binary files a/doc/img/testLoadOptions.jpg and /dev/null differ
diff --git a/doc/img/testLoadSettings.jpg b/doc/img/testLoadSettings.jpg
new file mode 100644
index 0000000..146325f
Binary files /dev/null and b/doc/img/testLoadSettings.jpg differ
diff --git a/doc/img/testOutputOptions.jpg b/doc/img/testOutputSettings.jpg
similarity index 100%
rename from doc/img/testOutputOptions.jpg
rename to doc/img/testOutputSettings.jpg
diff --git a/doc/img/testProperties.jpg b/doc/img/testProperties.jpg
index 8fe29ce..ad02778 100644
Binary files a/doc/img/testProperties.jpg and b/doc/img/testProperties.jpg differ
diff --git a/doc/img/testResultOptions.JPG b/doc/img/testResultOptions.JPG
deleted file mode 100644
index 1374bfd..0000000
Binary files a/doc/img/testResultOptions.JPG and /dev/null differ
diff --git a/doc/img/testResultSettings.jpg b/doc/img/testResultSettings.jpg
new file mode 100644
index 0000000..bd3f796
Binary files /dev/null and b/doc/img/testResultSettings.jpg differ
diff --git a/doc/img/testTab.jpg b/doc/img/testTab.jpg
deleted file mode 100644
index 8225369..0000000
Binary files a/doc/img/testTab.jpg and /dev/null differ
diff --git a/doc/img/testsTab.JPG b/doc/img/testsTab.JPG
deleted file mode 100644
index 8f6b701..0000000
Binary files a/doc/img/testsTab.JPG and /dev/null differ
diff --git a/doc/img/textOutputOptions.jpg b/doc/img/textOutputOptions.jpg
deleted file mode 100644
index d4ca9e7..0000000
Binary files a/doc/img/textOutputOptions.jpg and /dev/null differ
diff --git a/doc/img/textOutputSettings.jpg b/doc/img/textOutputSettings.jpg
new file mode 100644
index 0000000..df846b9
Binary files /dev/null and b/doc/img/textOutputSettings.jpg differ
diff --git a/doc/img/treeDisplayOptions.JPG b/doc/img/treeDisplayOptions.JPG
deleted file mode 100644
index e8d20f5..0000000
Binary files a/doc/img/treeDisplayOptions.JPG and /dev/null differ
diff --git a/doc/img/treeDisplaySettings.jpg b/doc/img/treeDisplaySettings.jpg
new file mode 100644
index 0000000..113c662
Binary files /dev/null and b/doc/img/treeDisplaySettings.jpg differ
diff --git a/doc/img/visualStudioOptions.JPG b/doc/img/visualStudioOptions.JPG
deleted file mode 100644
index 48ed3d1..0000000
Binary files a/doc/img/visualStudioOptions.JPG and /dev/null differ
diff --git a/doc/img/visualStudioSettings.jpg b/doc/img/visualStudioSettings.jpg
new file mode 100644
index 0000000..75800c5
Binary files /dev/null and b/doc/img/visualStudioSettings.jpg differ
diff --git a/doc/index.html b/doc/index.html
index 24b159e..3b37da3 100644
--- a/doc/index.html
+++ b/doc/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -24,11 +24,13 @@
 
 <div id="content">
 
-<h2>NUnit 2.4.7</h2>
+<h2>NUnit 2.5.10</h2>
 	
-<p>This documentation covers the NUnit 2.4.7 release, which corrects several
-   issues found in the prior release and introduces some minor features. 
-   Where applicable, we have marked sections with the version in which a feature 
+<p>This documentation covers the NUnit 2.5.10 release, 
+   introducing a large set of new features to NUnit, particularly in
+   the area of parameterized or data-driven testing.
+
+<p>Where applicable, we have marked sections with the version in which a feature 
    first appeared.</p>
 
 <p>If you are new to NUnit, we suggest you begin by reading the 
@@ -47,27 +49,27 @@ separately.</p>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li id="current"><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li id="current"><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/installation.html b/doc/installation.html
index 27ef544..7846347 100644
--- a/doc/installation.html
+++ b/doc/installation.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -26,26 +26,26 @@
 
 <h2>Installation</h2>
 <p>By default the <b>NUnit</b> installation program places all of the files into the 
-	<b>C:\Program Files\NUnit 2.4.7</b> directory. In the installation directory 
-	there are three sub-directories: bin, doc, and samples. Source code is no
+	<b>C:\Program Files\NUnit 2.5.10</b> directory. 
+	In the installation directory there are up to four sub-directories: net-1.1,
+	  net-2.0, doc, and samples. The actual number depends on what the user has
+	  chosen to install. Source code is no
       longer provided with the binary installation package. Download the source
 	  package if source is needed.
 <h3>Running NUnit</h3>
-<p>The installation program places a number of items in the Start menu. There are
-	a number of shortcuts, which run the NUnit GUI under various versions of .NET
-	or under Mono, depending on the versions available on your system at the time
-	of installation.</p>
+<p>The installation program places a number of shortcuts in the start menu, which 
+	run NUnit under .NET or Mono, depending on what is installed on your system.
+    For NUnit 2.5, the gui only runs under version 2.0 of the CLR, although tests
+	may be executed under other versions using a separate process.
+
 <h3>Configuration</h3>
 <p>When running NUnit from the command line or through the desktop shortcut, the
 	configuration files files nunit.exe.config and nunit-console.exe.config control 
-	which version of the CLR is used. As installed, the <startup> section of the
-	config file is commented out and may be left that way unless problems arise.
-	If uncommented, the order of precedence is .NET 2.0, .NET 1.1 and .NET 1.0. 
-	To change which version is used, simply change the order of the elements
-	in the config files. The nunit About Box shows the version currently being used.</p>
-<p>Settings that you place in these files are not available to your tests or to the 
-	production code you are testing. A separate config file is used when running 
-	tests. If you are running tests from the test.dll assembly, the config file 
+	the operation of NUnit itself.
+    Settings that you place in these files are not available to your tests or to the 
+	production code you are testing. 
+<p>A separate config file is used for your tests themselves. 
+    If you are running tests from the test.dll assembly, the config file 
 	should be named test.dll.config. If you are running tests from the NUnit test 
 	project MyTests.nunit, the config file should be named MyTests.config. In 
 	either case the config file must reside in the same directory as the file from 
@@ -53,11 +53,14 @@
 <p>In addition to settings of your own, the config file for a set of tests may 
 	contain information used by NUnit in loading your tests. In particular, this 
 	allows you to control the apartment state and priority of the thread that NUnit 
-	uses to run your tests. Other settings may be added in the future. See the file 
-	nunit.tests.dll for an example.</p>
+	uses to run your tests. Other settings may be added in the future.</p>
+<p>See the <a href="configFiles.html">Configuration Files</a> 
+    page for further information on configuration.</p>
+	
 <h3>Installation Verification</h3>
-<p>Verify that the installation has worked successfully by running the NUnit gui and
-loading and running NUnitTests.nunit in the bin directory. All tests should pass.
+<p>NUnit's own tests are available as an installation option. If you installed
+the tests, you may verify that the installation has worked successfully by
+running the NUnit gui and loading and running NUnitTests.nunit. All tests should pass.
 <div class="screenshot-left">
     <img src="img/gui-verify.jpg"></div>
 <p>
@@ -66,7 +69,7 @@ loading and running NUnitTests.nunit in the bin directory. All tests should pass
 	successfully under an administrative id. This is a problem with the code in
 	the tests themselves, not with NUnit.</p>
 <h3>Timing Tests</h3>
-<p>The assembly timing-tests.dll contains several tests that measure the performance
+<p>The assembly timing-tests.dll contains several tests that measure the performance of
     NUnit in loading tests. In addition, it contains some long-running tests that are used 
 	to verify that all remoting timeout problems have been fixed. The test cases 
 	all run for six to 12 minutes and give no indication whatsoever that they are 
@@ -76,95 +79,46 @@ loading and running NUnitTests.nunit in the bin directory. All tests should pass
 <p>Additional tests are included with the samples and in separate assemblies used 
 	as data by the verification tests themselves. Failures or not run conditions in 
 	these tests are intentional.</p>
-<h3>Manual Installation</h3>
-<p>If you are building NUnit from source, it is recommended that you use the
-    NAnt script for your final build, since it puts all the required files
-	into one directory, from which you can easily copy them. Perform a manual
-	installation by following these steps:</p>
-<ol>
-	<p><li>Copy the following files to the target directory:
-			<ul>
-				<li>nunit.framework.dll</li>
-				<li>nunit.framework.extensions.dll</li>
-				<li>nunit.core.dll</li>
-				<li>nunit.core.interfaces.dll</li>
-				<li>nunit.core.extensions.dll</li>
-				<li>nunit.mocks.dll</li>
-				<li>nunit.uikit.dll</li>
-				<li>nunit.util.dll</li>
-				<li>nunit-console-runner.dll</li>
-				<li>nunit-console.exe</li>
-				<li>nunit-console.exe.config</li>
-				<li>nunit-gui-runner.dll</li>
-				<li>nunit.exe</li>
-				<li>nunit.exe.config</li>
-			</ul>
-		</li>
-	<p><li>Create shortcuts as needed.</li>
-	<p><li>If you want to be able to run the nunit tests, copy the following files to the 
-			same location as the others, along with any additional config files
-			for the dlls.
-			<ul>
-				<li>mock-assembly.dll</li>
-				<li>nonamespace-assembly.dll</li>
-				<li>notestfixtures-assembly.dll</li>
-				<li>nunit.core.tests.dll</li>
-				<li>nunit.extensions.tests.dll</li>
-				<li>nunit.framework.tests.dll</li>
-				<li>nunit.mocks.tests.dll</li>
-				<li>nunit.uikit.tests.dll</li>
-				<li>nunit.util.tests.dll</li>
-				<li>nunit-console.tests.dll</li>
-				<li>nunit-gui.tests.dll</li>
-				<li>nunit.testutilities.dll</li>
-				<li>test-assembly.dll</li>
-				<li>timing-tests.dll</li>
-				<li>NunitTests.nunit</li>
-				<li>NUnitTests.config</li>
-			</ul>
-		</li>
-</ol>
 
-<h4>Installation Under Mono</h4>
+<h3>Manual Installation</h3>
 
-<p>Mono is delivered with a version of NUnit already pre-installed. The Mono 1.0 release 
-	included a beta version of NUnit 2.2. Later builds may include a more up-to-date 
-	version of NUnit. Before attempting to install NUnit under Mono, determine whether 
-	an equivalent or newer version is already installed. It may be necessary to remove 
-	the pre-installed version from the GAC in order for the new version to be recognized.</p>
+<p>You may build NUnit from source using one of the Visual Studio solutions or
+    the NAnt script. In either case, an output directory is created, which
+	contains all files needed in the proper relative location. Just copy this
+	directory to a permanent location and create shortcuts if desired.
 
 </div>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<ul>
-<li><a href="quickStart.html">Quick Start</a></li>
-<li id="current"><a href="installation.html">Installation</a></li>
-<ul>
-<li><a href="upgrade.html">Upgrading</a></li>
-</ul>
-</ul>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<ul>
+<li><a href="quickStart.html">Quick Start</a></li>
+<li id="current"><a href="installation.html">Installation</a></li>
+<ul>
+<li><a href="upgrade.html">Upgrading</a></li>
+</ul>
+</ul>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/license.html b/doc/license.html
index a6c5c89..03ab709 100644
--- a/doc/license.html
+++ b/doc/license.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -27,7 +27,7 @@
 <h2>NUnit License</h2>
 
 <p>
-Copyright © 2002-2007 Charlie Poole<br>
+Copyright © 2002-2009 Charlie Poole<br>
 Copyright © 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov<br>
 Copyright © 2000-2002 Philip A. Craig</p>
 <p>	This software is provided 'as-is', without any express or implied warranty. In 
@@ -39,7 +39,7 @@ Copyright © 2000-2002 Philip A. Craig</p>
 <p>1. The origin of this software must not be misrepresented; you must not claim 
 	that you wrote the original software. If you use this software in a product, an 
 	acknowledgment (see the following) in the product documentation is required.</p>
-<p>Portions Copyright © 2002-2007 Charlie Poole or 
+<p>Portions Copyright © 2002-2009 Charlie Poole or 
     Copyright © 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. 
 	Vorontsov or Copyright © 2000-2002 Philip A. Craig</p>
 <p>2. Altered source versions must be plainly marked as such, and must not be 
@@ -60,27 +60,27 @@ us know</a>.</p>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li id="current"><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li id="current"><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/listMapper.html b/doc/listMapper.html
index 86ff5e8..7f00234 100644
--- a/doc/listMapper.html
+++ b/doc/listMapper.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -55,44 +55,43 @@ Expect(Map(strings).Property("Length"), EqualTo(lengths));
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<ul>
-<li><a href="classicModel.html">Classic Model</a></li>
-<li><a href="constraintModel.html">Constraint Model</a></li>
-<ul>
-<li><a href="equalConstraint.html">Equal Constraint</a></li>
-<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
-<li><a href="conditionConstraints.html">Condition Constraints</a></li>
-<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
-<li><a href="typeConstraints.html">Type Constraints</a></li>
-<li><a href="stringConstraints.html">String Constraints</a></li>
-<li><a href="collectionConstraints.html">Collection Constraints</a></li>
-<li><a href="propertyConstraint.html">Property Constraint</a></li>
-<li><a href="compoundConstraints.html">Compound Constraints</a></li>
-<li><a href="customConstraints.html">Custom Constraints</a></li>
-<li id="current"><a href="listMapper.html">List Mapper</a></li>
-</ul>
-</ul>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<ul>
+<li><a href="equalConstraint.html">Equal Constraint</a></li>
+<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
+<li><a href="conditionConstraints.html">Condition Constraints</a></li>
+<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
+<li><a href="pathConstraints.html">Path Constraints</a></li>
+<li><a href="typeConstraints.html">Type Constraints</a></li>
+<li><a href="stringConstraints.html">String Constraints</a></li>
+<li><a href="collectionConstraints.html">Collection Constraints</a></li>
+<li><a href="propertyConstraint.html">Property Constraint</a></li>
+<li><a href="throwsConstraint.html">Throws Constraint</a></li>
+<li><a href="compoundConstraints.html">Compound Constraints</a></li>
+<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
+<li id="current"><a href="listMapper.html">List Mapper</a></li>
+<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
+</ul>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/mainMenu.html b/doc/mainMenu.html
index e40f6ec..5f208d9 100644
--- a/doc/mainMenu.html
+++ b/doc/mainMenu.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -55,10 +55,15 @@ should be saved.</p>
 <h4>Reload Tests</h4>
 <p>Reloads the tests, merging any changes into the tree.</p>
 
-<h4>Recent Files…</h4>
-<p>Displays a list of recently opened files from which the user is able to select one for opening.
-If you are running under a CLR version prior to 2.0, files that were last opened under 2.0 will not
-appear.</p>
+<h4>Select Runtime</h4>
+<p>Displays a list of runtime versions you may select in order to reload
+the tests using that runtime. This submenu is only present if you have
+more than one runtime version available. Any framework versions not supported
+by your NUnit installation will be disabled until you install the
+necessary NUnit components.
+
+<h4>Recent Projects…</h4>
+<p>Displays a list of recently opened projects and assemblies from which the user is able to select one for opening.</p>
 
 <h4>Exit</h4>
 <p>Closes and exits the application. If a test is running, the user is given the opportunity to
@@ -222,37 +227,48 @@ connect to the NUnit web site.</p>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<ul>
-<li><a href="guiCommandLine.html">Command-Line</a></li>
-<li id="current"><a href="mainMenu.html">Main Menu</a></li>
-<li><a href="contextMenu.html">Context Menu</a></li>
-<li><a href="optionsDialog.html">Options Dialog</a></li>
-<li><a href="addinsDialog.html">Addins Dialog</a></li>
-<li><a href="testProperties.html">Test Properties</a></li>
-<li><a href="configEditor.html">Configuration Editor</a></li>
-<li><a href="projectEditor.html">Project Editor</a></li>
-</ul>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<ul>
+<li><a href="nunit-console.html">Console Runner</a></li>
+<li><a href="nunit-gui.html">Gui Runner</a></li>
+<ul>
+<li><a href="guiCommandLine.html">Command-Line</a></li>
+<li id="current"><a href="mainMenu.html">Main Menu</a></li>
+<li><a href="contextMenu.html">Context Menu</a></li>
+<li><a href="settingsDialog.html">Settings Dialog</a></li>
+<li><a href="addinsDialog.html">Addins Dialog</a></li>
+<li><a href="testProperties.html">Test Properties</a></li>
+<li><a href="configEditor.html">Configuration Editor</a></li>
+<li><a href="projectEditor.html">Project Editor</a></li>
+</ul>
+<li><a href="pnunit.html">PNUnit Runner</a></li>
+<li><a href="nunit-agent.html">NUnit Agent</a></li>
+<li><a href="runtimeSelection.html">Runtime Selection</a></li>
+<li><a href="assemblyIsolation.html">Assembly Isolation</a></li>
+<li><a href="configFiles.html">Configuration Files</a></li>
+<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/maxtime.html b/doc/maxtime.html
new file mode 100644
index 0000000..8acc0ff
--- /dev/null
+++ b/doc/maxtime.html
@@ -0,0 +1,120 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - Maxtime</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>MaxtimeAttribute (NUnit 2.5)</h3>
+
+<p>The <b>MaxtimeAttribute</b> is used on test methods to specify a maximum time 
+   in milliseconds for a test case. If the test case takes longer than the 
+   specified time to complete, it is reported as a failure.
+   
+<h4>Example</h4>
+
+<div class="code"><pre>
+[Test, Maxtime(2000)]
+public void TimedTest()
+{
+    ...
+}
+</pre></div>
+
+<h4>Notes:</h4>
+
+<ol>
+<li>Any assertion failures take precedence over the elapsed time check.
+<li>This attribute does not cancel the test if the time
+is exceeded. It merely waits for the test to complete and then
+compares the elapsed time to the specified maximum. If you want to
+cancel long-running tests, see <a href="timeout.html">TimeoutAttribute</a>.
+</ol>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li><a href="category.html">Category</a></li>
+<li><a href="combinatorial.html">Combinatorial</a></li>
+<li><a href="culture.html">Culture</a></li>
+<li><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li id="current"><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/multiAssembly.html b/doc/multiAssembly.html
index e0106bc..7f6ac35 100644
--- a/doc/multiAssembly.html
+++ b/doc/multiAssembly.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -96,33 +96,38 @@ and the user may need to place the directory containing the unmanaged dll on the
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<ul>
-<li><a href="configFiles.html">Configuration Files</a></li>
-<li id="current"><a href="multiAssembly.html">Multiple Assemblies</a></li>
-<li><a href="vsSupport.html">Visual Studio Support</a></li>
-<li><a href="extensibility.html">Extensibility</a></li>
-</ul>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<ul>
+<li><a href="nunit-console.html">Console Runner</a></li>
+<li><a href="nunit-gui.html">Gui Runner</a></li>
+<li><a href="pnunit.html">PNUnit Runner</a></li>
+<li><a href="nunit-agent.html">NUnit Agent</a></li>
+<li><a href="runtimeSelection.html">Runtime Selection</a></li>
+<li><a href="assemblyIsolation.html">Assembly Isolation</a></li>
+<li><a href="configFiles.html">Configuration Files</a></li>
+<li id="current"><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/nunit-agent.html b/doc/nunit-agent.html
new file mode 100644
index 0000000..4f97979
--- /dev/null
+++ b/doc/nunit-agent.html
@@ -0,0 +1,97 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - Nunit-agent</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>NUnit-Agent</h2>
+
+<p>The nunit-agent.exe program is used by other runners when the tests are being
+   run in a separate process. It is not intended for direct execution by users.
+
+<p>NUnit runs tests in a separate process in several situations:
+
+<ol>
+<li>When the program needs to be run under a different framework or version
+from the one being used by NUnit itself.
+<li>When the user requests process-level isolation through the command line
+or the NUnit settings.
+</ol>
+
+<h3>Debugging</h3>
+
+<p>When debugging tests that are run in a separate process, it is 
+   not possible to do so by simply running the console or gui runner
+   under the debugger. Rather, it is necessary to attach the debugger
+   to the nunit-agent process after the tests have been loaded. 
+
+<p>When running under the Gui, NUnit will continue to use the same 
+   process to reload tests so that it is not normally necessary to 
+   re-attach to a new process. However, if the settings are changed
+   in a way that requires a differnt process - for example, by changing 
+   the version of the runtime that is being used - the old process will
+   be terminated and a new one created. In that case, it's necessary
+   to re-attach to the new process.
+
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<ul>
+<li><a href="nunit-console.html">Console Runner</a></li>
+<li><a href="nunit-gui.html">Gui Runner</a></li>
+<li><a href="pnunit.html">PNUnit Runner</a></li>
+<li id="current"><a href="nunit-agent.html">NUnit Agent</a></li>
+<li><a href="runtimeSelection.html">Runtime Selection</a></li>
+<li><a href="assemblyIsolation.html">Assembly Isolation</a></li>
+<li><a href="configFiles.html">Configuration Files</a></li>
+<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/nunit-console.html b/doc/nunit-console.html
index c645e97..d9d8b51 100644
--- a/doc/nunit-console.html
+++ b/doc/nunit-console.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -53,30 +53,41 @@ program, which is built using /platform:x86, when testing 32-bit code on a
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<li id="current"><a href="nunit-console.html">Console Runner</a></li>
-<ul>
-<li><a href="consoleCommandLine.html">Command-Line</a></li>
-</ul>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<ul>
+<li id="current"><a href="nunit-console.html">Console Runner</a></li>
+<ul>
+<li><a href="consoleCommandLine.html">Command-Line</a></li>
+</ul>
+<li><a href="nunit-gui.html">Gui Runner</a></li>
+<li><a href="pnunit.html">PNUnit Runner</a></li>
+<li><a href="nunit-agent.html">NUnit Agent</a></li>
+<li><a href="runtimeSelection.html">Runtime Selection</a></li>
+<li><a href="assemblyIsolation.html">Assembly Isolation</a></li>
+<li><a href="configFiles.html">Configuration Files</a></li>
+<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/nunit-gui.html b/doc/nunit-gui.html
index e720db7..ac21aaa 100644
--- a/doc/nunit-gui.html
+++ b/doc/nunit-gui.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -30,7 +30,7 @@
 	failure of the tests. It allows you to selectively run single tests or suites 
 	and reloads automatically as you modify and re-compile your code. The following 
 	is a screenshot of NUnit running the same mock-assembly.dll shown in the 
-	previous example.</p>
+	nunit-console example.</p>
 
 <div class="screenshot-left">
      <img src="img/gui-screenshot.jpg"></div>
@@ -60,69 +60,77 @@ some tests were ignored and green for success.
 <p>The tabs along the bottom of the display show the results of running
 a test. The <b>Errors and Failures</b> tab displays the error message
 and stack trace for both unexpected exceptions and assertion failures.
-The <b>Tests Not Run</b> tab provides a list of all tests that were
-selected for running but were not run, together with the reason. The
-remaining tabs display text output from the tests. In the image above,
-there are four of them: <b>Console.Out</b>, <b>Console.Error</b>,
-<b>Trace</b> and <b>Log</b>. This is the default display, but these
-output tabs are actually under user control and may be removed or 
-modified or have new tabs added. 
-For more information, see the documentation for the 
-<a href="optionsDialog.html">Options Dialog</a>.
+Beginning with NUnit 2.5, source code for each stack location can be displayed
+in this tab - as is seen above - provided that the program was compiled with 
+debug information.
+
+<p>The <b>Tests Not Run</b> tab provides a list of all tests that were
+selected for running but were not run, together with the reason.
+
+<p>The Text Output tab displays text output from the tests, potentially
+including console output, trace output and log output. The default display
+provides a single tab, but additional tabs may be created by the user to
+hold specific kinds of output. For more information on creating new tabs, 
+see the documentation for the 
+<a href="settingsDialog.html">Settings Dialog</a>.
    
+
 <h3>Mini-Gui</h3>
 
-<p>With the release of NUnit 2.4, an alternate "mini-gui" is also available. It 
-   may be selected from the View menu. The following screenshot shows the mini
-   gui displaying the NUnit tests.</p>
+<p>Since the release of NUnit 2.4, an alternate "mini-gui" is also available. It 
+   may be selected from the View menu. In the following screenshot, the mini
+   gui window has been positioned next to the Visual Studio IDE so
+   that both windows can be seen.</p>
    
-<div class="screenshot">
+<div class="screenshot-left">
      <img src="img/miniGui.jpg"></div>
 
-<h3>NUnit on 64-Bit Platforms</h3>
-
-<p>The .NET 2.0 version of nunit.exe is built using /platform:anycpu,
-which causes it to be jit-compiled to 32-bit code on a 32-bit system and 64-bit code 
-on a 64 bit system. This causes an exception when NUnit is used to test a 32-bit
-application on a 64-bit system. To avoid this problem, use nunit-x86.exe , 
-which is built using /platform:x86, when testing 32-bit code on a 
-64-bit system.
-
 </div>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li id="current"><a href="nunit-gui.html">Gui Runner</a></li>
-<ul>
-<li><a href="guiCommandLine.html">Command-Line</a></li>
-<li><a href="mainMenu.html">Main Menu</a></li>
-<li><a href="contextMenu.html">Context Menu</a></li>
-<li><a href="optionsDialog.html">Options Dialog</a></li>
-<li><a href="addinsDialog.html">Addins Dialog</a></li>
-<li><a href="testProperties.html">Test Properties</a></li>
-<li><a href="configEditor.html">Configuration Editor</a></li>
-<li><a href="projectEditor.html">Project Editor</a></li>
-</ul>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<ul>
+<li><a href="nunit-console.html">Console Runner</a></li>
+<li id="current"><a href="nunit-gui.html">Gui Runner</a></li>
+<ul>
+<li><a href="guiCommandLine.html">Command-Line</a></li>
+<li><a href="mainMenu.html">Main Menu</a></li>
+<li><a href="contextMenu.html">Context Menu</a></li>
+<li><a href="settingsDialog.html">Settings Dialog</a></li>
+<li><a href="addinsDialog.html">Addins Dialog</a></li>
+<li><a href="testProperties.html">Test Properties</a></li>
+<li><a href="configEditor.html">Configuration Editor</a></li>
+<li><a href="projectEditor.html">Project Editor</a></li>
+</ul>
+<li><a href="pnunit.html">PNUnit Runner</a></li>
+<li><a href="nunit-agent.html">NUnit Agent</a></li>
+<li><a href="runtimeSelection.html">Runtime Selection</a></li>
+<li><a href="assemblyIsolation.html">Assembly Isolation</a></li>
+<li><a href="configFiles.html">Configuration Files</a></li>
+<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/nunit.css b/doc/nunit.css
index f15acaa..1e01e53 100644
--- a/doc/nunit.css
+++ b/doc/nunit.css
@@ -6,7 +6,7 @@ table { font: 1em "Verdana", "Arial", "Helvetica", sans-serif; }
 h1 { font-size: 1.8em; font-weight: bold; }
 h2 { font-size: 1.5em; font-weight: bold; }
 h3 { font-size: 1.2em; font-weight: bold; }
-h4 { font-size: 1em; font-weight: bold; margin: 0; padding: 0; }
+h4 { font-size: 1em; font-weight: bold;  }
 ul.across { width: 100%; display: block; list-style: none; }
 ul.across li { float: left; display: block; width: 9em }
 
@@ -21,7 +21,7 @@ ul.across li { float: left; display: block; width: 9em }
 * html #nav { height: 1%; }
 /* End of IE-mac hack */
 
-#nav a{  text-decoration: none; color: #000; font: 1em "Times New Roman", Roman, serif;
+#nav a{  text-decoration: none; color: #000; font: small "Times New Roman", Roman, serif;
          text-transform: uppercase; margin: 0 5px; padding: 5px 10px; border: 1px solid black; }
 #nav a.active { background: #999; } 
 #nav a:hover { background: #CCC; }
@@ -43,7 +43,7 @@ ul.across li { float: left; display: block; width: 9em }
 #subnav li a:hover { background-image: url(img/bulletOn.gif) }
 
 /* Main Content */
-#content { margin: 3em 25% 0 0; padding: 0 5% 1em 5%; }
+#content { margin: 3em 25% 10px 0; padding: 0 5% 1em 5%; }
 #content.wide { margin: 3em 5% 0 5%; padding: 0 5% 1em 5%; }
 #content p { padding: 0; margin: 0 0 1em 0; max-width: 660px; }
 #content ul { max-width: 660px; }
@@ -59,6 +59,9 @@ ul.across li { float: left; display: block; width: 9em }
           page-break-after: always }          
 #sig { text-align: right; font-size: .8em; width: 95%; display: none }
           
+table.nunit { margin: 1em 5%; padding: 0; width: auto; border-collapse: collapse; }
+table.nunit td, table.nunit th { border: 1px solid black; padding: 6px; text-align: left }
+table.nunit th { background: #ccf; font-weight: bold; }
 
 table.articles { margin: 20px 0 0 5%; padding: 0 10px 0 0; }
 
@@ -93,7 +96,7 @@ table.quote td.sig { border-left: solid black 1px; padding-left: 15px }
 	width: 14%; margin: 1em 0 0; padding: 0 5%; font-size: .8em; background-color: #fff }
 #news h4 { font: 1.2em "Times New Roman", Roman, serif; font-variant: small-caps; text-align: center; margin: 0 0 1em; }
 
-div.code { border: 1px solid #888; background-color: #ccf; width: 32em;
+div.code { border: 1px solid #888; background-color: #ccf; width: 36em;
       margin: 1.5em 0; padding: 2px 0; position: relative; }
 div.code pre { font: .8em "Courier New", Courier, monospace; margin: 0 1em .25em; }
 div.langFilter { position: absolute; top: 100px; left: 5%; }
@@ -102,6 +105,14 @@ div.dropdown { position: absolute; top: 0; left: 14px; padding: 0 10px; width: 2
     text-align: left; border: 1px solid #888; background-color: #ffd; }
 div.code div.dropdown { position: absolute; left: 14px; top: 0; padding: 0 10px; width: 20px;
 	text-align: left; border: 1px solid #888; background-color: #ffd; }
+div.notice { 
+  margin-left: 2em;
+  margin-right: 2em; 
+  text-align: center; 
+  font-style: italic; 
+  font-weight: bold; 
+}
+
 /* 
 #content.wide p { width: expression( document.documentElement.clientWidth > 700 ? "660px" : "auto" ); }
 #content.wide blockquote { width: expression( document.documentElement.clientWidth > 700 ? "580px" : "auto"  ); }
diff --git a/doc/nunitAddins.html b/doc/nunitAddins.html
index 35fb2dc..4134e0f 100644
--- a/doc/nunitAddins.html
+++ b/doc/nunitAddins.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -26,10 +26,6 @@
 
 <h2>NUnit Addins</h2>
 
-<div style="text-align: center; margin: 2em 10%; padding: 4px 0; border: 2px solid black">
-  <h4>Preliminary documentation, subject to change.</h4>
-</div>
-
 <p>NUnit originally identified tests in the time-honored way used in many xUnit
 test frameworks. Test classes inherited from the framework's 
 TestCase class. Individual test case methods were identified by having names
@@ -114,15 +110,15 @@ extension points. It is defined as follows:</p>
 	public interface IExtensionHost
 	{
 	 	IExtensionPoint[] ExtensionPoints { get; }
-		IFrameworkRegistry FrameworkRegistry{ get; }
 		IExtensionPoint GetExtensionPoint( string name );
+		ExtensionType ExtensionTypes { get; }
 	}
 </pre>
 
 <p>The <b>ExtensionPoints</b> property returns an array of all extension points
-for those extensions that need the information. The <b>FrameworkRegistry</b>
-is provided for advanced extensions that emulate external test frameworks. See
-the source code for details.</p>
+for those extensions that need the information. The <b>ExtensionTypes</b>
+property returns the flags for the type of extension supported by this host,
+allowing, for example, Gui extensions to only load in a Gui host.</p>
 
 <p>Most addins will only need to use the <b>GetExtensionPoint</b> method to
 get the interface to a particular extension point. The <b>IExtensionPoint</b>
@@ -144,186 +140,82 @@ to the <b>Extension Point</b> where it is installed. Generally, extensions
 do not need to remove themselves once installed, but the method is
 provided in any case.</p>
 
-<h3>Extension Point Details</h3>
-
-<p>Depending on the particular extension point, the object passed will
-need to implement one or more interfaces. The following <b>ExtensionPoints</b>
-are implemented in this release of NUnit:
-
-<ul>
-	<li><a href="#suiteBuilders">SuiteBuilders</a>
-	<li><a href="#testBuilders">TestCaseBuilders</a>
-	<li><a href="#testDecorators">TestDecorators</a>
-	<li><a href="#eventListeners">Listeners</a>
-</ul></p>
-
-<p>For examples of implementing each type of extension, see the Extensibility
-samples provided with NUnit. More complete examples are available in the
-code of NUnit itself, since NUnit uses the same mechanism internally.</p>
-
-<h4><a name="suiteBuilders">SuiteBuilders</a></h4>
-<p>
-<p>Addins use the host to access this extension point by name:
+<p>With NUnit 2.5, an additional interface, <b>IExtensionPoint2</b> is
+available. It derives from <b>IExtensionPoint</b> and also allows setting
+the priority order in which the extension will be called in comparison to 
+other extensions on the same extension point. The interface is defined
+as follows:
 
 <pre>
-	IExtensionPoint suiteBuilders = host.GetExtensionPoint( "SuiteBuilders" );</pre>
-
-<p>The extension object passed to Install must implement the ISuiteBuilder interface:
-
-<pre>
-	public interface ISuiteBuilder
+	public interface IExtensionPoint2 : IExtensionPoint
 	{
-		bool CanBuildFrom( Type type );
-		Test BuildFrom( Type type );
+		void Install( object extension, int priority );
 	}
 </pre>
 
-<p>The BuildFrom method should return a test fixture completely populated
-with its contained test cases.
-
-<h4><a name="testBuilders">TestCaseBuilders</a></h4>
-<p>
-<p>Addins use the host to access this extension point by name:
-
-<pre>
-	IExtensionPoint testCaseBuilders = host.GetExtensionPoint( "TestCaseBuilders" );</pre>
+<p>Only extension points that use a priority scheme implement this interface.
+In general, extension points with a priority scheme will use a default value
+for priority if the Install method without a priority is called. 
 
-<p>The extension object passed to Install must implement the ITestCaseBuilder interface:
+<p>In the NUnit 2.5 release, only the <b>TestDecorators</b> extension point implements
+<b>IExtensionPoint2</b>.
 
-<pre>
-	public interface ITestCaseBuilder
-	{
-		bool CanBuildFrom( MethodInfo method );
-		Test BuildFrom( MethodInfo method );
-	}
-</pre>
-
-<p>Note that this extension point will be called for methods in any type
-of fixture. If the addin is intended to only work on methods within
-a particular type of fixture, the CanBuildFrom method must check
-the fixture type.
-
-<h4><a name="testDecorators">TestDecorators</a></h4>
-<p>
-<p>Addins use the host to access this extension point by name:
-
-<pre>
-	IExtensionPoint testDecorators = host.GetExtensionPoint( "TestDecorators" );</pre>
-
-<p>The extension object passed to Install must implement the ITestDecorator interface:
-
-<pre>
-	public interface ITestDecorator
-	{
-		Test Decorate( Test test, MemberInfo member );
-	}
-</pre>
-
-<p>The Decorator may do several things, depending on what it needs
-to accomplish:
-<ol>
-  <li>Return test unmodified
-  <li>Modify properties of the test object and return it
-  <li>Replace test with another object, either discarding the
-  original or aggregating it in the new test.
-</ol>
-
-<h4><a name="eventListeners">EventListeners</a></h4>
-<p>
-<p>Addins use the host to access this extension point by name:
-
-<pre>
-	IExtensionPoint listeners = host.GetExtensionPoint( "EventListeners" );</pre>
-
-<p>The extension object passed to Install must implement the EventListener interface:
+<h3>Extension Point Details</h3>
 
-<pre>
-	public interface EventListener
-	{
-		void RunStarted( string name, int testCount );
-		void RunFinished( TestResult result );
-		void RunFinished( Exception exception );
-		void TestStarted(TestName testName);
-		void TestFinished(TestCaseResult result);
-		void SuiteStarted(TestName testName);
-		void SuiteFinished(TestSuiteResult result);
-		void UnhandledException( Exception exception );
-		void TestOutput(TestOutput testOutput);
-	}
-</pre>
+<p>Depending on the particular extension point, the object passed will
+need to implement one or more interfaces. The following <b>ExtensionPoints</b>
+are implemented in this release of NUnit:
 
-<p>You must provide all the methods, but the body may be empty for any
-that you have no need of.
+<ul>
+	<li><a href="suiteBuilders.html">SuiteBuilders</a>	<li><a href="testcaseBuilders.html">TestCaseBuilders</a>	<li><a href="testDecorators.html">TestDecorators</a>	<li><a href="testcaseProviders.html">TestCaseProviders</a>	<li><a href="datapointProviders.html">DataPointProviders</a>	<li><a href="eventListeners.html">EventListeners</a></ul></p>
 
-<h3>Tips for Writing Extensions</h3>
+<p>For examples of implementing each type of extension, see the Extensibility
+samples provided with NUnit. More complete examples are available in the
+code of NUnit itself, since NUnit uses the same mechanism internally.</p>
 
-<p>An Extenders Guide will be published in the future. At the moment, writing an
-extension is a bit of an adventure. Extension authors are advised to join the 
-nunit-developer list and post questions and comments there.
+<h4>See also...</h4>
 
-<p>For the moment, the following tips may be of assistance.
 <ul>
-<li>The <b>nunit.core.interfaces</b> assembly is intended to be stable in the future
-while the <b>nunit.core</b> assembly will change from release to release. Right now,
-both assemblies are still in flux, but extensions that depend solely on the interfaces
-assembly will have a much better chance of surviving NUnit version changes. Unfortunately,
-this is rather difficult to do without duplicating a great deal of NUnit code. Most
-of the add-in samples provided with NUnit are currently version dependent.
-
-<li>If you place the definition of a custom attribute in the same assembly as your
-add-in, then user tests are dependent on the add-in assembly. If the add-in is 
-version-dependent, then the user tests will also be version-dependent. We suggest
-placing any types referenced by user tests in a separate assembly, particularly if
-your extension relies on nunit.core.
-
-<li>If using Visual Studio, set Copy Local to false for any references to nunit.core
-or nunit.core.interfaces. This is especially important if you are also building
-NUnit itself.
-
-<li>There is currently no mechanism to allow decorators to apply in a particular order.
-NUnit applies decorators in the order in which they are returned through reflection,
-which may vary among different runtimes.
-
-<li>Avoid trying to "stretch" the existing extension points to do more than they were
-intended to do. Rather, let us know what further extension points you would like to see!
-</ul>
-
+<li><a href="extensionTips.html">Tips for Writing Extensions</a></ul>
 
 </div>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<ul>
-<li><a href="configFiles.html">Configuration Files</a></li>
-<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
-<li><a href="vsSupport.html">Visual Studio Support</a></li>
-<li><a href="extensibility.html">Extensibility</a></li>
-<ul>
-<li><a href="customAsserts.html">Custom Asserts</a></li>
-<li id="current"><a href="nunitAddins.html">NUnit Addins</a></li>
-</ul>
-</ul>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<ul>
+<li><a href="customConstraints.html">Custom Constraints</a></li>
+<li id="current"><a href="nunitAddins.html">NUnit Addins</a></li>
+<ul>
+<li><a href="suiteBuilders.html">SuiteBuilders</a></li>
+<li><a href="testcaseBuilders.html">TestcaseBuilders</a></li>
+<li><a href="testDecorators.html">TestDecorators</a></li>
+<li><a href="testcaseProviders.html">TestcaseProviders</a></li>
+<li><a href="datapointProviders.html">DatapointProviders</a></li>
+<li><a href="eventListeners.html">EventListeners</a></li>
+</ul>
+<li><a href="extensionTips.html">Tips for Extenders</a></li>
+</ul>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/optionsDialog.html b/doc/optionsDialog.html
deleted file mode 100644
index b642e5a..0000000
--- a/doc/optionsDialog.html
+++ /dev/null
@@ -1,262 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - OptionsDialog</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<link rel="stylesheet" type="text/css" href="nunit.css">
-<link rel="shortcut icon" href="favicon.ico">
-</head>
-<!-- End Standard Head Part -->
-
-<body>
-
-<!-- Standard Header for NUnit.org -->
-<div id="header">
-  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
-  <div id="nav">
-    <a href="http://www.nunit.org">NUnit</a>
-    <a class="active" href="index.html">Documentation</a>
-  </div>
-</div>
-<!-- End of Header -->
-
-<div id="content">
-
-<h2>Options Dialog</h2>
-
-<p>The Options Dialog is displayed using the Tools | Options menu item and allows the user to
-control some aspects of NUnit’s operation. With NUnit 2.4.4, a tree-based dialog
-replaced the older tabbed format.</p>
-
-<hr><h3>Gui Options - General</h3><hr>
-
-<div class="screenshot-right">
-   <img src="img/generalOptions.jpg"></div>
-
-<h3>Gui Display</h3>
-
-<h4>Full Gui</h4>
-<p>Displays the complete gui - as in prior versions of NUnit. This includes the
-   errors and failures and other tabs and the progress bar.</p>
-   
-<h4>Mini Gui</h4>
-<p>Switches the display to the mini-gui, which consists of the tree display 
-   only.</p>
-<h3>Recent Files</h3>
-
-<p>The text box allows the user to choose the number of entries to display in the recent files list.
-If <b>Load most recent project at startup</b> is checked, the GUI will load the last file opened unless it
-is run with a specific filename or with the <code>/noload</code> parameter.</p>
-
-<hr style="clear: both"><h3>Gui Options - Tree Display</h3><hr>
-
-<div class="screenshot-right">
-   <img src="img/treeDisplayOptions.jpg"></div>
-
-<h3>Tree View</h3>
-
-<p>The list box allows selecting the degree of expansion of the tree when tests are loaded:</p>
-<blockquote>
-<p><b>Expand</b> – expands all tests</p>
-<p><b>Collapse</b> – collapses all tests</p>
-<p><b>Hide Tests</b> – expands all suites except for the fixtures themselves.</p>
-<p><b>Auto</b> – selects one of the above based on the space available for the tree display.</p>
-</blockquote>
-
-<p>If <b>Clear results when reloading</b> is checked, an automatic or manual reload will reinitialize all
-test nodes in the tree (grey display) – if it is not checked, result information for tests that do
-not seem to have changed will be retained.</p>
-
-<p>If <b>Save visual state of each project</b> is checked, NUnit saves the state of the tree
-and restores it when the project is next opened. The information saved includes which
-branches of the tree are expanded, the selected node, any checked nodes and any
-category selection.
-
-<p>If <b>Show Checkboxes</b> is checked, the tree includes checkboxes, which may
-   be used to select multiple tests for running.</p>
-
-<hr style="clear: both"><h3>Gui Options - Test Results</h3><hr>
-
-<div class="screenshot-right">
-   <img src="img/testResultOptions.jpg"></div>
-
-<h3>Errors Tab</h3>
-
-<p>Check <b>Display Errors and Failures Tab</b> to display the 
-<b>Errors and Failures</b> tab, which shows information about failing tests.
-
-<p>Check <b>Enable Failure ToolTips</b> to display the tip window over the
-Errors and Failures display and the stack trace. Clear it if you prefer not
-to see the tip window.</p>
-
-<p>Check <b>Enable Word Wrap</b> to turn on word wrapping
-in the Errors and Failures display. While you can select this item and the
-preceding one at the same time, they do not interact well, so you will 
-normally choose one or the other.</p>
-
-<h3>Not Run Tab</h3>
-
-<p>Check <b>Display Tests Not Run Tab</b> to display the 
-<b>Tests Not Run</b> tab, which shows information about tests that were
-skipped or ignored.
-
-<hr style="clear: both"><h3>Gui Options - Text Output</h3><hr>
-
-<div class="screenshot-right">
-   <img src="img/textOutputOptions.jpg"></div>
-
-<h3>Select Tab</h3>
-
-<p>The <b>Select Tab</b> dropdown list is used to select one of the output tabs, for which
-settings are to be viewed or changed. It also contains entries that allow
-you to add a new tab or edit the list of tabs.
-
-<p>The <b>Restore Defaults</b> button is used to restore the default
-set of four tabs, in case you have modified the list of tabs.
-
-<p>The <b>Title</b> text box is used to modify the title displayed
-for the selected output tab.
-
-<p><b>Enabled</b> is checked by default. If you uncheck it,
-the selected tab will be removed from the tab control. This allows you to temporarily
-suppress output to a tab without actually removing its definition.
-
-<h3>Content</h3>
-
-<p>The four check boxes enable or disable a particular type of output
-on the selected output window. For each type, the display captures
-output produced while your test is running - either by the test
-itself or by the program you are testing.
-
-<h4>Standard Output</h4>
-<p>Captures all output written to Console.Error.
-
-<h4>Error Output</h4>
-<p>Captures all output written to Console.Error.
-
-<h4>Trace Output</h4>
-<p>Captures all output written to Trace or Debug.
-
-<h4>Log Output</h4>
-<p>Captures output written to a log4net log. NUnit captures
-all output at the Error level or above unless another level
-is specified for the DefaultLogThreshold setting in the  
-configuration file for the test assembly or project.
-
-<h3>Test Labels</h3>
-
-<p>Check <b>Display TestCase Labels</b> to precede text in the output window
-with the name of the test that produced it.</p>
-
-<p>Check <b>Suppress label if no output is displayed</b> to eliminate display
-of labels for tests that produce no output in the window.
-
-
-<hr style="clear: both"><h3>Test Loader Options - General</h3><hr>
-
-<div class="screenshot-right">
-   <img src="img/testLoadOptions.jpg"></div>
-
-<h3>Test Structure</h3>
-
-<p>If <b>Automatic Namespace suites</b> is selected, tests will be
-   shown in a hierarchical listing based on namespaces. This is the
-   standard display as used in versions prior to NUnit 2.4.
-
-<p>If <b>Flat list of TestFixtures</b> is selected, tests will be
-   shown as a sequential list of fixtures.
-
-<h3>Multiple Assemblies</h3>
-
-<p>If <b>Load in separate AppDomains</b> is selected, each assembly
-   in a multiple-assembly test run will be loaded in a separate AppDomain.
-
-<p>If <b>Load in a single AppDomain</b> is selected, all assemblies in
-   a multiple-assembly test run will use the same AppDomain. This is
-   the standard behavior of NUnit prior to version 2.4.
-
-<p>If <b>Merge tests across assemblies</b> is checked, the display of tests
-   will not be divided across assemblies. If automatic namespace suites are
-   used, they will be merged across all assemblies. This option is only
-   available when tests are run in the same appdomain.
-
-<h3>Shadow Copy</h3>
-
-<p>NUnit normally uses .Net shadow-copying in order to allow you to edit
-and recompile assemblies while it is running. Uncheck this box to disable
-shadow-copy only if you have a particular problem that requires it.</p>
-
-<p><b>Note:</b> If you are tempted to disable shadow copy in order to access
-files in the same directory as your assembly, you should be aware that there
-are alternatives. Consider using the Assembly.Codebase property rather than
-Assembly.Location.
-
-<hr style="clear: both"><h3>Test Loader Options - Assembly Reload</h3><hr>
-
-<div class="screenshot-right">
-   <img src="img/assemblyReloadOptions.jpg"></div>
-
-<h3>Assembly Reload</h3>
-
-<p>If <b>Reload before each test run</b> is checked, a reload will occur whenever the run button is
-pressed whether the assemblies appear to have changed or not.</p>
-
-<p>If <b>Reload when test assembly changes</b> is checked, assemblies are watched for any change and
-an automatic reload is initiated. This item is disabled on Windows 98 or ME.</p>
-
-<p>If <b>Re-run last tests run</b> is checked, tests are re-run whenever a Reload
-   takes place.</p>
-   
-<hr style="clear: both"><h3>IDE Support Options - Visual Studio</h3><hr>
-
-<div class="screenshot-right">
-   <img src="img/visualStudioOptions.jpg"></div>
-
-<h3>Visual Studio</h3>
-
-<p>If <b>Enable Visual Studio Support</b> is checked, the user will be able to open Visual Studio projects
-and solutions and add Visual Studio projects to existing test projects.</p>
-
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<ul>
-<li><a href="guiCommandLine.html">Command-Line</a></li>
-<li><a href="mainMenu.html">Main Menu</a></li>
-<li><a href="contextMenu.html">Context Menu</a></li>
-<li id="current"><a href="optionsDialog.html">Options Dialog</a></li>
-<li><a href="addinsDialog.html">Addins Dialog</a></li>
-<li><a href="testProperties.html">Test Properties</a></li>
-<li><a href="configEditor.html">Configuration Editor</a></li>
-<li><a href="projectEditor.html">Project Editor</a></li>
-</ul>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
-</div>
-<!-- End of Submenu -->
-
-
-<!-- Standard Footer for NUnit.org -->
-<div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
-</div>
-<!-- End of Footer -->
-
-</body>
-</html>
diff --git a/doc/pairwise.html b/doc/pairwise.html
new file mode 100644
index 0000000..502d603
--- /dev/null
+++ b/doc/pairwise.html
@@ -0,0 +1,110 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - Pairwise</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>PairwiseAttribute (NUnit 2.5)</h3>
+
+<p>The <b>PairwiseAttribute</b> is used on a test to specify that NUnit should
+   generate test cases in such a way that all possible pairs of
+   values are used. This is a well-known approach for combatting
+   the combinatorial explosion of test cases when more than
+   two features (parameters) are involved.
+   
+<p><b>Note:</b> In the current Alpha release, this attribute is 
+accepted but ignored and data items are combined usin the default
+combinatorial approach.
+   
+<h4>See also...</h4>
+<ul>
+<li><a href="sequential.html">SequentialAttribute</a><li><a href="combinatorial.html">CombinatorialAttribute</a></ul>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li><a href="category.html">Category</a></li>
+<li><a href="combinatorial.html">Combinatorial</a></li>
+<li><a href="culture.html">Culture</a></li>
+<li><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li id="current"><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/parameterizedTests.html b/doc/parameterizedTests.html
new file mode 100644
index 0000000..73781e4
--- /dev/null
+++ b/doc/parameterizedTests.html
@@ -0,0 +1,156 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - ParameterizedTests</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Parameterized Tests</h2>
+
+<p>NUnit 2.5 supports parameterized tests. Test methods
+may have parameters and various attributes are available
+to indicate what arguments should be supplied by NUnit.
+
+<p>Multiple sets of arguments cause the creation of multiple
+tests. All arguments are created at the point of loading the
+tests, so the individual test cases are available for 
+display and selection in the Gui, if desired.
+
+<p>Some attributes allow you to specify arguments inline - directly on
+   the attribute - while others use a separate method, property or field
+   to hold the arguments. In addition, some attributes identify complete test cases,
+   including all the necessary arguments, while others only provide data
+   for a single argument. This gives rise to four groups of attributes,
+   as shown in the following table.
+   
+<table class="nunit">
+<tr><th></th><th>Complete Test Cases</th><th>Data for One Argument</th></tr>
+<tr><th>Inline</th>
+    <td><a href="testCase.html">TestCaseAttribute</a></td>
+    <td><a href="random.html">RandomAttribute</a><br>
+	    <a href="range.html">RangeAttribute</a><br>
+		<a href="values.html">ValuesAttribute</a></td></tr>
+<tr><th>Separate</th>
+	<td><a href="testCaseSource.html">TestCaseSourceAttribute</a></td>
+	<td><a href="valueSource.html">ValueSourceAttribute</a></td></tr>
+</table>
+
+<p>In addition, when data is specified for individual arguments, special attributes
+may be added to the test method itself in order to tell NUnit how
+to go about combining the arguments. Currently, the following attributes
+are provided:
+
+<ul>
+<li><a href="combinatorial.html">CombinatorialAttribute</a> (default)
+<li><a href="pairwise.html">PairwiseAttribute</a><li><a href="sequential.html">SequentialAttribute</a></ul>
+
+<h3>Order of Execution</h3>
+
+<p>In NUnit 2.5, individual test cases are sorted alphabetically and executed in
+   that order. With NUnit 2.5.1, the individual cases are not sorted, but are
+   executed in the order in which NUnit discovers them. This order does <b>not</b>
+   follow the lexical order of the attributes and will often vary between different
+   compilers or different versions of the CLR.
+   
+<p>The following specific rules for ordering apply:
+<ol>
+<li>If all arguments are specified in a <b>single TestCaseSource</b> attribute,
+    the ordering of the cases provided will be maintained.
+<li>If each parameter has a <b>single Values</b>, <b>ValueSource</b> or
+    <b>Range</b> attribute and the <b>Sequential</b> combining strategy
+	is used - or there is only one argument - the ordering will be maintained.
+<li>In all other cases, including using multiple <b>TestCase</b> attributes
+    or a combination of different types of attributes, the ordering of the
+	test cases is undefined.
+</ol>   
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li><a href="category.html">Category</a></li>
+<li><a href="combinatorial.html">Combinatorial</a></li>
+<li><a href="culture.html">Culture</a></li>
+<li><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<ul>
+<li id="current"><a href="parameterizedTests.html">Parameterized Tests</a></li>
+</ul>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/pathConstraints.html b/doc/pathConstraints.html
new file mode 100644
index 0000000..2d5e06f
--- /dev/null
+++ b/doc/pathConstraints.html
@@ -0,0 +1,193 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - PathConstraints</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Path Constraints (NUnit 2.5)</h2>
+
+<p>Path constraints perform tests on paths, without reference to any
+   actual files or directories. This allows testing paths that are
+   created by an application for reference or later use, without 
+   any effect on the environment.
+   
+<p>Path constraints are intended to work across multiple file systems,
+   and convert paths to a canonical form before comparing them. 
+
+<p>It is usually not necessary to know the file system of the paths
+   in order to compare them. Where necessary, the programmer may
+   use the <b>IgnoreCase</b> and <b>RespectCase</b> modifiers to provide 
+   behavior other than the system default.
+      
+<h3>SamePathConstraint</h3>
+
+<h4>Action</h4>
+<p>Tests that two paths are equivalent.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+SamePathConstraint( string expectedPath )
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.SamePath( string expectedPath )
+</pre></div>
+
+<h4>Modifiers</h4>
+<div class="code"><pre>
+...IgnoreCase
+...RespectCase
+</pre></div>
+
+<h4>Examples of Use</h4>
+<div class="code"><pre>
+Assert.That( "/folder1/./junk/../folder2", 
+	Is.SamePath( "/folder1/folder2" ) );
+Assert.That( "/folder1/./junk/../folder2/x", 
+	Is.Not.SamePath( "/folder1/folder2" ) );
+
+Assert.That( @"C:\folder1\folder2",
+	Is.SamePath( @"C:\Folder1\Folder2" ).IgnoreCase );
+Assert.That( "/folder1/folder2",
+	Is.Not.SamePath( "/Folder1/Folder2" ).RespectCase );
+</pre></div>
+
+<h3>SubPathConstraint</h3>
+
+<h4>Action</h4>
+<p>Tests that one path is under another path.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+SubPathConstraint( string expectedPath )
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.SubPath( string expectedPath )
+</pre></div>
+
+<h4>Modifiers</h4>
+<div class="code"><pre>
+...IgnoreCase
+...RespectCase
+</pre></div>
+
+<h4>Examples of Use</h4>
+
+<div class="code"><pre>
+Assert.That( "/folder1/./junk/../folder2", 
+	Is.SubPath( "/folder1/folder2" ) );
+Assert.That( "/folder1/junk/folder2",
+	Is.Not.SubPath( "/folder1/folder2" ) );
+
+Assert.That( @"C:\folder1\folder2\folder3",
+	Is.SubPath( @"C:\Folder1\Folder2/Folder3" ).IgnoreCase );
+Assert.That( "/folder1/folder2/folder3",
+	Is.Not.SubPath( "/Folder1/Folder2/Folder3" ).RespectCase );
+</pre></div>
+
+<h3>SamePathOrUnderConstraint</h3>
+
+<h4>Action</h4>
+<p>Tests that one path is equivalent another path or that it is under it.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+SamePathOrUnderConstraint( string expectedPath )
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.SamePathOrUnder( string expectedPath )
+</pre></div>
+
+<h4>Modifiers</h4>
+<div class="code"><pre>
+...IgnoreCase
+...RespectCase
+</pre></div>
+
+<h4>Examples of Use</h4>
+
+<div class="code"><pre>
+Assert.That( "/folder1/./junk/../folder2", 
+	Is.SamePathOrUnder( "/folder1/folder2" ) );
+Assert.That( "/folder1/junk/../folder2/./folder3",
+	Is.SamePathOrUnder( "/folder1/folder2" ) );
+Assert.That( "/folder1/junk/folder2/folder3",
+	Is.Not.SamePathOrUnder( "/folder1/folder2" ) );
+
+Assert.That( @"C:\folder1\folder2\folder3",
+	Is.SamePathOrUnder( @"C:\Folder1\Folder2" ).IgnoreCase );
+Assert.That( "/folder1/folder2/folder3",
+	Is.Not.SamePathOrUnder( "/Folder1/Folder2" ).RespectCase );
+</pre></div>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<ul>
+<li><a href="equalConstraint.html">Equal Constraint</a></li>
+<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
+<li><a href="conditionConstraints.html">Condition Constraints</a></li>
+<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
+<li id="current"><a href="pathConstraints.html">Path Constraints</a></li>
+<li><a href="typeConstraints.html">Type Constraints</a></li>
+<li><a href="stringConstraints.html">String Constraints</a></li>
+<li><a href="collectionConstraints.html">Collection Constraints</a></li>
+<li><a href="propertyConstraint.html">Property Constraint</a></li>
+<li><a href="throwsConstraint.html">Throws Constraint</a></li>
+<li><a href="compoundConstraints.html">Compound Constraints</a></li>
+<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
+<li><a href="listMapper.html">List Mapper</a></li>
+<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
+</ul>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/platform.html b/doc/platform.html
index c4f9ac6..cf73bbe 100644
--- a/doc/platform.html
+++ b/doc/platform.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -219,65 +219,92 @@ public class SuccessTests
 <li>NT3</li>
 <li>NT4</li>
 <li>NT5</li>
+<li>NT6</li>
 <li>Win2K</li>
 <li>WinXP</li>
 <li>Win2003Server</li>
+<li>Vista</li>
+<li>Win2008Server</li>
+<li>Win2008ServerR2</li>
+<li>Windows7</li>
 <li>Unix</li>
 <li>Linux</li>
 <li>Net</li>
 <li>Net-1.0</li>
 <li>Net-1.1</li>
 <li>Net-2.0</li>
+<li>Net-4.0</li>
 <li>NetCF</li>
 <li>SSCLI</li>
 <li>Rotor</li>
 <li>Mono</li>
+<li>Mono-1.0</li>
+<li>Mono-2.0</li>
 </ul>
 
 </div>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<ul>
-<li><a href="category.html">Category</a></li>
-<li><a href="culture.html">Culture</a></li>
-<li><a href="description.html">Description</a></li>
-<li><a href="exception.html">Expected Exception</a></li>
-<li><a href="explicit.html">Explicit</a></li>
-<li><a href="ignore.html">Ignore</a></li>
-<li id="current"><a href="platform.html">Platform</a></li>
-<li><a href="property.html">Property</a></li>
-<li><a href="setCulture.html">SetCulture</a></li>
-<li><a href="setup.html">Setup</a></li>
-<li><a href="setupFixture.html">SetUp Fixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testFixture.html">Test Fixture</a></li>
-<li><a href="fixtureSetup.html">Test Fixture SetUp</a></li>
-<li><a href="fixtureTeardown.html">Test Fixture </a></li>
-</ul>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li><a href="category.html">Category</a></li>
+<li><a href="combinatorial.html">Combinatorial</a></li>
+<li><a href="culture.html">Culture</a></li>
+<li><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li id="current"><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/platformSupport.html b/doc/platformSupport.html
deleted file mode 100644
index 4c1eb17..0000000
--- a/doc/platformSupport.html
+++ /dev/null
@@ -1,99 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - PlatformSupport</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<link rel="stylesheet" type="text/css" href="nunit.css">
-<link rel="shortcut icon" href="favicon.ico">
-</head>
-<!-- End Standard Head Part -->
-
-<body>
-
-<!-- Standard Header for NUnit.org -->
-<div id="header">
-  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
-  <div id="nav">
-    <a href="http://www.nunit.org">NUnit</a>
-    <a class="active" href="index.html">Documentation</a>
-  </div>
-</div>
-<!-- End of Header -->
-
-<div id="content">
-
-<h2>NUnit Platform Support</h2>
-
-<p>NUnit 2.4 is distributed in two binary packages, one built with .Net 1.1 and
-one build with .Net 2.0. Users may also build NUnit on other 
-platforms. 
-
-<p>The following table lists the platforms under which we have successfully built 
-and tested NUnit. We have heard of people building and running NUnit under OSX, 
-but have not tested it ourselves. If you have information about other platforms 
-on which you have built or run NUnit, please let us know.
-
-<table class="platforms">
-  <tr><th rowspan=3 colspan=2>Build Platform</th><th colspan=7 style="text-align: center">Execution platform</th></tr>
-  <tr><th colspan=5 style="text-align: center">Windows</th><th colspan=2 style="text-align: center">Linux</th></tr>
-  <tr><th>.Net 1.0</th><th>.Net 1.1</th><th>.Net 2.0</th><th>Mono 1.0</th><th>Mono 2.0</th><th>Mono 1.0</th><th>Mono 2.0</th></tr>
-  <tr><th rowspan=5>Windows</th><th>.Net 1.0</th><td>OK</td><td>OK</td><td>OK</td><td>OK</td><td>OK</td><td>OK</td><td>OK</td></tr>
-  <tr><th>.Net 1.1</th><td>OK</td><td>OK</td><td>OK</td><td>OK</td><td>OK</td><td>OK</td><td>OK</td></tr>
-  <tr><th>.Net 2.0</th><td>-</td><td>-</td><td>OK</td><td>-</td><td>OK</td><td>-</td><td>OK</td></tr>
-  <tr><th>Mono 1.0</th><td>(7)</td><td>(7)</td><td>(7)</td><td>OK</td><td>OK</td><td>OK</td><td>OK</td></tr>
-  <tr><th>Mono 2.0</th><td>-</td><td>-</td><td>(10)</td><td>-</td><td>OK</td><td>-</td><td>OK</td></tr>
-  <tr><th rowspan=2>Linux</th><th>Mono 1.0</th><td>Fails</td><td>(7)</td><td>(10)</td><td>OK</td><td>OK</td><td>OK</td><td>OK</td></tr>
-  <tr><th>Mono 2.0</th><td>-</td><td>-</td><td>(10)</td><td>-</td><td>OK</td><td>-</td><td>OK</td></tr>
-</table>
-
-<h4>Notes</h4>
-<ol>
-  <li>OK means the build runs and all tests pass. Some tests may be skipped on a particular platform.
-  <li>Fails means the build fails to run or crashes immediately.
-  <li>A number like (n) means the build runs but there are n test failures.
-</ol>
-
-<h3>Gui Support</h3>
-
-<p>The NUnit Gui runs on both Windows and Linux. There are some undesirable
-visual artifacts on Linux and the Gui is not completely robust. User actions
-will sometimes cause it to crash. Most of the problems are expected to be 
-resolved as the Mono Windows.Forms implementation evolves.
-
-<p>Currently, .NET 1.1 binaries are more stable on Linux than those built 
-with Mono. We expect this to change in the future as well.
-
-
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.2</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li id="current"><a href="platformSupport.html">Platform Support</a></li>
-<li><a href="installation.html">Installation</a></li>
-<li><a href="features.html">Core Features</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
-</div>
-<!-- End of Submenu -->
-
-
-<!-- Standard Footer for NUnit.org -->
-<div id="footer">
-  Copyright © 2007 Charlie Poole. All Rights Reserved.
-</div>
-<!-- End of Footer -->
-
-</body>
-</html>
diff --git a/doc/pnunit.html b/doc/pnunit.html
new file mode 100644
index 0000000..256efd5
--- /dev/null
+++ b/doc/pnunit.html
@@ -0,0 +1,100 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - Pnunit</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>PNUnit</h2>
+
+<p><b>PNUnit</b> stands for "Parallel NUnit." It is an extension of NUNit
+developed by Pablo Santos Luaces and his team at Codice Software for
+their internal use in testing the Plastic (TM) Software Configuration
+Management System. Codice released PNUnit to the community in 2007.
+
+<p>As part of the NUnit 2.5 release, we worked with the NUnit and PNUnit
+teams worked together to make PNUnit work with NUnit without any modifications.
+PNUnit is now included in the NUnit distribution.
+
+<h3>How it Works</h3>
+
+<p><b>PNUnit</b> is not intended for "casual" parallelism merely to
+make the tests run faster. Rather, it's intended as a way to test
+applications composed of distributed, communicating components. Tests
+of each component run in parallel and use memory barriers to synchronize
+their operation. 
+
+<p>PNUnit uses a special executable to launch its tests. 
+The launcher reads an xml file that specifies the tests to be 
+executed and where they should run, whether on the same machine or
+on another machine on the network.
+
+<p>For more information about using PNUnit, consult the
+<a href="http://www.codicesoftware.com/infocenter/technical-articles/pnunit.aspx">documentation</a>
+at <a href="http://www.codicesoftware.com">www.codicesoftware.com</a>
+
+<h3>Future Plans</h3>
+
+<p>PNUnit will be integrated with NUnit so that parallel, distributed tests
+may be used through the normal NUnit console or gui runners.
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<ul>
+<li><a href="nunit-console.html">Console Runner</a></li>
+<li><a href="nunit-gui.html">Gui Runner</a></li>
+<li id="current"><a href="pnunit.html">PNUnit Runner</a></li>
+<li><a href="nunit-agent.html">NUnit Agent</a></li>
+<li><a href="runtimeSelection.html">Runtime Selection</a></li>
+<li><a href="assemblyIsolation.html">Assembly Isolation</a></li>
+<li><a href="configFiles.html">Configuration Files</a></li>
+<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/projectEditor.html b/doc/projectEditor.html
index 6b56a44..2529963 100644
--- a/doc/projectEditor.html
+++ b/doc/projectEditor.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -35,12 +35,59 @@ consists of a common area and two tabs, as seen in the image below.</p>
 
 <h3>Common Area</h3>
 
-<p>The common area of the Project Editor contains a label showing the full path 
-   to the project file. There is an edit box, allowing the user to change
-   the project AppBase, which defaults to the directory of the project file.
-   There is also a dropdown combo box permitting selection of the configuration 
-   to be edited and a button, which opens the 
-   <a href="configEditor.html">Configuration Editor</a>.</p>
+<p>The common area of the Project Editor contains information pertaining to
+   the project as a whole. Information that applies to a particular configuration
+   is displayed in the General and Assemblies tabs.
+   
+<h4>Project Path</h4>
+<p>This label shows the full path to the project file. In the case of a 
+   wrapper project, the path is set to the same directory as the assembly
+   that was initially opened.
+   
+<h4>Application Base</h4> 
+<p>This TextBox allows the user to change the project AppBase, which defaults to 
+   the directory of the project file. The button to the right of the TextBox
+   allows the user to browse and select a directory.
+   
+<h4>Process Model</h4>
+<p>This dropdown list allows you to specify how operating system processes are
+   used in loading and running the tests in this project. Four settings are
+   defined:
+   <ul>
+   <li>The <b>Default</b> setting refers to the option selected by the user
+       on the Assembly Isolation page of the NUnit Settings Dialog.
+   <li><b>Single</b> means that tests are run in a test domain in the
+   	   same process as NUnit. This is the way previous versions of NUnit
+	   ran tests.
+   <li><b>Separate</b> means that all the tests are run in a separate process 
+       that NUnit creates.
+   <li><b>Multiple</b> means that NUnit will create a separate process for
+       each test assembly in the project and run its tests there.
+   </ul>
+   
+<h4>Domain Usage</h4>
+<p>This dropdown list allows you to specify how tests are loaded into
+   AppDomains by NUnit. Three settings are defined:
+   <ul>
+   <li>The <b>Default</b> setting refers to the option selected by the user
+       on the Assembly Isolation page of the NUnit Settings Dialog.
+   <li><b>Single</b> means that all tests will run in a single test domain
+       created by NUnit. This was the way versions of NUnit prior to 2.4
+	   ran tests.
+   <li><b>Multiple</b> means that each test assembly is loaded into a
+       separate AppDomain. This setting is not available when Multiple
+	   processes are selected in the Process Model dropown.
+   </ul>
+   
+<h4>Configuration</h4>
+<p>This dropdown list allows you to select the particular configuration
+   within a project that is displayed in the bottom part of the dialog.
+   
+<h4>Edit Configs...</h4>
+<p>This button opens the  
+   <a href="configEditor.html">Configuration Editor</a>,
+   which allows you to add, delete or rename configs and set the
+   active configuration.
 
 <div class="screenshot-left">
 <img src="img/generalTab.jpg"></div>
@@ -50,6 +97,41 @@ consists of a common area and two tabs, as seen in the image below.</p>
 <p>The General tab allows setting a number of options pertaining to the selected configuration, all of
 which will be stored in the NUnit project file as attributes of the <config> xml node.</p>
 
+<h4>Runtime</h4>
+<p>This dropdown allows you to select a particular runtime framework to be used
+   for loading and running tests under the current configuration. Currently,
+   only Microsoft .NET and Mono are supported. If <b>Any</b> is selected, the 
+   tests will be run under the same runtime that NUnit itself is currently using.
+
+<h4>Version</h4>
+<p>This ComboBox allows you to select the particular version of the runtime framework
+   to be used for loading and running tests under the current configuration. The
+   dropdown list contains entries for
+   <ul>
+   <li>Default
+   <li>1.0
+   <li>1.1
+   <li>2.0
+   <li>4.0
+   </ul>
+   
+<p>If you select "Default" the assemblies in the project are examined to determine  
+   the version that is required.
+   See <a href="runtimeSelection.html">Runtime Selection</a> for 
+   more information on how NUnit selects the version to be used.
+
+<p>In special cases, you may wish to enter a version number that is not listed
+   in the list box. You may specify the version using two, three or four
+   components. The version you provide will be saved as you enter it. Leaving
+   the text box blank is equivalent to selecting "Default." 
+   
+<p><b>Note:</b> Running tests under a different runtime or version from the one that NUnit
+   is currently using will force them to run in a separate process.
+   
+<p><b>Note:</b> To conform with normal usage, specifying Mono as the runtime
+   with "1.0" as the version results in use of the Mono 1.0 profile, equating
+   to version 1.1.4322.
+   
 <h4>ApplicationBase</h4>
 <p>The ApplicationBase defaults to the directory containing the project file. Beginning
 with NUnit 2.2.3, it may be set to any location that is desired.</p>
@@ -89,37 +171,48 @@ the contents to change the path to the assembly.
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<ul>
-<li><a href="guiCommandLine.html">Command-Line</a></li>
-<li><a href="mainMenu.html">Main Menu</a></li>
-<li><a href="contextMenu.html">Context Menu</a></li>
-<li><a href="optionsDialog.html">Options Dialog</a></li>
-<li><a href="addinsDialog.html">Addins Dialog</a></li>
-<li><a href="testProperties.html">Test Properties</a></li>
-<li><a href="configEditor.html">Configuration Editor</a></li>
-<li id="current"><a href="projectEditor.html">Project Editor</a></li>
-</ul>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<ul>
+<li><a href="nunit-console.html">Console Runner</a></li>
+<li><a href="nunit-gui.html">Gui Runner</a></li>
+<ul>
+<li><a href="guiCommandLine.html">Command-Line</a></li>
+<li><a href="mainMenu.html">Main Menu</a></li>
+<li><a href="contextMenu.html">Context Menu</a></li>
+<li><a href="settingsDialog.html">Settings Dialog</a></li>
+<li><a href="addinsDialog.html">Addins Dialog</a></li>
+<li><a href="testProperties.html">Test Properties</a></li>
+<li><a href="configEditor.html">Configuration Editor</a></li>
+<li id="current"><a href="projectEditor.html">Project Editor</a></li>
+</ul>
+<li><a href="pnunit.html">PNUnit Runner</a></li>
+<li><a href="nunit-agent.html">NUnit Agent</a></li>
+<li><a href="runtimeSelection.html">Runtime Selection</a></li>
+<li><a href="assemblyIsolation.html">Assembly Isolation</a></li>
+<li><a href="configFiles.html">Configuration Files</a></li>
+<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/property.html b/doc/property.html
index a07ee99..2b946d7 100644
--- a/doc/property.html
+++ b/doc/property.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -138,7 +138,8 @@ dialog of the gui.</p>
 attributes that derive from <b>PropertyAttribute</b> and have them
 recognized by NUnit. PropertyAttribute provides a protected constructor
 that takes the value of the property and sets the property name to the
-name of the derived class.
+name of the derived class. NUnit itself uses this facility: some of
+it's specialized attributes are actually specializations of <b>PropertyAttribute</b>.
 
 <p>Here's an example that creates a Severity property. It works
 just like any other property, but has a simpler syntax and is type-safe.
@@ -167,51 +168,75 @@ public void MyTest()
 { /*...*/ }
 </pre></div>
 
+<p>Beginning with NUnit 2.5, a property attribute is able to contain
+multiple name/value pairs. This capability is not exposed publicly
+but may be used by derived property classes. NUnit uses this
+feature itself for certain attributes. See, for example, 
+<a href="requiresThread.html">RequiresThreadAttribute</a>.
 
 </div>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<ul>
-<li><a href="category.html">Category</a></li>
-<li><a href="culture.html">Culture</a></li>
-<li><a href="description.html">Description</a></li>
-<li><a href="exception.html">Expected Exception</a></li>
-<li><a href="explicit.html">Explicit</a></li>
-<li><a href="ignore.html">Ignore</a></li>
-<li><a href="platform.html">Platform</a></li>
-<li id="current"><a href="property.html">Property</a></li>
-<li><a href="setCulture.html">SetCulture</a></li>
-<li><a href="setup.html">Setup</a></li>
-<li><a href="setupFixture.html">SetUp Fixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testFixture.html">Test Fixture</a></li>
-<li><a href="fixtureSetup.html">Test Fixture SetUp</a></li>
-<li><a href="fixtureTeardown.html">Test Fixture </a></li>
-</ul>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li><a href="category.html">Category</a></li>
+<li><a href="combinatorial.html">Combinatorial</a></li>
+<li><a href="culture.html">Culture</a></li>
+<li><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li id="current"><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/propertyConstraint.html b/doc/propertyConstraint.html
index 7d83d3d..c4442a9 100644
--- a/doc/propertyConstraint.html
+++ b/doc/propertyConstraint.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -24,64 +24,116 @@
 
 <div id="content">
 
-<h2>Property Constraint (NUnit 2.4.2)</h2>
+<h2>Property Constraints (NUnit 2.4.2)</h2>
 
-<p>PropertyConstraint is used to test for existence of a named property and
-optionally tests its value. It may also be used as a prefix for other constraints
+<p>Property constraints are used to test for the existence of a named property and
+optionally to test its value. It may also be used as a prefix for other constraints
 to be applied to the property.
 
-<table class="constraints">
-<tr><th>Syntax Helper</th><th>Constructor</th><th>Operation</th></tr>
-<tr><td>Has.Property( string )</td><td>PropertyConstraint( string )</td></td><td>tests that a specific property exists</td></tr>
-<tr><td>Has.Property( string, object )</td><td>PropertyConstraint( string, object )</td></td><td>tests that the value of a property is equal to the value provided</td></tr>
-<tr><td>Has.Property( string, Constraint)...</td><td>PropertyConstraint</td></td><td>applies the following constraint to the value of a named property</td></tr>
-<tr><td>Has.Length( int )</td><td>PropertyConstraint</td></td><td>tests that the object's Length property is equal to the value given</td></tr>
-<tr><td>Has.Count( int )</td><td>PropertyConstraint</td></td><td>tests that the object's Count property is equal to the value given</td></tr>
-</table>
+<h3>PropertyExistsConstraint</h3>
+
+<h4>Action</h4>
+
+<p>Tests for the existence of a named property on an object.
+
+<h4>Constructor</h4>
+
+<div class="code"><pre>
+PropertyExistsConstraint(string name)
+</pre></div>
+
+<h4>Syntax</h4>
+
+<div class="code"><pre>
+Has.Property( string )
+</pre></div>
+
+<h4>Examples of Use</h4>
+
+<div class="code"><pre>
+Assert.That( someObject, Has.Property( "Version" ) );
+</pre></div>
+
+<h3>PropertyConstraint</h3>
+
+<h4>Action</h4>
+
+<p>Tests for the existence of a named property on an object and causes subsequent
+allows tests to be made on the property value.
+
+<h4>Constructor</h4>
+
+<div class="code"><pre>
+PropertyConstraint(string name)
+</pre></div>
+
+<h4>Syntax</h4>
+
+<div class="code"><pre>
+Has.Property(string)...
+</pre></div>
+
+<h4>Examples of Use</h4>
+
+<div class="code"><pre>
+Assert.That(someObject, Has.Property("Version").EqualTo("2.0"));
+Assert.That(collection, Has.Property("Count").GreaterThan(10));
+</pre></div>
+
+<h3>Special Properties</h3>
+
+<p>Certain common properties are known to NUnit and 
+may be tested using the following syntax...
+
+<div class="code"><pre>
+Has.Length...
+Has.Count...
+Has.Message...
+Has.InnerException...
+</pre></div>
 
 
 </div>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<ul>
-<li><a href="classicModel.html">Classic Model</a></li>
-<li><a href="constraintModel.html">Constraint Model</a></li>
-<ul>
-<li><a href="equalConstraint.html">Equal Constraint</a></li>
-<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
-<li><a href="conditionConstraints.html">Condition Constraints</a></li>
-<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
-<li><a href="typeConstraints.html">Type Constraints</a></li>
-<li><a href="stringConstraints.html">String Constraints</a></li>
-<li><a href="collectionConstraints.html">Collection Constraints</a></li>
-<li id="current"><a href="propertyConstraint.html">Property Constraint</a></li>
-<li><a href="compoundConstraints.html">Compound Constraints</a></li>
-<li><a href="customConstraints.html">Custom Constraints</a></li>
-<li><a href="listMapper.html">List Mapper</a></li>
-</ul>
-</ul>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<ul>
+<li><a href="equalConstraint.html">Equal Constraint</a></li>
+<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
+<li><a href="conditionConstraints.html">Condition Constraints</a></li>
+<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
+<li><a href="pathConstraints.html">Path Constraints</a></li>
+<li><a href="typeConstraints.html">Type Constraints</a></li>
+<li><a href="stringConstraints.html">String Constraints</a></li>
+<li><a href="collectionConstraints.html">Collection Constraints</a></li>
+<li id="current"><a href="propertyConstraint.html">Property Constraint</a></li>
+<li><a href="throwsConstraint.html">Throws Constraint</a></li>
+<li><a href="compoundConstraints.html">Compound Constraints</a></li>
+<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
+<li><a href="listMapper.html">List Mapper</a></li>
+<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
+</ul>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/quickStart.html b/doc/quickStart.html
index 881fc92..ad3352d 100644
--- a/doc/quickStart.html
+++ b/doc/quickStart.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -194,7 +194,7 @@ public void TransferWithInsufficientFundsAtomicity()
 }</pre>
 </div>
 
-<p>We are testing the transactional property of our business method – all operations are successful or none. Compile and run – red bar. OK, we’ve made $300.00 out of a thin air (1999.com déjà vu?) – the source account has the correct balance of 150.00 but the destination account shows : $450.00. How do we fix this? Can we just move the minimum balance check call in front of the updates:</p>
+<p>We are testing the transactional property of our business method – all operations are successful or none. Compile and run – red bar. OK, we’ve made $300.00 out of a thin air (1999.com déjà vu?) – the source account has the correct balance of 200.00 but the destination account shows : $450.00. How do we fix this? Can we just move the minimum balance check call in front of the updates:</p>
 
 <div class="code">
 <pre>public void TransferFunds(Account destination, float amount)
@@ -282,31 +282,31 @@ public void TransferWithInsufficientFundsAtomicity()
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<ul>
-<li id="current"><a href="quickStart.html">Quick Start</a></li>
-<li><a href="installation.html">Installation</a></li>
-</ul>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<ul>
+<li id="current"><a href="quickStart.html">Quick Start</a></li>
+<li><a href="installation.html">Installation</a></li>
+</ul>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/random.html b/doc/random.html
new file mode 100644
index 0000000..66e6d2d
--- /dev/null
+++ b/doc/random.html
@@ -0,0 +1,134 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - Random</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>RandomAttribute (NUnit 2.5)</h3>
+
+<p>The <b>RandomAttribute</b> is used to specify a set of random values to be provided
+   for an individual parameter of a parameterized test method. Since
+   NUnit combines the data provided for each parameter into a set of
+   test cases, data must be provided for all parameters if it is
+   provided for any of them.
+   
+<p>By default, NUnit creates test cases from all possible combinations
+   of the datapoints provided on parameters - the combinatorial approach.
+   This default may be modified by use of specific attributes on the
+   test method itself.
+   
+<p>RandomAttribute supports the following constructors:
+
+<div class="code"><pre>
+public Random( int count );
+public Random( double min, double max, int count );
+public Random( int min, int max, int count );
+</pre></div>
+   
+<h4>Example</h4>
+
+<p>The following test will be executed fifteen times, three times
+for each value of x, each combined with 5 random doubles from -1.0 to +1.0.
+
+<div class="code"><pre>
+[Test]
+public void MyTest(
+    [Values(1,2,3)] int x,
+    [Random(-1.0, 1.0, 5)] double d)
+{
+    ...
+}
+</pre></div>
+
+<h4>See also...</h4>
+<ul>
+<li><a href="values.html">ValuesAttribute</a><li><a href="range.html">RangeAttribute</a><li><a href="sequential.html">SequentialAttribute</a><li><a href="combinatorial.html">CombinatorialAttribute</a><li><a href="pairwise.html">PairwiseAttribute</a></ul>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li><a href="category.html">Category</a></li>
+<li><a href="combinatorial.html">Combinatorial</a></li>
+<li><a href="culture.html">Culture</a></li>
+<li><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li id="current"><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/range.html b/doc/range.html
new file mode 100644
index 0000000..a849a7d
--- /dev/null
+++ b/doc/range.html
@@ -0,0 +1,145 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - Range</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>RangeAttribute (NUnit 2.5)</h3>
+
+<p>The <b>RangeAttribute</b> is used to specify a range of values to be provided
+   for an individual parameter of a parameterized test method. Since
+   NUnit combines the data provided for each parameter into a set of
+   test cases, data must be provided for all parameters if it is
+   provided for any of them.
+   
+<p>By default, NUnit creates test cases from all possible combinations
+   of the datapoints provided on parameters - the combinatorial approach.
+   This default may be modified by use of specific attributes on the
+   test method itself.
+   
+<p>RangeAttribute supports the following constructors:
+
+<div class="code"><pre>
+public RangeAttribute( int from, int to );
+public RangeAttribute( int from, int to, int step );
+public RangeAttribute( long from, long to, long step );
+public RangeAttribute( float from, float to, float step );
+public RangeAttribute( double from, double to, double step );
+</pre></div>
+   
+<h4>Example</h4>
+
+<p>The following test will be executed nine times, as follows:
+<pre>
+	MyTest(1, 0.2)
+	MyTest(1, 0.4)
+	MyTest(1, 0.6)
+	MyTest(2, 0.2)
+	MyTest(2, 0.4)
+	MyTest(2, 0.6)
+	MyTest(3, 0.2)
+	MyTest(3, 0.4)
+	MyTest(3, 0.6)
+</pre>
+<div class="code"><pre>
+[Test]
+public void MyTest(
+    [Values(1,2,3) int x,
+    [Range(0.2,0.6,0.2] double d)
+{
+    ...
+}
+</pre></div>
+
+<h4>See also...</h4>
+<ul>
+<li><a href="values.html">ValuesAttribute</a><li><a href="random.html">RandomAttribute</a><li><a href="sequential.html">SequentialAttribute</a><li><a href="combinatorial.html">CombinatorialAttribute</a><li><a href="pairwise.html">PairwiseAttribute</a></ul>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li><a href="category.html">Category</a></li>
+<li><a href="combinatorial.html">Combinatorial</a></li>
+<li><a href="culture.html">Culture</a></li>
+<li><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li id="current"><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/releaseNotes.html b/doc/releaseNotes.html
index c15007e..bd13e93 100644
--- a/doc/releaseNotes.html
+++ b/doc/releaseNotes.html
@@ -1,1211 +1,1398 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - ReleaseNotes</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<link rel="stylesheet" type="text/css" href="nunit.css">
-<link rel="shortcut icon" href="favicon.ico">
-</head>
-<!-- End Standard Head Part -->
-
-<body>
-
-<!-- Standard Header for NUnit.org -->
-<div id="header">
-  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
-  <div id="nav">
-    <a href="http://www.nunit.org">NUnit</a>
-    <a class="active" href="index.html">Documentation</a>
-  </div>
-</div>
-<!-- End of Header -->
-
-<div id="content">
-
-<style><!--
-li { padding-bottom: .5em; }
-ul ul li { padding-bottom: 0; }
-dt { font-weight: bold }
---></style>
-
-<h2>Release Notes</h2>
-
-<h3>NUnit 2.4.7 - March 30, 2008</h3>
-
-<h4>General</h4>
-
-<ul>
-<li>NUnit no longer uses log4net for its internal logging,
-eliminating conflicts with tested applications that used
-an earlier version of log4net.
-</ul>
-
-<h4>Gui</h4>
-
-<ul>
-<li>The level of logging sent to the gui for display is
-now controlled by a setting in the config file for each
-test. If no setting is provided, the default value is Error. 
-See the NUnitTests.config file for an example of how to set this.
-</ul>
-
-<h4>Extensibility</h4>
-<ul>
-<li>NUnit now includes the <b>RowTest</b> extension, written by
-Andreas Schlapsi, in it's extension assemblies. This extension 
-allows you to write
-test methods that take arguments and to provide multiple sets 
-of argument values using the <b>RowAttribute</b>. To use <b>RowTest</b>,
-your test must reference the nunit.framework.extensions assembly.
-<br><br>
-<b>Note:</b> Merging extensions into NUnit's own extension assembly 
-is an experiment we are trying for this release. The approach may
-change in future releases.
-</ul>
-
-<h4>Bug Fixes</h4>
-
-<ul>
-<li>Fixed null reference exception in SimpleSettingsDialog
-<li>String equality comparisons now use Equals rather than
-String.Compare, which was causing some unexpected results.
-<li>Fixed a race condition in the EventPump
-<li>Exceptions in Dispose are now handled properly
-<li>Projects in directories for which the user does not
-have write access are closed correctly.
-<li>The Reload command is now disabled when no project
-is open, eliminating a crashing problem.
-<li>Visual Studio projects with platforms other than
-Any CPU may now be opened correctly.
-<li>Assemblies located on a UNC path now load correctly
-<li>The EventListeners extension point is correctly initialized
-<li>Has.None no longer causes a null reference exception
-<li>Use of log4net for internal logging has been eliminated
-due to performance and compatibility problems.
-</ul>
-
-<h3>NUnit 2.4.6 - December 31, 2007</h3>
-
-<h4>Framework</h4>
-
-<ul>
-<li><b>CollectionAssert</b> has been modified to work with instances
-of <b>IEnumerable</b> even if they are not true collections.
-<li>All attributes are now unsealed and attributes that derive
-from them will now be recognized by NUnit. For example, if you
-derive SpecAttribute from TestAttribute, you may use [Spec] to
-designate test methods without writing an extension. Note that
-you will still need to create an extension if you want to
-introduce any new behavior.
-</ul>
-
-<h4>Console</h4>
-
-<ul>
-<li>The new <b>/run</b> commandline option may be used to execute any
-test method, class or namespace. Unlike the <b>/fixture</b> option,
-it does not restrict classes that are loaded into memory so
-it works properly with assemblies containing <b>SetUpFixture</b>.
-This option should generally be preferred to the <b>/fixture</b>
-option for new work.
-<li>The console runner now allows combining categories through
-use of boolean expressions. For example, <b>/include:Long+Data</b> 
-will run all tests that have both of the categories Long and Data
-applied to them.
-</ul>
-
-<h4>Gui</h4>
-
-<ul>
-<li>When a test run has errors, the first one is now automatically selected
-at the end of the run.
-<li>Error messages have been reformatted so that the user message or expected
-value display starts a new line.
-<li>Extra leadin spaces have been removed from the stack trace display.
-<li>A new command-line option <b>/runselected</b> causes the gui to run the last
-remembered test selection. If no selection information has been saved for
-the project, then all tests are run.
-</ul>
-
-<h4>Extensibility</h4>
-
-<ul>
-<li>The NUnit web site now includes a <a href="http://nunit.com/?p=extensions">directory</a> 
-of published extensions to NUnit. The initial release of the site includes
-only a few items but will continue to expand as we receive and review extensions
-from contributors.
-
-</ul>
-
-<h4>Bug Fixes</h4>
-
-<ul>
-<li>NUnit-console now shows a stack trace when the TestFixtureSetUp fails or
-if the fixture constructor throws an exception.
-<li>The Enable Shadow Copy checkbox in the options dialog now functions
-correctly.
-<li>Automatic rerun no longer takes place when a run is already in progress.
-<li>Logging is commented out in the config file since the entries must
-be tailored for certain installations to avoid exceptions.
-<li>Non-assembly files in the addins directory no longer cause the
-loading of addins to fail.
-<li>The selection of Mini versus Full Gui displays in the options dialog
-now works correctly.
-<li>The status bar is no longer displayed for the Mini Gui.
-<li>Help text, which was formerly available in the options dialog,
-has now been restored.
-</ul>
-
-<h3>NUnit 2.4.5 - November 23, 2007</h3>
-
-<h4>Bug Fixes</h4>
-
-<ul>
-<li>The included log4net dll has been replaced with a version that works on all runtime platforms.
-<li>CollectionConstraint no longer confuses expected and actual counts
-<li>Radio buttons on the TestLoader settings page now work correctly
-<li>The MaxTimeTestDecorator sample has been fixed so that test attributes are recogized
-<li>Invalid data in the Settings file, no longer causes an exception
-<li>Documentation has been corrected in several places and missing files added
-</ul>
-
-<h3>NUnit 2.4.4 - October 20, 2007</h3>
-
-<h4>General</h4>
-
-<ul>
-<li>NUnit now uses log4net rather than Trace for its own internal logging. If
-enabled by the NUnit config files, log entries are saved in the file NUnit.log
-located in the Application Data directory.
-<br><br>
-<b>Note:</b> Using the supplied config file, log4net currently fails to create 
-the log file when running under Mono on Windows platforms. As a workaround, you
-may edit the configs to use a hardcoded path in place of the $(APPDATA) macro.
-</ul>
-
-<h4>Framework</h4>
-
-<ul>
-<li>A suite marked with the SuiteAttribute is now permitted to return a collection
-of fixture objects or Types, rather than a TestSuite. This eliminates the need
-for the tests to reference the nunit.core assembly.
-<li>Classes containing suites may now use the TestFixtureSetUp and TestFixtureTearDown
-attributes to decorate methods to be called for one-time setup and teardown.
-<br><br>
-<b>Note:</b> This feature has actually been in place since the 2.4 release, but
-was not previously reported in the release notes.
-
-<li>It is now possible to specify a TimeSpan as a tolerance when comparing
-two DateTime objects for equality.
-
-<li>Tests may now set a default tolerance for floating point comparisons may now 
-be set using <b>GlobalSettings.DefaultFloatingPointTolerance</b>. If not set, a 
-tolerance of 0.0d is used for backward compatibility.
-
-<li>String comparison failures now show more context than before, using the
-full width of the message line. The length of the message line defaults to 78
-but may be changed by setting <b>TextMessageWriter.MaxLineLength</b>. Set it to an
-arbitrarily high value to avoid all string truncation. Use the <b>NoClip</b>
-modifier on an equality constraint to prevent clipping on an individual
-assert.
-</ul>
-
-<h4>Gui</h4>
-
-<ul>
-<li>Cosmetic changes have been made to the main Gui window and the tabbed Options
-dialog has  been replaced with a tree-based dialog in order to allow more
-opportunity for expanded options.
-
-<li>User logging through log4net is captured and displayed by the Gui.
-
-<li>A new Test Output Options pane allows controlling exactly what appears in 
-each text window. By default, NUnit uses four tabs: StdOut, StdErr, Trace and 
-Log, but the user may remove, create or combine tabs as desired.
-
-<li>A new command-line option <b>/console</b> causes a console to be 
-allocated. This should be used when testing applications that used unmanaged
-APIs to write to stdout, since NUnit is not able to capture that output.
-</ul>
-
-<h4>Extensibility</h4>
-
-<ul>
-
-<li>A new <b>ExtensionPoint</b> has been added. The <b>Listeners</b> extension
-point allows an addin to install an <b>EventListener</b> in the test domain,
-which is called as the tests are run. Note that the call is asynchronous and
-therefore may not be used to control the running of the tests, but only to
-report information or take other action based on the events.
-
-<li>The implementation of NUnitTestFixture has been modified so that
-it is now possible to write a TestCaseBuilder addin, which will replace
-or enhance the builtin creation of TestCases.
-
-</ul>
-
-<h4>Bug Fixes</h4>
-
-<ul> 
-<li>The ability to select and copy text from the text output windows, which
-was unintentionally dropped in NUnit 2.4.3, has been restored.
-<li>The programs nunit-console-x86.exe and nunit-x86.exe are now being installed
-correctly by the .NET 2.0 Windows installer package.
-<li>Checked tests are now ignored when the checkboxes are hidden.
-<li>Fixed a problem loading assemblies with multiple # characters in the path
-<li>Tests are no longer executed twice with certain combinations of reload/rerun settings
-<li>Obsolete /framework option is no longer displayed by the console runner help
-<li>The console runner now accepts both /include and /exclude options
-<li>The Gui "loading" and "reloading" notices are now sized correctly under Mono
-<li>Trace output, which was disabled in 2.4.3, is now displayed correctly.
-<li>The exception message is now displayed when the wrong exception type is received from a testcase marked with ExpectedException
-<li>The EmptyCollection constraint now throws an exception if applied to a null reference rather than returning false
-<li>Reloading a single assembly no longer changes the config file name 
-<li>Changing options without a loaded project no longer gives an exception
-<li>The Show Checkboxes entry on the tree context menu now works correctly.
-<li>All levels of teardown now run when an exception is thrown
-</ul>
-
-<h3>NUnit 2.4.3 - August 16, 2007</h3>
-
-<h4>General</h4>
-<ul>
-<li>Mono compatibility is significantly improved. The Gui runs under Mono
-1.2.2. A number of tests, which were previously skipped under Mono, are now 
-executed successfully. See the 
-<a href="http://nunit.com/platformSupport.html">Platform Support</a>
-page on the website for more information.
-
-<li>Documentation is now available as a separate download.
-</ul>
-
-<h4>Console Runner</h4>
-
-<ul>
-<li>The console runner now uses negative return codes for errors encountered
-in trying to run the test.
-Failures or errors in the test themselves give a positive return 
-code equal to the number of such failures or errors.
-
-</ul>
-
-<h4>Bug Fixes</h4>
-
-<ul>
-<li>Comparisons between numeric values of various types now work correctly (see note).
-
-<li>Fixed crashing problems running the Gui under .NET 1.0. and Mono.
-
-<li>Fixed several problems when the new Load Fixture facility of the Gui:
-  <ul>
-    <li>An exception is no longer thrown when using it with multiple AppDomains.
-	<li>The Load Fixture menu item is no longer enabled for the top-level node.
-	<li>Assemblies within a test project now load without error.
-	<li>The full namespace hierarchy is now shown when loading a TestFixture.
-  </ul>
-  
-<li>Fixed incorrect implementation of CollectionAssert.AreEquivalent and
-CollectionAssert.IsEqualTo so that the number of occurences of an object
-in a collection is properly taken into account (see note). 
-<br><br>
-<b>Note:</b> Several of these fixes may cause failures of tests, which 
-had appeared to pass. In most cases, the passing tests were probably
-false positives.
-
-</ul>
-
-<h3>NUnit 2.4.2 - August 2, 2007</h3>
-
-<h4>General</h4>
-<ul>
-<li>The .Net 2.0 packages now include nunit-x86.exe and nunit-console-x86.exe,
-which may be used to test 32-bit code on 64-bit systems.
-</ul>
-
-<h4>Framework</h4>
-<ul>
-<li>Numeric comparison is now performed by converting the expected and actual
-values to the widest of the two types rather than by comparing the string
-representation of the two values. This eliminates certain problems with 
-decimals and floats and is more representative of how the comparison would
-be performed in most programming languages.
-
-<li>Two new attributes allow tailoring the tests for different cultures
-   <dl style="margin-left: 2em">
-      <dt>CultureAttribute
-	  <dd>Allows you to specify the cultures under which a test should be
-	  run or skipped. It works just like PlatformAttribute, supporting named
-	  parameters Include, Exclude and Reason. You can use local cultures ("en-GB")
-	  or neutral cultures ("en"). It may be used on tests, fixtures or assemblies.
-	  <dt>SetCultureAttribute
-	  <dd>Changes the culture for the duration of the test. As of this release,
-	  only a single culture may be specified, so you will need to create a separate
-	  test method for each culture under which you want ta test to be run.
-   </dl>
-   
-<li>Expected and actual value messages created by NUnit now use the InvariantCulture
-in formatting numeric values. DateTime values are formatted as "yyyy-MM-dd HH:mm:ss.fff".
-
-<li>A number of changes have been made to the constraint-based Assert syntax
-introduced in version 2.4:
-  <dl style="margin-left: 2em">
-    <dt>EqualTo(...).Within(...)
-    <dd>A tolerance may be specified 
-    for any numeric type and works as expected. The value specified as a tolerance
-    must be convertible to the type used in the comparison or an exception will
-    be thrown.
-
-    <dt>Collection Asserts 
-    <dd>Asserts that require a collection as the actual value now throw an exception
-    if the value is not a collection. In earlier releases, the test failed, which
-    caused false positives when it was modified by Not.
-	
-	<dt>Syntax Helpers
-	<dd>NUnit 2.4.1 provided four SyntaxHelpers: Is, List, Text and the 
-	undocumented Has helper. In 2.4.2, there are three helpers, with the List
-	class now being used for mapping collections as describe below.
-	
-	Rather than inheriting from a common base containing properties like Not and
-	All, each SyntaxHelper now implements only specific properties.
-	<ul>
-	<li><b>Is</b> defines the large majority of constraint tests. Since it is
-	a keyword in Visual Basic, the synonym <b>Iz</b> is provided for VB users.
-	Constraint operators <b>Is.All</b> and <b>Is.Not</b> are supported.
-	<li><b>Text</b> defines constraints that are specific to strings.
-	Constraint operator <b>Is.All</b> is supported as well.
-	<li><b>Has</b> is newly documented and extended in 2.4.2. It is used to make
-	tests on members of collections, elements of arrays, entries in dictionaries
-	and properties of objects. Operators <b>Has.No</b>, <b>Has.All</b>,
-	<b>Has.Some</b> and <b>Has.None</b> are supported.
-	<li><b>List.Contains()</b> has been replaced by <b>Has.Member()</b>.
-	</ul>
-
-	<dt>List.Map
-	<dd>Used to map a collection provided as an actual value to another collection
-	to which constraints are then applied. Currently supports creating a list
-	of the values of a given property. See the documentation for details.
-  </dl>
-  
-  <li>The <b>IConstraint</b> interface has been removed. Custom constraint
-  classes should inherit from the <b>Constraint</b> abstract class. 
-
-</ul>
-
-<h4>Core</h4>
-<ul>
-  <li>When tests in an NUnit project are run in multiple AppDomains, any non-default
-  values set for AppBase, PrivateBinPath and Configuration File are now honored for 
-  each separate assembly. If values are not provided, the default is to use the
-  location of each assembly together with any config file with the name of the
-  assembly plus the ".config" extension. When running in a single AppDomain, the
-  existing defaults are unchanged.
-  
-  <li>Any changes to the current directory or current culture made during a test 
-  are now restored at the end of the test. For example, if you set the culture
-  with code in your TestFixtureSetUp, that change will remain in place until
-  all tests are run and the TestFixtureTearDown completes. At that point, the
-  value will be restored to what it was before.
-</ul>
-
-<h4>Gui</h4>
-
-<ul>
-<li>The main window is activated whenever a test run has failures. This causes
-NUnit's taskbar button to be highlighted if the window is minimized or hidden.
-
-<li>The reload menu item is now called Reload Tests. It continues to work as 
-before, causing any changes in the assemblies to be merged into the tree. A new
-menu item, Reload Project, does a complete load by closing the project and 
-reopening it as if the user had done so through the Open menu item.
-
-<li>Separate recent file lists are maintained, one for running under .NET 2.0
-and one for earlier versions of the runtime. This useful for developers who work
-on multiple projects as well as those who maintain configurations for different
-runtimes in the same project file.
-
-<li>The tree context menu contains an entry to load the selected fixture alone.
-Developers working on large projects can reduce reloading time significantly
-by using this feature to load only a subset of the tests. A separate context
-menu item is used to reload the full project.
-<br><br>
-<b>Note:</b> This feature is a quick and dirty solution to the problem 
-of reload time. It is limited to a single selected item because that's
-what the underlying test loader currently supports. Future releases will
-deal with this in an entirely different way.
-
-<li>The Gui can now save and restore the visual state of the tree when a 
-project is closed and restores it on open. The following items are saved:
-  <ul>
-  <li>Whether checkboxes are shown
-  <li>The topmost visible node
-  <li>The selected node
-  <li>Which nodes are expanded or collapsed
-  <li>Which nodes are checked
-  <li>Which categories are selected
-  </ul>
-This is controlled by a selection on the Options Dialog.
-<br><br>
-<b>Note:</b> TopNode is restored correctly under .NET 2.0. Under .NET 1.1
-the node is made visible but may not be at the top of the display.
-
-<li>A summary of the last test run is shown below the progress bar. This
-information remains displayed even when the information in the status
-bar changes.
-
-<li>The Gui now remembers the last result tab selected.
-
-<li>The Project Editor now displays a confirmation box when you attempt
-to delete an assembly from the project.
-
-<li>If you change settings in the Options Dialog, which require a reload
-in order to take effect, a message box gives you the opportunity to 
-reload the project immediately.
-
-<li>If you change the active configuration - as from Debug to Release - and
-the new config can not be loaded, the old configuration is unloaded. In prior
-releases, the old config remained loaded even though the new config was
-marked as active.
-
-<li>The "Reloading..." message is now displayed when automatic reloading
-takes place.
-</ul>
-
-<h4>Bug Fixes</h4>
-<ul>
-<li>A comparer passed to CollectionAssert.AreEqual is now used
-<li>An error message is now displayed if the test result file can not be written
-<li>AbstractTestCaseDecoration no longer duplicates the fixture name
-<li>Renamed and deleted tests are now correctly removed from the Gui display
-<li>The internally used create-msi target is no longer displayed by the project help for NUnit.build
-<li>TipWindow no longer gives an IndexOutOfRangeException in certain situations
-<li>Failures are now reported correctly when running multiple assemblies in separate AppDomains
-<li>Recent file names containing a comma no longer cause an exception
-<li>Is.EqualTo(x).Within(y) now works correctly for floats
-<li>TestFixtureTearDown was not being called on fixtures marked as Explicit
-<li>Exclude checkbox in Gui is now cleared when all categories are removed
-<li>Tab order in the properties dialog has been corrected
-<li>The install files are now included in the source package
-</ul>
-
-<h3>NUnit 2.4.1 - May 3, 2007</h3>
-
-<h4>General</h4>
-
-<ul>
-<li>When the NUnit help is not installed, the Help menu item now displays the
-documentation from the NUnit web site.
-</ul>
-
-<h4>Framework</h4>
-
-<ul>
-<li>The following Assert overloads have been added
-   <dl style="margin-left: 2em">
-     <dt>Assert.Greater(long, long)
-     <dt>Assert.Greater(ulong, ulong)
-	 <dt>Assert.GreaterOrEqual(long, long)
-	 <dt>Assert.GreaterOrEqual(ulong, ulong)
-	 <dt>Assert.Less(long, long)
-	 <dt>Assert.Less(ulong, ulong)
-	 <dt>Assert.LessOrEqual(long, long)
-	 <dt>Assert.LessOrEqual(ulong, ulong)
-   </dl>
-</ul>
-
-<h4>Gui</h4>
-
-<ul>
-<li>When a load or reload is in progress, an indicator message is now
-displayed, centered on top of the form. The form is now displayed 
-earlier in the startup sequence so that error messages do not appear
-in isolation.
-
-<li>When a non-existent assembly is specified on the command line, the
-gui no longer closes after the error message is dismissed.
-
-<li>When the option to re-run tests when assembly changes is selected,
-the last set of tests run is now re-run, rather than running all tests.
-
-<li>The failure message for tests failing due to a problem with the
-TestFixtureSetUp now indicate the name of the failing fixture.
-</ul>
-
-<h4>Extensibility</h4>
-<ul>
-<li>The TestCase class has a new virtual method <b>MakeTestCaseResult()</b>,
-allowing extensions to use a derived TestCaseResult if desired. Because
-NUnit makes no use of additional properties or methods added to the 
-TestCaseResult, some sort of custom processing is required for this
-feature to be useful. Extenders should be aware that inheriting from
-TestCase currently makes the extension dependent on a particular version 
-of NUnit.
-
-<li>A brief list of "Tips for Writing Extensions" has been added to the documentation.
-</ul>
-
-<h4>Bug Fixes</h4>
-
-<ul>
-<li>CollectionAsserts no longer fail on collections containig null values.
-
-<li>The obsolete file, <b>nunit-gui.exe</b>, has been removed from the zip distribution.
-
-<li>The errors and failures display now recalculates the space available and 
-enables or disables the scrollbar whenever it is resized.
-
-<li>The xml file automatically saved by the Gui when a test is run is now
-correctly named as TestResult.xml rather than TestTesult.xml.
-
-<li>The <b>Explicit</b> attribute now works correctly when specified on
-a test fixture.
-
-<li>The /cleanup option no longer throws an exception when the shadow copy
-cache directory is not present.
-
-<li>The current directory is now set correctly when running a <b>SetUpFixture</b>.
-
-<li>Non-default test load options are no longer ignored when loading tests in
-multiple AppDomains.
-
-<li>The Errors and Failures display is now re-drawn with the scroll bars
-enabled/disabled as needed whenever it is resized.
-
-<li>The MaxTimeDecorator example no longer shows the name of a test
-case repeated twice in the full name of the test.
-</ul>
-
-<h3>NUnit 2.4 Final Release (2.4.0.2) - March 16, 2007</h3>
-
-<h4>Gui</h4>
-
-<ul>
-<li>A new /cleanup commandline option deletes NUnit's shadow copy
-cache and then exits.
-
-<li>When NUnit is run under .Net 1.1, assemblies built with .Net 2.0
-are not displayed in the recent files list. NUnit automatically loads
-the last assembly that was opened under .Net 1.1.
-<br><br>
-<b>Note:</b> When a program built with .Net 1.1 is run under .Net 2.0,
-it will not appear in the Recent Files list the next time NUnit is run
-under .Net 1.1. This issue will be fixed in a future release.
-
-<li>When the NUnit documentation is not installed, the Help menu item
-now displays the NUnit web site.
-</ul>
-
-<h4>Bug Fixes</h4>
-
-<ul>
-<li>The user interface (NUnitForm.cs) was not properly displayed at
-design time due to a problem with detecting DesignMode in nested
-User Controls.
-
-<li>CollectionConstraint was failing to find contained items in
-a collection implementing ICollection only - that is not implementing
-IList. This is now fixed and all collections use the same code path
-to avoid future problems.
-
-<li>The Tree setting "Show Checkboxes" was not being saved properly.
-
-<li>Many of NUnit's own tests were leaving files in the shadow
-copy cache due to not closing the test domain.
-
-<li>NUnit was attempting to instantiate an abstract class, derived
-from another abstract class marked with TestFixtureAttribute. NUnit
-will now mark all abstract classes with this attribute, or inheriting
-from classes with this attribute as non-runnable.
-</ul>
-
-<h3>NUnit 2.4 RC2 (2.4.0.1) - March 9, 2007</h3>
-
-<h4>Framework</h4>
-
-<ul>
-<li>The Is class has been moved to the SyntaxHelpers namespace in order
-to eliminate conflicts with mock object frameworks. Additional helper
-classes <b>List</b>, <b>Has</b> and <b>Text</b> have been added.
-<li>The <b>AssertionHelper</b> class has been added as an optional
-base class for user fixtures. Use of this class as a base makes methods
-available for creating constraints needing to use one of the helper
-classes.
-
-<li>A PropertyConstraint has been added, which allows testing the
-value of one of an object's properties.
-</ul>
-
-<h3>NUnit 2.4 RC1 (2.4.0) - February 25, 2007</h3>
-
-<h4>General</h4>
-
-<ul>
-<li>Two packages, built under the 1.1 and 2.0 runtimes, are provided
-as before, but they are now mutually exclusive - only one may be installed.
-By downloading the source, you can rebuild NUnit under other runtimes. See
-the <a href="platformSupport.html">Platform Support</a> page for 
-details about the runtimes under which each each package may be run.
-
-<li>If you build NUnit from source, you will notice that the full text
-of the license is no longer included in every file. For easier maintenance, we
-now put a short notice in the source files, which refers to the license.
-
-<li>Fit tests are now provided. The tests supplied are fairly rudimentary,
-but it's a start! The Fit assemblies required to run the tests are included
-with the NUnit distribution. You can get a complete Fit download, including 
-source code, at the <a href="fit.c2.com">Fit website</a>.
-
-<li>Samples are now organized by language and additional samples
-have been provided. C++ samples are provided using both the VS2003 
-managed C++ syntax and the new C++/CLI syntax for VS2005. Solution files
-group samples by language, with an additional solution for extensibility samples.
-
-<li>The nunit.common assembly, added in the Alpha release, has been eliminated.
-</ul>
-
-<h4>Framework</h4>
-
-<ul>
-<li>A new syntax and internal architecture for Asserts is being introduced in 
-this release, based on the notion of <b>constraints</b> found in JMock and NMock.
-  <ul>
-  <li>The <b>Assert.That</b> method is used to make an assertion based on a 
-  constraint
-    <dl style="margin-left: 2em">
-      <dt>Assert.That( actual, constraint, message, args );
-      <dt>Assert.That( actual, constraint, message );
-      <dt>Assert.That( actual, constraint );
-    </dl>
-  <li>The <b>constraint</b> argument may be specified directly using one of the 
-  built-in constraint classes or a user-defined class.
-  <li>It may also be specified using one of the syntax helpers provided as 
-  static methods of the <b>Is</b> class, such as
-    <dl style="margin-left: 2em">
-	  <dt>Is.Null
-	  <dt>Is.Empty
-	  <dt>Is.EqualTo( object )
-	  <dt>Is.CollectionContaining( object )
-	  <dt>Is.SubsetOf( collection )
-	</dl>
-	See the docs for complete information.
-  <li>Internally, all the "classic" Assert methods, like AreEqual, have been
-  re-implemented using the underlying constraint architecture.
-  <li>The old approach to extending Asserts by creating <b>Asserter</b> classes
-  is now deprecated and the classes and interfaces are marked Obsolete.
-  </ul>
-
-<li>A number of changes have been made to the <b>ExpectedException</b> attribute
-<ul>
-<li>Several constructors for <b>ExpectedExceptionAttribute</b> have
-been removed and two are now marked obsolete. All functionality
-continues to be available through the use of named parameters. See
-the  documentation for details.
-
-<li>User-defined <b>ExceptionHandlers</b> are now supported:
-  <ul>
-  <li>A handler takes a <b>System.Exception</b> as an argument and returns void.
-  Normal Assert statements are used to validate the exception.
-  <li>A default handler may be specified for the fixture by implementing
-  the <b>IExpectException</b> interface.
-  <li>Individual test case handlers may be specified by use of the
-  <b>Handler</b> named parameter.
-  <li>The <b>ExpectedException</b> attribute may be used without 
-  an exception type, leaving all validation to the <b>ExceptionHandler</b>.
-  </ul>
-
-<li>A custom error message may be displayed by use of the <b>UserMessage</b>
-named parameter.  
-</ul>
-
-<li>The <b>StringAssert</b> class has a new <b>IsMatch</b> method
-that does regular expression matching.
-
-<li>The setup and teardown methods in a <b>SetUpFixture</b> are now
-marked by the <b>SetUpAttribute</b> and <b>TearDownAttribute</b> rather
-than the corresponding "Fixture" attributes used in earlier betas.
-
-<li>NUnit now recognizes user-defined attributes derived from CategoryAttribute
-and PropertyAttribute. Protected constructors are provided for use by derived classes:
-<dl style="margin-left: 2em">
-	<dt>protected CategoryAttribute()
-	<dd>Creates a category with the same name as the derived class.
-	<dt>protected PropertyAttribute(object attributeValue)
-	<dd>Creates a property with the same name as the derived class.
-</dl><br>
-<b>Note:</b> Other attributes remain sealed, as in prior releases. 
-
-</ul>
-
-<h4>Core</h4>
-
-<ul>
-
-<li>User settings are now stored in an XML file rather than the registry.
-Any existing settings from NUnit 2.2 or from earlier betas are migrated on first use.
-
-<li>Properties assigned to tests are now included in the XML output file.
-
-<li>Internally, many classes which were previously defined as singletons are 
-now treated as services, managed by a ServiceManager.
-
-</ul>
-
-<h4>Console</h4>
-<ul>
-<li>The new <b>/domain</b> option controls of the creation of AppDomains for running tests.
-    The following values are recognized:
-	<dl style="margin-left: 2em">
-	<dt>None
-	<dd>No domain is created - the tests are run in the primary domain. This normally
-	requires copying the <b>NUnit</b> assemblies into the same directory as your tests.
-	<dt>Single
-	<dd>A test domain is created - this is how NUnit worked prior to version 2.4
-	<dt>Multiple
-	<dd>A separate test domain is created for each assembly
-	</dl>
-	The default is to use multiple domains if multiple assemblies are listed on 
-	the command line. Otherwise a single domain is used.<br><br>
-	
-<li>The obsolete <b>/thread</b> option has been replaced by <b>/nothread</b>.
-    Since tests have been run on a separate thread by default for some time,
-	the old option had no effect.<br><br>
-
-	<b>Note:</b> Default use of a separate test thread is intended to isolate 
-	NUnit from changes made to the thread context. Tests that change the context 
-	and don't restore it should not be run using this option.
-</ul>
-
-<h4>Gui</h4>
-
-<ul>
-<li>The GUI command line now supports /include and /exclude options for
-categories. Only one of the two may be used at a time. These options effect
-the initial category selection in the GUI.
-
-<li>The XML test results are now saved automatically in file <b>TestResult.xml</b>
-at the end of each run.
-
-<li>An option is provided to suppress shadow-copying of assemblies.
-
-<li>The Test Properties dialog now displays properties assigned to a test.
-The text fields for categories and properties have been replaced with listboxes.
-
-<li>Trace output from tests is displayed in a tab in the GUI. Optionally,
-trace and stderr output may be redirected to the Console output tab
-
-<li>The position, size and font of the mini-Gui window are now saved separately
-from the full-size window.
-
-<li>Internally, the gui display has been refactored so so that the tab
-display is provided by a separate control.
-
-<li>The Windows install packages set up individual shortcuts for running under
-each of the supported runtimes installed on your system. If additional supported
-runtimes are installed, you can create similar shortcuts yourself or reinstall
-NUnit to have them created automatically.
-
-</ul>
-
-<h3>NUnit 2.4 Beta 2 Release (2.3.6293) - October 20, 2006</h3>
-
-<h4>General</h4>
-
-<ul>
-<li>A new assembly, <b>nunit.core.interfaces</b>, is being introduced in this release.
-This assembly holds interfaces, enumerations and data types that are intended 
-for external use - for example, by client code that executes NUnit tests. Our
-intent is to hold the version number of this assembly constant through all 
-NUnit 2.4 maintenance releases and to avoid any breaking changes in this code.
-
-<li>The Windows installer is now built using WiX. With the removal of
-the Visual Studio deployment project from the VS2005 solution, it is
-now possible to build NUnit completely using C# Express.
-
-<li>The nunit.framework assembly is no longer installed in the GAC.
-
-</ul>
-
-<h4>Framework</h4>
-<ul>
-<li>The AreEqual and AreNotEqual asserts have been enhanced to work with
-multi-dimensional arrays and jagged arrays.
-
-<li>The error message for AreEqual with doubles and floats now includes
-the tolerance that was used in the comparison.
-
-<li>The handling of categories was not being done correctly. This is now fixed.
-   
-</ul>
-
-<h4>Console</h4>
-<ul>
-<li>The '/' character is no longer accepted for command-line options under Linux.
-    Any argument beginning with '/' is taken as a path.
-	
-<li>Fixed bug causing the /include and /exclude parameters to be ignored.
-</ul>
-
-<h4>Gui</h4>
-<ul>
-<li>Added a dialog to the Tools menu for displaying installed NUnit add-ins.
-
-<li>Modified the Tree submenu of the View menu to simplify choices for 
-expanding and collapsing the tree.
-
-<li>Added an entry to the View menu for displaying info about loaded test assemblies.
-
-<li>Added Run All, Run Failed, Show CheckBoxes, Expand All and Collapse All
-items to the tree context menu.
-
-<li>When right-clicking in the tree below the lowest node, the context menu commands 
-now relate to the currently selected node or nodes rather than the last node the 
-user right-clicked on.
-
-<li>The '/' character is no longer accepted for command-line options under Linux.
-    Any argument beginning with '/' is taken as a path.
-	
-<li>The category list is now cleared when a project is closed.
-
-<li>The "Word Wrap" checkbox has been removed. The setting is now available on
-    the Options Dialog.
-	
-<li>Automatic rerun of tests on change now works correctly.
-</ul>
-
-<h4>Extensibility</h4>
-<ul>
-<li>The extensibility mechanism has been generalized to allow a wider range
-of future extension points. The following new attributes and interfaces
-are used:
-	<dl style="margin-left: 2em">
-		<dt>NUnitAddinAttribute
-		<dd>Used to mark all addins and optionally specify Type, Name and Description
-		<dt>ExtensionType
-		<dd>Indicates whether the addin provides Core, Client or Gui extensions.
-		<dt>IAddin
-		<dd>Interface implemented by all addins, which allows the addin to install itself.
-		<dt>IExtensionHost
-		<dd>Interface supported by each NUnit extension host. Each host provides a number of extension points.
-		This release provides only the Core extension host. Future releases will provide Client and Gui hosts.
-		<dt>IExtensionPoint
-		<dd>Interface supported by an extension point, allowing an addin to install and remove the extensions it provides.
-		<dt>IFrameworkRegistry
-		<dd>Interface allowing addins that support external test frameworks to register them with NUnit.
-	</dl>
-</ul>
-
-<h3>NUnit 2.4 Beta 1 Release (2.3.6162) - June 11, 2006</h3>
-
-<h4>General</h4>
-<ul>
-<li>Additional NUnit tests now pass under Linux. Those that do not have
-    been excluded using the Platform attribute.
-
-</ul>
-<h4>Framework</h4>
-<ul>
-<li>Added a Reason property to ExplicitAttribute, for use in explaining why a test is marked Explicit.
-
-<li>Multiple SetUp or TearDown methods now give a more meaningful error message.
-</ul>
-
-<h4>Console</h4>
-<ul>
-<li>The console now outputs test failures to Trace all the time, not just
-    when running under the debugger. You will see clickable trace output in 
-	Visual Studio even if you use the Start Without Debugging menu item.
-</ul>
-
-<h4>Gui</h4>
-<ul>
-<li>Added Test Menu with entries for running the selected test, all tests or failed tests.
-
-<li>Instead of displaying a dialog box, unhandled exceptions now display in the 
-	Errors & Failures tab, with an indication of the test that was running 
-	when the exception was thrown. The test itself is not shown as a failure,
-	(unless it failed for some other reason, since it may not have caused the
-	exception. The progress bar turns red if any unhandled exceptions are thrown.
-	
-<li>The GUI no longer crashes when reloading assemblies with added or deleted
-    tests.
-</ul>
-
-<h3>NUnit 2.4 Alpha Release (2.3.6142) - May 22, 2006</h3>
-
-<h4>General</h4>
-<ul>
-<li>The source code directory structure has been reorganized to separate NUnitFramework and
-    NUnitCore.
-	
-<li>A new nunit.common assembly isolates core interfaces.
-
-<li>The following assemblies are now strongly named: nunit.mocks, nunit.core.extensions
- and nunit.framework.extensions
-
-<li>NUnit may now be installed by non-administrators, subject to any security
-    restrictions imposed by the particular site.
-	
-<li>The .Net 2.0 builds of NUnit are now called "NUnit for .Net 2.0"
-
-<li>The NAnt build script has been simplified and now consists only of the
-    <b>nunit.build</b> and <b>nunit.build.include</b> files.
-
-<li>The NAnt build script now has a target for building under the Mono 2.0 profile.
-
-<li>NUnit is now been built and tested using both Microsoft .Net (1.0, 1.1, 2.0) and Mono
-    (1.0 and 2.0 profiles).<br><br>
-	<b>Note:</b> in the Alpha release, a number of tests are skipped
-	when running under Linux or Unix.
-	
-</ul>
-
-<h4>Framework</h4>
-<ul>
-<li>A new CollectionAssert class has been added. It supports the following methods:
-   <dl style="margin-left: 2em">
-       <dt>AllItemsAreInstancesOf
-	   <dd>Tests that all members of a collection are instances of a class
-	   <dt>AllItemsAreNotNull
-	   <dd>Tests that all collection members are non-null.
-	   <dt>AllItemsAreUnique
-	   <dd>Tests that all collection members are unique
-	   <dt>AreEqual / AreNotEqual
-	   <dd>Test whether two collections are equal, having the same members in the same order
-	   <dt>AreEquivalent / AreNotEquivalent
-	   <dd>Test whether two collections are equivalent, having the same members without regard to order
-	   <dt>Contains / DoesNotContain
-	   <dd>Test whether a collection contains a particular object
-	   <dt>IsSubsetOf / IsNotSubsetOf
-	   <dd>Test whether one collection is a subset of another
-	   <dt>IsEmpty / IsNotEmpty
-	   <dd>Test whether a collection is empty or not
-   </dl><p><p>
-   
-   <b>Note:</b> In the Alpha release, IsEmpty, IsNotEmpty and Contains also continue 
-      to be available in the Assert class. We will be seeking feedback to determine
-	  whether these methods should be removed.
-   
-<li>A new FileAssert class has been added. It supports the following methods:
-   <dl style="margin-left: 2em">
-	   <dt>AreEqual( Stream, Stream )
-       <dt>AreEqual( FileInfo, FileInfo )
-	   <dt>AreEqual( string, string )
-	   <dt>AreNotEqual( Stream, Stream )
-       <dt>AreNotEqual( FileInfo, FileInfo )
-	   <dt>AreNotEqual( string, string )
-   </dl> 
-
-<li>The following new methods have been added to the Assert Class:
-   <dl style="margin-left: 2em">
-       <dt>Assert.GreaterOrEqual()
-	   <dt>Assert.LessOrEqual()
-   </dl>
-   
-<li>The following new overloads have been added to the Assert class:
-   <dl style="margin-left: 2em">
-       <dt>Assert.AreEqual( long, long )
-	   <dt>Assert.AreEqual( ulong, ulong )
-       <dt>Assert.AreNotEqual( long, long )
-	   <dt>Assert.AreNotEqual( ulong, ulong )
-   </dl>
-   
-<li>The following Asserts have been re-implemented in terms of AreEqual and
-    AreNotEqual in order to provide clearer messages when they fail:
-	<dl style="margin-left: 2em">
-	    <dt>IsTrue / IsFalse
-		<dt>IsNull / IsNotNull
-		<dt>IsNaN
-		<dt>IsEmpty / IsNotEmpty (string only)
-	</dl>
-	
-<li>A new PropertyAttribute allows setting arbitrary named properties on test
-    cases and fixtures. NUnit makes no use of these properties
-	but they may be accessed from the tests via reflection.
-	
-<li>ExpectedExceptionAttribute now takes an optional third argument to specify
-    how the expected message should be matched. In addition to an exact match, 
-	as now, you may specify a string which should be contained in the message
-	or a regular expression to be matched against the actual message.
-</ul>
-
-<h4>Core</h4>
-<ul>
-<li>When multiple assemblies are loaded, they may use a single AppDomain, as now,
-    or a separate AppDomain for each assembly. The new option provides greater 
-	isolation of the tests and allows use of separate config files for each assembly.
-	<br><br>
-	<b>Note:</b> In the Alpha release, separate config files are required when
-	this option is used, even if an NUnit project is loaded.
-	
-<li>The automatic creation of test suites for each namespace is now optional. When
-    the creation of these suites is suppressed, the fixtures are loaded as a simple
-	flat list, without any hierarchy imposed.
-	
-<li>When multiple assemblies are loaded, the tests may optionally be merged. If
-    automatic namespace suites are enabled, namespaces are merged across assemblies.
-	This option is only available if a single AppDomain is used.
-	
-<li>The fixture object is created for the life of the test run and is no longer
-    reused on subsequent runs. If the object implements IDisposable, Dispose
-	is called before destroying it.
-	
-<li>The current directory is set to the location of the test assembly before
-    running each fixture. This change facilitates running fixtures in any order
-	and eliminates interference between fixtures that change the current directory.
-	
-<li>Non-public fixture classes are treated as non-runnable and display a warning
-    message rather than being silently ignored.
-
-<li>A new SetUpFixture allows one-time SetUp and TearDown at the level of a
-    NameSpace or for an entire assembly.<p><p>
-	
-<li>The TestRunner no longer passes "live" tests back to the gui or console.
-    Instead, a data class that encapsulates the info about the test is sent.
-	
-<li>Registry settings are now stored under nunit.org. Old settings are migrated
-    automatically when the application is first run.
-	
-<li>When the default config for a test project is set to "NUnitAutoConfig"
-    the configuration of the current NUnit build is automatically selected
-	for the tests, if available. This is intended for use by NUnit developers.
-
-</ul>
-
-<h4>Console</h4>
-<ul>
-<li>When multiple assemblies are passed on the command line, the console runner
-    now loads those assemblies into separate AppDomains. Separate config files
-	should be provided for each assembly in this case.
-	
-<li>The <b>/include</b> and <b>/exclude></b> options may now be combined on 
-    the command line. When both are used, all tests with the included categories 
-	are run except for those with the excluded categories.
-	
-</ul>
-
-<h4>Gui</h4>
-<ul>
-<li>The gui executable is now called "nunit.exe" rather than "nunit-gui.exe"
-
-<li>There is a new option to automatically re-run the test whenever
-    a change is detected.
-    
-<li>A new "mini-gui" configuration may be selected from the View menu. This
-    display consists of the tree view area only. All info about the tests may
-	be accessed via the properties display or by returning to the full gui.
-	
-<li>The following additional Gui customizations are also available through the 
-    View menu:
-    <ul>
-	    <li>The font used in the Gui may be changed
-		<li>The four info tabs on the right may be turned on or off
-		<li>The status bar may be removed
-	</ul>
-	
-<li>Menu items pertaining to expansion and collapse of the tree have been moved
-    to the Tree submenu of the View menu.
-	
-<li>The Options dialog has been reorganized to add new options for running tests
-    and to better group similar items.
-	
-<li>The Test Properties dialog has been reorganized to display all info on a
-    single page and to more clearly show the status of the test.
-	
-<li>The icons used for tests in the tree view now show test status by use of
-    symbols, in addition to their color:
-	<dl style="margin-left: 2em">
-	    <dt>Not Run
-		<dd>Grey circle
-		<dt>Success
-		<dd>Green circle with a check mark in it
-		<dt>Failure
-		<dd>Red circle with an X mark in it
-		<dt>Ignored
-		<dd>Yellow circle with a question mark in it
-	</dl>
-	
-<li>For further customization of the icons, users may modify or replace the 
-    files Success.jpg, Failure.jpg or Ignored.jpg in the NUnit bin directory.
-	
-<li>Tests that are not run due to the Explicit or Platform attributes are no
-    longer considered as Ignored. They remain marked as grey in the gui and 
-	do not affect the color of the progress bar.
-	
-<li>Wordwrap may be turned on and off in the 'Errors and Failures' tab by use
-    of a checkbox at the bottom of the tab.
-</ul>
-
-<h4>Extensibility</h4>
-<ul>
-<li>NUnit now supports three types of core addins:
-    <dl style="margin-left: 2em">
-	   <dt>SuiteBuilders
-	   <dd>Allow an extender to provide new types of test fixtures with
-	       their own behavior.
-	   <dt>TestCaseBuilders
-	   <dd>Allow an extender to provide new types of test cases, either
-	       as a part of a custom test fixture or within a standard NUnit
-		   fixture.
-	   <dt>TestDecorators
-	   <dd>Allow an extender to modify the behavior of 
-	       a standard or custom test case or fixture. This is a good
-		   choice for implementing attributes that should apply to 
-		   various types of tests.
-	   <dd>
-	</dl>
-
-<li>Addin assemblies may now be deployed by copying them assembly to the
-	NUnit <b>bin/addins</b> directory.
-	
-<li>Extensions distributed as part of NUnit are now divided between the two
-    assemblies nunit.core.extensions and nunit.framework.extensions. Only the
-	latter is intended to be referenced by user tests.
-	
-<li>This Alpha release of NUnit provides only one internal extension: the Repeat 
-    attribute may be applied to test cases to cause them to run a number of 
-	times. The extensions emulating CsUnit and VSTS tests, which were included
-	experimentally in recent versions of NUnit 2.2 have been removed and will
-	be distributed separately.
-	
-<li>Several trivial examples, which were formerly part of the extensions
-	assmebly are now included as samples.
-	
-<li>Documentation for NUnit's extensibility features is still in preparation.
-</ul>
-
-<h3>Earlier Releases</h3>
-
-Cumulative notes through NUnit 2.2.9 are available <a href="docs/2.2.10/releaseNotes.html">here</a></h3>
-
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - ReleaseNotes</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<style><!--
+li { padding-bottom: .5em; }
+ul ul li { padding-bottom: 0; }
+dt { font-weight: bold }
+--></style>
+
+<h2>Release Notes</h2>
+
+<style><!--
+li { padding-bottom: .5em; }
+ul ul li { padding-bottom: 0; }
+dt { font-weight: bold }
+--></style>
+
+<h3>NUnit 2.5.10 - Version 2.5.10.11092 - April 2, 2011</h3>
+
+<h4>Framework</h4>
+
+<ul>
+<li><b>TestCaseAttribute</b> and <b>TestFixtureAttribute</b> now accept a named parameter 'Category' to specify the category of the individual test case or fixture instance.
+</ul>
+
+<h4>Bug Fixes</h4>
+
+<ul>
+<li>691129   	Add Category parameter to TestFixture
+<li>701331   	TestFixture attributes on base classes are not ignored
+<li>711330   	Test-free assembly given failure icon in tree display
+<li>712444 	nunit-console /run doesn't execute parameterized test-cases with commas in test-case name
+<li>725718 	Documented overloads of Has.Property do not exist
+<li>728500   	TestDomain should unload the test AppDomain
+<li>736062 	Deadlock when EventListener performs a Trace call + EventPump synchronisation
+<li>737783 	Distributed Results.xsd file is out of date
+<li>741402 	Error running .NET 1.1 console tests
+<li>747581	Failure in TestFixtureTearDown not reported in console runner
+</ul>
+<style><!--
+li { padding-bottom: .5em; }
+ul ul li { padding-bottom: 0; }
+dt { font-weight: bold }
+--></style>
+
+<h3>NUnit 2.5.9 - Version 2.5.9.10348 - December 14, 2010</h3>
+
+<h4>Bug Fixes</h4>
+
+<ul>
+<li>423611 	Bug 686560 AppDomainUnloadedException not fixed
+<li>498664 	SetUp failure reported as FailureSite.Test
+<li>602761 	nunit-agent hangs after tests complete
+<li>612052 	NUnit-agent should be reused on reload
+<li>655882 	Make CategoryAttribute inherited
+<li>666800 	Throws.Nothing doesn't work properly
+<li>669317 	Loading test in separate process causes exception under Mono+Linux
+<li>669684 	Change Menu text from "Recent Files" to "Recent Projects"
+<li>669689 	Info from last run remains while loading a new project
+<li>671349	Add doc page for SetUICultureAttribute
+<li>671432	Upgrade NAnt to 0.90 or 0.91
+<li>673691 	nunit.exe session degrades with ever-lengthening "Reloading..." phase when test project is recompiled
+<li>674718	Reload when assembly changes setting disabled on Linux
+<li>674860	Using() modifier missing on NUnit.Framework.Contains.Item()
+<li>684513 	NUnit 2.5.8 Build Problems
+<li>684598 	Number of asserts in XML result file always stays 0
+<li>684821 	ResultSummarizer doesn't count tests with [RequiresSTA]
+</ul>
+<style><!--
+li { padding-bottom: .5em; }
+ul ul li { padding-bottom: 0; }
+dt { font-weight: bold }
+--></style>
+
+<h3>NUnit 2.5.8 - Version 2.5.8.10295 - October 22, 2010</h3>
+
+<h4>General</h4>
+
+<ul>
+<li>The test file mock-assembly.dll has been enhanced to contain examples of all
+types of test suites for use in development of custom test reports.
+</ul>
+
+<h4>Framework</h4>
+
+<ul>
+<li>SubDirectoryConstraint has been removed and is replaced by SubPathConstraint, which operates on paths without the need to access the underlying directories.
+<li>Custom attributes may now be derived from ExplicitAttribute.
+<li>New key words "Windows7" and "Windows2008ServerR2" are recognized by the PlatformAttribute.
+<li>A warning is now given if a test changes the current directory.
+</ul>
+
+<h4>Console Runner</h4>
+
+<ul>
+<li>A new /trace option may be used to set NUnit's internal trace level for a console run.
+</ul>
+
+<h4>Gui Runner</h4>
+
+<ul>
+<li>Stability problems with the NUnit Gui under Linux have been resolved and NUnit 2.5.8 is the recommended release for all platforms. Various cosmetic fixes have been made under Linux as well, so that the Gui functions in the same way as it does under Windows.
+<li>A new setting dialog allows control of NUnit's InternalTrace facility, which was previously controlled by an entry in the config file.
+<li>Tests run out of process may be debugged by attaching to the nunit-agent process once,
+since the same process is now used across multiple reloads of the test assembly.
+</ul>
+
+<h4>Bug Fixes</h4>
+
+<ul>
+<li>487999  	 RequiresThreadAttribute not working on Windows 7 64-bit
+<li>491300  	 Self containing enumerables cause stack overflow when compared for equality
+<li>524474  	 NUnit GUI issue: /exclude categories are saved each time
+<li>602761  	 nunit-agent hangs after tests complete
+<li>603088  	 NUnit Gui: Project Config Change from Menu Does Not Change AssemblyWatcher
+<li>608897  	 Incorrect program name in Test Assemblies display under Mono
+<li>612052  	 NUnit-agent should be reused on reload
+<li>613031  	 Subclasses of ExplicitAttribute ignored
+<li>615340  	 Give warning if CurrentDirectory is changed
+<li>624603  	 Outdated copyright notice
+<li>631620  	 UnauthorizedAccessException in DirectoryAssert
+<li>631809  	 Misleading doc of CollectionAssert.AreEqual() and .AreEquivalent()
+<li>633884  	 TestCaseSource does not use Arguments, Categories etc as described in documentation for 2.5.7
+<li>641423  	 Timeout test fails under Mono on Linux
+<li>644252  	 Memory leak in ParameterizedMethodSuite
+<li>644643  	 NUnit uses fonts which may not be present on Linux
+<li>644682  	 Tab text not properly aligned under linux
+<li>644684  	 Tree display text is sometimes centered under linux
+<li>645430  	 Status bar panels not sized correctly under Linux
+<li>650598  	 Exception thrown when nunit-console run from networked drive on unit-tests built with .Net 4
+<li>654788  	 TestContext is null when the test/fixture has a timeout attribute
+<li>655674  	 New Fixture Object Suite requires pre-constructed objects to have a no-arg constructor
+<li>657797  	 Remove InternalTrace settings from config file
+<li>664081  	 Add Server2008 R2 and Windows 7 to PlatformAttribute
+<li>665236  	 Support for Mono 4.0 profile not detected in Linux
+</ul>
+<style><!--
+li { padding-bottom: .5em; }
+ul ul li { padding-bottom: 0; }
+dt { font-weight: bold }
+--></style>
+
+<h3>NUnit 2.5.7 - Version 2.5.7.10213 - August 1, 2010</h3>
+
+<h4>Features</h4>
+
+<ul>
+<li>The new <b>TestContext</b> class allows tests to
+access information about themselves. The following properties
+are supported:
+<ul>
+<li><b>TestName</b> gets the name of the test
+<li><b>Properties</b> gets the test properties dictionary
+<li><b>State</b> gets the TestState
+<li><b>Status</b> gets the TestStatus
+</ul>
+<br><b>Notes:</b> 
+<ol>
+<li>This is an experimental feature and could change in future releases. It is not included in the docs at this time.
+<li><b>TestState</b> and <b>TestStatus</b> are intended for use in a TearDown method. Consult the intellisense for values of each enumeration. 
+<li><b>TestStatus</b> should preferred over <b>TestState</b> for compatibility with future releases.
+</ol>
+</ul>
+
+<h4>Bug Fixes</h4>
+
+<ul>
+<li>570162  FileNotFoundException when loading .nunit file
+<li>595683  NUnit console runner fails to load assemblies
+<li>611325  Allow Teardown to detect if last test failed
+<li>611938  Generic Test Instances disappear
+</ul>
+<style><!--
+li { padding-bottom: .5em; }
+ul ul li { padding-bottom: 0; }
+dt { font-weight: bold }
+--></style>
+
+<h3>NUnit 2.5.6 - Version 2.5.6.10205 - July 24, 2010</h3>
+
+<h4>Features</h4>
+
+<ul>
+<li><b>ReusableConstraint</b> provides reusability of constraint
+expressions within the test code. This feature is experimental.
+<li>The <b>Mono 4.0</b> profile is now listed in the Gui when support for it is detected.
+<li>Multiple test names may be supplied to the console <b>/run</b> option.
+<li><b>Dictionaries</b> and <b>Hashtables</b> may be tested for equality without regard to order of entries.
+<li><b>PNunit</b> has been updated to match the latest release available.
+<li><b>DirectoryAssert</b>, xxxx and xxx are now marked as Obsolete.
+</ul>
+
+<h4>Bug Fixes</h4>
+
+<ul>
+<li>441022 	Setup not called when test method inherited
+<li>498656 	TestCase should show array values in GUI
+<li>532488 	Constraints from ConstraintExpression/ConstraintBuilder are not reusable
+<li>548841  [Explicit] does not get overridden if there is another category exclude
+<li>570162 	FileNotFoundException when loading .nunit file
+<li>571256 	NUnit 2.5.5 Console Runner Requires /framework flag to run with .NET 4
+<li>574408 	DirectoryAssert fails to recognise the sub folder using IsWithin
+<li>590717 	Category contains dash or trail spaces is not selectable
+<li>590970 	Static TestFixtureSetUp/TestFixtureTearDown methods in base classes are not run
+<li>591622 	When SetUp method fails, no clear indication in GUI
+<li>595996 	Missing files in source package
+<li>600554 	NUnit uses wrong priority-scheme for addins
+<li>600555 	NullReferenceException when ISuiteBuilder.BuildFrom(Type) returns null
+<li>600627 	Assertion message formatted poorly by PropertyConstraint
+<li>601108 	Duplicate test using abstract test fixtures
+<li>601129 	Mono 4.0 not supported
+<li>601645 	Parameterized test should try to convert data type from source to parameter
+<li>602798 	NUnitConfiguration.MonoExePath returns wrong path
+<li>604861 	Console runner /run option should allow multiple test names
+<li>605432  ToString not working properly for some properties
+<li>605793 	Multiple instances of Nunit runners, which use nunit-agent, cannot be run in parallel
+<li>607924 	PNUnit is out of date
+<li>608875 	NUnit Equality Comparer incorrectly defines equality for Dictionary objects
+<li>606548 	Deprecate Directory Assert
+<li>609509  Test assembly file lock in version 2.5.5 
+</ul>
+<style><!--
+li { padding-bottom: .5em; }
+ul ul li { padding-bottom: 0; }
+dt { font-weight: bold }
+--></style>
+
+<h3>NUnit 2.5.5 - Version 2.5.5.10112 - April 22, 2010</h3>
+
+<h4>Features</h4>
+
+<ul>
+<li>The Runtime Version dropdown on the <b>Project Editor</b> dialog
+now includes only major and minor version numbers like 2.0 or 4.0.
+When loading the tests, these versions are resolved to the highest 
+version of the particular runtime available on your system. You may
+still enter a complete version number in the text box if desired.
+<li>The <b>DatapointsAttribute</b> may now be specified on properties
+and methods as well as fields. For parameters of type T, the attribute
+now supports members of Type <b>IEnumerable<T></b> in addition
+to arrays of the parameter Type.
+<li>Timeouts are now suppressed when running under a debugger.
+</ul>
+
+<h4>Bug Fixes</h4>
+
+<ul>
+<li>FileNotFoundException when test assembly is built for x64 platform.
+<li>Config files not found with /domain:Multiple.
+<li>SetCultureAttribute ignored on parameterized test methods.
+<li>NUnit not recognizing .NET 4.0 RC or Final Release.
+<li>TestFixtureTearDown in static class not executed
+<li>Failing tests in sample files AssertSyntaxTests.cs and AssertSyntaxTests.vb.
+<li>Invalid XML character in TestResult.xml when a test case string argument
+uses certain control or unicode characters.
+</ul>
+<style><!--
+li { padding-bottom: .5em; }
+ul ul li { padding-bottom: 0; }
+dt { font-weight: bold }
+--></style>
+
+<h3>NUnit 2.5.4 - Version 2.5.4.10098 - April 8, 2010</h3>
+
+<h4>Features</h4>
+
+<ul>
+<li>NUnit now defaults to running an assembly under the runtime version for
+which it was built. If that version is not available, a higher version may be
+used. See the <a href="runtimeSelection.html">Runtime Selection</a> 
+page for details.
+<li><b>ProjectEditor</b> now provides a 'Default' selection for the runtime
+version to be used.
+<li>The XML result file format has been enhanced to provide additional information
+needed to identify and report on theories and also includes extended result states
+such as Inconclusive, Invalid, Error and Cancelled.
+<li>The <b>EmptyConstraint</b> (Is.Empty) may now be used with a <b>DirectoryInfo</b>
+to test whether the directory is empty.
+<li>Datapoints for <b>boolean</b> and <b>enum</b> arguments are now generated 
+automatically for theories.
+<li>The cache path for shadow copying is now saved in the NUnit settings file
+rather than in the config files. The settings dialog may be used to change it
+if necessary.
+</ul>
+
+<h4>Bug Fixes</h4>
+
+<ul>
+<li>NUnit crashing when a message contains ']]>'
+<li>Replace compile-time exclusion of code from Mono with run-time test
+<li>Message associated with Assert.Inconclusive() not shown in XML
+<li>Category on test case clashes with category on the test method
+<li>Console crash when specifying /domain:Single with multiple assemblies
+<li>Incorrect relative path causing problems in saving projects
+<li>Message associated with Assert.Pass() not shown in XML
+<li>Tests with ExpectedException compiled against NUnit 2.4 always pass under 2.5
+<li>Datapoints with a null value were not being passed correctly to theories
+<li>Error in XML output with FSharp.Net
+<li>Documentation refers to files missing from Windows install
+<li>Parameterized test fixtures with null parameters not handled correctly
+<li>Theories now work as designed, failing when no data satisfies the assumptions
+<li>Target framework of net-3.5 was causing console to crash
+<li>Mono stack traces are now parsed correctly in the Gui
+<li>Test failures under .NET 1.1
+<li>Thread CurentPrincipal set in TestFixtureSetUp not maintained between tests
+</ul>
+<style><!--
+li { padding-bottom: .5em; }
+ul ul li { padding-bottom: 0; }
+dt { font-weight: bold }
+--></style>
+
+<h3>NUnit 2.5.3 - Version 2.5.3.9345 - December 11, 2009</h3>
+
+<p><b>Note:</b> This is the first release of NUnit on Launchpad.
+   
+<h4>Features</h4>
+
+<ul>
+<li>Test execution under .NET 4.0 is now supported. It may be selected
+    in the Gui runner or using the console runner /framework option.
+	NUnit test projects may specify .NET 4.0 as the required framework
+	to be used for loading the the project. PlatformAttribute allows 
+	testing for .NET 4.0.
+<li>The distribution now includes nunit-agent-x86.exe, which is used
+    for running tests in a separate process under nunit-x86.exe
+	or nunit-console-x86.exe when the target framework is .NET 2.0
+	or greater.
+<li>Static methods Contains.Substring() and Contains.Item() have been
+    added to the NUnit syntax for compatibility with NUnitLite.
+<li>Non-public test fixtures are now allowed in all cases, 
+    whether the TestFixtureAttribute is present or not.
+<li>Abstract classes may now be marked with TestFixtureAttribute
+    to indicate that derived classes are to be treated as 
+	test fixtures. The abstract class is no longer marked as invalid.
+<li>Fixtures without tests are no longer shown as non-runnable but
+    are simply executed. If the fixture setup or teardown does not cause
+	an error, they are reported as inconclusive.
+</ul>
+
+<h4>Bug Fixes</h4>
+
+<ul>
+<li>Reloading tests in the Gui no longer uses the default runtime if
+    a different runtime was previously selected.
+<li>Thread principal is now saved before each test and restored afterward
+    eliminating failures under .NET 4.0.
+<li>Assume.That() overload with a message no longer results in test failure.
+<li>An expected Result of null is now handled correctly on parameterized tests.
+<li>Duplicate caching of metadata has been eliminated, resolving a
+    load performance problem when many methods are inherited from
+	a base class.
+<li>The names of nested generic and non-generic classes are now displayed 
+    correctly.
+<li>Assert.Catch<T> now correctly returns exception type T rather than
+    System.Exception.
+<li>ValueSourceAttribute now works correctly when used with an external type.
+<li>The /domain=None option on nunit-console once again works correctly.
+<li>Parameterized test fixture names are now displayed with the actual
+    arguments used so that failures may be associated with the correct
+	instantiation of the fixture.
+<li>Test labels for generics are now displayed correctly by the console
+    runner and in the Gui text output tab.
+<li>Generic fixtures without type attributes provided are now shown
+    as non-runnable rather than causing a runtime error. (1)
+<li>Use of an unknown file type in the console command line no longer causes
+    an error. (2)
+<li>A number of tests that ran incorrectly under Linux have been fixed.
+<li>A number of tests failing under .NET 4.0 have been fixed.
+</ul>
+
+<h4>Notes</h4>
+
+<ol>
+<li>As a side effect of this fix, TestFixtureAttribute on a base class is
+    overridden by a TestFixtureAttribute on the derived class. 
+<li>This was originally reported as "crash when using /option in linux."
+</ol>
+<style><!--
+li { padding-bottom: .5em; }
+ul ul li { padding-bottom: 0; }
+dt { font-weight: bold }
+--></style>
+
+<h3>NUnit 2.5.2 - Version 2.5.2.9222 - August 10, 2009</h3>
+
+<p><b>Note:</b> This is the last release of NUnit using source code
+   maintained on Sourceforge. The CVS repository there will be kept,
+   but no longer updated. After this release, the source is being
+   maintained on Launchpad at http://launchpad.net/nunit-2.5.
+
+<h4>Framework</h4>
+
+<ul>
+<li>The new <b>SetUICultureAttribute</b> allows setting CurrentUICulture
+    for the duration of a test method, fixture or assembly.
+<li>The <b>TestFixture</b>, <b>TestCase</b> and <b>TestCaseData</b> attributes
+    have been enhanced to allow ignoring an individual fixture instance or
+	test case. Two new named parameters are provided:
+	<ul>
+	<li><b>Ignore</b> may be set to true to ignore an item.
+	<li><b>IgnoreReason</b> may be set to specify the reason for ignoring
+	    the item. If IgnoreReason is set to a non-empty string, then setting
+		Ignore is optional.
+	</ul>
+<li><b>Assert.Catch</b> has been added with several overloads. It differs
+    from <b>Assert.Throws</b> in accepting exceptions derived from the one
+	that is specified. Like <b>Assert.Throws</b>, it returns the exception
+	thrown when it succeeds so that further tests can be made on it.
+<li>The <b>Throws</b> syntax has a number of new additions:
+    <ul>
+	<li><b>ThrowsTargetInvocationException</b>, <b>ThrowsArgumentException</b>
+	    and <b>Throws.InvalidOperationException</b> provide a shorter syntax
+		for testing for these common exception types.
+	<li><b>Throws.InnerException</b> applies any constraints to the InnerException 
+	    of the exception that was thrown rather than to the exception itself.
+	<li><b>InnerException</b> can also be used in constraint expressions - see
+	    the documentation for an example.
+	</ul>
+</ul>
+
+<h4>Bug Fixes</h4>
+
+<ul>
+<li>Data from a TestCaseSource in a separate class from the tests
+    is now handled correctly.
+<li>Arguments specified using TestCaseData are now used correctly.
+<li>Comparing the a stream to itself no longer causes an error.
+<li>TimeoutAttribute is now permitted on an assembly as documented.
+<li>Clear All and Clear Failures buttons are now displayed correctly
+    depending on whether Checkboxes are displayed in the Gui.
+<li>The console runner option descriptions have been revised to
+    more clearly indicate what each option does.
+<li>Running special tests that do not use the nunit.framework assembly
+    no longer causes a null reference exception.
+<li>Console Runner option descriptions have been edited for accuracy.
+<li>Gui TreeView now updates correctly when the order of tests has changed.
+<li>An exception in TearDown now displays the actual exception
+    at the top of the stack rather than a TargetInvocationException.
+</ul>
+<style><!--
+li { padding-bottom: .5em; }
+ul ul li { padding-bottom: 0; }
+dt { font-weight: bold }
+--></style>
+
+<h3>NUnit 2.5.1 - Version 2.5.1.9189 - July 8, 2009</h3>
+
+<h4>Framework</h4>
+
+<ul>
+<li>A new <b>TestResult</b> state has been defined for tests cancelled by the
+    user. Results with <b>ResultState.Cancelled</b> are reported as a type of
+	failure and no longer generate an ApplicationException.
+<li>Parameterized test fixtures with <b>TestCaseSource</b> or <b>ValueSource</b> 
+	data are now constructed using the appropriate parameterized constructor 
+	when test cases are being created. This avoids the need for a default
+	constructor and permits use of member data initialized from
+	the fixture parameters in creating the test data.
+<li>The <b>TestCaseData</b> class now supports use of a string or other
+    array type as the sole argument value, without the need to nest
+	that array in an object array.
+<li>Abstract classes marked with <b>TestFixtureAttribute</b> are no longer
+    reported as ignored or non-runnable.
+	<br><br>
+	<b>Note:</b> This was changed in 2.5 but was omitted from the release notes.
+<li>The methods in the <b>Text</b> class are now marked as obsolete. For string 
+	constraints, use one of the following at the start of an expression:
+	<ul>
+	<li><b>Is.StringContaining</b>
+	<li><b>Is.StringStarting</b>
+	<li><b>Is.StringEnding</b>
+	<li><b>Is.StringMatching</b>
+	</ul>
+	Within an expression (afer Not, Some, All, And, Or, etc.) you may use
+	<ul>
+	<li><b>Contains</b> or <b>ContainsSubstring</b>
+	<li><b>StartsWith</b>
+	<li><b>EndsWith</b>
+	<li><b>Matches</b>	
+	</ul>
+<li><b>ThrowsConstraint</b> now has a constructor taking an <b>ActualValueDelegate</b>
+    in addition to the constructor that takes a <b>TestDelegate</b>. This allows
+	simpler use of Lambda expressions under C# 3.0, but requires users of pre-3.0
+	compilers to disambiguate their delegates by use of an explicit return
+	expression.
+</ul>
+
+<h4>Core</h4>
+
+<ul>
+<li>Individual test cases under a parameterized test are
+    no longer sorted by name within the test group but are
+	run (and shown in the Gui) in the order in which the
+	data is retrieved.
+	<br><br>
+	<b>Note:</b> Since the order of retrieval of custom
+	attributes is not guaranteed by the CLR, the order
+	of test cases will not necessarily match the textual
+	ordering of attributes in the source code. The order
+	of tests will vary across different compilers and
+	CLR versions as well.
+<li>The XML test result file now contains a count of 
+	inconclusive results.
+</ul>
+
+<h4>Gui</h4>
+
+<ul>
+<li>The default icons in the Gui tree have been updated.
+<li>Alternative icons placed by the user in the directory containing
+    nunit.uikit.dll may now be in PNG format. Icons are now recognized
+	for Skipped and Inconclusive status in addition to Success, Failure
+	and Ignored.
+<li>A new setting option allows the user to disable checking for the 
+    existence of files in the Recent Files list before listing them. This
+    prevents NUnit from appearing to freeze when the file is on a network
+    path that is no longer connected.
+</ul>
+
+<h4>Extensibility</h4>
+
+<ul>
+<li>The <b>ITestCaseProvider2</b> and <b>IDatapointProvider2</b> interfaces
+    extend <b>ITestCaseProvider</b> and <b>IDatapointProvider</b>
+    with methods that include the fixture for which the test case is being
+    built. Providers may implement either the old or the new interface, 
+	but the new interface is required if the data source is contained in
+	the test fixture itself so that the fixture may be constructed with
+	the proper parameters in the case of a parameterized fixture.
+</ul>
+
+<h4>Bug Fixes</h4>
+
+<ul>
+<li>Lambda in Throws constraint was not compiling correctly.
+<li>Null reference exception is no longer thrown when adding an assembly to a 
+    new project that has not yet been saved.
+<li>Dispose is now called on disposable types created while loading test case 
+    parameters.
+<li>Installations that copy NUnit to a single folder (no lib or framework folders) 
+    now work correctly.
+<li>Test Assemblies menu item is no longer enabled when no test was loaded
+<li>The Text Output tab of the Settings dialog no longer causes an exception
+    when invoked from the mini-gui.
+<li>Errors in various copyright statements were fixed and the year updated to 2009.
+<li>Control characters in test arguments are now escaped in the display.
+<li>Additional control characters are now escaped in error messages.
+<li>Miscellaneous typographic corrections were made to the documentation.
+</ul>
+<h3>NUnit 2.5 Final Release - Version 2.5.0.9122 - May 2, 2009</h3>
+
+<h4>Framework</h4>
+
+<ul>
+<li>A new syntax element, <b>Matches(Constraint)</b>, allows use of
+custom constraints, predicates or lambda expressions in constraint expressions.
+
+<li>The <b>MessageMatch</b> enum used with <b>ExpectedExceptionAttribute</b>
+has been extended with a new value <b>StartsWith</b>, indicating that the
+exception message must start with the string provided.
+
+<li><b>TestCaseAttribute</b> now supports a <b>MessageMatch</b>
+property.
+</ul>
+
+<h4>Gui</h4>
+
+<ul>
+<li>The File menu now allows selecting an alternate runtime,
+such as Mono, on a machine with multiple CLR implementations
+installed. This feature is still considered experimental and
+may change in the future.
+
+<li>The combo box in the Project Editor allowing selection of
+a particular runtime type such as Mono for loading the test
+has been re-enabled.
+</ul>
+
+<h4>Bug Fixes</h4>
+
+<ul>
+<li>Provided a workaround to a Mono 2.4 bug in handling remote 
+references to an interface, where the provider is running under
+MS .NET and the implementation is explicit.
+
+<li>Fixed a problem with the display of line numbers from a German
+language stack trace, with lines terminating in a period.
+
+<li> The Console Runner display now shows the settings for ProcessModel,
+DomainUsage and RuntimeFramework actually provided, before resolution
+of any defaults.
+
+<li> Removed references in the docs to pages that no longer exist.
+</ul>
+
+<h3>NUnit 2.5 Release Candidate - Version 2.5.0.9117 - April 27, 2009</h3>
+
+<h4>General</h4>
+
+<ul>
+<li>The installation now uses a 'lib' subdirectory to hold dlls.
+
+<li>The build script target names have been changed to make more sense.
+In particular, 'package' now builds the default package and
+targets not intended to be called directly are no longer listed
+as 'Main Targets' by the -projecthelp option.
+</ul>
+
+<h4>Framework</h4>
+
+<ul>
+<li>The following Constraints now use the NUnit definition
+of equality in comparing items, which may lead to changed behavior 
+of some tests.
+   <ul><b>
+   <li>UniqueItemsConstraint
+   <li>CollectionContainsConstraint
+   <li>CollectionEquivalentConstraint
+   <li>CollectionSubsetConstraint
+   </b></ul>
+The constraints listed now accept the <b>IgnoreCase</b> and <b>Using</b>
+modifiers, which work exactly as they do with <b>EqualConstraint</b>
+</ul>
+
+<h4>Core</h4>
+
+<ul>
+<li>Caching is now used to reduce the time required to load tests.
+</ul>
+
+<h4>Gui</h4>
+
+<ul>
+<li>A new submenu under <b>File</b> allows selecting a runtime version
+under which to reload the tests. Reloading in this way does not affect
+any runtime version setting in the project file.
+
+<li>The project editor now provides a combo box listing known versions
+of the runtime. Other versions may still be entered in the edit box.
+Cross-CLR execution (for example, running Mono from .NET) has
+been disabled in the Gui, since it isn't yet implemented.
+
+<li>The new stack trace display now follows the NUnit Font settings.
+The stack display uses the general gui font, while the source code
+display uses the fixed font.
+
+<li>The separate settings for Recent Files under .NET 1.1
+and .NET 2.0 have been combined, since the Gui now runs exclusively
+under .NET 2.0.
+
+<li>The time required to restore the visual state of the tree after
+reloading has been substantially reduced, especially for large numbers
+of tests.
+</ul>
+
+<h4>Bug Fixes</h4>
+
+<ul>
+<li>Use of a long assembly name for the ApplicationName of the AppDomain
+was causing excessively long paths in the shadow cache.
+
+<li>The <b>Using</b> modifier of <b>EqualConstraint</b> now works as
+expected for string operands.
+
+<li><b>TestCaseAttribute.ExpectedExceptionMessage</b> is no longer ignored.
+
+<li>The max number of files setting was not being saved when modified
+in the Gui Settings dialog.
+
+<li>As a temporary fix, the pnunit.tests.dll has been moved to the 
+same directory as pnunit-agent.exe and pnunit-launcher.exe, since
+pnunit tests don't allow for setting an appbase separate from the
+location of the test assembly.
+</ul>
+
+<h3>NUnit 2.5 Beta 3 Release - Version 2.5.0.9096 - April 6, 2009</h3>
+
+<h4>General</h4>
+
+<ul>
+<li>The Gui is now built against .NET 2.0 only. Tests may still
+be run under .NET 1.x by running in a separate process.
+
+<li>The Visual Studio 2003 solution has been removed. Framework
+and other components may still be built under .NET 1.x through
+the NAnt script.
+
+<li>The nunit.framework.extensions assembly has been removed
+from the build.
+</ul>
+
+<h4>Framework</h4>
+
+<ul>
+<li><b>EqualConstraint</b> has been enhanced with
+    several new modifiers, which may be used immediately after
+	the Within(...) modifier to indicate how a numeric tolerance value
+	should be interpreted.
+	<ul>
+	<li><b>Ulps</b> = as units in the last place (floating point only)
+	<li><b>Percent</b> = as a percentage of expected value
+	<li><b>Days</b> =  as a TimeSpan in days
+	<li><b>Hours</b> = as a TimeSpan in hours
+	<li><b>Minutes</b> = as a TimeSpan in minutes
+	<li><b>Seconds</b> = as a TimeSpan in seconds
+	<li><b>Milliseconds</b> = as a TimeSpan in milliseconds
+	<li><b>Ticks</b> = as a TimeSpan in ticks
+	</ul>
+
+<li>The comparison constraints (<b>GreaterThan</b>, <b>LessThan</b>, etc.),
+    <b>RangeConstraint</b> and <b>CollectionOrderedConstraint</b> may now be used 
+	with 	objects that implement <b>IComparable<T></b>.
+    
+<li>The syntax used for specifying that a collection is ordered has changed.
+    <b>Is.Ordered</b> is now a property. The property name to use for ordering
+	is specified using <b>Is.Ordered.By(name)</b>.
+	
+<li>The following constraints now accept a <b>Using</b> modifier to indicate
+    that a user-specified comparer should be used:
+	<ul><b>
+	<li>EqualConstraint
+	<li>GreaterThanConstraint
+	<li>GreaterThanOrEqualConstraint
+	<li>LessThanConstraint
+	<li>LessThanOrEqualConstraint
+	<li>RangeConstraint
+	<li>CollectionOrderedConstraint
+	</b></ul>
+	The provided comparer may be any of the following:
+	<ul><b>
+	<li>IComparer
+	<li>IComparer<T>
+	<li>Comparison<T>
+	</b></ul>
+	In addition, <b>EqualConstraint</b> may use:
+	<ul><b>
+	<li>IEqualityComparer
+	<li>IEqualityComparer<T>
+	</b></ul>
+</ul>
+
+<h3>NUnit 2.5 Beta 2 Release - Version 2.5.0.9015 - January 15, 2009</h3>
+
+<h4>Framework</h4>
+
+<ul>
+<li>NUnit now includes an implementation of <b>Theories</b>, similar to what
+    is found in JUnit. Support for Theories is provided by the
+	<b>Theory</b>, <b>Datapoint</b> and <b>Datapoints</b> attributes and by
+	the <b>Assume.That</b> method. For more information and further links, 
+	see the <a href="theory.html">TheoryAttribute</a> 
+	documentation page.
+<li>AssertionHelper has been updated so that the Expect overloads now
+    include the signatures newly introduced for Assert.That.
+<li>The code for Assert is now generated. This is in addition to the files 
+    that were generated in beta-1.
+<li><b>AfterConstraint</b> has been renamed to <b>DelayedConstraint</b>.
+</ul>
+
+<h4>Console</h4>
+
+<ul>
+<li>The console runner now supports a <b>/framework</b> option, which
+    allows running the tests under a different version of the CLR.
+</ul>
+
+<h4>Gui</h4>
+
+<ul>
+<li>The Gui is now able to display the source code for test or production
+    code from the stack trace, provided the assemblies contain source code
+    information and the source code is available. Contributed by Irénée Hottier.
+<li>Reloading the tests after changing settings in a way that modifies
+    the shape of the tree is now handled correctly.
+<li>The Settings Dialog now opens to the page that was last viewed.
+</ul>
+
+<h3>NUnit 2.5 Beta 1 Release - Version 2.5.0.8332 - November 27, 2008</h3>
+
+<h4>General</h4>
+
+<ul>
+<li>Most of the code for elements of the constraint
+    syntax is now generated. This allows us to more rapidly deploy new 
+	constraints with their corresponding syntax. The file <b>SyntaxElements.txt</b>
+	contains the specifications used in generating the code. At this time,
+	we are including both this file and the generated files with the NUnit source,
+	so that those working in other areas of the code don't have to regenerate 
+	them each time they make changes.
+<li>The nunit.core.extensions assembly has been removed from the build. Features
+    that were previously in that assembly are now in the nunit.core assembly.
+<li>All third-party addins have been removed from the build and must be
+    downloaded separately from their own sites. An index of such
+	addins is maintained on the NUnit site.
+</ul>
+
+<h4>Framework</h4>
+<ul>
+<li>New attributes are provided to control use of threads by tests. All of
+   the following may be used on methods, classes or assemblies:
+   <ul>
+   <li><b>RequiresThreadAttribute</b> forces creation of a new thread and
+       may optionally indicate the desired ApartmentState for the thread.
+   <li><b>RequiresSTAAttribute</b> causes the test to run in the STA. A
+       new thread is created only if the parent is not in the STA. On
+	   methods, the .NET-provided STAThreadAttribute may also be used.
+   <li><b>RequiresMTAAttribute</b> causes the test to run in the MTA. A
+       new thread is created only if the parent is not in the MTA. On
+	   methods, the .NET-provided MTAThreadAttribute may also be used.
+   <li><b>TimeoutAttribute</b> is used to set the timeout for tests. When
+       used on classes or assemblies, the timeout value is used as the
+	   default timeout for all subordinate test cases. Test cases with
+	   a timeout value run on a separate thread and return a failure
+	   message if the timeout is exceeded.
+   </ul>
+<li>The <b>MaxTimeAttribute</b> specifies a miximum elapsed time for a
+	test case. If the test takes longer, it is reported as a failure.
+	This attribute was previously available as an extension.
+	<br><br>
+	<b>Note:</b> Unlike <b>TimeoutAttribute</b>, <b>MaxTimeAttribute</b>
+	does not cause the test to be cancelled, but merely times it.
+<li><b>RepeatAttribute</b> causes a test case to be executed multiple
+    times. This attribute was previously available as an extension.
+<li><b>PairwiseAttribute</b> now works, generating all pairs of each
+    argument value. [In earlier betas, it was unimpemented and simply
+	generated all combinations.]
+<li><b>PropertyAttribute</b> has been modified internally to use a dictionary
+    of name/value pairs rather than just a single name and value. This feature
+	is not exposed for direct use, but may be accessed by derived attributes
+	that want to apply multiple named values to the test. For a simple 
+	example of usage, see the code for <b>RequiredThreadAttribute</b>.
+<li>The presence of <b>TestCaseSourceAttribute</b> on a method is now
+    sufficient to identify it as a test. As with <b>TestCaseAttribute</b>,
+	use of <b>TestAttribute</b> is optional.
+<li><b>Assert.That</b> has been extended to allow a delegate or a reference 
+	as the argument. By default, these are evaluated before being used by
+	the constraint supplied but some constraints may delay evaluation. The
+	new <b>AfterConstraint</b> is an example.
+<li>An additional overload of <b>Assert.Throws</b> allows passing a
+    constraint or constraint expression as the first argument.
+<li>The syntax for AttributeConstraints has been enhanced so that further
+    tests may be applied to properties of the attribute rather than just
+	checking for its existence.
+<li><b>AfterConstraint</b> allows delaying the application of a constraint
+    until a certain time has passed. In it's simplest form, it replaces
+	use of a Sleep in the code but it also supports polling, which may
+	allow use of a longer maximum time while still keeping the tests as
+	fast as possible. The <b>After</b> modifier is permitted on any
+	constraint, but the delay applies to the entire expression up to the
+	point where <b>After</b> appears. 
+	<br><br>
+	<b>Note:</b> Use of After with a simple value makes no sense, since
+	the value will be extracted at the point of call. It's intended use
+	is with delegates and references. If a delegate is used with polling,
+	it may be called multiple times so only methods without side effects
+	should be used in this way.
+</ul>
+
+<h4>Core</h4>
+
+<ul>
+<li>NUnit now supports running tests in a separate process or in
+    multiple processes per assembly. In addition, tests run in
+	a separate process may use a different runtime version
+	from that under which NUnit is running.
+	<br><br>
+	<b>Note:</b> In the Beta release, execution of tests under Mono 
+	from a copy of NUnit that is running under .NET is not yet supported.
+</ul>
+
+<h4>Console</h4>
+
+<ul>
+<li>The new <b>/process:xxxxx</b> command line option is used to run
+    tests in a separate process or in multiple processes per assembly.
+<li>A new commandline option, <b>/timeout:nnnn</b> allows you to specify a
+    default timeout value, which is applied to each test case in the run without
+    a Timeout specified.
+</ul>
+
+<h4>Gui</h4>
+
+<ul>
+<li>The Assembly Info display now uses a scrolling text box and has
+    been enhanced to show information about the Process and AppDomain
+	in which the test is running and the runtime version under that
+	is being used.
+<li>The Project Editor now allows setting the ProcessModel and
+    DomainUsage for a project to control how that project is
+	loaded and run. It also supports setting a target runtime
+	framework for each configuration. If the target runtime is
+	different from the runtime under which NUnit is running, the
+	tests will be run automatically in a separate process under
+	the target runtime.
+<li>The Project Editor no longer reloads the tests as each
+    individual change is made. Tests are reloaded after the
+	editor is closed and only if changes have been made to
+	the overall project configuration or to the active
+	configuration.
+<li>The "Options" dialog is now called "Settings."
+</ul>
+
+<h4>Extensibility</h4>
+
+<ul>
+<li>The implementation of constraints has been changed so that it is no
+    longer necessary to create an additional "Modifier" class when a
+	custom constraint takes modifiers. If you simply implement each modifier
+	as a property or method returning the object itself, it will be 
+	usable in the full range of constraint expressions.
+	<br><br>
+	<b>Note:</b> Although you can readily create custom constraints,
+	this release of NUnit still lacks the ability to create new syntactic
+	elements without rebuilding the framework.
+</ul>
+
+<h4>Bug Fixes</h4>
+
+<ul>
+<li>Loading a single assembly and then adding another assembly using
+    the Add Assembly menu item was not working correctly.
+<li>Reloading tests after settings changes was failing when the
+    new settings changed the shape of the tree in such a way
+	that the new tests didn't match the old ones correctly.
+<li>The Reload Project menu item was followed by a prompt asking
+    if the current project state should be saved first and making
+	the reload work in an unexpected way if you answered yes.
+<li>A class without a TestFixture attribute, containing only
+    TestCase methods, without any Tests, was not recognized as
+	a test fixture.
+<li>Assert.DoesNotThrow was failing to display a user message.
+<li>Xml documentation for Assert.IsNotEmpty and Assert.AreEqual
+    was incorrect.
+<li>CollectionAssert.AreEqual and EqualConstraint were not
+    working with IEnumerables that were not also Collections.
+<li>PlatformAttribute now distinguishes correctly between
+    Vista and Windows 2008 Server.
+</ul>
+
+<h3>NUnit 2.5 Alpha 4 Release - Version 2.5.0.8528 - September 14, 2008</h3>
+
+<h4>Framework</h4>
+<ul>
+<li>Use of the TestFixtureAttribute is now optional in designating
+    classes that contain tests.
+<li>More than one method may now be marked with the <b>SetUp</b>, <b>TearDown</b>,
+	<b>TestFixtureSetUp</b> and <b>TestFixtureTearDown</b> attributes. Setups
+	in a base class are executed before those in a derived class and teardowns
+	are executed in the reverse order. If there are multiple setups or teardowns
+	defined at the same level, the order is unspecified so this practice is
+	not generally recommended.
+<li>The <b>FactoryAttribute</b> and <b>TestCaseFactoryAttribute</b> introduced 
+   in alhpa-3 have been removed. The new <b>TestCaseSourceAttribute</b> allows
+	specification of the name of the source of test cases and - optionally - the 
+	type providing the source if it is not the same as the type that contains the 
+	test. Only one source may be specified per attribute but the attribute may be 
+	applied more than once to indicate multiple sources.
+<li>It is now possibe to specify Categories and Properties on test cases
+    defined using the TestCaseData class.
+<li>Named fields, properties or methods may be used to provide values for
+    individual method parameters using the new <b>ValueSourceAttribute</b>.
+<li>New constraints and corresponding syntactic constructs are provided: 
+	<ul>
+	<li><b>Is.InRange</b> tests that a value lies within a specified range.
+	<li><b>Has.Attribute()</b> tests for the presence of a specified attribute
+		on a type.
+	<li><b>Is.AssignableTo</b> allows reversing the operands of AssignableFrom 
+		for increased clarity in the code and in any error messages when the
+		actual value is of the derived type.
+	<li><b>Throws.Exception</b> allows testing the exception thrown by a
+	    delegate in place and provides the ability to make arbitrary tests
+		on the caught exception. <b>Throws.TypeOf()</b> and <b>Throws.InstanceOf()</b>
+		are provided as shorthand for the commonly used <b>Throws.Exception.TypeOf()</b>
+		and <b>Throws.Exception.InstanceOf</b>.
+	<li><b>Throws.Nothing</b> provides for testing that a delegate does
+	    not throw. While it doesn't do much, it serves the purpose of
+		converting an unexpected error into a test failure.
+	</ul>
+<li>The parsing of constraint expressions written using the fluent interface
+    has been reorganized internally, with the following benefits:
+    <ul>
+	<li>Meaningless sequences like "...Null.Null..." or "...And.Or..."
+	    will no longer compile - the NUnit tests actually verify this
+		by attempting to compile them.
+	<li>Syntax modifiers like <b>Within</b> and <b>IgnoreCase</b> are
+	    now only accepted - and shown by intellisense - on constraints that
+	    actually make use of them.
+    <li>New <b>And</b> and <b>Or</b> infix operators are provided.
+	<li>The <b>With</b> provides some ability to group constraints.
+    </ul>	
+    
+	<p><p><b>Note:</b> Operators are evaluated in the following order:
+	<ol>
+	<li>Postfix modifiers (highest)
+	<li>Not Operator
+	<li>And operator (see below)
+	<li>Or operator  (see below)
+	<li>With operator
+	<li>Some, None and All operators
+	<li>And operator when followed directly by Some, None or All
+	<li>Or operator when followed directly by Some, None or All
+	<li>Overloaded operator &
+	<li>Overloaded operator | (lowest)
+	</ol>
+	Operators of equal precedence associate left to right.
+	
+<li>The "syntax helper" classes, <b>Is</b>, <b>Has</b>, <b>Text</b> and
+    <b>List</b> have been moved to the NUnit.Framework namespace, since they 
+	seem to have entered the mainstream.
+<li>NUnit 2.5 is able to recognize, load and run NUnitLite tests.
+<li>PropertyConstraint now works with Types when testing for the
+    existence of a named property.
+</ul>
+
+<h4>Core</h4>
+<ul>
+<li>Experimental support is provided for running tests in a separate process.
+    Currently, this is only exposed in the Gui runner.
+<li>NUnit recognizes a special attribute on
+    the config element of the nunit project file, <b>runtimeFramework</b>,
+	which may be set to "net-1.1" or "net-2.0." This causes use of the
+	appropriate runner if tests are run in a separate process.
+	<p><p>
+	<b>Note:</b> Both of the above features are experimental and
+	somewhat fragile. Results are expected to vary for different
+	installations and we ask that problems be reported.
+</ul>
+
+<h4>Gui</h4>
+
+<ul>
+<li>The Addin Dialog now shows an error message for any addin that
+    fails to load.  (from 2.4.8)
+<li>The TestLoader settings dialog provides an option for running tests
+    in a separate process.
+<li>The Assembly Info display now shows two runtime versions for each
+    test assembly: the one for which it was built and the one under
+	which it is currently loaded.
+</ul>
+
+<h4>Extensibility</h4>
+
+<ul>
+<li>The <b>RequiredAddinAttribute</b> is now only permitted at the assembly level.
+</ul>
+
+<h4>Bug Fixes</h4>
+
+<ul>
+<li>The Gui output panes were failing to use a fixed font. (from 2.4.8)
+</ul>
+
+<h3>NUnit 2.5 Alpha 3 Release - Version 2.5.0.8189 - July 7, 2008</h3>
+
+<h4>General</h4>
+
+<ul>
+<li>NUnit now uses a new version numbering scheme. The first three
+    dot-separated values represent the release level, as before, while 
+	the fourth is a build number tied to the date of the release. This 
+	alpha release, for example, is numbered 2.5.0.8189.
+<li>The NUnit source now includes a VS2008 project, in addition to
+    the existing VS2005 and VS2003 projects
+</ul>
+
+<h4>Framework</h4>
+
+<ul>
+<li><b>DataSourceAttribute</b> has been replaced with <b>FactoryAttribute</b>.
+    The new attribute may refer to any field, method or property that 
+	provides test cases consistent with the signature of the method on which
+	it appears. The naming of this attribute is still a bit unsatisfactory
+	and it may change in the final release. 
+<li>The new <b>TestCaseFactoryAttribute</b> class may be used to mark a
+    field, method or property that provides test cases. It specifies the
+	argument types of the test cases that will be provided and is used
+	to identify the cases to be used when the name of a factory is not
+	specified.
+<li>Data may be specified for individual arguments of a parameterized test
+    using the new attributes: <b>ValuesAttribute</b>, <b>RangeAttribute</b>
+	and <b>RandomAttribute</b>. By default, test cases are created using
+	every possible combination of the items provided. Attributes on the
+	test method may specify how data is combined. This release includes
+	<b>SequentialAttribute</b>, <b>CombinatorialAttribute</b> (the default) and 
+	<b>PairwiseAttribute</b>. However, Pairwise combination is not yet
+	implemented, so that attribute is currently ignored.
+<li><b>TestFixture</b> classes may now be generic. They must be marked with
+    or or more instances of <b>TextFixtureAttribute</b> using the new
+	constructor that takes an array of Types. NUnit will instantiate
+	the fixture multiple times, using the type arguments provided.
+<li>Parameterized test methods may now be generic. NUnit will deduce
+    the correct implementation to use based on the types of the
+	parameters provided.
+<li>The new <b>RequiredAddinAttribute</b> may be used to mark tests,
+    fixtures or assemblies, indicating the name of any addin that is
+	required to run the tests. If the addin is not present, the test,
+	fixture or assembly is marked NotRunnable.
+<li>A new assertion and corresponding constraint <b>IsOrdered</b>
+    has been added. (contributed by Simone Busoli)
+<li><b>PlatformAttribute</b> has been extended to accept the new keywords
+    <b>NT6</b>, <b>Vista</b> and <b>Win2008Server</b>.
+	<br><br>
+	<b>Note:</b> In the current alpha release, NUnit is unable to 
+	distintuish between Vista and Windows 2008 Server. Either
+	of them will match all the above values.
+</ul>
+
+<h4>Gui</h4>
+
+<ul>
+<li>Properties with a collection for a value are now displayed
+displayed as a comma-separated list in the properties window.
+</ul>
+
+<h4>Extensibility</h4>
+
+<ul>
+<li>The <b>IParameterProvider</b> interface has been replaced with
+    <b>ITestCaseProvider</b>. The ParameterProviders extension point
+	has been renamed to TestCaseProviders.
+<li>A new extension point, <b>DataPointProviders</b>, has been
+    added to support extensions that provide data for individual
+	test parameters. Extensions must implement the <b>IDataPointProvider</b>
+	interface.
+<li>A simpler method of providing new data point extensions based
+    on attributes applied to the parameter itself is also available.
+    Such attributes may be derived from <b>ValuesAttribute</b> and
+    do not require any special addin in order to work.
+</ul>
+
+<h4>Bug Fixes</h4>
+
+<ul>
+<li>NUnit tests of AssertThrows were not working on systems using
+    non-English cultures.
+<li>Domains were not unloading correctly in some circumstances. Unloading
+    is now done on a separate thread.
+<li>An NUnitSettings.xml file of zero length was causing a crash. (from 2.4.8)
+<li>Invoking the gui with /exclude:XXX, where XXX is a non-existent
+    category, was causing all tests to be excluded. (from 2.4.8)
+<li>Categories were not working properly on repeated tests. (from 2.4.8)
+<li>A serious memory leak was fixed in the NUnit test runners. (from 2.4.8)
+<li>Static SetUp and TearDown methods were not being called in a SetUpFixture.
+<li>The current directory used when executing addins that load tests was
+    not correctly set.
+</ul>
+
+<h3>NUnit 2.5 Alpha 2 Release - May 7, 2008</h3>
+
+<p><b>Note:</b> Since this is an alpha level release, the
+features are not complete and some features present in
+this release may be removed or changed in future releases.
+
+<h4>General</h4>
+
+<ul>
+<li>This release includes pNUnit, an extended NUnit runner for distributed
+    parallel tests. The pNUnit program was developed at Codice Software
+	for use in testing the Plastic SCM and has been contributed to NUnit.
+	For more info about using pNUnit see the 
+	<a href="http://www.codicesoftware.com/opdownloads2/oppnunit.aspx">pNUnit site</a>.
+<li>The install now offers Typical, Complete and Custom options. Selecting
+    Typical gets you the NUnit framework, core, console runner and Gui.
+    To install pNUnit, any of the bundled addins or the NUnit tests,
+	select Complete or Custom.
+</ul>
+
+<h4>Extensibility</h4>
+
+<ul>
+<li>The RowTestExtension, which was merged into the nunit extension dlls
+	in Alpha-1, is now provided as a separate addin. This is the general
+	approach we plan to take with regard to any bundled addins, since it
+	permits the creator of an addin to provide updates separately from
+	the NUnit release.
+<li>This release includes the CSUnitAddin extension, which allows the running of 
+    CSUnit tests under NUnit. The csunit.dll must be available in order to
+	run the tests.
+</ul>
+
+<h3>NUnit 2.5 Alpha 1 Release - April 18, 2008</h3>
+
+<h4>General</h4>
+
+<ul>
+<li>There are no longer separate distributed packages for .NET 1.1 an 2.0.
+    Both the binary zip and msi packages contain subdirectories for .NET
+	1.1 and 2.0. In the case of the msi, the user may elect to install either
+	or both of them.
+<li>The Visual Studio solutions and projects are now in a directory tree that 
+	is parallel to the source tree. This eliminates problems where the VS2003 
+	and VS2005 builds were interfering with one another and makes room for 
+	adding VS2008.
+<li>NUnit is now built using NAnt 0.86 beta 1
+<li>The windows installer is now created using WiX 2.0.5085
+</ul>
+
+<h4>Framework</h4>
+
+<ul>
+<li>Two new attributes have been added to support passing arguments
+	to test methods:
+	<ul>
+	<li><b>TestCaseAttribute</b> allows the programmer to
+		specify the arguments and a number of optional parameters inline.
+	<li><b>DataSourceAttribute</b> identifies a static property that 
+		will provide the arguments and other parameters.
+	</ul>
+
+<li>Two new constraints have been added to permit testing of
+	application-created paths, without requiring that they exist in
+	the file system. The following syntax is supported:
+	<ul>
+	<li><b>Is.SamePath(string)</b>
+	<li><b>Is.SamePathOrUnder(string)</b>
+	</ul>
+	
+<li>The DirectoryAssert class has been added, providing the following Methods:
+	<ul>
+	<li><b>AreEqual(DirectoryInfo, DirectoryInfo)</b>
+	<li><b>AreEqual(string, string)</b>
+	<li><b>AreNotEqual(DirectoryInfo, DirectoryInfo)</b>
+	<li><b>AreNotEqual(string, string)</b>
+	<li><b>IsEmpty(DirectoryInfo, DirectoryInfo)</b>
+	<li><b>IsEmpty(string, string)</b>
+	<li><b>IsNotEmpty(DirectoryInfo, DirectoryInfo)</b>
+	<li><b>IsNotEmpty(string, string)</b>
+	<li><b>IsWithin(DirectoryInfo, DirectoryInfo)</b>
+	<li><b>IsWithin(string, string)</b>
+	<li><b>IsNotWithin(DirectoryInfo, DirectoryInfo)</b>
+	<li><b>IsNotWithin(string, string)</b>
+	</ul>
+	
+<li>The method <b>Assert.Throws(Type expectedException, TestSnippet code)</b> 
+	has been added to provide more control over tests of expected exceptions. 
+	<b>TestSnippet</b> is a delegate, which may of course be supplied 
+	anonymously under .NET 2.0. If the correct exception type is thrown,
+	the actual exception is returned from the method, allowing further
+	verification to be performed.
+	
+<li>The <b>Assert.DoesNotThrow</b> method may be used to verify that a
+	delegate does not throw an exception.
+	
+<li>The <b>Assert.Pass</b> method allows early termination of a test with a
+    successful result. 
+
+<li>The <b>Assert.Inconclusive</b> method allows returning
+	the new Inconclusive result state.
+
+<li>NUnit now includes added funtionality in the .NET 2.0 build of
+	the framework. The following additional features are supported:
+	<ul>
+	<li>All Asserts and Constraints work with nullable types. 
+	<li>Some Asserts allow an alternate generic syntax for convenience:
+		<ul>
+		<li><b>Assert.IsInstanceOf<T>(object actual);</b>
+		<li><b>Assert.IsNotInstanceOf<T>(object actual);</b>
+		<li><b>Assert.IsAssignableFrom<T>(object actual);</b>
+		<li><b>Assert.IsNotAssignableFrom<T>(object actual);</b>
+		<li><b>Assert.Throws<T&gt(TypeSnippet code);</b>
+		</ul>
+	</ul>
+	
+<li>The following obsolete interfaces, classes and methods have been removed:
+<ul>
+	<li>The <b>IAsserter</b> interface
+	<li>The <b>AbstractAsserter</b> class
+	<li>The <b>Assertion</b> class
+	<li>The <b>AssertionFailureMessage</b> class
+	<li>The old <b>NUnit.Framework.TestCase</b> class used for inheriting test classes
+	<li>The <b>Assert.DoAssert()</b> method
+	<li>Two <b>ExpectedExceptionAttribute(Type, string)</b> constructor
+	<li>Two <b>ExpectedExceptionAttribute(string, string)</b> constructor
+</ul>
+
+<li>The syntactic constructs in the <b>SyntaxHelpers</b> namespace have been
+	moved to the <b>NUnit.Framework.Syntax.CSharp</b> namespace. The old
+	namespace may still be used for existing classes, but will not be 
+	supported after the 2.5 release.
+	
+</ul>
+
+<h4>Core</h4>
+
+<ul>
+<li>NUnit now allows use of static methods as tests and for SetUp, TearDown, 
+    TestFixtureSetUp and TestFixtureTearDown.
+<li>Failures and Errors are now distinquished internally and in summary reports.
+    Methods that are not run because they are invalid are also reported separately.
+</ul>
+
+<h4>Console</h4>
+
+<ul>
+<li>The summary report now displays Errors, Failures, Inconclusive, Ignored and Skipped tests 
+	separately. More detailed information on non-runnable tests and setup failures
+	is provided.
+<li>The console summary report is no longer created using a stylesheet, which
+	renders the <b>/transform</b> option meaningless. The option has been removed.
+</ul>
+
+<h4>Gui</h4>
+
+<ul>
+<li>The default gui display now uses a single tab for all text output. For
+	users upgrading from an earlier release, the current settings are
+	honored. If you wish to change to the new default, use the Restore Defaults
+	button on the Text Output settings dialog.
+
+<li>The final test run display shows a more detailed summary: passed tests,
+    errors, failures, inconclusive, non-runnable, skipped and ignored.
+
+<li>The status bar now displays errors and failures separately in.
+
+<li>The tree display shows non-runnable tests in red and inconclusive tests
+	in orange. Inconclusive tests are temporarily listed
+	on the Tests Not Run tab for this alpha release.
+</ul>
+
+<h4>Extensibility</h4>
+
+<ul>
+<li>A new extension point <b>ParameterProviders</b> allows addins to 
+	provide data for parameterized tests.
+	
+<li>The following extensions are included in the nunit.core.extensions
+	and nunit.framework.extensions assemblies:
+	<ul>
+	<li>The MaxTime extension, which was previously a sample.
+	<li>The RowTest extension, which remains an alternative to NUnit's
+		native TestCase syntax.
+	<li>The XmlConstraint extension, which allows comparing two xml files
+	</ul> 
+</ul>
+
+
+<h3>Earlier Releases</h3>
+
+<ul>
+<li>Release Notes for <a href="http://www.nunit.org/?p=releaseNotes&r=2.4.8">NUnit 2.4 through 2.4.8</a>
+<li>Release Notes for <a href="http://www.nunit.org/?p=releaseNotes&r=2.2.10">NUnit 2.0 through 2.2.10</a>
+</ul>
+
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
 <li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
 <li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
 <li id="current"><a href="releaseNotes.html">Release Notes</a></li>
 <li><a href="samples.html">Samples</a></li>
 <li><a href="license.html">License</a></li>
 </ul>
 </ul>
-</div>
-<!-- End of Submenu -->
-
-
-<!-- Standard Footer for NUnit.org -->
-<div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
-</div>
-<!-- End of Footer -->
-
-</body>
-</html>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/repeat.html b/doc/repeat.html
new file mode 100644
index 0000000..13f7f0b
--- /dev/null
+++ b/doc/repeat.html
@@ -0,0 +1,100 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - Repeat</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>RepeatAttribute (NUnit 2.5)</h3>
+
+<p><b>RepeatAttribute</b> is used on a test case to specify that it should be 
+   executed multiple times. If any repetition fails, the remaining ones are
+   not run and a failure is reported.
+   
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li><a href="category.html">Category</a></li>
+<li><a href="combinatorial.html">Combinatorial</a></li>
+<li><a href="culture.html">Culture</a></li>
+<li><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li id="current"><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/requiredAddin.html b/doc/requiredAddin.html
new file mode 100644
index 0000000..e86fdd8
--- /dev/null
+++ b/doc/requiredAddin.html
@@ -0,0 +1,149 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - RequiredAddin</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>RequiredAddinAttribute (NUnit 2.5)</h3>
+
+<p>The RequiredAddin attribute is used to indicate that an
+   assembly requires a particular addin in order to function correctly. If
+   that addin is not installed, the entire assembly is marked as non-runnable.
+   
+<p><b>Note:</b> In the Alpha-3 release, this attribute may be applied to
+classes or methods as well. This is of limited utility, for two reasons:
+<ol>
+<li>If the method or class is not recognized as a test, due to the addin
+being missing, then NUnit will never process it.
+<li>If the method or class is handled by some a different addin, that
+addin may not recognize the attribute.
+</ol>
+<p>The attribute will be limited to assemblies only in the next release.
+   
+<h4>Example</h4>
+
+<In the 
+
+<div class="code"><pre>
+[assembly: RequiredAddin("MyTestFixtureAddin")]
+[assembly: RequiredAddin("MyTestAddin")]
+[assembly: RequiredAddin("MyDecoratorAddin")]
+
+...
+
+namespace NUnit.Tests
+{
+  using System;
+  using NUnit.Framework;
+
+  [MyTestFixture]
+  public class MyTests
+  {
+    [MyTest]
+	public void SomeTest()
+	{
+	  ...
+	}
+  }
+  
+  [TestFixture, MyDecorator]
+  public class MoreTests
+  {
+    [Test, MyDecorator]
+	public void AnotherTest()
+	{
+	  ...
+	}
+  }
+}
+</pre>
+</div>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li><a href="category.html">Category</a></li>
+<li><a href="combinatorial.html">Combinatorial</a></li>
+<li><a href="culture.html">Culture</a></li>
+<li><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li id="current"><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/requiresMTA.html b/doc/requiresMTA.html
new file mode 100644
index 0000000..06f9969
--- /dev/null
+++ b/doc/requiresMTA.html
@@ -0,0 +1,148 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - RequiresMTA</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>RequiresMTAAttribute (NUnit 2.5)</h3>
+
+<p>The <b>RequiresMTAAttribute</b> is used on a test method, class or assembly
+   to specify that the tests should be run in the multi-threaded apartment.
+   It causes creation of a new thread if the parent test is not already running
+   in the MTA.
+   
+<p><b>Note:</b> On test methods, you may also use the <b>MTAThreadAttribute</b>.
+   Although the runtime only recognizes this attribute on the entrypoint of 
+   an executable assembly, many users have expected it to work on tests, so
+   we treat it as a synonym.
+
+<h4>Examples</h4>
+   
+<div class="code">
+
+<pre>
+
+// An MTA thread will be created and used to run
+// all the tests in the assembly
+[assembly:RequiresMTA]
+
+...
+
+// TestFixture requiring a separate thread
+[TestFixture, RequiresMTA]
+public class FixtureRequiringMTA
+{
+  // An MTA thread will be created and all
+  // tests in the fixture will run on it
+  // unless the containing assembly is
+  // already running on an MTA Thread
+}
+
+[TestFixture]
+public class AnotherFixture
+{
+  [Test, RequiresMTA]
+  public void TestRequiringMTA()
+  {
+    // A separate thread will be created for this test
+	// unless the containing fixture is already running 
+	// in the MTA.
+  }
+}
+
+</pre>
+
+</div>
+
+<h4>See also...</h4>
+<ul>
+<li><a href="requiresThread.html">RequiresThreadAttribute</a><li><a href="requiresSTA.html">RequiresSTAAttribute</a></ul>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li><a href="category.html">Category</a></li>
+<li><a href="combinatorial.html">Combinatorial</a></li>
+<li><a href="culture.html">Culture</a></li>
+<li><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li id="current"><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/requiresSTA.html b/doc/requiresSTA.html
new file mode 100644
index 0000000..a371ba8
--- /dev/null
+++ b/doc/requiresSTA.html
@@ -0,0 +1,149 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - RequiresSTA</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>RequiresSTAAttribute (NUnit 2.5)</h3>
+
+<p>The <b>RequiresSTAAttribute</b> is used on a test method, class or assembly
+   to specify that the tests should be run in the Single-threaded apartment.
+   It causes creation of a new thread if the parent test is not already running
+   in the STA.
+   
+<p><b>Note:</b> On test methods, you may also use the <b>STAThreadAttribute</b>.
+   Although the runtime only recognizes this attribute on the entrypoint of 
+   an executable assembly, many users have expected it to work on tests, so
+   we treat it as a synonym.
+
+<h4>Examples</h4>
+   
+<div class="code">
+
+<pre>
+
+// An STA thread will be created and used to run
+// all the tests in the assembly
+[assembly:RequiresSTA]
+
+...
+
+// TestFixture requiring a separate thread
+[TestFixture, RequiresSTA]
+public class FixtureRequiringSTA
+{
+  // An STA thread will be created and all
+  // tests in the fixture will run on it
+  // unless the containing assembly is
+  // already running on an STA Thread
+}
+
+[TestFixture]
+public class AnotherFixture
+{
+  [Test, RequiresSTA]
+  public void TestRequiringSTA()
+  {
+    // A separate thread will be created for this test
+	// unless the containing fixture is already running 
+	// in the STA.
+  }
+}
+
+</pre>
+
+</div>
+
+<h4>See also...</h4>
+<ul>
+<li><a href="requiresThread.html">RequiresThreadAttribute</a><li><a href="requiresMTA.html">RequiresMTAAttribute</a></ul>
+   
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li><a href="category.html">Category</a></li>
+<li><a href="combinatorial.html">Combinatorial</a></li>
+<li><a href="culture.html">Culture</a></li>
+<li><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li id="current"><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/requiresThread.html b/doc/requiresThread.html
new file mode 100644
index 0000000..3c63e1f
--- /dev/null
+++ b/doc/requiresThread.html
@@ -0,0 +1,149 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - RequiresThread</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>RequiresThreadAttribute (NUnit 2.5)</h3>
+
+<p>The <b>RequiresThreadAttribute</b> is used to indicate that a test method, 
+   class or assembly should be run on a separate thread. Optionally, the 
+   desired apartment for the thread may be specified in the constructor.
+   
+<p><b>Note:</b> This attribute, used with or without an ApartmentState
+   argument will <b>always</b> result in creation of a new thread. To
+   create a thread only if the current ApartmentState is not appropriate,
+   use <b>RequiresSTAAttribute</b> or <b>RequiresMTAAttribute</b>.
+   
+<h4>Examples</h4>
+   
+<div class="code">
+
+<pre>
+
+// A thread will be created and used to run
+// all the tests in the assembly
+[assembly:RequiresThread]
+
+...
+
+// TestFixture requiring a separate thread
+[TestFixture, RequiresThread]
+public class FixtureOnThread
+{
+  // A separate thread will be created and all
+  // tests in the fixture will run on it.
+}
+
+[TestFixture]
+public class AnotherFixture
+{
+  [Test, RequiresThread]
+  public void TestRequiringThread()
+  {
+    // A separate thread will be created for this test
+  }
+  
+  [Test, RequiresThread(ApartmentState.STA)]
+  public void TestRequiringSTAThread()
+  {
+    // A separate STA thread will be created for tnis test.
+  }
+}
+
+</pre>
+
+</div>
+
+<h4>See also...</h4>
+<ul>
+<li><a href="requiresSTA.html">RequiresSTAAttribute</a><li><a href="requiresMTA.html">RequiresMTAAttribute</a></ul>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li><a href="category.html">Category</a></li>
+<li><a href="combinatorial.html">Combinatorial</a></li>
+<li><a href="culture.html">Culture</a></li>
+<li><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li id="current"><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/reusableConstraint.html b/doc/reusableConstraint.html
new file mode 100644
index 0000000..1beda2b
--- /dev/null
+++ b/doc/reusableConstraint.html
@@ -0,0 +1,161 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - ReusableConstraint</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>ReusableConstraint (NUnit 2.5.6)</h2>
+
+<p>Normally constraints just work. However, attempting to reuse the 
+same constraint in several places can lead to unexpected results.
+
+<p>Consider the following code as an example:
+
+<code><pre>
+    Constraint myConstraint = Is.Not.Null;
+    Assert.That("not a null", myConstraint); // Passes, of course
+    Assert.That("not a null", myConstraint); // Fails! What's that about?
+</pre></code>
+
+<p>We'll save the technical explanation for later and show the
+solution first:
+
+<code><pre>
+    ReusableConstraint myConstraint = Is.Not.Null;
+    Assert.That("not a null", myConstraint); // Passes
+    Assert.That("not a null", myConstraint); // Passes
+</pre></code>
+
+Or alternatively..
+
+<code><pre>
+    var myConstraint = new ReusableConstraint(Is.Not.Null);
+    Assert.That("not a null", myConstraint); // Passes
+    Assert.That("not a null", myConstraint); // Passes
+</pre></code>
+
+<h3>Technical Explanation</h3>
+
+<p>In the original example, the value assigned to myConstraint is
+known as an <b>unresolved</b> constraint. In fact, it's an
+unresolved NullConstraint, because that was the last constraint 
+encountered in the expression. It's associated with a <b>Not</b>
+operator that has not yet been applied.
+
+<p>That's OK for use with Assert.That(), because the method
+knows how to resolve a constraint before using it. Assert.That()
+resolves this constraint to a NotConstraint referencing the
+original NullConstraint.
+
+<p>Of course, the original reference in myConstraint is left
+unchanged in all of this. But the EqualConstraint it points
+to has now been resolved. It is now a <b>resolved</b> constraint
+and can't be resolved again by the second Assert.That(), which
+only sees the NullConstraint and not the NotConstraint.
+
+<p>So, for reusability, what we want to save is the result
+of resolving the constraint, in this case
+
+<pre>    NotConstraint => NullConstraint</pre>
+
+That's what <b>ReusableConstraint</b> does for us. It resolves
+the full expression and saves the result. Then it passes all
+operations on to that saved result.
+
+<h3>When to Use It</h3>
+
+<p>Use this constraint any time you want to reuse a constraint
+expression and you'll be safe.
+
+<p>If you like to take chances, you'll find that you can
+avoid using it in the following cases...
+
+<ol>
+<li> With a simple constraint involving no operators, like...
+
+<pre>
+    Constraint myConstraint = Is.Null;
+    Constraint myConstraint = Is.EqualTo(42);
+</pre>
+
+<li> With any constraint you construct using new, without
+using the "dotted" constraint syntax...
+
+<pre>
+    Constraint myConstraint = new NotConstraint(new NullConstraint());
+    Constraint myConstraint = new AndConstraint(
+        new GreaterThanConstraint(0), 
+        new LessThanConstraint(100));
+</pre>
+
+<p>However, there is no significant penalty to using <b>ReusableConstraint</b>.
+It makes your intent much clearer and the exceptions listed are accidents of
+the internal implementation and could disappear in future releases.
+
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<ul>
+<li><a href="equalConstraint.html">Equal Constraint</a></li>
+<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
+<li><a href="conditionConstraints.html">Condition Constraints</a></li>
+<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
+<li><a href="pathConstraints.html">Path Constraints</a></li>
+<li><a href="typeConstraints.html">Type Constraints</a></li>
+<li><a href="stringConstraints.html">String Constraints</a></li>
+<li><a href="collectionConstraints.html">Collection Constraints</a></li>
+<li><a href="propertyConstraint.html">Property Constraint</a></li>
+<li><a href="throwsConstraint.html">Throws Constraint</a></li>
+<li><a href="compoundConstraints.html">Compound Constraints</a></li>
+<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
+<li><a href="listMapper.html">List Mapper</a></li>
+<li id="current"><a href="reusableConstraint.html">Reusable Constraint</a></li>
+</ul>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/runningTests.html b/doc/runningTests.html
new file mode 100644
index 0000000..7a1906d
--- /dev/null
+++ b/doc/runningTests.html
@@ -0,0 +1,108 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - RunningTests</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Running Tests</h2>
+
+<p>Nunit provides three different runners, which may be used to load and
+run your tests.
+
+<ul>
+<li>The <a href="nunit-console.html">console runner</a>, 
+    nunit-console.exe, is used for batch execution.
+<li>The <a href="nunit-gui.html">gui runner</a>, nunit.exe,
+    provides interactive loading and running of tests.
+<li>The <a href="pnunit.html">pNUnit runner</a>, 
+    pnunit-launcher.exe, is used to run parallel, distributed tests under the
+	control of pNUnit.
+</ul>
+
+<h3>NUnit Agent</h3>
+
+<p>When running tests in a separate process, the console and gui runners
+   make use of the <a href="nunit-agent.html">nunit-agent</a>   program, nunit-agent.exe. Although not directly run by users, nunit-agent
+   does load and execute tests and users need to be aware of it, especially
+   when debugging is involved.
+
+<h3>Third-Party Runners</h3>
+
+<p>Various third-party applications are available for loading and running
+   NUnit tests. Some of these actually use NUnit to load the tests, while
+   others provide their own emulation and may not work in the same way 
+   that NUnit does.
+   
+<p>Because the status of such projects may change from time to time, we don't
+   discuss them individually here. For the latest information, consult the 
+   manufacturer of any third-party software or ask other users on our
+   <a href="http://groups.google.com/group/nunit-discuss">discussion list</a>.
+   
+<h3>Additional Information</h3>
+
+<p>For additional general information on how tests are loaded and run, see
+
+<ul>
+<li><a href="runtimeSelection.html">Runtime Selection</a><li><a href="assemblyIsolation.html">Assembly Isolation</a><li><a href="configFiles.html">Configuration Files</a><li><a href="multiAssembly.html">Multiple Assemblies</a><li><a href="vsSupport.html">Visual Studio Support</a></ul>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li id="current"><a href="runningTests.html">Running Tests</a></li>
+<ul>
+<li><a href="nunit-console.html">Console Runner</a></li>
+<li><a href="nunit-gui.html">Gui Runner</a></li>
+<li><a href="pnunit.html">PNUnit Runner</a></li>
+<li><a href="nunit-agent.html">NUnit Agent</a></li>
+<li><a href="runtimeSelection.html">Runtime Selection</a></li>
+<li><a href="assemblyIsolation.html">Assembly Isolation</a></li>
+<li><a href="configFiles.html">Configuration Files</a></li>
+<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/runtimeSelection.html b/doc/runtimeSelection.html
new file mode 100644
index 0000000..16b28ab
--- /dev/null
+++ b/doc/runtimeSelection.html
@@ -0,0 +1,122 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - RuntimeSelection</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>Runtime Selection</h3>
+
+<p>Before loading an assembly, NUnit must determine what runtime to use. By default
+(see below for exceptions) the following rules are used:
+
+<ol>
+<li><p>If the assembly was built for the same runtime under which NUnit is currently 
+running, then that runtime is used.
+
+<li><p>If the assembly was built for a different runtime version and that version 
+is available, NUnit uses it, running out of process if necessary. 
+
+<li><p>If the assembly was built for a different runtime version, which is not
+available, then the result depends on whether the build version is earlier or
+later than the current version. If earlier, the test will be run using the
+same runtime version under which NUnit is running. If later, then it is not
+possible to load the test and NUnit gives an error message.
+
+<li><p>If multiple assemblies are being run at the same time, NUnit first
+determines the runtime under which each assembly was built. The highest version 
+is then selected for the entire group, and rules 1 through 3 are applied.
+</ol>
+
+<p><b>Note:</b> For versions 2.5.4 and 2.5.5, automatic runtime selection only
+works in the Gui runner. Use the /framework option to select the appropriate
+runtime under the Console runner.
+
+<h3>Overriding the Defaults</h3>
+
+<p>The default runtime framework may be overridden using command line arguments, 
+   menu items in the Gui or settings in an NUnit project file. Provided that the 
+   requested framework is available, it will be used. If it isn't available, 
+   NUnit will issue an error message.
+   
+<p><b>Note:</b> To use version 1.x runtimes, you must have NUnit's support 
+   for those runtimes installed, in addition to the runtime itself. This
+   support is an option of the NUnit installation.
+
+<h4>Command Line Options</h4>
+
+<p>The <b>/framework</b> option of console runner allows you to specify
+   the framework type and version to be used for a test run. See
+   <a href="consoleCommandLine.html">NUnit-Console Command Line Options</a>   for more information.
+   
+<h4>Gui Menu Selection</h4>
+
+<p>The main menu provides <b>File | Select Runtime</b> sub-items allowing you
+   to reload the tests under a specific runtime. See 
+   <a href="mainMenu.html">Main Menu</a> for more info.
+   
+<h4>Project Settings</h4>
+
+<p>The NUnit project format supports specification of a specific runtime to
+   be used with a project at the configuration level. See
+   <a href="projectEditor.html">Project Editor</a>   for more information.
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<ul>
+<li><a href="nunit-console.html">Console Runner</a></li>
+<li><a href="nunit-gui.html">Gui Runner</a></li>
+<li><a href="pnunit.html">PNUnit Runner</a></li>
+<li><a href="nunit-agent.html">NUnit Agent</a></li>
+<li id="current"><a href="runtimeSelection.html">Runtime Selection</a></li>
+<li><a href="assemblyIsolation.html">Assembly Isolation</a></li>
+<li><a href="configFiles.html">Configuration Files</a></li>
+<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/sameasConstraint.html b/doc/sameasConstraint.html
index 27592ac..2168200 100644
--- a/doc/sameasConstraint.html
+++ b/doc/sameasConstraint.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -30,10 +30,17 @@
    as an actual value has the same identity as the object supplied
    in its constructor.
 
-<table class="constraints">
-<tr><th>Syntax Helper</th><th>Constructor</th><th>Operation</th></tr>
-<tr><td>Is.SameAs( object )</td><td>SameAsConstraint( null )</td></td><td>tests that two object references refer to the same object</td></tr>
-</table>
+<h4>Constructor</h4>
+
+<div class="code"><pre>
+SameAsConstraint( object expected )
+</pre></div>
+
+<h4>Syntax</h4>
+
+<div class="code"><pre>
+Is.SameAs( object expected )
+</pre></div>
 
 <h4>Examples of Use</h4>
 
@@ -44,53 +51,48 @@ Assert.That( ex2, Is.SameAs( ex1 ) );
 
 Exception ex3 = new Exception();
 Assert.That( ex3, Is.Not.SameAs( ex1 ) );
-
-// Using inheritance
-Expect( ex2, SameAs( ex1 ) );
-Expect( ex3, Not.SameAs( ex1 ) );
 </pre></div>
 </div>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<ul>
-<li><a href="classicModel.html">Classic Model</a></li>
-<li><a href="constraintModel.html">Constraint Model</a></li>
-<ul>
-<li><a href="equalConstraint.html">Equal Constraint</a></li>
-<li id="current"><a href="sameasConstraint.html">SameAs Constraint</a></li>
-<li><a href="conditionConstraints.html">Condition Constraints</a></li>
-<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
-<li><a href="typeConstraints.html">Type Constraints</a></li>
-<li><a href="stringConstraints.html">String Constraints</a></li>
-<li><a href="collectionConstraints.html">Collection Constraints</a></li>
-<li><a href="propertyConstraint.html">Property Constraint</a></li>
-<li><a href="compoundConstraints.html">Compound Constraints</a></li>
-<li><a href="customConstraints.html">Custom Constraints</a></li>
-<li><a href="listMapper.html">List Mapper</a></li>
-</ul>
-</ul>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<ul>
+<li><a href="equalConstraint.html">Equal Constraint</a></li>
+<li id="current"><a href="sameasConstraint.html">SameAs Constraint</a></li>
+<li><a href="conditionConstraints.html">Condition Constraints</a></li>
+<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
+<li><a href="pathConstraints.html">Path Constraints</a></li>
+<li><a href="typeConstraints.html">Type Constraints</a></li>
+<li><a href="stringConstraints.html">String Constraints</a></li>
+<li><a href="collectionConstraints.html">Collection Constraints</a></li>
+<li><a href="propertyConstraint.html">Property Constraint</a></li>
+<li><a href="throwsConstraint.html">Throws Constraint</a></li>
+<li><a href="compoundConstraints.html">Compound Constraints</a></li>
+<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
+<li><a href="listMapper.html">List Mapper</a></li>
+<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
+</ul>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/samples.html b/doc/samples.html
index 2442cbd..d830fef 100644
--- a/doc/samples.html
+++ b/doc/samples.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -29,8 +29,9 @@ dt { font-weight: bold; }
 --></style>
 <h2>Samples</h2>
 
-NUnit 2.4 has additional samples from previous versions. Samples are now organized
-by language, with an additional folder for Extensility examples.
+NUnit 2.5 samples continue to be organized by language, with an additional 
+folder for Extensibility examples. The 'money-port' example has been
+removed.
 
 <h3>C# Samples</h3>
 <dl>
@@ -40,9 +41,6 @@ by language, with an additional folder for Extensility examples.
 	<dt>Money
 	<dd>This is a C# version of the money example which is found in most xUnit 
 		implementations. Thanks to Kent Beck.
-	<dt>Money-port
-	<dd>This is an example of the minimum amount of work that is needed to 
-		upgrade from previous versions of NUnit to this version.
 </dl>
 
 <h3>J# Samples</h3>
@@ -98,27 +96,27 @@ by language, with an additional folder for Extensility examples.
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li id="current"><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li id="current"><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/sequential.html b/doc/sequential.html
new file mode 100644
index 0000000..bf7e235
--- /dev/null
+++ b/doc/sequential.html
@@ -0,0 +1,128 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - Sequential</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>SequentialAttribute (NUnit 2.5)</h3>
+
+<p>The <b>SequentialAttribute</b> is used on a test to specify that NUnit should
+   generate test cases by selecting individual data items provided
+   for the parameters of the test, without generating additional
+   combinations.
+   
+<p><b>Note:</b> If parameter data is provided by multiple attributes,
+the order in which NUnit uses the data items is not guaranteed. However,
+it can be expected to remain constant for a given runtime and operating
+system.
+   
+<h4>Example</h4>
+
+<p>The following test will be executed three times, as follows:
+<pre>
+	MyTest(1, "A")
+	MyTest(2, "B")
+	MyTest(3, null)
+</pre>
+<div class="code"><pre>
+[Test, Sequential]
+public void MyTest(
+    [Values(1,2,3)] int x,
+    [Values("A","B")] string s)
+{
+    ...
+}
+</pre></div>
+
+<h4>See also...</h4>
+<ul>
+<li><a href="combinatorial.html">CombinatorialAttribute</a><li><a href="pairwise.html">PairwiseAttribute</a></ul>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li><a href="category.html">Category</a></li>
+<li><a href="combinatorial.html">Combinatorial</a></li>
+<li><a href="culture.html">Culture</a></li>
+<li><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li id="current"><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/setCulture.html b/doc/setCulture.html
index fbd3e12..0edc731 100644
--- a/doc/setCulture.html
+++ b/doc/setCulture.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -118,50 +118,73 @@ public class FrenchCultureTests
 </pre>
 </div>
 
+<h4>See also...</h4>
+<ul>
+<li><a href="culture.html">CultureAttribute</a></ul>
+
 </div>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<ul>
-<li><a href="category.html">Category</a></li>
-<li><a href="culture.html">Culture</a></li>
-<li><a href="description.html">Description</a></li>
-<li><a href="exception.html">Expected Exception</a></li>
-<li><a href="explicit.html">Explicit</a></li>
-<li><a href="ignore.html">Ignore</a></li>
-<li><a href="platform.html">Platform</a></li>
-<li><a href="property.html">Property</a></li>
-<li id="current"><a href="setCulture.html">SetCulture</a></li>
-<li><a href="setup.html">Setup</a></li>
-<li><a href="setupFixture.html">SetUp Fixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testFixture.html">Test Fixture</a></li>
-<li><a href="fixtureSetup.html">Test Fixture SetUp</a></li>
-<li><a href="fixtureTeardown.html">Test Fixture </a></li>
-</ul>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li><a href="category.html">Category</a></li>
+<li><a href="combinatorial.html">Combinatorial</a></li>
+<li><a href="culture.html">Culture</a></li>
+<li><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li id="current"><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/setUICulture.html b/doc/setUICulture.html
new file mode 100644
index 0000000..1ab9b1c
--- /dev/null
+++ b/doc/setUICulture.html
@@ -0,0 +1,192 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - SetUICulture</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
+
+<style><!--
+div.code { width: 34em }
+--></style>
+
+<h3>SetUICultureAttribute (NUnit 2.5.2)</h3> 
+<p>The SetUICulture attribute is used to set the current UI Culture for the duration
+of a test. It may be specified at the level of a test or a fixture. The UI culture
+remains set until the test or fixture completes and is then reset to its original
+value. If you wish to use the current culture setting to decide whether to run
+a test, use the Culture attribute instead of this one.</p>
+	
+<p>Only one culture may be specified. Running a test under
+multiple cultures is a planned future enhancement. At this time, you can 
+achieve the same result by factoring out your test code into a private method 
+that is called by each individual test method.</p>
+
+<h4>Examples:</h4>
+
+<div class="code">
+
+<div class="langFilter">
+	<a href="javascript:Show('DD1')" onmouseover="Show('DD1')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
+	<div id="DD1" class="dropdown" style="display: none;" onclick="Hide('DD1')">
+		<a href="javascript:ShowCS()">C#</a><br>
+		<a href="javascript:ShowVB()">VB</a><br>
+		<a href="javascript:ShowMC()">C++</a><br>
+		<a href="javascript:ShowJS()">J#</a><br>
+	</div>
+</div>
+
+<pre class="cs">namespace NUnit.Tests
+{
+  using System;
+  using NUnit.Framework;
+
+  [TestFixture]
+  [SetUICulture("fr-FR")]
+  public class FrenchCultureTests
+  {
+    // ...
+  }
+}
+</pre>
+
+<pre class="vb">Imports System
+Imports Nunit.Framework
+
+Namespace Nunit.Tests
+
+  <TestFixture(), SetUICulture("fr-FR")>
+  Public Class FrenchCultureTests
+    ' ...
+  End Class
+End Namespace
+</pre>
+
+<pre class="mc">#using <Nunit.Framework.dll>
+using namespace System;
+using namespace NUnit::Framework;
+
+namespace NUnitTests
+{
+  [TestFixture]
+  [SetUICulture("fr-FR")]
+  public __gc class FrenchCultureTests
+  {
+    // ...
+  };
+}
+
+#include "cppsample.h"
+
+namespace NUnitTests {
+  // ...
+}
+</pre>
+
+<pre class="js">package NUnit.Tests;
+
+import System.*;
+import NUnit.Framework.TestFixture;
+
+
+/** @attribute NUnit.Framework.TestFixture() */
+/** @attribute NUnit.Framework.SetUICulture("fr-FR") */
+public class FrenchCultureTests
+{
+  // ...
+}
+</pre>
+</div>
+
+<h4>See also...</h4>
+<ul>
+<li><a href="culture.html">CultureAttribute</a><li><a href="setCulture.html">SetCultureAttribute</a></ul>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li><a href="category.html">Category</a></li>
+<li><a href="combinatorial.html">Combinatorial</a></li>
+<li><a href="culture.html">Culture</a></li>
+<li><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li id="current"><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/settingsDialog.html b/doc/settingsDialog.html
new file mode 100644
index 0000000..8a45268
--- /dev/null
+++ b/doc/settingsDialog.html
@@ -0,0 +1,321 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - SettingsDialog</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Settings Dialog</h2>
+
+<p>The Settings Dialog is displayed using the Tools | Settings menu item and allows the user to
+control some aspects of NUnit’s operation. Beginning with NUnit 2.4.4, a tree-based dialog
+replaced the older tabbed format.</p>
+
+<hr><h3>Gui Settings - General</h3><hr>
+
+<div class="screenshot-right">
+   <img src="img/generalSettings.jpg"></div>
+
+<h3>Gui Display</h3>
+
+<h4>Full Gui</h4>
+<p>Displays the complete gui - as in prior versions of NUnit. This includes the
+   test result tabs and the progress bar.</p>
+   
+<h4>Mini Gui</h4>
+<p>Switches the display to the mini-gui, which consists of the tree display 
+   only.</p>
+<h3>Recent Files</h3>
+
+<p>The <b>Display ... files in list</b> TextBox allows the user to choose the number 
+of entries to display in the recent files list.
+
+<p>Normally, NUnit checks that project files still exist before
+displaying them in the recent files list. This can cause long delays if the
+file is on a network connection that is no longer available. Unchecking 
+<b>Check that files exist before listing</b> will avoid this delay, so 
+long as the missing file is not actually selected.
+
+<p>If <b>Load most recent project at startup</b> is checked, the GUI will load the 
+last file opened unless it is run with a specific filename or with the 
+<code>/noload</code> parameter.</p>
+
+<hr style="clear: both"><h3>Gui Settings - Tree Display</h3><hr>
+
+<div class="screenshot-right">
+   <img src="img/treeDisplaySettings.jpg"></div>
+
+<h3>Tree View</h3>
+
+<p>The list box allows selecting the degree of expansion of the tree when tests are loaded:</p>
+<blockquote>
+<p><b>Auto</b> – selects a setting based on the space available for the tree display.</p>
+<p><b>Expand</b> – expands all tests</p>
+<p><b>Collapse</b> – collapses all tests</p>
+<p><b>Hide Tests</b> – expands all suites except for the fixtures themselves.</p>
+</blockquote>
+
+<p>If <b>Clear results when reloading</b> is checked, an automatic or manual reload will reinitialize all
+test nodes in the tree (grey display) – if it is not checked, result information for tests that do
+not seem to have changed will be retained.</p>
+
+<p>If <b>Save visual state of each project</b> is checked, NUnit saves the state of the tree
+and restores it when the project is next opened. The information saved includes which
+branches of the tree are expanded, the selected node, any checked nodes and any
+category selection.
+
+<p>If <b>Show Checkboxes</b> is checked, the tree includes checkboxes, which may
+   be used to select multiple tests for running. This setting is also available
+   in the <b>View | Tree</b> menu.</p>
+
+<h3>Test Structure</h3>
+
+<p>If <b>Automatic Namespace suites</b> is selected, tests will be
+   shown in a hierarchical listing based on namespaces. This is the
+   standard display as used in versions prior to NUnit 2.4.
+
+<p>If <b>Flat list of TestFixtures</b> is selected, tests will be
+   shown as a sequential list of fixtures.
+
+<hr style="clear: both"><h3>Gui Settings - Test Results</h3><hr>
+
+<div class="screenshot-right">
+   <img src="img/testResultSettings.jpg"></div>
+
+<h3>Errors Tab</h3>
+
+<p>Check <b>Display Errors and Failures Tab</b> to display the 
+<b>Errors and Failures</b> tab, which shows information about failing tests.
+
+<p>Check <b>Enable Failure ToolTips</b> to display the tip window over the
+Errors and Failures display and the stack trace. Clear it if you prefer not
+to see the tip window.</p>
+
+<p>Check <b>Enable Word Wrap</b> to turn on word wrapping
+in the Errors and Failures display. While you can select this item and the
+preceding one at the same time, they do not interact well, so you will 
+normally choose one or the other.</p>
+
+<h3>Not Run Tab</h3>
+
+<p>Check <b>Display Tests Not Run Tab</b> to display the 
+<b>Tests Not Run</b> tab, which shows information about tests that were
+skipped or ignored.
+
+<hr style="clear: both"><h3>Gui Settings - Text Output</h3><hr>
+
+<div class="screenshot-right">
+   <img src="img/textOutputSettings.jpg"></div>
+
+<h3>Select Tab</h3>
+
+<p>The <b>Select Tab</b> dropdown list is used to select one of the output tabs, for which
+settings are to be viewed or changed. It also contains entries that allow
+you to add a new tab or edit the list of tabs.
+
+<p>The <b>Restore Defaults</b> button is used to restore the default
+setting, which is a single tab labeled "Text Output." The default tab
+displays all types of output and includes a label for each test that 
+displays text.
+
+<p>The <b>Title</b> text box is used to modify the title displayed
+for the selected output tab.
+
+<p><b>Enabled</b> is checked by default. If you uncheck it,
+the selected tab will be removed from the tab control. This allows you to temporarily
+suppress output to a tab without actually removing its definition.
+
+<h3>Content</h3>
+
+<p>The four check boxes enable or disable a particular type of output
+on the selected output window. For each type, the display captures
+output produced while your test is running - either by the test
+itself or by the program you are testing.
+
+<h4>Standard Output</h4>
+<p>Captures all output written to Console.Out.
+
+<h4>Error Output</h4>
+<p>Captures all output written to Console.Error.
+
+<h4>Trace Output</h4>
+<p>Captures all output written to Trace or Debug.
+
+<h4>Log Output</h4>
+<p>Captures output written to a log4net log. NUnit captures
+all output at the Error level or above unless another level
+is specified for the DefaultLogThreshold setting in the  
+configuration file for the test assembly or project.
+
+<h3>Test Labels</h3>
+
+<p>Check <b>Display TestCase Labels</b> to precede text in the output window
+with the name of the test that produced it.</p>
+
+<p>Check <b>Suppress label if no output is displayed</b> to eliminate display
+of labels for tests that produce no output in the window.
+
+
+<hr style="clear: both"><h3>Test Loader Settings - Assembly Isolation</h3><hr>
+
+<div class="screenshot-right">
+   <img src="img/testLoadSettings.jpg"></div>
+
+<h3>Default Process Model</h3>
+
+<p>These settings determine NUnit's default use of operating system
+processes and may be overridden by settings in the NUnit project.
+
+<p>If <b>Run tests directly in the NUnit process</b> is selected,
+all tests are run in a test domain in the same process as NUnit.
+This is the way previous versions of NUnit ran tests and is the
+default setting.
+
+<p>If <b>Run tests in a single separate process</b> is selected,
+a separate process is used for all tests.
+
+<p>If <b>Run tests in a separate process per Assembly </b> is selected,
+a separate process is used for each test assembly.
+
+<h3>Default Domain Usage</h3>
+
+<p>If <b>Use a separate AppDomain per Assembly</b> is selected, each assembly
+   in a multiple-assembly test run will be loaded in a separate AppDomain.
+   This setting is not available when <b>Run tests in a separate process
+   per Assembly</b> is selected above.
+
+<p>If <b>Use a single AppDomain for all tests</b> is selected, all assemblies in
+   a multiple-assembly test run will use the same AppDomain. This was
+   the standard behavior of NUnit prior to version 2.4 and is the
+   default setting.
+
+<p>If <b>Merge tests across assemblies</b> is checked, the display of tests
+   will not be divided across assemblies. If automatic namespace suites are
+   used, they will be merged across all assemblies. This option is only
+   available when tests are run in the same appdomain.
+
+<hr style="clear: both"><h3>Test Loader Settings - Assembly Reload</h3><hr>
+
+<div class="screenshot-right">
+   <img src="img/assemblyReloadSettings.jpg"></div>
+
+<h3>Assembly Reload</h3>
+
+<p>If <b>Reload before each test run</b> is checked, a reload will occur whenever the run button is
+pressed whether the assemblies appear to have changed or not.</p>
+
+<p>If <b>Reload when test assembly changes</b> is checked, assemblies are watched for any change and
+an automatic reload is initiated. This item is disabled on Windows 98 or ME.</p>
+
+<p>If <b>Re-run last tests run</b> is checked, tests are re-run whenever a Reload
+   takes place.</p>
+   
+<hr style="clear: both"><h3>Test Loader Settings - Advanced</h3><hr>
+
+<div class="screenshot-right">
+   <img src="img/advancedSettings.jpg"></div>
+
+<h3>Shadow Copy</h3>
+
+<p>NUnit normally uses .Net shadow-copying in order to allow you to edit
+and recompile assemblies while it is running. Uncheck this box to disable
+shadow-copy only if you have a particular problem that requires it.</p>
+
+<p><b>Note:</b> If you are tempted to disable shadow copy in order to access
+files in the same directory as your assembly, you should be aware that there
+are alternatives. Consider using the Assembly.Codebase property rather than
+Assembly.Location.
+
+
+<hr style="clear: both"><h3>IDE Support Settings - Visual Studio</h3><hr>
+
+<div class="screenshot-right">
+   <img src="img/visualStudioSettings.jpg"></div>
+
+<h3>Visual Studio</h3>
+
+<p>If <b>Enable Visual Studio Support</b> is checked, the user will be able to open Visual Studio projects
+and solutions and add Visual Studio projects to existing test projects.</p>
+
+<hr style="clear: both"><h3>Advanced Settings - Internal Trace</h3><hr>
+
+<div class="screenshot-right">
+   <img src="img/internalTraceSettings.jpg"></div>
+
+<h3>Internal Trace</h3>
+
+<p>The <b>Trace Level</b> dropdown controls the level of internal trace output.</p>
+
+
+
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<ul>
+<li><a href="nunit-console.html">Console Runner</a></li>
+<li><a href="nunit-gui.html">Gui Runner</a></li>
+<ul>
+<li><a href="guiCommandLine.html">Command-Line</a></li>
+<li><a href="mainMenu.html">Main Menu</a></li>
+<li><a href="contextMenu.html">Context Menu</a></li>
+<li id="current"><a href="settingsDialog.html">Settings Dialog</a></li>
+<li><a href="addinsDialog.html">Addins Dialog</a></li>
+<li><a href="testProperties.html">Test Properties</a></li>
+<li><a href="configEditor.html">Configuration Editor</a></li>
+<li><a href="projectEditor.html">Project Editor</a></li>
+</ul>
+<li><a href="pnunit.html">PNUnit Runner</a></li>
+<li><a href="nunit-agent.html">NUnit Agent</a></li>
+<li><a href="runtimeSelection.html">Runtime Selection</a></li>
+<li><a href="assemblyIsolation.html">Assembly Isolation</a></li>
+<li><a href="configFiles.html">Configuration Files</a></li>
+<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/setup.html b/doc/setup.html
index 7e9ef44..a345283 100644
--- a/doc/setup.html
+++ b/doc/setup.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -26,12 +26,22 @@
 
 <script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
 
-<h3>SetUpAttribute (NUnit 2.0)</h3>
+<h3>SetUpAttribute (NUnit 2.0 / 2.5)</h3>
 
 <p>This attribute is used inside a TestFixture to provide a common set of 
 	functions that are performed just before each test method is called.  
-    A TestFixture can have only one SetUp method. If more than one is defined 
-	the TestFixture will compile successfully, but its tests will not run.</p 
+    
+<p><b>Before NUnit 2.5</b>, a TestFixture could have only one SetUp method
+	and it was required to be an instance method. 
+
+<p><b>Beginning with NUnit 2.5</b>, SetUp methods may be either static or
+   instance methods and you may define more than one of them in a fixture.
+   Normally, multiple SetUp methods are only defined at different levels
+   of an inheritance hierarchy, as explained below.
+   
+<p>If a SetUp method fails or throws an exception, the test is not executed
+   and a failure or error is reported.
+   
 
 <h4>Example:</h4>
 
@@ -58,7 +68,7 @@
     [SetUp] public void Init()
     { /* ... */ }
 
-    [TearDown] public void Dispose()
+    [TearDown] public void Cleanup()
     { /* ... */ }
 
     [Test] public void Add()
@@ -77,7 +87,7 @@ Namespace Nunit.Tests
     ' ...
     End Sub
 
-    <TearDown()> Public Sub Dispose()
+    <TearDown()> Public Sub Cleanup()
     ' ...
     End Sub
 
@@ -98,7 +108,7 @@ namespace NUnitTests
   public __gc class SuccessTests
   {
     [SetUp] void Init();
-    [TearDown] void Dispose();
+    [TearDown] void Cleanup();
 
     [Test] void Add();
   };
@@ -125,7 +135,7 @@ public class SuccessTests
   { /* ... */ }
 
   /** @attribute NUnit.Framework.TearDown() */
-  public void Dispose()
+  public void Cleanup()
   { /* ... */ }
 
   /** @attribute NUnit.Framework.Test() */
@@ -136,58 +146,93 @@ public class SuccessTests
 
 </div>
 
-<h4>SetUp Inheritance</h4>
+<h3>Inheritance</h3>
 
 <p>The SetUp attribute is inherited from any base class. Therefore, if a base 
 	class has defined a SetUp method, that method will be called 
-	before each test method in the derived class. If you wish to add more 
-	SetUp functionality in a derived class you need to mark the method 
-	with the appropriate attribute and then call the base class method.</p>
+	before each test method in the derived class.
 	
+<p>Before NUnit 2.5, you were permitted only one SetUp method. If you wanted to 
+   have some SetUp functionality in the base class and add more in the derived 
+   class you needed to call the base class method yourself.
+ 
+<p>With NUnit 2.5, you can achieve the same result by defining a SetUp method
+   in the base class and another in the derived class. NUnit will call base
+   class SetUp methods before those in the derived classes.
+   
+<p><b>Note:</b> Although it is possible to define multiple SetUp methods
+   in the same class, you should rarely do so. Unlike methods defined in
+   separate classes in the inheritance hierarchy, the order in which they
+   are executed is not guaranteed.
+
+<h4>See also...</h4>
+<ul>
+<li><a href="teardown.html">TearDownAttribute</a><li><a href="fixtureSetup.html">TestFixtureSetUpAttribute</a><li><a href="fixtureTeardown.html">TestFixtureTearDownAttribute</a></ul>
+	
+
 </div>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<ul>
-<li><a href="category.html">Category</a></li>
-<li><a href="culture.html">Culture</a></li>
-<li><a href="description.html">Description</a></li>
-<li><a href="exception.html">Expected Exception</a></li>
-<li><a href="explicit.html">Explicit</a></li>
-<li><a href="ignore.html">Ignore</a></li>
-<li><a href="platform.html">Platform</a></li>
-<li><a href="property.html">Property</a></li>
-<li><a href="setCulture.html">SetCulture</a></li>
-<li id="current"><a href="setup.html">Setup</a></li>
-<li><a href="setupFixture.html">SetUp Fixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testFixture.html">Test Fixture</a></li>
-<li><a href="fixtureSetup.html">Test Fixture SetUp</a></li>
-<li><a href="fixtureTeardown.html">Test Fixture </a></li>
-</ul>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li><a href="category.html">Category</a></li>
+<li><a href="combinatorial.html">Combinatorial</a></li>
+<li><a href="culture.html">Culture</a></li>
+<li><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li id="current"><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/setupFixture.html b/doc/setupFixture.html
index e34d04d..d16fca1 100644
--- a/doc/setupFixture.html
+++ b/doc/setupFixture.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -151,46 +151,65 @@ public class MySetUpClass
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<ul>
-<li><a href="category.html">Category</a></li>
-<li><a href="culture.html">Culture</a></li>
-<li><a href="description.html">Description</a></li>
-<li><a href="exception.html">Expected Exception</a></li>
-<li><a href="explicit.html">Explicit</a></li>
-<li><a href="ignore.html">Ignore</a></li>
-<li><a href="platform.html">Platform</a></li>
-<li><a href="property.html">Property</a></li>
-<li><a href="setCulture.html">SetCulture</a></li>
-<li><a href="setup.html">Setup</a></li>
-<li id="current"><a href="setupFixture.html">SetUp Fixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testFixture.html">Test Fixture</a></li>
-<li><a href="fixtureSetup.html">Test Fixture SetUp</a></li>
-<li><a href="fixtureTeardown.html">Test Fixture </a></li>
-</ul>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li><a href="category.html">Category</a></li>
+<li><a href="combinatorial.html">Combinatorial</a></li>
+<li><a href="culture.html">Culture</a></li>
+<li><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li id="current"><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/stringAssert.html b/doc/stringAssert.html
index b113092..a04b0b3 100644
--- a/doc/stringAssert.html
+++ b/doc/stringAssert.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -53,10 +53,10 @@ StringAssert.AreEqualIgnoringCase( string expected, string actual,
 StringAssert.AreEqualIgnoringCase( string expected, string actual,
                 string message params object[] args );
 				
-StringAssert.IsMatch( string expected, string actual );
-StringAssert.IsMatch( string expected, string actual, 
+StringAssert.IsMatch( string regexPattern, string actual );
+StringAssert.IsMatch( string regexPattern, string actual, 
                 string message );
-StringAssert.IsMatch( string expected, string actual,
+StringAssert.IsMatch( string regexPattern, string actual,
                 string message, params object[] args );</pre>
 </div>
 
@@ -64,42 +64,40 @@ StringAssert.IsMatch( string expected, string actual,
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<ul>
-<li><a href="classicModel.html">Classic Model</a></li>
-<ul>
-<li><a href="equalityAsserts.html">Equality Asserts</a></li>
-<li><a href="identityAsserts.html">Identity Asserts</a></li>
-<li><a href="conditionAsserts.html">Condition Tests</a></li>
-<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
-<li><a href="typeAsserts.html">Type Asserts</a></li>
-<li><a href="utilityAsserts.html">Utility Methods</a></li>
-<li id="current"><a href="stringAssert.html">String Assert</a></li>
-<li><a href="collectionAssert.html">Collection Assert</a></li>
-<li><a href="fileAssert.html">File Assert</a></li>
-</ul>
-<li><a href="constraintModel.html">Constraint Model</a></li>
-</ul>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<ul>
+<li><a href="equalityAsserts.html">Equality Asserts</a></li>
+<li><a href="identityAsserts.html">Identity Asserts</a></li>
+<li><a href="conditionAsserts.html">Condition Asserts</a></li>
+<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
+<li><a href="typeAsserts.html">Type Asserts</a></li>
+<li><a href="exceptionAsserts.html">Exception Asserts</a></li>
+<li><a href="utilityAsserts.html">Utility Methods</a></li>
+<li id="current"><a href="stringAssert.html">String Assert</a></li>
+<li><a href="collectionAssert.html">Collection Assert</a></li>
+<li><a href="fileAssert.html">File Assert</a></li>
+<li><a href="directoryAssert.html">Directory Assert</a></li>
+</ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/stringConstraints.html b/doc/stringConstraints.html
index 36ec1d6..02107dc 100644
--- a/doc/stringConstraints.html
+++ b/doc/stringConstraints.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -27,83 +27,215 @@
 <h2>String Constraints (NUnit 2.4)</h2>
 
 <p>String constraints perform tests that are specific to strings.
-   The following string constraints are provided.
+   Attempting to test a non-string value with a string constraint
+   is an error and gives an exception.
    
-<table class="constraints">
-<tr><th>Syntax Helpers</th><th>Constructor</th><th>Operation</th></tr>
-<tr><td>Text.Contains( string )<br>Text.DoesNotContain( string )</td><td>SubstringConstraint( string )</td></td><td>tests for a substring</td></tr>
-<tr><td>Text.StartsWith( string )<br>Text.DoesNotStartWith( string )</td><td>StartsWithConstraint( string )</td></td><td>tests for an initial string</td></tr>
-<tr><td>Text.EndsWith( string )<br>Text.DoesNotEndWith( string )</td><td>EndsWithConstraint( string )</td></td><td>tests for an ending string</td></tr>
-<tr><td>Text.Matches( string )<br>Text.DoesNotMatch( string )</td><td>RegexConstraint( string )</td></td><td>tests that a pattern is matched</td></tr>
-</table>
+<p>The <b>Text</b> prefix is deprecated beginning with NUnit 2.5.1
+   and will be removed in NUnit 3.0.
+ 
+<h3>SubstringConstraint</h3>  
 
-<h4>Examples</h4>
+<h4>Action</h4>
+<p>Tests for a substring.
 
-<div class="code" style="width: 36em"><pre>
+<h4>Constructor</h4>
+<div class="code"><pre>
+SubstringConstraint(string expected)
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.StringContaining(string expected)
+Contains.Substring(string expected)
+ContainsSubstring(string expected)
+Contains(string expected)
+[Obsolete] Text.Contains(string expected)
+[Obsolete] Text.DoesNotContain(string expected)
+</pre></div>
+
+<h4>Modifiers</h4>
+<div class="code"><pre>
+...IgnoreCase
+</pre></div>
+
+<h4>Examples of Use</h4>
+<div class="code"><pre>
 string phrase = "Make your tests fail before passing!"
 
-Assert.That( phrase, Text.Contains( "tests fail" ) );
-Assert.That( phrase, Text.Contains( "make" ).IgnoreCase );
+Assert.That( phrase, Is.StringContaining( "tests fail" ) );
+Assert.That( phrase, Contains.Substring( "tests fail" ) );
+Assert.That( phrase, Is.Not.StringContaining( "tests pass" ) );
+Assert.That( phrase, Is.StringContaining( "make" ).IgnoreCase );
+Expect (phrase, Contains.Substring( "make" ).IgnoreCase );
+</pre></div>
+
+<h4>Notes</h4>
+<ol>
+<li><b>ContainsSubstring</b> and <b>Contains</b> may appear only in the 
+    body of a constraint expression or when the inherited syntax is used.
+<li><b>Contains</b> is not actually a string constraint but is converted
+    to one when a string is being tested.
+</ol>
+
+<h3>StartsWithConstraint</h3>
+
+<h4>Action</h4>
+<p>Tests for an initial string.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+StartsWithConstraint(string expected)
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.StringStarting(string expected)
+StartsWith(string expected)
+[Obsolete] Text.StartsWith(string expected)
+[Obsolete] Text.DoesNotStartWith(string expected)
+</pre></div>
+
+<h4>Modifiers</h4>
+<div class="code"><pre>
+...IgnoreCase
+</pre></div>
+
+<h4>Examples of Use</h4>
+<div class="code"><pre>
+string phrase = "Make your tests fail before passing!"
+
+Assert.That( phrase, Is.StringStarting( "Make" ) );
+Assert.That( phrase, Is.Not.StringStarting( "Break" ) );
+Assert.That( phrase, Has.Length.GreaterThan(10)
+                .And.Not.StartsWith( "Break" ) );
+Expect( phrase, StartsWith( "Make" ) );
+</pre></div>
+
+<h4>Notes</h4>
+<ol>
+<li><b>StartsWith</b> may appear only in the body of a constraint 
+    expression or when the inherited syntax is used.
+</ol>
 
-Assert.That( phrase, Text.StartsWith( "Make" ) );
-Assert.That( phrase, Text.Not.StartsWith( "Break" ) );
-Assert.That( phrase, Text.DoesNotStartWith( "Break" ) );
+<h3>EndsWithConstraint</h3>
 
-Assert.That( phrase, Text.EndsWith( "!" ) );
-Assert.That( phrase, Text.EndsWith( "PASSING!" ).IgnoreCase );
+<h4>Action</h4>
+<p>Tests for an ending string.
 
-Assert.That( phrase, Text.Matches( "Make.*tests.*pass" ) );
-Assert.That( phrase, Text.Not.Matches( "your.*passing.*tests" ) );
-Assert.That( phrase, Text.DoesNotMatch( "your.*passing.*tests" ) );
+<h4>Constructor</h4>
+<div class="code"><pre>
+EndsWithConstraint(string expected)
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.StringEnding(string expected)
+EndsWith(string expected)
+[Obsolete] Text.EndsWith(string expected)
+[Obsolete] Text.DoesNotEndWith(string expected)
+</pre></div>
 
-// Using Inheritance
-Expect( phrase, Contains( "make" ).IgnoreCase );
+<h4>Modifiers</h4>
+<div class="code"><pre>
+...IgnoreCase
+</pre></div>
+
+<h4>Examples of Use</h4>
+<div class="code"><pre>
+string phrase = "Make your tests fail before passing!"
+
+Assert.That( phrase, Is.StringEnding( "!" ) );
+Assert.That( phrase, Is.StringEnding( "PASSING!" ).IgnoreCase );
 Expect( phrase, EndsWith( "!" ) );
+</pre></div>
+
+<h4>Notes</h4>
+<ol>
+<li><b>EndsWith</b> may appear only in the body of a constraint 
+    expression or when the inherited syntax is used.
+</ol>
+
+<h3>RegexConstraint</h3>
+
+<h4>Action</h4>
+<p>Tests that a pattern is matched.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+RegexConstraint(string pattern)
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.StringMatching(string pattern)
+Matches(string pattern)
+[Obsolete] Text.Matches(string pattern)
+[Obsolete] Text.DoesNotMatch(string pattern)
+</pre></div>
+
+<h4>Modifiers</h4>
+<div class="code"><pre>
+...IgnoreCase
+</pre></div>
+
+<h4>Examples of Use</h4>
+<div class="code"><pre>
+string phrase = "Make your tests fail before passing!"
+
+Assert.That( phrase, Is.StringMatching( "Make.*tests.*pass" ) );
+Assert.That( phrase, Is.Not.StringMatching( "your.*passing.*tests" ) );
+Assert.That( phrase, Has.Length.GreaterThan(10)
+                .And.Not.Matches( "your.*passing.*tests" ) );
 Expect( phrase, Matches( "Make.*pass" ) );
 </pre></div>
 
+<h4>Notes</h4>
+<ol>
+<li><b>Matches</b> may appear only in the body of a constraint 
+    expression or when the inherited syntax is used.
+</ol>
+
 </div>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<ul>
-<li><a href="classicModel.html">Classic Model</a></li>
-<li><a href="constraintModel.html">Constraint Model</a></li>
-<ul>
-<li><a href="equalConstraint.html">Equal Constraint</a></li>
-<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
-<li><a href="conditionConstraints.html">Condition Constraints</a></li>
-<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
-<li><a href="typeConstraints.html">Type Constraints</a></li>
-<li id="current"><a href="stringConstraints.html">String Constraints</a></li>
-<li><a href="collectionConstraints.html">Collection Constraints</a></li>
-<li><a href="propertyConstraint.html">Property Constraint</a></li>
-<li><a href="compoundConstraints.html">Compound Constraints</a></li>
-<li><a href="customConstraints.html">Custom Constraints</a></li>
-<li><a href="listMapper.html">List Mapper</a></li>
-</ul>
-</ul>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<ul>
+<li><a href="equalConstraint.html">Equal Constraint</a></li>
+<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
+<li><a href="conditionConstraints.html">Condition Constraints</a></li>
+<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
+<li><a href="pathConstraints.html">Path Constraints</a></li>
+<li><a href="typeConstraints.html">Type Constraints</a></li>
+<li id="current"><a href="stringConstraints.html">String Constraints</a></li>
+<li><a href="collectionConstraints.html">Collection Constraints</a></li>
+<li><a href="propertyConstraint.html">Property Constraint</a></li>
+<li><a href="throwsConstraint.html">Throws Constraint</a></li>
+<li><a href="compoundConstraints.html">Compound Constraints</a></li>
+<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
+<li><a href="listMapper.html">List Mapper</a></li>
+<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
+</ul>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/suite.html b/doc/suite.html
index ca36dd0..76c811d 100644
--- a/doc/suite.html
+++ b/doc/suite.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -164,8 +164,6 @@ NUnit support for user-defined Suites currently has two limitations:
 	the Suite mechanism was to provide a way of aggregating tests at the
 	top level of each run. Hence, they are only supported when used with 
 	the /fixture option on the console or gui command line.
-	top level of an application. Thus, they may only
-	outcome of the historical purpose of 
 </ol>
 
 Approaches to removing these limitations are being investigated as part
@@ -175,46 +173,65 @@ of the planning for future NUnit releases.
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<ul>
-<li><a href="category.html">Category</a></li>
-<li><a href="culture.html">Culture</a></li>
-<li><a href="description.html">Description</a></li>
-<li><a href="exception.html">Expected Exception</a></li>
-<li><a href="explicit.html">Explicit</a></li>
-<li><a href="ignore.html">Ignore</a></li>
-<li><a href="platform.html">Platform</a></li>
-<li><a href="property.html">Property</a></li>
-<li><a href="setCulture.html">SetCulture</a></li>
-<li><a href="setup.html">Setup</a></li>
-<li><a href="setupFixture.html">SetUp Fixture</a></li>
-<li id="current"><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testFixture.html">Test Fixture</a></li>
-<li><a href="fixtureSetup.html">Test Fixture SetUp</a></li>
-<li><a href="fixtureTeardown.html">Test Fixture </a></li>
-</ul>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li><a href="category.html">Category</a></li>
+<li><a href="combinatorial.html">Combinatorial</a></li>
+<li><a href="culture.html">Culture</a></li>
+<li><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li id="current"><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/suiteBuilders.html b/doc/suiteBuilders.html
new file mode 100644
index 0000000..c256064
--- /dev/null
+++ b/doc/suiteBuilders.html
@@ -0,0 +1,101 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - SuiteBuilders</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>SuiteBuilders (NUnit 2.4)</h3>
+
+<h4>Purpose</h4>
+<p>A SuiteBuilder is an addin used to build a test fixture from a type. NUnit itself
+uses a SuiteBuilder to recognize and build TestFixtures. 
+
+<h4>Extension Point</h4>
+<p>An addin may use the host to access this extension point by name:
+
+<pre>
+	IExtensionPoint suiteBuilders = host.GetExtensionPoint( "SuiteBuilders" );</pre>
+
+<h4>Interface</h4>
+<p>The extension object passed to Install must implement the ISuiteBuilder interface:
+
+<pre>
+	public interface ISuiteBuilder
+	{
+		bool CanBuildFrom( Type type );
+		Test BuildFrom( Type type );
+	}
+</pre>
+
+<p>CanBuildFrom should return true if the specified Type is one from which
+the builder is able to create a fixture. This usually involve examining
+the Type and its attriutes.
+
+<p>The BuildFrom method should return a test fixture completely populated
+with its contained test cases. Return null if it is not possible to 
+build a fixture using the provided Type.
+
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<ul>
+<li><a href="customConstraints.html">Custom Constraints</a></li>
+<li><a href="nunitAddins.html">NUnit Addins</a></li>
+<ul>
+<li id="current"><a href="suiteBuilders.html">SuiteBuilders</a></li>
+<li><a href="testcaseBuilders.html">TestcaseBuilders</a></li>
+<li><a href="testDecorators.html">TestDecorators</a></li>
+<li><a href="testcaseProviders.html">TestcaseProviders</a></li>
+<li><a href="datapointProviders.html">DatapointProviders</a></li>
+<li><a href="eventListeners.html">EventListeners</a></li>
+</ul>
+<li><a href="extensionTips.html">Tips for Extenders</a></li>
+</ul>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/teardown.html b/doc/teardown.html
index 53de7ea..0af7daa 100644
--- a/doc/teardown.html
+++ b/doc/teardown.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -26,13 +26,19 @@
 
 <script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
 
-<h3>TearDownAttribute (NUnit 2.0)</h3>
+<h3>TearDownAttribute (NUnit 2.0 / 2.5)</h3>
 
 <p>This attribute is used inside a TestFixture to provide a common set of 
 	functions that are performed after each test method is run.  
-    A TestFixture can have only one TearDown method. If more than one is defined 
-	the TestFixture will compile successfully, but its tests will not run.</p>
+    
+<p><b>Before NUnit 2.5</b>, a TestFixture could have only one TearDown method
+	and it was required to be an instance method. 
 	
+<p><b>Beginning with NUnit 2.5</b>, TearDown methods may be either static or
+   instance methods and you may define more than one of them in a fixture.
+   Normally, multiple TearDown methods are only defined at different levels
+   of an inheritance hierarchy, as explained below.
+
 <p>So long as any SetUp method runs without error, the TearDown method is 
    guaranteed to run. It will not run if a SetUp method fails or throws an 
    exception.</p>
@@ -62,7 +68,7 @@
     [SetUp] public void Init()
     { /* ... */ }
 
-    [TearDown] public void Dispose()
+    [TearDown] public void Cleanup()
     { /* ... */ }
 
     [Test] public void Add()
@@ -81,7 +87,7 @@ Namespace Nunit.Tests
     ' ...
     End Sub
 
-    <TearDown()> Public Sub Dispose()
+    <TearDown()> Public Sub Cleanup()
     ' ...
     End Sub
 
@@ -102,7 +108,7 @@ namespace NUnitTests
   public __gc class SuccessTests
   {
     [SetUp] void Init();
-    [TearDown] void Dispose();
+    [TearDown] void Cleanup();
 
     [Test] void Add();
   };
@@ -129,7 +135,7 @@ public class SuccessTests
   { /* ... */ }
 
   /** @attribute NUnit.Framework.TearDown() */
-  public void Dispose()
+  public void Cleanup()
   { /* ... */ }
 
   /** @attribute NUnit.Framework.Test() */
@@ -140,58 +146,93 @@ public class SuccessTests
 
 </div>
 
-<h4>Inheritance</h4>
+<h3>Inheritance</h3>
 
 <p>The TearDown attribute is inherited from any base class. Therefore, if a base 
 	class has defined a TearDown method, that method will be called 
-	after each test method in the derived class. If you wish to add more 
-	TearDown functionality in a derived class you need to mark the method 
-	with the appropriate attribute and then call the base class method.</p>
+	after each test method in the derived class. 
+	
+<p>Before NUnit 2.5, you were permitted only one TearDown method. If you wanted to 
+   have some TearDown functionality in the base class and add more in the derived 
+   class you needed to call the base class method yourself.
+	
+<p>With NUnit 2.5, you can achieve the same result by defining a TearDown method
+   in the base class and another in the derived class. NUnit will call base
+   class TearDown methods after those in the derived classes.
+   
+<p><b>Note:</b> Although it is possible to define multiple TearDown methods
+   in the same class, you should rarely do so. Unlike methods defined in
+   separate classes in the inheritance hierarchy, the order in which they
+   are executed is not guaranteed.
+
+<h4>See also...</h4>
+<ul>
+<li><a href="setup.html">SetUpAttribute</a><li><a href="fixtureSetup.html">TestFixtureSetUpAttribute</a><li><a href="fixtureTeardown.html">TestFixtureTearDownAttribute</a></ul>
+
 
 </div>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<ul>
-<li><a href="category.html">Category</a></li>
-<li><a href="culture.html">Culture</a></li>
-<li><a href="description.html">Description</a></li>
-<li><a href="exception.html">Expected Exception</a></li>
-<li><a href="explicit.html">Explicit</a></li>
-<li><a href="ignore.html">Ignore</a></li>
-<li><a href="platform.html">Platform</a></li>
-<li><a href="property.html">Property</a></li>
-<li><a href="setCulture.html">SetCulture</a></li>
-<li><a href="setup.html">Setup</a></li>
-<li><a href="setupFixture.html">SetUp Fixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li id="current"><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testFixture.html">Test Fixture</a></li>
-<li><a href="fixtureSetup.html">Test Fixture SetUp</a></li>
-<li><a href="fixtureTeardown.html">Test Fixture </a></li>
-</ul>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li><a href="category.html">Category</a></li>
+<li><a href="combinatorial.html">Combinatorial</a></li>
+<li><a href="culture.html">Culture</a></li>
+<li><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li id="current"><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/test.html b/doc/test.html
index 6285e9a..904c287 100644
--- a/doc/test.html
+++ b/doc/test.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -26,20 +26,38 @@
 
 <script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
 
-<h3>TestAttribute (NUnit 2.0)</h3>
+<h3>TestAttribute (NUnit 2.0 / 2.5)</h3>
 
-<p>The Test attribute marks a specific method inside a class that has already been 
-	marked as a TestFixture, as a test method. For backwards compatibility with 
-	previous versions of Nunit a test method will also be found if the first 4 
-	letters are "test" regardless of case.</p>
+<p>The Test attribute is one way of marking a method inside a TestFixture class
+    as a test. For backwards compatibility with previous versions of Nunit a 
+	test method may also be found if the first 4 letters are "test" 
+	regardless of case. This option is available by setting a value in
+	the config file for the test.</p>
 	
-<p>The signature for a test method is defined as follows:
+<p>Prior to NUnit 2.5, the signature for a test method was:
 	<pre>        public void MethodName()</pre></p>
 	
-<p>Note that there must be no parameters. If the programmer marks a test method 
-	that does not have the correct signature it will not be run and it will appear 
-	in the Test Not Run area in the UI that ran the program.</p>
+<p>Beginning with NUnit 2.5, static methods may be used as tests:
+	<pre>        public static void MethodName()</pre></p>
+	
+<p>In addition, with 2.5, test methods may have arguments and return
+   values, provided that NUnit is told what values to use for the
+   arguments and how to handle the return value. For more information
+   on these capabilities, see 
+   <a href="parameterizedTests.html">Parameterized Tests</a>   as well as some of the related attributes
+   listed at the end of this page.
+   
+<p>Parameterized test methods may also be generic, provided that 
+   NUnit is able to deduce the proper argument types from the
+   types of the data arguments supplied.
+	
+<p>If the programmer marks a test method that does not have the correct signature 
+   it will be considered as not runnable and be indicated as such by the console
+   or gui runner. In the Gui, such tests are marked in red.</p> 
 
+<p>In the examples on this page, NUnit would have no way of knowing what values 
+   to supply as arguments, so methods without parameters are used.
+   
 <h4>Example:</h4>
 
 <div class="code">
@@ -120,50 +138,77 @@ public class SuccessTests
 </pre>
 </div>
 
+<h4>See also...</h4>
+
+<ul>
+<li><a href="parameterizedTests.html">Parameterized Tests</a><li><a href="testCase.html">TestCaseAttribute</a></ul>
+
 </div>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<ul>
-<li><a href="category.html">Category</a></li>
-<li><a href="culture.html">Culture</a></li>
-<li><a href="description.html">Description</a></li>
-<li><a href="exception.html">Expected Exception</a></li>
-<li><a href="explicit.html">Explicit</a></li>
-<li><a href="ignore.html">Ignore</a></li>
-<li><a href="platform.html">Platform</a></li>
-<li><a href="property.html">Property</a></li>
-<li><a href="setCulture.html">SetCulture</a></li>
-<li><a href="setup.html">Setup</a></li>
-<li><a href="setupFixture.html">SetUp Fixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li id="current"><a href="test.html">Test</a></li>
-<li><a href="testFixture.html">Test Fixture</a></li>
-<li><a href="fixtureSetup.html">Test Fixture SetUp</a></li>
-<li><a href="fixtureTeardown.html">Test Fixture </a></li>
-</ul>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li><a href="category.html">Category</a></li>
+<li><a href="combinatorial.html">Combinatorial</a></li>
+<li><a href="culture.html">Culture</a></li>
+<li><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li id="current"><a href="test.html">Test</a></li>
+<ul>
+<li><a href="parameterizedTests.html">Parameterized Tests</a></li>
+</ul>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/testCase.html b/doc/testCase.html
new file mode 100644
index 0000000..da711c9
--- /dev/null
+++ b/doc/testCase.html
@@ -0,0 +1,181 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - TestCase</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
+
+<h3>TestCaseAttribute (NUnit 2.5)</h3>
+
+<p><b>TestCaseAttribute</b> serves the dual purpose of marking a method with
+   parameters as a test method and providing inline data to be used when
+   invoking that method. Here is an example of a test being run three
+   times, with three different sets of data:
+   
+<div class="code">
+<pre>[TestCase(12,3,4)]
+[TestCase(12,2,6)]
+[TestCase(12,4,3)]
+public void DivideTest(int n, int d, int q)
+{
+  Assert.AreEqual( q, n / d );
+}
+</pre>
+</div>
+
+<p><b>Note:</b> Because arguments to .NET attributes are limited in terms of the 
+Types that may be used, NUnit will make some attempt to convert the supplied
+values using <b>Convert.ChangeType()</b> before supplying it to the test.
+
+<p><b>TestCaseAttribute</b> may appear one or more times on a test method,
+which may also carry other attributes providing test data, such as the
+<a href="factories.html">FactoriesAttribute</a>.
+The method may optionally be marked with the 
+<a href="test.html">TestAttribute</a> as well.
+
+<p>By using the named parameter <b>Result</b> this test set may be simplified
+further:
+
+<div class="code">
+<pre>[TestCase(12,3, Result=4)]
+[TestCase(12,2, Result=6)]
+[TestCase(12,4, Result=3)]
+public int DivideTest(int n, int d)
+{
+  return( n / d );
+}
+</pre>
+</div>
+
+<p>In the above example, NUnit checks that the return
+value of the method is equal to the expected result provided on the attribut
+
+<p><b>TestCaseAttribute</b> supports a number of additional 
+named parameters, which may be used as follows:
+
+<dl>
+<dt><b>Description</b>
+<dd>Sets the description property of the test
+<dt><b>ExpectedException</b>
+<dd>Specifies a the Type of an exception that should be thrown by this invocation
+<dt><b>ExpectedExceptionName</b>
+<dd>Specifies a the FullName of an exception that should be thrown by this invocation
+<dt><b>ExpectedMessage</b>
+<dd>Specifies the message text of the expected exception
+<dt><b>MatchType</b>
+<dd>A <b>MessageMatch</b> enum value indicating how to test the expected message 
+(See <a href="exception.html">ExpectedExceptionAttribute</a>)
+<dt><b>Result</b>
+<dd>The expected result to be returned from the method, which must have
+a compatible return type.
+<dt><b>TestName</b>
+<dd>Provides a name for the test. If not specified, a name is generated based on 
+the method name and the arguments provided.
+<dt><b>Ignore</b>
+<dd>Set to true in order to ignore the individual test case.
+<dt><b>IgnoreReason</b>
+<dd>Specifies the reason for ignoring this test case. If set to a non-empty
+    string, then Ignore is assumed to be true.
+</dl>
+
+<h3>Order of Execution</h3>
+
+<p>In NUnit 2.5, individual test cases are sorted alphabetically and executed in
+   that order. With NUnit 2.5.1, the individual cases are not sorted, but are
+   executed in the order in which NUnit discovers them. This order does <b>not</b>
+   follow the lexical order of the attributes and will often vary between different
+   compilers or different versions of the CLR.
+   
+<p>As a result, when <b>TestCaseAttribute</b> appears multiple times on a method
+   or when other data-providing attributes are used in combination with 
+   <b>TestCaseAttribute</b>, the order of the test cases is undefined.
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li><a href="category.html">Category</a></li>
+<li><a href="combinatorial.html">Combinatorial</a></li>
+<li><a href="culture.html">Culture</a></li>
+<li><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li id="current"><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/testCaseSource.html b/doc/testCaseSource.html
new file mode 100644
index 0000000..0279617
--- /dev/null
+++ b/doc/testCaseSource.html
@@ -0,0 +1,326 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - TestCaseSource</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
+
+<h3>TestCaseSourceAttribute (NUnit 2.5)</h3>
+
+<p><b>TestCaseSourceAttribute</b> is used on a parameterized test method to
+identify the property, method or field that will provide the required 
+arguments. The attribute has two public constructors.
+
+<div class="code">
+<pre>
+TestCaseSourceAttribute(Type sourceType, string sourceName);
+TestCaseSourceAttribute(string sourceName);
+</pre>
+</div>
+
+<p>If <b>sourceType</b> is specified, it represents the class that provides
+the test cases. It must have a default constructor.
+
+<p>If <b>sourceType</b> is not specified, the class containing the test
+method is used. NUnit will construct it using either the default constructor
+or - if arguments are provided - the appropriate constructor for those 
+arguments.
+
+<p>The <b>sourceName</b> argument represents the name of the source used
+to provide test cases. It has the following characteristics:
+<ul>
+<li>It may be a field, property or method.
+<li>It may be either an instance or a static member.
+<li>It must return an IEnumerable or a type that implements IEnumerable.
+<li>The individual items returned by the enumerator must be compatible
+    with the signature of the method on which the attribute appears.
+	The rules for this are described in the next section.
+</ul>
+
+<h3>Constructing Test Cases</h3>
+
+<p>In constructing tests, NUnit uses each item returned by
+the enumerator as follows:
+<ol>
+
+<li><p>If it is an object implementing <b>NUnit.Framework.ITestCaseData</b>, 
+its properties are used to provide the test case. In NUnit 2.5, this is
+done using reflection to allow compatibility with earlier versions that
+did not implement <b>ITestCaseData</b>.
+
+<p>The following public fields or properties are used:
+  <p><dl>
+  <dt><b>Arguments</b>
+  <dd>An <b>object[]</b> representing the arguments to the method
+  <dt><b>Categories</b>
+  <dd>An IList of categories to be applied to the test case.
+  <dt><b>Description</b>
+  <dd>Sets the description property of the test
+  <dt><b>ExpectedException</b>
+  <dd>Specifies a the Type of an exception that should be thrown by this invocation
+  <dt><b>ExpectedExceptionName</b>
+  <dd>Specifies a the FullName of an exception that should be thrown by this invocation
+  <dt><b>Properties</b>
+  <dd>An IDictionary of properties to be applied to the test case.
+      Note that the values provided must be compatible with PropertiesAttribute.
+	  In particular, use of custom types or enums will cause problems.
+  <dt><b>Result</b>
+  <dd>The expected result to be returned from the method, which must have
+      a compatible return type.
+  <dt><b>TestName</b>
+  <dd>Provides a name for the test. If not specified, a name is generated based on 
+      the method name and the arguments provided
+  <dt><b>Ignored</b>
+  <dd>If true, the test case is ignored.
+  <dt><b>IgnoreReason</b>
+  <dd>Specifies the reason for ignoring this test case. If set to a non-empty
+      string, then the test is ignored.
+  </dl>
+
+<p>
+<li><p>If the test has a single argument and the returned value matches the type of
+that argument it is used directly.
+
+<li><p>If it is an <b>object[]</b>, its members are used to provide
+the arguments for the method, as in this example, which returns
+arguments from a named static field.
+
+<div class="code">
+<pre>[Test, TestCaseSource("DivideCases")]
+public void DivideTest(int n, int d, int q)
+{
+    Assert.AreEqual( q, n / d );
+}
+
+static object[] DivideCases =
+{
+    new object[] { 12, 3, 4 },
+    new object[] { 12, 2, 6 },
+    new object[] { 12, 4, 3 } 
+};
+</pre></div>
+
+<li><p>If it is an array of some other type, NUnit can use it provided
+that the arguments to the method are all of that type. For example,
+the above code could be modified to make the three nested arrays 
+of type int[].
+
+<li><p>If anything else is returned, it is used directly as the sole 
+argument to the method. This allows NUnit to give an error message
+in cases where the method requires a different number arguments or
+an argument of a different type.
+This can also eliminate a bit of extra typing by the programmer, 
+as in this example:
+
+<div class="code"><pre>
+static int[] EvenNumbers = new int[] { 2, 4, 6, 8 };
+
+[Test, TestCaseSource("EvenNumbers")]
+public void TestMethod(int num)
+{
+    Assert.IsTrue( num % 2 == 0 );
+}
+</pre></div>
+
+</ol>
+
+<h3>TestCaseData Class</h3>
+
+<p>Although any object implementing <b>ITestCaseData</b> may be used to
+   provide extended test case information, NUnit provides the <b>TestCaseData</b> 
+   class for this purpose. The following    example returns <b>TestCaseData</b> 
+   instances from a data source in a separately defined class.
+
+<div class="code">
+<pre>[TestFixture]
+public class MyTests
+{
+  [Test,TestCaseSource(typeof(MyFactoryClass),"TestCases")]
+  public int DivideTest(int n, int d)
+  {
+    return n/d;
+  }
+	
+  ...
+}
+
+public class MyFactoryClass
+{
+  public static IEnumerable TestCases
+  {
+    get
+    {
+      yield return new TestCaseData( 12, 3 ).Returns( 4 );
+      yield return new TestCaseData( 12, 2 ).Returns( 6 );
+      yield return new TestCaseData( 12, 4 ).Returns( 3 );
+      yield return new TestCaseData( 0, 0 )
+        .Throws(typeof(DivideByZeroException))
+        .SetName("DivideByZero")
+        .SetDescription("An exception is expected");
+    }
+  }  
+}
+</div>
+
+<p>This example uses the fluent interface supported by <b>TestCaseData</b>
+to make the program more readable. The last yield statement above  is equivalent to
+
+<div class="code"><pre>
+      TestCaseData data = new TestCaseData(0,0);
+      data.ExpectedException = typeof(DivideByZeroException;
+      data.TestName = "DivideByZero";
+      data.Description = "An exception is expected";
+      yield return data;
+</pre>
+</div> 
+
+<p><b>TestCaseData</b> supports the following properties
+and methods, which may be appended to an instance in any order.
+
+<p>
+<dl>
+  <dt><b>.Returns</b>
+  <dd>The expected result to be returned from the method, which must have
+      a compatible return type.
+  <dt><b>.SetCategory(string)</b>
+  <dd>Applies a category to the test
+  <dt><b>.SetProperty(string, string)</b>
+  <dt><b>.SetProperty(string, int)</b>
+  <dt><b>.SetProperty(string, double)</b>
+  <dd>Applies a named property and value to the test
+  <dt><b>.SetDescription(string)</b>
+  <dd>Sets the description property of the test
+  <dt><b>.SetName(string)</b>
+  <dd>Provides a name for the test. If not specified, a name is generated based on 
+      the method name and the arguments provided
+  <dt><b>.Throws(Type)</b>
+  <dt><b>.Throws(string)</b>
+  <dd>Specifies a the Type or FullName of an exception that should be thrown by this invocation
+  <dt><b>.Ignore()</b>
+  <dd>Causes the test case to be ignored.
+  <dt><b>.Ignore(string)</b>
+  <dd>Causes the test case to be ignored with a reason specified.
+</dl>
+
+<h3>Order of Execution</h3>
+
+<p>In NUnit 2.5, individual test cases are sorted alphabetically and executed in
+   that order. With NUnit 2.5.1, the individual cases are not sorted, but are
+   executed in the order in which NUnit discovers them. This order does <b>not</b>
+   follow the lexical order of the attributes and will often vary between different
+   compilers or different versions of the CLR.
+   
+<p>As a result, when <b>TestCaseSourceAttribute</b> appears multiple times on a 
+   method or when other data-providing attributes are used in combination with 
+   <b>TestCaseSourceAttribute</b>, the order of the test cases is undefined.
+
+<p>However, when a single <b>TestCaseSourceAttribute</b> is used by itself, 
+   the order of the tests follows exactly the order in which the test cases 
+   are returned from the source.
+   
+<h3>Note on Object Construction</h3>
+
+<p>NUnit locates the test cases at the time the tests are loaded, creates
+instances of each class with non-static sources and builds a list of 
+tests to be executed. Each source object is only created once at this
+time and is destroyed after all tests are loaded. 
+
+<p>If the data source is in the test fixture itself, the object is created
+using the appropriate constructor for the fixture parameters provided on
+the <b>TestFixtureAttribute</b> or
+the default constructor if no parameters were specified. Since this object
+is destroyed before the tests are run, no communication is possible between
+these two phases - or between different runs - except through the parameters
+themselves.
+
+   
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li><a href="category.html">Category</a></li>
+<li><a href="combinatorial.html">Combinatorial</a></li>
+<li><a href="culture.html">Culture</a></li>
+<li><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li id="current"><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/testDecorators.html b/doc/testDecorators.html
new file mode 100644
index 0000000..d23349c
--- /dev/null
+++ b/doc/testDecorators.html
@@ -0,0 +1,112 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - TestDecorators</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>TestDecorators (NUnit 2.4)</h3>
+
+<h4>Purpose</h4>
+<p>TestDecorators are able to modify a test after it has been constructed.
+
+<h4>Extension Point</h4>
+<p>Addins use the host to access this extension point by name:
+
+<pre>
+	IExtensionPoint testDecorators = host.GetExtensionPoint( "TestDecorators" );</pre>
+
+<h4>Interface</h4>
+<p>The extension object passed to Install must implement the ITestDecorator interface:
+
+<pre>
+	public interface ITestDecorator
+	{
+		Test Decorate( Test test, MemberInfo member );
+	}
+</pre>
+
+<p>The Decorate method may do several things, depending on what it needs
+to accomplish:
+<ol>
+  <li>Return test unmodified
+  <li>Modify properties of the test object and return it
+  <li>Replace test with another object, either discarding the
+  original or aggregating it in the new test.
+</ol>
+
+<p>Depending on what the decorator does, it may need to run
+ahead of other decorators or after them. Decorators should
+be installed using the Install method overload that takes
+a priority. The priorities range from 1 to 9 and decorators
+with lower priority values are installed first. The following
+standard values are defined for use if desired:
+<ul>
+<li>DecoratorPriority.Default = 0
+<li>DecoratorPriority.First = 1
+<li>DecoratorPriority.Normal = 5
+<li>DecoratorPriority.Last = 9
+</ul>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<ul>
+<li><a href="customConstraints.html">Custom Constraints</a></li>
+<li><a href="nunitAddins.html">NUnit Addins</a></li>
+<ul>
+<li><a href="suiteBuilders.html">SuiteBuilders</a></li>
+<li><a href="testcaseBuilders.html">TestcaseBuilders</a></li>
+<li id="current"><a href="testDecorators.html">TestDecorators</a></li>
+<li><a href="testcaseProviders.html">TestcaseProviders</a></li>
+<li><a href="datapointProviders.html">DatapointProviders</a></li>
+<li><a href="eventListeners.html">EventListeners</a></li>
+</ul>
+<li><a href="extensionTips.html">Tips for Extenders</a></li>
+</ul>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/testFixture.html b/doc/testFixture.html
index 2b32ff6..7ffefbb 100644
--- a/doc/testFixture.html
+++ b/doc/testFixture.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -26,27 +26,37 @@
 
 <script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
 
-<h3>TestFixtureAttribute (NUnit 2.0)</h3>
+<h3>TestFixtureAttribute (NUnit 2.0 / 2.5)</h3>
+
 <p>This is the attribute that marks a class that contains tests and, optionally, 
-	setup or teardown methods.</p>
-<p>There are a few restrictions on a class that is used as a test fixture.
+	setup or teardown methods. NUnit 2.5 introduces parameterized and generic
+	test fixtures - see below.</p>
+	
+<p>Most restrictions on a class that is used as a test fixture have now been
+   eliminated. As of NUnit 2.5.3, a test fixture class:
 	<ul>
-		<li>It must be a publicly exported type.</li>
-		<li>It must have not be abstract.</li>
-		<li>It must have a default constructor</li>
-		<li>It must have no more than one of each of the following method
-		    types: SetUp, TearDown, TestFixtureSetUp and TestFixtureTearDown.</li>
+		<li>May be public, protected, private or internal.
+		<li>May be a static class in .NET 2.0 or later.
+		<li>May be generic, so long as any type parameters are provided or
+		    can be inferred from the actual arguments.
+		<li>May not be abstract - although the attribute may be applied to an
+		    abstract class intended to serve as a base class for test fixtures.
+		<li>If no arguments are provided with the TestFixtureAttribute, the class
+		     must have a default constructor. 
+		<li>If arguments are provided, they must match one of the constructors.
 	</ul>
 </p>
 
-<p>If any of these restrictions are violated, the class will be shown as a
-   non-runnable test fixture, and will turn yellow in the Gui if you attempt to run it.</p>
+<p>If any of these restrictions are violated, the class is not runnable
+   as a test and will display as an error.</p>
 
-<p>In addition, it is advisable that the constructor not have any side effects, 
+<p>It is advisable that the constructor not have any side effects, 
    since NUnit may construct the object multiple times in the course of a session.</li>
 
-
-<p>If you mark a class as a test fixture
+<p>Beginning with NUnit 2.5, the <b>TestFixture</b> attribute is optional
+   for non-parameterized, non-generic fixtures. So long as the class contains
+   at least one method marked with the <b>Test</b>, <b>TestCase</b> or 
+   <b>TestCaseSource</b> attribute, it will be treated as a test fixture.
 
 <h4>Example:</h4>
 
@@ -121,50 +131,298 @@ public class SuccessTests
 
 </div>
 
+<h3>Inheritance</h3>
+
+<p>The <b>TestFixtureAttribute</b> may be applied to a base class and is
+inherited by any derived classes. This includes any abstract base class,
+so the well-known Abstract Fixture pattern may be implemented if desired.
+
+<p>In order to facilitate use of generic and/or parameterized classes,
+where the derived class may require a different number of arguments (or
+type arguments) from the base class, superfluous <b>TestFixture</b> 
+attributes are ignored, using the following rules:
+
+<ol>
+<li>If all TestFixture attributes provide constructor or type arguments, 
+then all of them are used.
+<li>If some of the attributes provide arguments and others do not, then
+only those with arguments are used and those without arguments are ignored.
+<li>If none of the attributes provide arguments, one of them is selected
+for use by NUnit. It is not possible to predict which will be used, so
+this situation should generally be avoided.
+</ol>
+
+This permits code like the following, which would cause an error if the
+attribute on the base class were not ignored.
+
+<div class="code">
+<pre>[TestFixture]
+public class AbstractFixtureBase
+{
+    ...
+}
+
+[TestFixture(typeof(string))]
+public class DerivedFixture<T> : AbstractFixtureBase
+{
+    ...
+}
+</pre>
+</div>
+
+<h3>Parameterized Test Fixtures (NUnit 2.5)</h3>
+
+<p>Beginning with NUnit 2.5, test fixtures may take constructor arguments.
+   Argument values are specified as arguments to the <b>TestFixture</b>
+   attribute. NUnit will construct a separate instance of the fixture
+   for each set of arguments.
+   
+<p>Individual fixture instances in a set of parameterized fixtures may be ignored. 
+   Set the <b>Ignore</b> named parameter of the attribute to true or set 
+   <b>IgnoreReason</b> to a non-empty string.
+
+<p>Individual fixture instances may be given categories as well. Set the <b>Category</b>
+   named parameter of the attribute to the name of the category or to a comma-separated
+   list of categories.
+   
+<h4>Example</h4>
+
+<p>The following test fixture would be instantiated by NUnit three times,
+   passing in each set of arguments to the appropriate constructor. Note
+   that there are three different constructors, matching the data types
+   provided as arguments.
+   
+<div class="code"><pre>
+[TestFixture("hello", "hello", "goodbye")]
+[TestFixture("zip", "zip")]
+[TestFixture(42, 42, 99)]
+public class ParameterizedTestFixture
+{
+    private string eq1;
+    private string eq2;
+    private string neq;
+    
+    public ParameterizedTestFixture(string eq1, string eq2, string neq)
+    {
+        this.eq1 = eq1;
+        this.eq2 = eq2;
+        this.neq = neq;
+    }
+
+    public ParameterizedTestFixture(string eq1, string eq2)
+        : this(eq1, eq2, null) { }
+
+    public ParameterizedTestFixture(int eq1, int eq2, int neq)
+    {
+        this.eq1 = eq1.ToString();
+        this.eq2 = eq2.ToString();
+        this.neq = neq.ToString();
+    }
+
+    [Test]
+    public void TestEquality()
+    {
+        Assert.AreEqual(eq1, eq2);
+        if (eq1 != null && eq2 != null)
+            Assert.AreEqual(eq1.GetHashCode(), eq2.GetHashCode());
+    }
+
+    [Test]
+    public void TestInequality()
+    {
+        Assert.AreNotEqual(eq1, neq);
+        if (eq1 != null && neq != null)
+            Assert.AreNotEqual(eq1.GetHashCode(), neq.GetHashCode());
+    }
+}
+</pre></div>
+
+<h3>Generic Test Fixtures (NUnit 2.5)</h3>
+
+<p>Beginning with NUnit 2.5, you may also use a generic class as a test fixture.
+   In order for NUnit to instantiate the fixture, you must either specify the 
+   types to be used as arguments to <b>TestFixtureAttribute</b> or use the
+   named parameter <b>TypeArgs=</b> to specify them. NUnit will construct a
+   separate instance of the fixture for each <b>TestFixtureAttribute</b> 
+   you provide.
+   
+<h4>Example</h4>
+
+<p>The following test fixture would be instantiated by NUnit twice,
+   once using an ArrayList and once using a List<int>.
+   
+<div class="code"><pre>
+[TestFixture(typeof(ArrayList))]
+[TestFixture(typeof(List<int>))]
+public class IList_Tests<TList> where TList : IList, new()
+{
+  private IList list;
+
+  [SetUp]
+  public void CreateList()
+  {
+    this.list = new TList();
+  }
+
+  [Test]
+  public void CanAddToList()
+  {
+    list.Add(1); list.Add(2); list.Add(3);
+    Assert.AreEqual(3, list.Count);
+  }
+}</pre></div>
+
+<h3>Generic Test Fixtures with Parameters (NUnit 2.5)</h3>
+
+<p>If a Generic fixture, uses constructor arguments, there are three
+   approaches to telling NUnit which arguments are type parameters 
+   and which are normal constructor parameters.
+   <ol>
+   <li>Specify both sets of parameters as arguments to the <b>TestFixtureAttribute</b>.
+       Leading <b>System.Type</b> arguments are used as type parameters, while
+	   any remaining arguments are used to construct the instance. In the
+	   following example, this leads to some obvious duplication...
+
+<div class="code"><pre>
+[TestFixture(typeof(double), typeof(int), 100.0, 42)]
+[TestFixture(typeof(int) typeof(double), 42, 100.0)]
+public class SpecifyBothSetsOfArgs<T1, T2>
+{
+    T1 t1;
+    T2 t2;
+
+    public SpecifyBothSetsOfArgs(T1 t1, T2 t2)
+    {
+        this.t1 = t1;
+        this.t2 = t2;
+    }
+
+    [TestCase(5, 7)]
+    public void TestMyArgTypes(T1 t1, T2 t2)
+    {
+        Assert.That(t1, Is.TypeOf<T1>());
+        Assert.That(t2, Is.TypeOf<T2>());
+    }
+}</pre></div>
+
+   <li>Specify normal parameters as arguments to <b>TestFixtureAttribute</b>
+       and use the named parameter <b>TypeArgs=</b> to specify the type
+	   arguments. Again, for this example, the type info is duplicated, but
+	   it is at least more cleanly separated from the normal arguments...
+
+<div class="code" style="width: 40em"><pre>
+[TestFixture(100.0, 42, TypeArgs=new Type[] {typeof(double), typeof(int) } )]
+[TestFixture(42, 100.0, TypeArgs=new Type[] {typeof(int), typeof(double) } )]
+public class SpecifyTypeArgsSeparately<T1, T2>
+{
+    T1 t1;
+    T2 t2;
+
+    public SpecifyTypeArgsSeparately(T1 t1, T2 t2)
+    {
+        this.t1 = t1;
+        this.t2 = t2;
+    }
+
+    [TestCase(5, 7)]
+    public void TestMyArgTypes(T1 t1, T2 t2)
+    {
+        Assert.That(t1, Is.TypeOf<T1>());
+        Assert.That(t2, Is.TypeOf<T2>());
+    }
+}</pre></div>
+
+   <li>In some cases, when the constructor makes use of all the type parameters 
+       NUnit may simply be able to deduce them from the arguments provided. 
+	   That's the case here and the following is the preferred way to
+	   write this example...
+   
+<div class="code"><pre>
+[TestFixture(100.0, 42)]
+[TestFixture(42, 100.0)]
+public class DeduceTypeArgsFromArgs<T1, T2>
+{
+    T1 t1;
+    T2 t2;
+
+    public DeduceTypeArgsFromArgs(T1 t1, T2 t2)
+    {
+        this.t1 = t1;
+        this.t2 = t2;
+    }
+
+    [TestCase(5, 7)]
+    public void TestMyArgTypes(T1 t1, T2 t2)
+    {
+        Assert.That(t1, Is.TypeOf<T1>());
+        Assert.That(t2, Is.TypeOf<T2>());
+    }
+}</pre></div>
+   </ol> 
+
 </div>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<ul>
-<li><a href="category.html">Category</a></li>
-<li><a href="culture.html">Culture</a></li>
-<li><a href="description.html">Description</a></li>
-<li><a href="exception.html">Expected Exception</a></li>
-<li><a href="explicit.html">Explicit</a></li>
-<li><a href="ignore.html">Ignore</a></li>
-<li><a href="platform.html">Platform</a></li>
-<li><a href="property.html">Property</a></li>
-<li><a href="setCulture.html">SetCulture</a></li>
-<li><a href="setup.html">Setup</a></li>
-<li><a href="setupFixture.html">SetUp Fixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li id="current"><a href="testFixture.html">Test Fixture</a></li>
-<li><a href="fixtureSetup.html">Test Fixture SetUp</a></li>
-<li><a href="fixtureTeardown.html">Test Fixture </a></li>
-</ul>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li><a href="category.html">Category</a></li>
+<li><a href="combinatorial.html">Combinatorial</a></li>
+<li><a href="culture.html">Culture</a></li>
+<li><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li id="current"><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/testProperties.html b/doc/testProperties.html
index 9311222..2a06328 100644
--- a/doc/testProperties.html
+++ b/doc/testProperties.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -38,37 +38,48 @@ which causes it to remain open as the user clicks on different tests.</p>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<ul>
-<li><a href="guiCommandLine.html">Command-Line</a></li>
-<li><a href="mainMenu.html">Main Menu</a></li>
-<li><a href="contextMenu.html">Context Menu</a></li>
-<li><a href="optionsDialog.html">Options Dialog</a></li>
-<li><a href="addinsDialog.html">Addins Dialog</a></li>
-<li id="current"><a href="testProperties.html">Test Properties</a></li>
-<li><a href="configEditor.html">Configuration Editor</a></li>
-<li><a href="projectEditor.html">Project Editor</a></li>
-</ul>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<ul>
+<li><a href="nunit-console.html">Console Runner</a></li>
+<li><a href="nunit-gui.html">Gui Runner</a></li>
+<ul>
+<li><a href="guiCommandLine.html">Command-Line</a></li>
+<li><a href="mainMenu.html">Main Menu</a></li>
+<li><a href="contextMenu.html">Context Menu</a></li>
+<li><a href="settingsDialog.html">Settings Dialog</a></li>
+<li><a href="addinsDialog.html">Addins Dialog</a></li>
+<li id="current"><a href="testProperties.html">Test Properties</a></li>
+<li><a href="configEditor.html">Configuration Editor</a></li>
+<li><a href="projectEditor.html">Project Editor</a></li>
+</ul>
+<li><a href="pnunit.html">PNUnit Runner</a></li>
+<li><a href="nunit-agent.html">NUnit Agent</a></li>
+<li><a href="runtimeSelection.html">Runtime Selection</a></li>
+<li><a href="assemblyIsolation.html">Assembly Isolation</a></li>
+<li><a href="configFiles.html">Configuration Files</a></li>
+<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/testcaseBuilders.html b/doc/testcaseBuilders.html
new file mode 100644
index 0000000..45efbc5
--- /dev/null
+++ b/doc/testcaseBuilders.html
@@ -0,0 +1,112 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - TestcaseBuilders</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>TestCaseBuilders (NUnit 2.4)</h3>
+
+<h4>Purpose</h4>
+<p>TestCaseBuilders create Tests based on a MethodInfo. NUnit uses several
+TestCaseBuilders internally to create various kinds of TestMethods.
+
+<h4>Extension Point</h4>
+Addins use the host to access this extension point by name:
+
+<pre>
+	IExtensionPoint testCaseBuilders = host.GetExtensionPoint( "TestCaseBuilders" );</pre>
+
+<h4>Interfaces</h4>
+<p>The extension object passed to Install must implement either the ITestCaseBuilder 
+or the ITestCaseBuilder2 interface:
+
+<pre>
+	public interface ITestCaseBuilder
+	{
+		bool CanBuildFrom( MethodInfo method );
+		Test BuildFrom( MethodInfo method );
+	}
+
+	public interface ITestCaseBuilder2 : ITestCaseBuilder
+	{
+		bool CanBuildFrom( MethodInfo method, Test suite );
+		Test BuildFrom( MethodInfo method, Test suite );
+	}
+</pre>
+
+<p>NUnit will call ITestCaseBuilder2 if it is available. Otherwise
+ITestCaseBuilder will be used.
+
+<p>The CanBuildFrom method should return true if the addin can build
+a test from the MethodInfo provided. Some TestCaseBuilder addins are only 
+intended to apply to methods within a specific type of fixture. The
+suite argument of the ITestCaseBuilder2 interface may be used to make
+this determination.
+
+<p>The BuildFrom method should return a test constructed over the MethodInfo
+provided as an argument or null if the method cannot be used.
+
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<ul>
+<li><a href="customConstraints.html">Custom Constraints</a></li>
+<li><a href="nunitAddins.html">NUnit Addins</a></li>
+<ul>
+<li><a href="suiteBuilders.html">SuiteBuilders</a></li>
+<li id="current"><a href="testcaseBuilders.html">TestcaseBuilders</a></li>
+<li><a href="testDecorators.html">TestDecorators</a></li>
+<li><a href="testcaseProviders.html">TestcaseProviders</a></li>
+<li><a href="datapointProviders.html">DatapointProviders</a></li>
+<li><a href="eventListeners.html">EventListeners</a></li>
+</ul>
+<li><a href="extensionTips.html">Tips for Extenders</a></li>
+</ul>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/testcaseProviders.html b/doc/testcaseProviders.html
new file mode 100644
index 0000000..2d8bf64
--- /dev/null
+++ b/doc/testcaseProviders.html
@@ -0,0 +1,140 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - TestcaseProviders</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>TestCaseProviders (NUnit 2.5)</h3>
+
+<h4>Purpose</h4>
+<p>TestCaseProviders are used with parameterized tests to provide the
+specific test cases that will be used in calling the test.
+
+<h4>Extension Point</h4>
+<p>Addins use the host to access this extension point by name:
+
+<pre>
+	IExtensionPoint listeners = host.GetExtensionPoint( "ParameterProviders" );</pre>
+
+<h4>Interface</h4>
+<p>The extension object passed to Install must implement either the 
+   <b>ITestCaseProvider</b> or the <b>ITestCaseProvider2</b> interface:
+
+<pre>
+	public interface ITestCaseProvider
+	{
+		bool HasTestCasesFor( MethodInfo method );
+		IEnumerable GetTestCasesFor( MethodInfo method );
+	}
+	
+	public interface ITestCaseProvider2 : ITestCaseProvider
+	{
+		bool HasTestCasesFor( MethodInfo method, Test suite );
+		IEnumerable GetTestCasesFor( MethodInfo method, Test suite );
+	}
+</pre>
+
+<p>NUnit will call <b>ITestCaseProvider2</b> if it is available. Otherwise
+   <b>ITestCaseProvider</b> will be used.
+
+<p><b>HasTestCasesFor</b> should return true if the provider is able to supply test cases
+   for the specified method. If a provider only wants to be used on certain types 
+   of tests, it can examine the provided MethodInfo and the suite for which the
+   test is being constructed and return true or false based on what it finds.
+
+<p>The GetParametersFor method should return a list of individual test cases.
+   Each test case may be expressed as a ParameterSet, as an array of arguments
+   or as a custom object containing one or more of the following properties:
+   
+   <ul>
+   <li>Arguments
+   <li>RunState
+   <li>NotRunReason
+   <li>ExpectedExceptionType
+   <li>ExpectedExceptionName
+   <li>ExpectedExceptionMessage
+   <li>Result
+   <li>Description
+   <li>TestName
+   </ul>
+
+<p>The ParameterSet class provides all these properties and may be used
+to avoid the overhead of reflecting on the properties.
+
+<h4>Notes:</h4>
+
+<ol>
+<li>Most providers will delegate one of the interface implementations
+    to the other if they implement both.
+<li>TestCaseProviders that use data from the fixture class should use 
+    <b>ITestCaseProvider2</b> interface so that they are able to access any 
+	arguments supplied for constructing the fixture object.
+<li>Providers that acquire data from outside the fixture will usually
+    be able to work with <b>ITestCaseProvider</b> alone.
+<li>The <b>ITestCaseProvider2</b> interface was added in the NUnit 2.5.1 release.
+</ol>
+   
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<ul>
+<li><a href="customConstraints.html">Custom Constraints</a></li>
+<li><a href="nunitAddins.html">NUnit Addins</a></li>
+<ul>
+<li><a href="suiteBuilders.html">SuiteBuilders</a></li>
+<li><a href="testcaseBuilders.html">TestcaseBuilders</a></li>
+<li><a href="testDecorators.html">TestDecorators</a></li>
+<li id="current"><a href="testcaseProviders.html">TestcaseProviders</a></li>
+<li><a href="datapointProviders.html">DatapointProviders</a></li>
+<li><a href="eventListeners.html">EventListeners</a></li>
+</ul>
+<li><a href="extensionTips.html">Tips for Extenders</a></li>
+</ul>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/theory.html b/doc/theory.html
new file mode 100644
index 0000000..3d73e49
--- /dev/null
+++ b/doc/theory.html
@@ -0,0 +1,192 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - Theory</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>TheoryAttribute (NUnit 2.5) (Experimental)</h3>
+
+<p>A Theory is a special type of test, used to verify a general
+   statement about the system under development. Normal tests are
+   <em>example-based</em>. That is, the developer supplies one or
+   more examples of inputs and expected outputs either within the
+   code of the test or - in the case of
+   <a href="parameterizedTests.html">Parameterized Tests</a> 
+   - as arguments to the test method. A theory, on the other hand,
+   makes a general statement that all of its assertions will pass
+   for all arguments satisfying certain assumptions.
+   
+<p>Theories are implemented in NUnit
+   as methods within a <b>TestFixture</b>, which are annotated
+   with the <b>TheoryAttribute</b>. Theory methods must always have 
+   arguments and therefore appears quite similar to 
+   <a href="parameterizedTests.html">Parameterized Tests</a>   at first glance. However, a Theory incorporates additional data sources 
+   for its arguments and allows special processing for assumptions
+   about that data. The key difference, though, is that theories
+   make general statements and are more than just a set of examples.
+   
+<h4>Data for Theories</h4>
+
+<p>The primary source of data for a <b>Theory</b> is the
+   <a href="datapoint.html"><b>Datapoint</b> or <b>Datapoints</b> attribute</a>. 
+   NUnit will use any fields of the required types, which are annotated
+   with one of these attributes, to provide data for each parameter
+   of the Theory. NUnit assembles the values for individual arguments 
+   combinatorially to provide test cases for the theory.
+   
+<p>In addition to the Datapoint and Datapoints attributes, it
+   is possible to use any of the approaches for supplying data
+   that are recognized on normal parameterized tests. We suggest
+   that this capability not be overused, since it runs counter
+   to the distinction between a test based on examples and a
+   theory. However, it may be useful in order to guarantee that
+   a specific test case is included.
+   
+<h4>Assumptions</h4>
+
+<p>The theory itself is responsible for ensuring that all data supplied
+   meets its assumptions. It does this by use of the
+   <b>Assume.That(...)</b> construct, which works just like
+   <b>Assert.That(...)</b> but does not cause a failure. If
+   the assumption is not satisfied for a particular test case, that case
+   returns an Inconclusive result, rather than a Success or Failure. 
+   
+<p>The overall result of executing a Theory over a set of test cases is 
+   determined as follows:
+   
+   <ul>
+   <li>If the assumptions are violated for <b>all</b> test cases, then the
+       Theory itself is marked as a failure.
+   
+   <li>If any Assertion fails, the Theory itself fails.
+   
+   <li>If at least <b>some</b> cases pass the stated assumptions, and 
+       there are <b>no</b> assertion failures or exceptions, then the
+	   Theory passes.
+   </ul>
+   
+<h4>Example:</h4>
+
+<p>In the following example, the theory SquareRootDefinition
+   verifies that the implementation of square root satisies
+   the following definition:
+   
+<p style="margin: 2em"><i>
+"Given a non-negative number, the square root of that number
+ is always non-negative and, when multiplied by itself, gives 
+ the original number."</i>
+
+<div class="code" style="width: 36em">
+<pre>
+public class SqrtTests
+{
+    [Datapoints]
+    public double[] values = new double[] { 0.0, 1.0, -1.0, 42.0 };
+
+    [Theory]
+    public void SquareRootDefinition(double num)
+    {
+        Assume.That(num >= 0.0);
+
+        double sqrt = Math.Sqrt(num);
+
+        Assert.That(sqrt >= 0.0);
+        Assert.That(sqrt * sqrt, Is.EqualTo(num).Within(0.000001));
+    }
+}
+</pre>
+</div>
+   
+<h4>See also...</h4>
+
+<ul>
+<li><a href="datapoint.html">Datapoint(s)Attribute</a><li><a href="parameterizedTests.html">Parameterized Tests</a></ul>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li><a href="category.html">Category</a></li>
+<li><a href="combinatorial.html">Combinatorial</a></li>
+<li><a href="culture.html">Culture</a></li>
+<li><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li id="current"><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/throwsConstraint.html b/doc/throwsConstraint.html
new file mode 100644
index 0000000..2752478
--- /dev/null
+++ b/doc/throwsConstraint.html
@@ -0,0 +1,157 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - ThrowsConstraint</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Throws Constraint (NUnit 2.5)</h2>
+
+<p><b>ThrowsConstraint</b> is used to test that some code, represented as a delegate,
+throws a particular exception. It may be used alone, to merely test the type
+of constraint, or with an additional constraint to be applied to the exception
+specified as an argument.
+
+p>The related <b>ThrowsNothingConstraint</b> simply asserts that the delegate
+does not throw an exception.
+
+<h4>Constructors</h4>
+<div class="code"><pre>
+ThrowsConstraint(Type expectedType)
+ThrowsConstraint<T>()
+ThrowsConstraint(Type expectedType, Constraint constraint)
+ThrowsConstraint<T>(Constraint constraint)
+ThrowsNothingConstraint()
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Throws.Exception
+Throws.TargetInvocationException
+Throws.ArgumentException
+Throws.InvalidOperationException
+Throws.TypeOf(Type expectedType)
+Throws.TypeOf<T>()
+Throws.InstanceOf(Type expectedType)
+Throws.InstanceOf<T>()
+Throws.Nothing
+Throws.InnerException
+</pre></div>
+
+<h4>Examples of Use</h4>
+<div class="code"><pre>
+// .NET 1.1
+Assert.That( new TestDelegate(SomeMethod),
+  Throws.TypeOf(typeof(ArgumentException)));
+Assert.That( new TestDelegate(SomeMethod),
+  Throws.Exception.TypeOf(typeof(ArgumentException)));
+Assert.That( new TestDelegate(SomeMethod),
+  Throws.TypeOf(typeof(ArgumentException))
+    .With.Property("Parameter").EqualTo("myParam"));
+Assert.That( new TestDelegate(SomeMethod),
+  Throws.ArgumentException );
+Assert.That( new TestDelegate(SomeMethod), 
+  Throws.TargetInvocationException
+    .With.InnerException.TypeOf(ArgumentException));
+	
+// .NET 2.0
+Assert.That( SomeMethod, 
+  Throws.TypeOf<ArgumentException>());
+Assert.That( SomeMethod, 
+  Throws.Exception.TypeOf<ArgumentException>());
+Assert.That( SomeMethod, 
+  Throws.TypeOf<ArgumentException>()
+    .With.Property("Parameter").EqualTo("myParam"));
+Assert.That( SomeMethod, Throws.ArgumentException );
+Assert.That( SomeMethod, 
+  Throws.TargetInvocationException
+    .With.InnerException.TypeOf<ArgumentException>());
+</pre></div>
+
+<h4>Notes</h4>
+<ol>
+<li><b>Throws.Exception</b> may be followed by further constraints,
+    which are applied to the exception itself as shown in the last two
+	examples above. It may also be used alone to verify that some
+	exception has been thrown, without regard to type. This is
+	not a recommended practice since you should normally know
+	what exception you are expecting.
+<li><b>Throws.TypeOf</b> and <b>Throws.InstanceOf</b> are provided
+    as a shorter syntax for this common test. They work exactly like
+	the corresponding forms following <b>Throws.Exception</b>.
+<li><b>Throws.TargetInvocationException/b>, <b>Throws.ArgumentException</b>
+    and <b>Throws.InvalidOperationException</b> provide a shortened form
+	for some common exceptions.
+<li>Used alone, <b>Throws.InnerException</b> simply tests the InnerException
+    value of the thrown exception. More commonly, it will be used in 
+	combination with a test for the type of the outer exception as shown
+	in the examples above.
+</ol>
+
+
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<ul>
+<li><a href="equalConstraint.html">Equal Constraint</a></li>
+<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
+<li><a href="conditionConstraints.html">Condition Constraints</a></li>
+<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
+<li><a href="pathConstraints.html">Path Constraints</a></li>
+<li><a href="typeConstraints.html">Type Constraints</a></li>
+<li><a href="stringConstraints.html">String Constraints</a></li>
+<li><a href="collectionConstraints.html">Collection Constraints</a></li>
+<li><a href="propertyConstraint.html">Property Constraint</a></li>
+<li id="current"><a href="throwsConstraint.html">Throws Constraint</a></li>
+<li><a href="compoundConstraints.html">Compound Constraints</a></li>
+<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
+<li><a href="listMapper.html">List Mapper</a></li>
+<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
+</ul>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/timeout.html b/doc/timeout.html
new file mode 100644
index 0000000..5d2cbca
--- /dev/null
+++ b/doc/timeout.html
@@ -0,0 +1,124 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - Timeout</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>TimeoutAttribute (NUnit 2.5)</h3>
+
+<p>The <b>TimeoutAttribute</b> is used to specify a timeout value in milliseconds
+   for a test case. If the test case runs longer than the time specified it
+   is immediately cancelled and reported as a failure, with a message 
+   indicating that the timeout was exceeded.
+   
+<p>The attribute may also be specified on a fixture or assembly, in which
+   case it indicates the default timeout for any subordinate test cases.
+   
+<h4>Example</h4>
+
+<div class="code"><pre>
+[Test, Timeout(2000)]
+public void PotentiallyLongRunningTest()
+{
+    ...
+}
+</pre></div>
+
+<h4>Notes</h4>
+<ol>
+<li>Beginning with NUnit 2.5.5, timeouts are suppressed when running under a debugger.</li>
+</ol>
+
+<h4>See Also...</h4>
+<ul>
+<li><a href="maxtime.html">MaxtimeAttribute</a></ul>
+   
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li><a href="category.html">Category</a></li>
+<li><a href="combinatorial.html">Combinatorial</a></li>
+<li><a href="culture.html">Culture</a></li>
+<li><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li id="current"><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/typeAsserts.html b/doc/typeAsserts.html
index 34a6900..9c1172b 100644
--- a/doc/typeAsserts.html
+++ b/doc/typeAsserts.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -24,12 +24,13 @@
 
 <div id="content">
 
-<h2>Type Asserts</h2>
+<h2>Type Asserts (NUnit 2.2.3 / 2.5)</h2>
 
 <p>These methods allow us to make assertions about the type of an object.</p>
 
-<div class="code" style="width: 36em" >
-<pre>Assert.IsInstanceOfType( Type expected, object actual );
+<div class="code" style="width: 36em" ><pre>
+
+Assert.IsInstanceOfType( Type expected, object actual );
 Assert.IsInstanceOfType( Type expected, object actual, 
                 string message );
 Assert.IsInstanceOfType( Type expected, object actual, 
@@ -51,49 +52,76 @@ Assert.IsNotAssignableFrom( Type expected, object actual );
 Assert.IsNotAssignableFrom( Type expected, object actual, 
                 string message );
 Assert.IsNotAssignableFrom( Type expected, object actual, 
-                string message, params object[] parms );</pre>
-</div>
+                string message, params object[] parms );
+				
+</pre></div>
+
+Beginning with NUnit 2.5, generic equivalents are available 
+in .NET 2.0 NUnit packages.
+
+<div class="code" style="width: 36em" ><pre>
+
+Assert.IsInstanceOf<T>( object actual );
+Assert.IsInstanceOf<T>( object actual, string message );
+Assert.IsInstanceOf<T>( object actual, 
+                string message, params object[] parms );
+				
+Assert.IsNotInstanceOf<T>( object actual );
+Assert.IsNotInstanceOf<T>( object actual, string message ); 
+Assert.IsNotInstanceOf<T>( object actual, 
+                string message, params object[] parms );
+			
+Assert.IsAssignableFrom<T>( object actual );
+Assert.IsAssignableFrom<T>( object actual, string message );
+Assert.IsAssignableFrom<T>( object actual, 
+                string message, params object[] parms );
+				
+Assert.IsNotAssignableFrom<T>( object actual );
+Assert.IsNotAssignableFrom<T>( object actual, string message );
+Assert.IsNotAssignableFrom<T>( object actual, 
+                string message, params object[] parms );
+				
+</pre></div>
+
 
 </div>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<ul>
-<li><a href="classicModel.html">Classic Model</a></li>
-<ul>
-<li><a href="equalityAsserts.html">Equality Asserts</a></li>
-<li><a href="identityAsserts.html">Identity Asserts</a></li>
-<li><a href="conditionAsserts.html">Condition Tests</a></li>
-<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
-<li id="current"><a href="typeAsserts.html">Type Asserts</a></li>
-<li><a href="utilityAsserts.html">Utility Methods</a></li>
-<li><a href="stringAssert.html">String Assert</a></li>
-<li><a href="collectionAssert.html">Collection Assert</a></li>
-<li><a href="fileAssert.html">File Assert</a></li>
-</ul>
-<li><a href="constraintModel.html">Constraint Model</a></li>
-</ul>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<ul>
+<li><a href="equalityAsserts.html">Equality Asserts</a></li>
+<li><a href="identityAsserts.html">Identity Asserts</a></li>
+<li><a href="conditionAsserts.html">Condition Asserts</a></li>
+<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
+<li id="current"><a href="typeAsserts.html">Type Asserts</a></li>
+<li><a href="exceptionAsserts.html">Exception Asserts</a></li>
+<li><a href="utilityAsserts.html">Utility Methods</a></li>
+<li><a href="stringAssert.html">String Assert</a></li>
+<li><a href="collectionAssert.html">Collection Assert</a></li>
+<li><a href="fileAssert.html">File Assert</a></li>
+<li><a href="directoryAssert.html">Directory Assert</a></li>
+</ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/typeConstraints.html b/doc/typeConstraints.html
index 14ce2ae..c71a8ec 100644
--- a/doc/typeConstraints.html
+++ b/doc/typeConstraints.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -58,44 +58,43 @@ Expect( "Hello", AssignableFrom(typeOf(string)));
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<ul>
-<li><a href="classicModel.html">Classic Model</a></li>
-<li><a href="constraintModel.html">Constraint Model</a></li>
-<ul>
-<li><a href="equalConstraint.html">Equal Constraint</a></li>
-<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
-<li><a href="conditionConstraints.html">Condition Constraints</a></li>
-<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
-<li id="current"><a href="typeConstraints.html">Type Constraints</a></li>
-<li><a href="stringConstraints.html">String Constraints</a></li>
-<li><a href="collectionConstraints.html">Collection Constraints</a></li>
-<li><a href="propertyConstraint.html">Property Constraint</a></li>
-<li><a href="compoundConstraints.html">Compound Constraints</a></li>
-<li><a href="customConstraints.html">Custom Constraints</a></li>
-<li><a href="listMapper.html">List Mapper</a></li>
-</ul>
-</ul>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<ul>
+<li><a href="equalConstraint.html">Equal Constraint</a></li>
+<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
+<li><a href="conditionConstraints.html">Condition Constraints</a></li>
+<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
+<li><a href="pathConstraints.html">Path Constraints</a></li>
+<li id="current"><a href="typeConstraints.html">Type Constraints</a></li>
+<li><a href="stringConstraints.html">String Constraints</a></li>
+<li><a href="collectionConstraints.html">Collection Constraints</a></li>
+<li><a href="propertyConstraint.html">Property Constraint</a></li>
+<li><a href="throwsConstraint.html">Throws Constraint</a></li>
+<li><a href="compoundConstraints.html">Compound Constraints</a></li>
+<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
+<li><a href="listMapper.html">List Mapper</a></li>
+<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
+</ul>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/upgrade.html b/doc/upgrade.html
index 740e147..cf59550 100644
--- a/doc/upgrade.html
+++ b/doc/upgrade.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -33,26 +33,27 @@ specify a setting in the test config file to allow use of old style test cases b
 default.</p>
 
 <p>Beginning with NUnit 2.2.2, NUnit is able to run tests Built with older
-versions of NUnit 2.x without recompilation.</p>
+versions of NUnit 2.x without recompilation. Note that you must have an
+available copy of the nunit.framework assembly from the older version
+in order for your tests to load correctly.
 
 <h2>From NUnit 1.x</h2>
 
-<p>Upgrading requires a minimal amount of work. Since the framework still looks for 
-	test methods by name in addition to the attributes, <b>no test method will need to 
-		be modified to upgrade to the new version</b>. The only source code change 
-	required is to remove the constructor with the string parameter in the class 
-	that inherits from TestCase. The only new requirement is that you have a 
-	default constructor. If there was significant processing in the existing 
-	constructor then just move it to the default constructor. The only other change 
-	is to change the reference to nunit.framework.dll instead of the V1.x framework 
-	dll. Using the TestCase class has been marked obsolete so you will get 
-	warnings, but they can be ignored for now! 
-</p>
+<p>NUnit 2.5 no longer supports inheriting from TestCase when defining a test.
+   If you need to run such tests, you may continue to do so using the
+   a 2.4.x or earlier version of the nunit.framework assembly. Of course, you
+   will not be able to use new features introduced in 2.5 if you follow this
+   course.
+   
+<p>For a complete conversion to 2.5, you should modify and recompile your tests
+   using the new version of NUnit.
+
 <h3>Suite property</h3>
-<p>The existing Suite property will not be found by the new program. These must be 
+<p>The NUnit 1.x Suite property will not be found by the new program. These must be 
 	changed to the "Suite" attribute for the test runners to find them. 
 	Another alternative is that these suites are no longer needed due to the 
 	automatic capability that is built in to the new version.</p>
+	
 <h3>AssertionFailedError</h3>
 <p>If you have written code expecting the exception AssertionFailedError, this must 
 	be changed to AssertionException.</p>
@@ -62,34 +63,34 @@ versions of NUnit 2.x without recompilation.</p>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<ul>
-<li><a href="quickStart.html">Quick Start</a></li>
-<li><a href="installation.html">Installation</a></li>
-<ul>
-<li id="current"><a href="upgrade.html">Upgrading</a></li>
-</ul>
-</ul>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<ul>
+<li><a href="quickStart.html">Quick Start</a></li>
+<li><a href="installation.html">Installation</a></li>
+<ul>
+<li id="current"><a href="upgrade.html">Upgrading</a></li>
+</ul>
+</ul>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/utilityAsserts.html b/doc/utilityAsserts.html
index d68874c..14d492c 100644
--- a/doc/utilityAsserts.html
+++ b/doc/utilityAsserts.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -25,18 +25,33 @@
 <div id="content">
 
 <h2>Utility Methods</h2>
-<p>Two utility methods, Fail() and Ignore() are provided in order to allow more 
-	direct control of the test process:</p>
-<div class="code" style="width: 36em">
-	<pre>Assert.Fail();
+<p>Four utility methods, <b>Pass()</b>, <b>Fail()</b>, <b>Ignore()</b> and <b>Inconclusive()</b> are provided 
+   in order to allow more direct control of the test process:</p>
+<div class="code" style="width: 36em"><pre>
+Assert.Pass();
+Assert.Pass( string message );
+Assert.Pass( string message, object[] parms );
+
+Assert.Fail();
 Assert.Fail( string message );
 Assert.Fail( string message, object[] parms );
 
 Assert.Ignore();
 Assert.Ignore( string message );
-Assert.Ignore( string message, object[] parms );</pre>
+Assert.Ignore( string message, object[] parms );
+
+Assert.Inconclusive();
+Assert.Inconclusive( string message );
+Assert.Inconclusive( string message, object[] parms );</pre>
 </div>
-<p>The Assert.Fail method provides you with the ability to generate a failure based 
+<p>The <b>Assert.Pass</b> method allows you to immediately end the test, recording
+	it as successful. Since it causes an exception to be thrown, it is more
+	efficient to simply allow the test to return. However, Assert.Pass allows 
+	you to record a message in the test result and may also make the test
+	easier to read in some situations. Additionally, like the other methods
+	on this page, it can be invoked from a nested method call with the
+	result of immediately terminating test execution.</p>
+<p>The <b>Assert.Fail</b> method provides you with the ability to generate a failure based 
 	on tests that are not encapsulated by the other methods. It is also useful in 
 	developing your own project-specific assertions.</p>
 <p>Here's an example of its use to create a private assertion that tests whether a 
@@ -54,53 +69,55 @@ public void AssertStringContains( string expected, string actual,
         Assert.Fail( message );
 }</pre>
 </div>
-<p>The Assert.Ignore method provides you with the ability to dynamically cause a 
+<p>The <b>Assert.Ignore</b> method provides you with the ability to dynamically cause a 
 	test or suite to be ignored at runtime. It may be called in a test, setup or 
 	fixture setup method. We recommend that you use this only in isolated cases. 
 	The category facility is provided for more extensive inclusion or exclusion of 
 	tests or you may elect to simply divide tests run on different occasions into 
 	different assemblies.</p>
+<p>The <b>Assert.Inconclusive</b> method indicates that the test could not be
+   completed with the data available. It should be used in situations where 
+   another run with different data might run to completion, with either a
+   success or failure outcome.
 
 </div>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<ul>
-<li><a href="classicModel.html">Classic Model</a></li>
-<ul>
-<li><a href="equalityAsserts.html">Equality Asserts</a></li>
-<li><a href="identityAsserts.html">Identity Asserts</a></li>
-<li><a href="conditionAsserts.html">Condition Tests</a></li>
-<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
-<li><a href="typeAsserts.html">Type Asserts</a></li>
-<li id="current"><a href="utilityAsserts.html">Utility Methods</a></li>
-<li><a href="stringAssert.html">String Assert</a></li>
-<li><a href="collectionAssert.html">Collection Assert</a></li>
-<li><a href="fileAssert.html">File Assert</a></li>
-</ul>
-<li><a href="constraintModel.html">Constraint Model</a></li>
-</ul>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<ul>
+<li><a href="equalityAsserts.html">Equality Asserts</a></li>
+<li><a href="identityAsserts.html">Identity Asserts</a></li>
+<li><a href="conditionAsserts.html">Condition Asserts</a></li>
+<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
+<li><a href="typeAsserts.html">Type Asserts</a></li>
+<li><a href="exceptionAsserts.html">Exception Asserts</a></li>
+<li id="current"><a href="utilityAsserts.html">Utility Methods</a></li>
+<li><a href="stringAssert.html">String Assert</a></li>
+<li><a href="collectionAssert.html">Collection Assert</a></li>
+<li><a href="fileAssert.html">File Assert</a></li>
+<li><a href="directoryAssert.html">Directory Assert</a></li>
+</ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/valueSource.html b/doc/valueSource.html
new file mode 100644
index 0000000..d050ecf
--- /dev/null
+++ b/doc/valueSource.html
@@ -0,0 +1,158 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - ValueSource</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
+
+<h3>ValueSourceAttribute (NUnit 2.5)</h3>
+
+<p><b>ValueSourceAttribute</b> is used on individual parameters of a test method to
+identify a named source for the argument values to be supplied. The attribute has 
+two public constructors.
+
+<div class="code">
+<pre>
+ValueSourceAttribute(Type sourceType, string sourceName);
+ValueSourceAttribute(string sourceName);
+</pre>
+</div>
+
+<p>If <b>sourceType</b> is specified, it represents the class that provides
+the data. It must have a default constructor.
+
+<p>If <b>sourceType</b> is not specified, the class containing the test
+method is used. NUnit will construct it using either the default constructor
+or - if arguments are provided - the appropriate constructor for those 
+arguments.
+
+<p>The <b>sourceName</b>, represents the name of the source that will 
+provide the arguments. It should have the following characteristics:
+<ul>
+<li>It may be a field, a non-indexed property or a method taking no arguments.
+<li>It may be either an instance or a static member.
+<li>It must return an IEnumerable or a type that implements IEnumerable.
+<li>The individual items returned from the enumerator must be compatible
+    with the type of the parameter on which the attribute appears.
+</ul>
+
+<h3>Order of Execution</h3>
+
+<p>In NUnit 2.5, individual test cases are sorted alphabetically and executed in
+   that order. With NUnit 2.5.1, the individual cases are not sorted, but are
+   executed in the order in which NUnit discovers them. This order does <b>not</b>
+   follow the lexical order of the attributes and will often vary between different
+   compilers or different versions of the CLR.
+   
+<p>As a result, when <b>ValueSourceAttribute</b> appears multiple times on a 
+   parameter or when other data-providing attributes are used in combination with 
+   <b>ValueSourceAttribute</b>, the order of the arguments is undefined.
+
+<p>However, when a single <b>ValueSourceAttribute</b> is used by itself, 
+   the order of the arguments follows exactly the order in which the data 
+   is returned from the source.
+   
+<h3>Note on Object Construction</h3>
+
+<p>NUnit locates the test cases at the time the tests are loaded, creates
+instances of each class with non-static sources and builds a list of 
+tests to be executed. Each source object is only created once at this
+time and is destroyed after all tests are loaded. 
+
+<p>If the data source is in the test fixture itself, the object is created
+using the appropriate constructor for the fixture parameters provided on
+the <b>TestFixtureAttribute</b>, or
+the default constructor if no parameters were specified. Since this object
+is destroyed before the tests are run, no communication is possible between
+these two phases - or between different runs - except through the parameters
+themselves.
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li><a href="category.html">Category</a></li>
+<li><a href="combinatorial.html">Combinatorial</a></li>
+<li><a href="culture.html">Culture</a></li>
+<li><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li id="current"><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/values.html b/doc/values.html
new file mode 100644
index 0000000..1c060e8
--- /dev/null
+++ b/doc/values.html
@@ -0,0 +1,132 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - Values</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<link rel="stylesheet" type="text/css" href="nunit.css">
+<link rel="shortcut icon" href="favicon.ico">
+</head>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
+  <div id="nav">
+    <a href="http://www.nunit.org">NUnit</a>
+    <a class="active" href="index.html">Documentation</a>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>ValuesAttribute (NUnit 2.5)</h3>
+
+<p>The <b>ValuesAttribute</b> is used to specify a set of values to be provided
+   for an individual parameter of a parameterized test method. Since
+   NUnit combines the data provided for each parameter into a set of
+   test cases, data must be provided for all parameters if it is
+   provided for any of them.
+   
+<p>By default, NUnit creates test cases from all possible combinations
+   of the datapoints provided on parameters - the combinatorial approach.
+   This default may be modified by use of specific attributes on the
+   test method itself.
+   
+<h4>Example</h4>
+
+<p>The following test will be executed six times, as follows:
+<pre>
+	MyTest(1, "A")
+	MyTest(1, "B")
+	MyTest(2, "A")
+	MyTest(2, "B")
+	MyTest(3, "A")
+	MyTest(3, "B")
+</pre>
+<div class="code"><pre>
+[Test]
+public void MyTest(
+    [Values(1,2,3)] int x,
+    [Values("A","B")] string s)
+{
+    ...
+}
+</pre></div>
+
+<h4>See also...</h4>
+<ul>
+<li><a href="range.html">RangeAttribute</a><li><a href="random.html">RandomAttribute</a><li><a href="sequential.html">SequentialAttribute</a><li><a href="combinatorial.html">CombinatorialAttribute</a><li><a href="pairwise.html">PairwiseAttribute</a></ul>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li><a href="category.html">Category</a></li>
+<li><a href="combinatorial.html">Combinatorial</a></li>
+<li><a href="culture.html">Culture</a></li>
+<li><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li id="current"><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="runningTests.html">Running Tests</a></li>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/vsSupport.html b/doc/vsSupport.html
index 40b11d2..06b34c9 100644
--- a/doc/vsSupport.html
+++ b/doc/vsSupport.html
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <html>
 <!-- Standard Head Part -->
 <head>
@@ -33,9 +33,24 @@ interacting with the Visual Studio extensibility model.</p>
 <h3>Running From Within Visual Studio</h3>
 
 <p>The most convenient way to do this is to set up a custom tool entry specifying the path to 
-nunit.exe as the command. For a C# project, you may wish to use $(TargetPath) for the arguments and
-$(TargetDir) for the initial directory. If you would like to debug your tests, use the Visual Studio
-Debug | Processes… menu item to attach to nunit.exe after starting it and set breakpoints in
+NUnit as the command. For a VS2003 C# project, you can use $(TargetPath) for the arguments and
+$(TargetDir) for the initial directory. 
+
+<p>With Visual Studio VS2005 this becomes a bit harder, because that release changed the
+meaning of the 'Target' macros so they now point to the intermediate 'obj' directories rather
+than the final output in one of the 'bin' directories. Here are some alternatives that
+work in both versions:
+
+<ul>
+<li><b>$(ProjectDir)$(ProjectFileName)</b> to open the VS Project rather than the assembly.
+    If you use this approach, be sure to rename your config file accordingly and put it
+	in the same directory as the VS project file.
+<li><b>$(ProjectDir)bin/Debug/$(TargetName)$(TargetExt)</b> to run the assembly directly.
+    Note that this requires hard-coding part of the path, including the configuration.
+</ul>
+
+<p>If you would like to debug your tests, use the Visual Studio
+Debug | Processes… menu item to attach to NUnit after starting it and set breakpoints in
 your test code as desired before running the tests.</p>
 
 <h3>Using Console Interface to Debug Applications</h3>
@@ -91,33 +106,38 @@ specified in the VS project.</p>
 
 <!-- Submenu -->
 <div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.4.7</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<li><a href="assertions.html">Assertions</a></li>
-<li><a href="attributes.html">Attributes</a></li>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="features.html">Other Features</a></li>
-<ul>
-<li><a href="configFiles.html">Configuration Files</a></li>
-<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
-<li id="current"><a href="vsSupport.html">Visual Studio Support</a></li>
-<li><a href="extensibility.html">Extensibility</a></li>
-</ul>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-</ul>
+<ul>
+<li><a href="index.html">NUnit 2.5.10</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="runningTests.html">Running Tests</a></li>
+<ul>
+<li><a href="nunit-console.html">Console Runner</a></li>
+<li><a href="nunit-gui.html">Gui Runner</a></li>
+<li><a href="pnunit.html">PNUnit Runner</a></li>
+<li><a href="nunit-agent.html">NUnit Agent</a></li>
+<li><a href="runtimeSelection.html">Runtime Selection</a></li>
+<li><a href="assemblyIsolation.html">Assembly Isolation</a></li>
+<li><a href="configFiles.html">Configuration Files</a></li>
+<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li id="current"><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+</ul>
 </div>
 <!-- End of Submenu -->
 
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2008 Charlie Poole. All Rights Reserved.
+  Copyright © 2010 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/install/NUnit.wxs b/install/NUnit.wxs
new file mode 100644
index 0000000..d948492
--- /dev/null
+++ b/install/NUnit.wxs
@@ -0,0 +1,272 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Wix xmlns="http://schemas.microsoft.com/wix/2003/01/wi">
+
+  <Product UpgradeCode="009074FF-2CEC-4b0c-9951-B07186F9ED3A"
+           Name="NUnit $(var.NominalVersion)"
+	   Id="879F64A7-7EC6-4281-90DB-C720DE11D79C"
+           Version="$(var.ProductVersion)"
+           Manufacturer="nunit.org"
+           Language="1033">
+
+    <Package Id="????????-????-????-????-????????????"
+             Comments="NUnit $(var.ProductVersion)"
+		         Manufacturer="nunit.org"
+             InstallerVersion="200"
+             Platforms="Intel"
+		         Languages="1033"
+             Compressed="yes"
+             SummaryCodepage="1252" />
+
+    <!-- ***************************************************************** -->
+    <!-- **********  Define Properties used in the install      ********** -->
+    <!-- ***************************************************************** -->
+
+    <Property Id="FRAMEWORK10">
+      <RegistrySearch Id='Framework10Registry' Type='raw' Root='HKLM'
+                      Key='Software\Microsoft\.NETFramework\policy\v1.0' Name='3705' />
+    </Property>
+
+    <Property Id="FRAMEWORK11">
+      <RegistrySearch Id='Framework11Registry' Type='raw' Root='HKLM'
+                      Key='Software\Microsoft\.NETFramework\policy\v1.1' Name='4322' />
+    </Property>
+
+    <Property Id="FRAMEWORK20">
+      <RegistrySearch Id='Framework20Registry' Type='raw' Root='HKLM'
+                      Key='Software\Microsoft\.NETFramework\policy\v2.0' Name='50727' />
+    </Property>
+
+    <Property Id="MONODEFAULTCLR">
+      <RegistrySearch Id="MonoDefaultClr" Type='raw' Root='HKLM'
+                      Key='Software\Novell\Mono' Name='DefaultCLR' />
+    </Property>
+
+    <Property Id="MONODIRECTORY">
+      <RegistrySearch Id="MonoDirectory" Type='directory' Root='HKLM'
+                      Key='Software\Novell\Mono\[MONODEFAULTCLR]' Name='SDKInstallRoot' />
+    </Property>
+
+    <Property Id="CMD_EXE" Value="[!SystemFolder]cmd.exe"/>
+
+    <!-- ***************************************************************** -->
+    <!-- *********  Properties for the Add Remove Programs list  ********* -->
+    <!-- ***************************************************************** -->
+
+    <Property Id="ARPCONTACT" Value="Charlie Poole" />
+    <Property Id='ARPPRODUCTICON' Value='nunit_icon.exe'/>
+    <Property Id="ARPHELPLINK" Value="http://lists.sourceforge.net/lists/listinfo/nunit-users" />
+    <Property Id="ARPREADME" Value="http://nunit.org/?p=releaseNotes&r=2.5" />
+    <Property Id="ARPURLINFOABOUT" Value="NUnit is a testing framework for all .NET languages" />
+    <Property Id="ARPURLUPDATEINFO" Value="http://nunit.org?p=download" />
+
+
+    <!-- ***************************************************************** -->
+    <!-- **********       Define Directory Structure            ********** -->
+    <!-- ***************************************************************** -->
+
+    <Directory Id="TARGETDIR" Name="SourceDir">
+
+      <Directory Id='ProgramFilesFolder' Name='PFiles'>
+
+        <!-- Target locations for NUnit Files -->
+        <Directory Id='INSTALLDIR' Name='NUnit' LongName="NUnit $(var.NominalVersion)">
+
+          <Directory Id='bin' Name='bin'>
+
+            <Directory Id='net_1.1' Name='net-1.1'>
+              <Directory Id='lib_1.1' Name='lib' />
+              <Directory Id='addins_1.1' Name='addins' />
+              <Directory Id='tests_1.1' Name='tests' />
+              <Directory Id='framework_1.1' Name='FRAMEWK' LongName='framework' />
+            </Directory>
+
+            <Directory Id='net_2.0' Name='net-2.0'>
+              <Directory Id='lib_2.0' Name='lib' />
+              <Directory Id='addins_2.0' Name='addins' />
+              <Directory Id='tests_2.0' Name='tests' />
+              <Directory Id='framework_2.0' Name='FRAMEWK' LongName='framework' />
+            </Directory>
+
+          </Directory>
+
+          <Directory Id='doc' Name='doc'>
+            <Directory Id='files' Name='files' />
+            <Directory Id='img' Name='img' />
+          </Directory>
+
+          <Directory Id='samples' Name='samples'>
+            <Directory Id='csharp' Name='csharp' />
+            <Directory Id='jsharp' Name='jsharp' />
+            <Directory Id='vb' Name='vb' />
+            <Directory Id='cpp' Name='cpp' />
+            <Directory Id='extensibility' Name='EXTENSIB' LongName='Extensibility' />
+          </Directory>
+
+        </Directory>
+
+      </Directory>
+
+      <!-- Desktop Folder Directory for our Desktop Shortcut -->
+      <Directory Id="DesktopFolder" Name="." SourceName="DESKTOP" LongSource="User's Desktop" />
+
+      <!-- Program Menu Folder and our subfolders for Shortcuts -->
+      <Directory Id="ProgramMenuFolder" Name="." SourceName="PROGRAMS" LongSource="User's Program Menu">
+        <Directory Id="NUnitMenu" Name="NUnit" LongName="NUnit $(var.NominalVersion)" >
+          <Directory Id="RunUnderMenu" Name="RunUnder" LongName="Select Runtime" />
+          <Directory Id="SamplesMenu" Name="Samples" />
+        </Directory>
+      </Directory>
+
+    </Directory>
+
+
+    <!-- ***************************************************************** -->
+    <!-- **********      Define the NUnit feature tree          ********** -->
+    <!-- ***************************************************************** -->
+
+    <Feature Id="TopLevelFeature" ConfigurableDirectory="INSTALLDIR"
+		         Level="1" Title="NUnit $(var.NominalVersion)" Display='expand'
+		         Description="Installs NUnit with all selected components">
+
+      <!-- Defined below -->
+      <ComponentRef Id="C__LICENSE" />
+      <ComponentRef Id="C__FIT_LICENSE" />
+      <ComponentRef Id="C__LOGO" />
+      <ComponentRef Id="InstallationRegistryEntry"/>
+
+      <Feature Id="Net_2.0_BaseFeature" Title="Base Level Support" Level="0" Display="collapse"
+			         Description="NUnit assemblies required to write and run tests under .NET 2.0.">
+        <Condition Level="1">FRAMEWORK20 = "50727-50727" OR MONODIRECTORY</Condition>
+
+        <ComponentGroupRef Id="Net_2.0_FrameworkGroup"/>
+        <ComponentGroupRef Id="Net_2.0_CoreGroup"/>
+        <ComponentGroupRef Id="Net_2.0_ConsoleRunnerGroup" />
+
+      </Feature>
+
+      <Feature Id="Net_2.0_GuiRunner" Level="1" Title='Gui Runner' Display='expand'
+				         Description="Installs NUnit Windows GUI runner for .NET 2.0">
+
+        <ComponentGroupRef Id="Net_2.0_FrameworkGroup"/>
+        <ComponentGroupRef Id="Net_2.0_CoreGroup"/>
+        <ComponentGroupRef Id="Net_2.0_GuiRunnerGroup"/>
+
+      </Feature>
+
+      <Feature Id="Net_2.0_PNunitRunner" Level="10" Title='PNUnit Runner' Display='expand'
+               Description="Installs the PNUnit runner for parallel distributed tests">
+
+        <ComponentGroupRef Id="Net_2.0_FrameworkGroup"/>
+        <ComponentGroupRef Id="Net_2.0_CoreGroup"/>
+        <ComponentGroupRef Id="pnunit_2.0"/>
+
+      </Feature>
+
+      <Feature Id="Net_2.0_TestsFeature" Level="10" Title='Unit Tests' Display='expand'
+				         Description='Unit tests for NUnit under .NET 1.1'>
+
+        <ComponentGroupRef Id="Net_2.0_TestsGroup" />
+
+      </Feature>
+
+      <Feature Id="Net_1.1_BaseFeature" Level="10" Title=".NET 1.1 Support" Display="collapse"
+			         Description="NUnit assemblies required to write and run tests under .NET 1.1.">
+        <!--<Condition Level="1">FRAMEWORK10 = "3321-3705" OR FRAMEWORK11 = "3706-4322" OR MONODIRECTORY</Condition>-->
+
+        <Feature Id="Net_1.1_Framework"	Level="10" Title="Framework Assemblies" Display="expand"
+				         Description = "Assemblies referenced by user tests">
+
+          <ComponentGroupRef Id="Net_1.1_FrameworkGroup" />
+
+        </Feature>
+
+        <Feature Id="Net_1.1_ConsoleRunner" Level="10" Title="Console Runner" Display="expand"
+				         Description="Installs NUnit console runner for .NET 1.1">
+
+          <ComponentGroupRef Id="Net_1.1_FrameworkGroup"/>
+          <ComponentGroupRef Id="Net_1.1_CoreGroup"/>
+          <ComponentGroupRef Id="Net_1.1_ConsoleRunnerGroup" />
+
+        </Feature>
+
+        <Feature Id="Net_1.1_PNUnitRunner" Level="10" Title='PNUnit Runner' Display='expand'
+                 Description="Installs the PNUnit runner for parallel distributed tests">
+
+          <ComponentGroupRef Id="pnunit_1.1"/>
+
+        </Feature>
+
+        <Feature Id="Net_1.1_TestsFeature" Level="10" Title='Unit Tests' Display='expand'
+				         Description='Unit tests for NUnit under .NET 1.1' >
+
+          <ComponentGroupRef Id="Net_1.1_TestsGroup" />
+
+        </Feature>
+
+      </Feature>
+
+      <Feature Id="DocumentationFeature" Level="1" Title='Documentation' Display='expand'
+			         Description="HTML documentation for NUNit">
+
+        <ComponentGroupRef Id="DocumentationComponents"/>
+
+      </Feature>
+
+
+      <!-- Defined in samples.wxs -->
+      <Feature Id="SamplesFeature" Level="1" Title='Samples' Display='expand'
+               Description='Sample code showing the use of NUnit' >
+
+        <ComponentGroupRef Id="SampleComponents"/>
+
+      </Feature>
+
+    </Feature>
+
+    <!-- The NUnit files are all in a single cab file that is embedded in the MSI -->
+    <Media Id="1" EmbedCab="yes" Cabinet="nunit.cab" />
+
+    <!-- ***************************************************************** -->
+    <!-- **********  Define our GUI using standard WiX UI       ********** -->
+    <!-- ***************************************************************** -->
+
+    <UIRef Id="WixUI_Mondo" />
+    <!--<UIRef Id="WixUI_FeatureTree" />-->
+    <UIRef Id="WixUI_ErrorProgressText" />
+
+    <!-- ***************************************************************** -->
+    <!-- **********       Define Top-level Components           ********** -->
+    <!-- ***************************************************************** -->
+
+    <DirectoryRef Id="INSTALLDIR">
+
+      <Component Id="C__LOGO" Guid="99080421-75CC-4DFC-0987-AA16B7E68659">
+        <File Id="_LOGO" Name="Logo.ico" Source="Logo.ico" Vital="yes" KeyPath="yes" DiskId="1" />
+        <RemoveFile Id="RemoveThumbnails" Name="*" On="uninstall" />
+      </Component>
+
+      <Component Id="C__LICENSE" Guid="7D03AE6B-15A7-16E0-0D21-D65708B2FA79">
+        <File Id="_LICENSE" Name="license.txt" Source="license.txt" Vital="yes" KeyPath="yes" DiskId="1" />
+      </Component>
+
+      <Component Id="C__FIT_LICENSE" Guid="6C47563D-CDCD-4a65-BD89-A37F3A3C681D">
+        <File Id="fit_license.txt" Name="FITLICNS.TXT" LongName="fit-license.txt"
+              Source="fit-license.txt" Vital="yes" KeyPath="yes" DiskId="1" />
+      </Component>
+
+      <Component Id="InstallationRegistryEntry" Guid="FD139082-C1B1-46be-AA70-BA970EBDF397">
+
+        <Registry Id="R__INSTALLDIR" Root="HKMU"
+                  Key="Software\[Manufacturer]\NUnit\$(var.NominalVersion)"
+                  Name="InstallDir" Action="write" Type="string" Value="[INSTALLDIR]" />
+
+        <Registry Id="R__ProductVersion" Root="HKMU"
+                  Key="Software\[Manufacturer]\NUnit\$(var.NominalVersion)"
+                  Name="ProductVersion" Action="write" Type="string" Value="[ProductVersion]" />
+
+      </Component>
+
+    </DirectoryRef>
+
+  </Product>
+</Wix>
\ No newline at end of file
diff --git a/install/bin.wxs b/install/bin.wxs
new file mode 100644
index 0000000..4f6b4fc
--- /dev/null
+++ b/install/bin.wxs
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Wix xmlns="http://schemas.microsoft.com/wix/2003/01/wi">
+  <Fragment>
+
+    <ComponentGroup Id="Net_1.1_FrameworkGroup">
+      <ComponentRef Id="nunit.framework_1.1"/>
+      <ComponentRef Id="nunit.mocks_1.1"/>
+      <ComponentRef Id="AssemblyReferenceFolder_1.1"/>
+    </ComponentGroup>
+
+    <ComponentGroup Id="Net_1.1_CoreGroup">
+      <ComponentRef Id="nunit.core_1.1"/>
+      <ComponentRef Id="nunit.core.interfaces_1.1"/>
+      <ComponentRef Id="nunit.util_1.1"/>
+      <ComponentRef Id="Net_1.1_AddinsFolder"/>
+    </ComponentGroup>
+
+    <ComponentGroup Id="Net_1.1_ConsoleRunnerGroup">
+      <ComponentRef Id="console.exe_1.1"/>
+      <ComponentRef Id="console.dll_1.1"/>
+      <ComponentRef Id="agent.exe_1.1"/>
+    </ComponentGroup>
+
+    <ComponentGroup Id="Net_2.0_FrameworkGroup">
+      <ComponentRef Id="nunit.framework_2.0"/>
+      <ComponentRef Id="nunit.mocks_2.0"/>
+      <ComponentRef Id="AssemblyReferenceFolder_2.0"/>
+    </ComponentGroup>
+
+    <ComponentGroup Id="Net_2.0_CoreGroup">
+      <ComponentRef Id="nunit.core_2.0"/>
+      <ComponentRef Id="nunit.core.interfaces_2.0"/>
+      <ComponentRef Id="nunit.util_2.0"/>
+      <ComponentRef Id="Net_2.0_AddinsFolder"/>
+    </ComponentGroup>
+
+    <ComponentGroup Id="Net_2.0_ConsoleRunnerGroup">
+      <ComponentRef Id="console.exe_2.0"/>
+      <ComponentRef Id="consolex86.exe"/>
+      <ComponentRef Id="console.dll_2.0"/>
+      <ComponentRef Id="agent.exe_2.0"/>
+      <ComponentRef Id="agentx86.exe"/>
+    </ComponentGroup>
+
+    <DirectoryRef Id="net_1.1" FileSource="bin\net-1.1">
+
+      <Component Id="console.exe_1.1" DiskId="1" Guid="DE968C7C-5145-416f-8E85-82E7989CBC83">
+        <File Id="console.exe_1.1" Name="CONSOLE.EXE" LongName="nunit-console.exe" />
+        <File Id="console.config_1.1" Name="CONSOLE.CFG" LongName="nunit-console.exe.config" />
+      </Component>
+      
+ <!--
+      <Component Id="NUnitServer" DiskId="1" Guid="Need Guid">
+        <File Id="F__nunit_server_exe" Name="NUS.EXE" LongName="nunit-server.exe" Source="nunit-server.exe" />
+        <File Id="F__nunit_test_server_dll" Name="NUNTS.DLL" LongName="nunit-test-server.dll" Source="nunit-test-server.dll" /> 
+      </Component>
+   -->
+
+      <Component Id="agent.exe_1.1" DiskId="1" Guid="91C3ED1C-16A0-49f1-9FD3-ED72AF060CD6">
+        <File Id="agent.exe_1.1" Name="AGENT.EXE" LongName="nunit-agent.exe" />
+        <File Id="agent.config_1.1" Name="AGENT.CFG" LongName="nunit-agent.exe.config" />
+      </Component>
+          	  
+    </DirectoryRef>
+
+    <DirectoryRef Id="lib_1.1" FileSource="bin\net-1.1\lib">
+
+      <Component Id="nunit.core_1.1" DiskId="1" Guid="15222234-C43E-4f31-B2C3-E83995627A68">
+        <File Id="nunit.core_1.1" Name="CORE.DLL" LongName="nunit.core.dll" />
+      </Component>
+
+      <Component Id="nunit.core.interfaces_1.1" DiskId="1" Guid="9D9C1B32-3B31-46bc-B8A2-BF359F69F389">
+        <File Id="nunit.core.interfaces_1.1" Name="IFACES.DLL" LongName="nunit.core.interfaces.dll" />
+      </Component>
+
+      <Component Id="nunit.util_1.1" DiskId="1" Guid="47D85562-08D1-4312-B4C3-6BFF078A635B">
+        <File Id="nunit.util_1.1" Name="UTIL.DLL" LongName="nunit.util.dll" />
+      </Component>
+
+      <Component Id="console.dll_1.1" DiskId="1" Guid="DE968C7C-5145-416f-8E85-82E7989CBC83">
+        <File Id="console.dll_1.1" Name="CONSOLE.DLL" LongName="nunit-console-runner.dll" />
+      </Component>
+
+    </DirectoryRef>
+
+    <DirectoryRef Id="addins_1.1">
+
+      <Component Id="Net_1.1_AddinsFolder" DiskId="1" Guid="5DBAEF2B-DF1A-4582-9036-1261B3421EE8">
+        <CreateFolder />
+        <RemoveFile Id="RemoveAddins_1.1" Name="*.*" On="uninstall" />
+        <RemoveFolder Id="RemoveAddinFolder_1.1" On="uninstall"/>
+      </Component>
+    		
+    </DirectoryRef>
+    	
+    <DirectoryRef Id="framework_1.1" FileSource="bin\net-1.1\framework">
+
+      <Component Id="nunit.framework_1.1" DiskId="1" Guid="913D2A45-E701-4f64-A779-D2614B3D322D">
+        <File Id="nunit.framework_1.1" Name="FRAMEWRK.DLL" LongName="nunit.framework.dll" />
+        <File Id="nunit.framework.xml_net_1.1" Name="FRAMEWRK.XML" LongName="nunit.framework.xml" />
+      </Component>
+
+      <Component Id="nunit.mocks_1.1" DiskId="1" Guid="E495EDF2-8A89-4e6c-A59B-D94A7703E22C">
+        <File Id="nunit.mocks_1.1" Name="MOCKS.DLL" LongName="nunit.mocks.dll" />
+      </Component>
+
+      <Component Id="AssemblyReferenceFolder_1.1" DiskId="1" Guid="DE37BD75-E15B-4df6-8E33-FEDE23AA6DF6">
+        
+        <Registry Id="Assemblies_1.1" Root="HKMU"
+                  Key="Software\Microsoft\.NETFramework\AssemblyFolders\NUnit [ProductVersion]"
+                  Action="createKeyAndRemoveKeyOnUninstall">
+          <Registry Id="Assemblies_1.1_Default" Action="write" Type="string" Value="[framework_1.1]" />
+        </Registry>
+
+      </Component>
+        
+    </DirectoryRef>
+    	
+    <DirectoryRef Id="net_2.0" FileSource="bin\net-2.0">
+
+      <Component Id="console.exe_2.0" DiskId="1" Guid="678873A1-D670-455c-B44A-C5C7FC16B4EF">
+        <File Id="console.exe_2.0" Name="CONSOLE.EXE" LongName="nunit-console.exe" />
+        <File Id="console.config_2.0" Name="CONSOLE.CFG" LongName="nunit-console.exe.config" />
+      </Component>
+      
+      <Component Id="consolex86.exe" DiskId="1" Guid="1243DDA4-E8A0-422d-BD0C-14F1D3EDCFCA">
+        <File Id="consolex86.exe" Name="CONSOL86.EXE" LongName="nunit-console-x86.exe" />
+        <File Id="consolex86.config" Name="CONSOL86.CFG" LongName="nunit-console-x86.exe.config" />
+      </Component>
+                
+      <Component Id="agent.exe_2.0" DiskId="1" Guid="E0819EB1-2DCE-4648-81CB-0C101ECB0109">
+        <File Id="agent.exe_2.0" Name="AGENT.EXE" LongName="nunit-agent.exe" />
+        <File Id="agent.config_2.0" Name="AGENT.CFG" LongName="nunit-agent.exe.config" />
+      </Component>
+
+      <Component Id="agentx86.exe" DiskId="1" Guid="D2417C51-E283-4d75-BD4D-E47D9A7E64CD">
+        <File Id="agentx86.exe" Name="AGENTX86.EXE" LongName="nunit-agent-x86.exe" />
+        <File Id="agentx86.config" Name="AGENTX86.CFG" LongName="nunit-agent-x86.exe.config" />
+      </Component>
+          	  
+    </DirectoryRef>
+
+    <DirectoryRef Id="lib_2.0" FileSource="bin\net-2.0\lib">
+
+      <Component Id="nunit.core_2.0" DiskId="1" Guid="4AA0CB6E-27FE-4e9b-B496-E3D7F2AAAC05">
+        <File Id="nunit.core_2.0" Name="CORE.DLL" LongName="nunit.core.dll" />
+      </Component>
+      
+      <Component Id="nunit.core.interfaces_2.0" DiskId="1" Guid="A2739889-9EF7-4770-8015-A04D2CFF1A36">
+        <File Id="nunit.core.interfaces_2.0" Name="IFACES.DLL" LongName="nunit.core.interfaces.dll" />
+      </Component>
+      
+      <Component Id="nunit.util_2.0" DiskId="1" Guid="78E58FF1-C407-4f23-A989-74C289915D2C">
+        <File Id="nunit.util_2.0" Name="UTIL.DLL" LongName="nunit.util.dll" />
+      </Component>
+      
+      <Component Id="console.dll_2.0" DiskId="1" Guid="50CB13FF-AC66-4de9-8BCE-0AAB3E96DE70">
+        <File Id="console.dll_2.0" Name="CONSOLE.DLL" LongName="nunit-console-runner.dll" />
+      </Component>
+
+    </DirectoryRef>
+
+    <DirectoryRef Id="addins_2.0">
+    	
+      <Component Id="Net_2.0_AddinsFolder" DiskId="1" Guid="5DBAEF2B-DF1A-4582-9036-1261B3421EE8">
+        <CreateFolder />
+        <RemoveFile Id="RemoveAddins_2.0" Name="*.*" On="uninstall" />
+        <RemoveFolder Id="RemoveAddinFolder_2.0" On="uninstall"/>
+      </Component>
+    		
+    </DirectoryRef>
+    	
+    <DirectoryRef Id="framework_2.0" FileSource="bin\net-2.0\framework">
+
+      <Component Id="nunit.framework_2.0" DiskId="1" Guid="5654EFF0-F41F-44f4-A13F-33A0D11709EA">
+        <File Id="nunit.framework_2.0" Name="FRAMEWRK.DLL" LongName="nunit.framework.dll" />
+        <File Id="nunit.framework.xml_2.0" Name="FRAMEWRK.XML" LongName="nunit.framework.xml" />
+      </Component>
+
+      <Component Id="nunit.mocks_2.0" DiskId="1" Guid="890C81D4-6423-4863-9EA0-C62DB88AF5BB">
+        <File Id="nunit.mocks_2.0" Name="MOCKS.DLL" LongName="nunit.mocks.dll" />
+      </Component>
+
+      <Component Id="AssemblyReferenceFolder_2.0" DiskId="1" Guid="65AB502C-FC28-4c85-AF32-15384D5050FF">
+        <Registry Id="R__Assemblies_2.0" Root="HKMU"
+                  Key="Software\Microsoft\.NETFramework\v2.0.50727\AssemblyFoldersEx\NUnit [ProductVersion]"
+                  Action="createKeyAndRemoveKeyOnUninstall">
+
+          <Registry Id="R__Assemblies_2.0_Default" Action="write" Type="string" Value="[framework_2.0]" />
+        </Registry>
+      </Component>
+
+    </DirectoryRef>
+  	
+  </Fragment>
+</Wix>
\ No newline at end of file
diff --git a/install/doc.wxs b/install/doc.wxs
new file mode 100644
index 0000000..ace1774
--- /dev/null
+++ b/install/doc.wxs
@@ -0,0 +1,165 @@
+<Wix xmlns="http://schemas.microsoft.com/wix/2003/01/wi">
+  <Fragment>
+
+	<ComponentGroup Id="DocumentationComponents">  
+		<ComponentRef Id="HtmlDocs" />
+		<ComponentRef Id="DocFiles" />
+		<ComponentRef Id="DocImages" />
+	</ComponentGroup>
+	
+    <DirectoryRef Id="doc" FileSource="doc">
+    
+      <Component Id="HtmlDocs" DiskId="1" Guid="6d9faf90-1ff2-11db-a98b-0800200c9a66">
+        <File Id="nunit.css" Name="nunit.css" />
+        <File Id="codeFuncs.js" Name="CODEFNCS.JS" LongName="codeFuncs.js" />
+        <File Id="favicon.ico" Name="favicon.ico" />
+        <File Id="addinsDialog.html" Name="ADDINDLG.HTM" LongName="addinsDialog.html" />
+        <File Id="assemblyIsolation.html" Name="ASMISLTN.HTM" LongName="assemblyIsolation.html" />
+        <File Id="assertions.html" Name="ASSERT_1.HTM" LongName="assertions.html" />
+        <File Id="attributes.html" Name="ATTRIB_1.HTM" LongName="attributes.html" />
+        <File Id="category.html" Name="CATEGO_1.HTM" LongName="category.html" />
+        <File Id="collectionAssert.html" Name="COLLEC_1.HTM" LongName="collectionAssert.html" />
+        <File Id="collectionConstraints.html" Name="COLLEC_2.HTM" LongName="collectionConstraints.html" />
+        <File Id="combinatorial.html" Name="COMBINAT.HTM" LongName="combinatorial.html" />
+        <File Id="comparisonAsserts.html" Name="COMPAR_1.HTM" LongName="comparisonAsserts.html" />
+        <File Id="comparisonConstraints.html" Name="COMPAR_2.HTM" LongName="comparisonConstraints.html" />
+        <File Id="compoundConstraints.html" Name="COMPOUND.HTM" LongName="compoundConstraints.html" />
+        <File Id="conditionAsserts.html" Name="CONDIT_1.HTM" LongName="conditionAsserts.html" />
+        <File Id="conditionConstraints.html" Name="CONDIT_2.HTM" LongName="conditionConstraints.html" />
+        <File Id="configEditor.html" Name="CONFIG_1.HTM" LongName="configEditor.html" />
+        <File Id="configFiles.html" Name="CONFIG_2.HTM" LongName="configFiles.html" />
+        <File Id="consoleCommandLine.html" Name="CONSOL_1.HTM" LongName="consoleCommandLine.html" />
+        <File Id="constraintModel.html" Name="CON_MODL.HTM" LongName="constraintModel.html" />
+        <File Id="contextMenu.html" Name="CONTEX_1.HTM" LongName="contextMenu.html" />
+        <File Id="culture.html" Name="CULTURE.HTM" LongName="culture.html" />
+        <File Id="customConstraints.html" Name="CUSTOM_2.HTM" LongName="customConstraints.html" />
+        <File Id="datapoint.html" Name="DATAPNT.HTM" LongName="datapoint.html" />
+        <File Id="datapointProviders.html" Name="DPNTPROV.HTM" LongName="datapointProviders.html" />
+        <File Id="delayedConstraint.html" Name="DELAYED.HTM" LongName="delayedConstraint.html" />
+        <File Id="description.html" Name="DESCRIP.HTM" LongName="description.html" />
+        <File Id="directoryAssert.html" Name="DIRASSRT.HTM" LongName="directoryAssert.html" />
+        <File Id="equalConstraint.html" Name="EQUALCON.HTM" LongName="equalConstraint.html" />
+        <File Id="equalityAsserts.html" Name="EQUALI_1.HTM" LongName="equalityAsserts.html" />
+        <File Id="eventListeners.html" Name="LISTNERS.HTM" LongName="eventListeners.html" />
+        <File Id="exception.html" Name="EXCEPT_1.HTM" LongName="exception.html" />
+        <File Id="exceptionAsserts.html" Name="EXCEPT_2.HTM" LongName="exceptionAsserts.html" />
+        <File Id="explicit.html" Name="EXPLIC_1.HTM" LongName="explicit.html" />
+        <File Id="extensibility.html" Name="EXTENSBL.HTM" LongName="extensibility.html" />
+        <File Id="extensionTips.html" Name="DATAPNT.HTM" LongName="extensionTips.html" />
+        <File Id="fileAssert.html" Name="FILEAS_1.HTM" LongName="fileAssert.html" />
+        <File Id="fixtureSetup.html" Name="FIXTUR_1.HTM" LongName="fixtureSetup.html" />
+        <File Id="fixtureTeardown.html" Name="FIXTUR_2.HTM" LongName="fixtureTeardown.html" />
+        <File Id="getStarted.html" Name="GETSTA_1.HTM" LongName="getStarted.html" />
+        <File Id="guiCommandLine.html" Name="GUICOM_1.HTM" LongName="guiCommandLine.html" />
+        <File Id="identityAsserts" Name="IDENTI_1.HTM" LongName="identityAsserts.html" />
+        <File Id="ignore.html" Name="IGNORE_1.HTM" LongName="ignore.html" />
+        <File Id="index.html" Name="INDEX_1.HTM" LongName="index.html" >
+          <Shortcut Id="S__docs" Directory="NUnitMenu" Name="SDOCS" 
+              LongName="Documentation" Show="normal" WorkingDirectory="D__doc" />
+        </File>
+        <File Id="installation.html" Name="INSTAL_1.HTM" LongName="installation.html" />
+        <File Id="license.html" Name="LICENS_1.HTM" LongName="license.html" />
+        <File Id="listMapper.html" Name="LISTMAP.HTM" LongName="listMapper.html" />
+        <File Id="mainMenu.html" Name="MAINME_1.HTM" LongName="mainMenu.html" />
+        <File Id="maxtime.html" Name="MAXTIME.HTM" LongName="maxtime.html" />
+        <File Id="multiAssembly.html" Name="MULTIA_1.HTM" LongName="multiAssembly.html" />
+        <File Id="nunit_agent.html" Name="NU_AGENT.HTM" LongName="nunit-agent.html" />
+        <File Id="nunit_console.html" Name="NUNIT-_1.HTM" LongName="nunit-console.html" />
+        <File Id="nunit_gui.html" Name="NUNIT-_2.HTM" LongName="nunit-gui.html" />
+        <File Id="nunitAddins.html" Name="ADDINS.HTM" LongName="nunitAddins.html" />
+        <File Id="pairwise.html" Name="PAIRWISE.HTM" LongName="pairwise.html" />
+        <File Id="parameterizedTests.html" Name="PARMTSTS.HTM" LongName="parameterizedTests.html" />
+        <File Id="pathConstraints.html" Name="PATHCNST.HTM" LongName="pathConstraints.html" />
+        <File Id="platform.html" Name="PLATFO_1.HTM" LongName="platform.html" />
+        <File Id="pnunit.html" Name="PNUNIT.HTM" LongName="pnunit.html" />
+        <File Id="projectEditor.html" Name="PROJEC_1.HTM" LongName="projectEditor.html" />
+        <File Id="property.html" Name="PROPER_1.HTM" LongName="property.html" />
+        <File Id="propertyConstraint.html" Name="PROPER_2.HTM" LongName="propertyConstraint.html" />
+        <File Id="quickstart.html" Name="QUICKS_1.HTM" LongName="quickStart.html" />
+        <File Id="random.html" Name="RANDOM.HTM" LongName="random.html" />
+        <File Id="range.html" Name="RANGE.HTM" LongName="range.html" />
+        <File Id="releaseNotes.html" Name="RELNOTES.HTM" LongName="releaseNotes.html" />
+        <File Id="repeat.html" Name="REPEAT.HTM" LongName="repeat.html" />
+        <File Id="requiredAddin.html" Name="REQADDIN.HTM" LongName="requiredAddin.html" />
+        <File Id="requiresMTA.html" Name="REQMTA.HTM" LongName="requiresMTA.html" />
+        <File Id="requiresSTA.html" Name="REQSTA.HTM" LongName="requiresSTA.html" />
+        <File Id="requiresThread.html" Name="REQTHRD.HTM" LongName="requiresThread.html" />
+        <File Id="reusableConstraint.html" Name="REUSABLE.HTM" LongName="reusableConstraint.html" />
+        <File Id="runningTests.html" Name="RUNTESTS.HTM" LongName="runningTests.html" />
+        <File Id="runtimeSelection.html" Name="RUNTIME.HTM" LongName="runtimeSelection.html" />
+        <File Id="sameasConstraint.html" Name="SAMEAS.HTM" LongName="sameasConstraint.html" />
+        <File Id="samples.html" Name="SAMPLE_1.HTM" LongName="samples.html" />
+        <File Id="sequential.html" Name="SEQUENTL.HTM" LongName="sequential.html" />
+        <File Id="setCulture.html" Name="SETCULTR.HTM" LongName="setCulture.html" />
+        <File Id="setUICulture.html" Name="SETUICLT.HTM" LongName="setUICulture.html" />
+        <File Id="settingsDialog.html" Name="SETTINGS.HTM" LongName="settingsDialog.html" />
+        <File Id="setup.html" Name="SETUP_1.HTM" LongName="setup.html" />
+        <File Id="setupFixture.html" Name="SETUPF_1.HTM" LongName="setupFixture.html" />
+        <File Id="stringAssert.html" Name="STRING_1.HTM" LongName="stringAssert.html" />
+        <File Id="stringConstraints.html" Name="STRING_2.HTM" LongName="stringConstraints.html" />
+        <File Id="suite.html" Name="SUITE_1.HTM" LongName="suite.html" />
+        <File Id="suiteBuilders.html" Name="SBUILDRS.HTM" LongName="suiteBuilders.html" />
+        <File Id="teardown.html" Name="TEARDO_1.HTM" LongName="teardown.html" />
+        <File Id="test.html" Name="TEST.HTM" LongName="test.html" />
+        <File Id="testCase.html" Name="TESTCASE.HTM" LongName="testCase.html" />
+        <File Id="testcaseBuilders.html" Name="TBUILDRS.HTM" LongName="testcaseBuilders.html" />
+        <File Id="testcaseProviders.html" Name="TCPRVDRS.HTM" LongName="testcaseProviders.html" />
+        <File Id="testCaseSource.html" Name="TCSOURCE.HTM" LongName="testCaseSource.html" />
+        <File Id="testDecorators.html" Name="DCORATRS.HTM" LongName="testDecorators.html" />
+        <File Id="testFixture.html" Name="TESTFI_1.HTM" LongName="testFixture.html" />
+        <File Id="testProperties.html" Name="TESTPR_1.HTM" LongName="testProperties.html" />
+        <File Id="theory.html" Name="THEORY.HTM" LongName="theory.html" />
+        <File Id="throwsConstraint.html" Name="THRWSCON.HTM" LongName="throwsConstraint.html" />
+        <File Id="timeout.html" Name="TIMEOUT.HTM" LongName="timeout.html" />
+        <File Id="typeAsserts.html" Name="TYPEAS_1.HTM" LongName="typeAsserts.html" />
+        <File Id="typeConstraints.html" Name="TYPECON.HTM" LongName="typeConstraints.html" />
+        <File Id="upgrade.html" Name="UPGRAD_1.HTM" LongName="upgrade.html" />
+        <File Id="utilityAsserts.html" Name="UTILIT_1.HTM" LongName="utilityAsserts.html" />
+        <File Id="values.html" Name="VALUES.HTM" LongName="values.html" />
+        <File Id="valueSource.html" Name="VALUESRC.HTM" LongName="valueSource.html" />
+        <File Id="vsSupport.html" Name="VSSUPPRT.HTM" LongName="vsSupport.html" />
+	    <RemoveFile Id="RemoveThumbnails_Doc" Name="*" On="uninstall" />
+      </Component>
+    </DirectoryRef>
+		
+    <DirectoryRef Id="files" FileSource="doc\files" >
+      <Component Id="DocFiles" DiskId="1" Guid="757c2ae0-1ff2-11db-a98b-0800200c9a66">
+        <File Id="F__doc_file70" Name="QUICKS_2.DOC" LongName="QuickStart.doc" />
+        <File Id="F__doc_file71" Name="QUICKS_1.DOC" LongName="QuickStart.Spanish.doc" />
+        <File Id="F__doc_file72" Name="Results.xsd" />
+        <File Id="F__doc_file73" Name="SUMMAR_1.XSL" LongName="Summary.xslt" />
+        <File Id="F__doc_file75" Name="TESTRE_1.XML" LongName="TestResult.xml" />
+        <RemoveFile Id="RemoveThumbnails_Doc_Files" Name="*" On="uninstall" />
+      </Component>
+    </DirectoryRef>
+		
+    <DirectoryRef Id="img" FileSource="doc\img">
+      <Component Id="DocImages" DiskId="1" Guid="7bb6dd10-1ff2-11db-a98b-0800200c9a66">
+        <File Id="addinsDialog.jpg" Name="ADDINDLG.JPG" LongName="addinsDialog.jpg" />
+        <File Id="advancedSettings.jpg" Name="ADVANCED.JPG" LongName="advancedSettings.jpg" />
+        <File Id="assemblyReloadSettings.jpg" Name="ASRELOAD.JPG" LongName="assemblyReloadSettings.jpg" />
+        <File Id="assembliesTab.jpg" Name="ASSEMB_1.JPG" LongName="assembliesTab.jpg" />
+        <File Id="bulletOff.gif" Name="BULLET_1.GIF" LongName="bulletOff.gif" />
+        <File Id="bulletOn.gif" Name="bulletOn.gif" />
+        <File Id="configEditor.jpg" Name="CONFIG_1.JPG" LongName="configEditor.jpg" />
+        <File Id="console_mock.jpg" Name="CONSOL_1.JPG" LongName="console-mock.jpg" />
+        <File Id="generalSettings.jpg" Name="GENERAL.JPG" LongName="generalSettings.jpg" />
+        <File Id="generalTab.jpg" Name="GENERA_1.JPG" LongName="generalTab.jpg" />
+        <File Id="gui_screenshot.jpg" Name="GUI-SC_1.JPG" LongName="gui-screenshot.jpg" />
+        <File Id="gui_verify.jpg" Name="GUI-VE_1.JPG" LongName="gui-verify.jpg" />
+        <File Id="internalTraceSettings.jpg" Name="NTRACE.JPG" LongName="internalTraceSettings.jpg" />
+        <File Id="langFilter.gif" Name="LANGFI_1.GIF" LongName="langFilter.gif" />
+        <File Id="logo.gif" Name="logo.gif" />
+        <File Id="miniGui.jpg" Name="miniGui.jpg" />
+        <File Id="testProperties.jpg" Name="TESTPR_1.JPG" LongName="testProperties.jpg" />
+        <File Id="testLoadSettings.jpg" Name="TESTLOAD.JPG" LongName="testLoadSettings.jpg" />
+        <File Id="testResultSettings.jpg" Name="TESTRSLT.JPG" LongName="testResultSettings.jpg" />
+        <File Id="textOutputSettings.jpg" Name="TEXTOTPT.JPG" LongName="textOutputSettings.jpg" />
+        <File Id="treeDisplaySettings.jpg" Name="TREEDISP.JPG" LongName="treeDisplaySettings.jpg" />
+        <File Id="visualStudioSettings.jpg" Name="VSTUDIO.JPG" LongName="visualStudioSettings.jpg" />
+        <RemoveFile Id="RemoveThumbnails_Doc_Img" Name="*" On="uninstall" />
+      </Component>
+    </DirectoryRef>
+	
+  </Fragment>
+</Wix>
diff --git a/install/nunit-gui.wxs b/install/nunit-gui.wxs
new file mode 100644
index 0000000..bfd1b39
--- /dev/null
+++ b/install/nunit-gui.wxs
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Wix xmlns="http://schemas.microsoft.com/wix/2003/01/wi"> 
+  <Fragment> 
+    
+    <ComponentGroup Id="Net_2.0_GuiRunnerGroup">
+      <ComponentRef Id="nunit.exe_2.0" />
+      <ComponentRef Id="nunit_x86.exe" />
+      <ComponentRef Id="nunit_gui_runner_2.0" />
+      <ComponentRef Id="nunit.uikit_2.0" />
+      <ComponentRef Id="nunit.uiexception.dll" />
+      <ComponentRef Id="DllFileAssociation_2.0" />
+      <ComponentRef Id="NUnitProjectFileAssociation_2.0" />
+      <ComponentRef Id="MenuShortcut_NUnit" />
+      <ComponentRef Id="MenuShortcut_2.0" />
+      <ComponentRef Id="MenuShortcut_Mono_2.0" />
+    </ComponentGroup>
+        
+    <DirectoryRef Id="net_2.0" FileSource="bin\net-2.0">
+             
+      <Component Id="nunit.exe_2.0" DiskId="1" Guid="E0AFF731-3B75-4a29-A885-076A46533D2D">
+        <File Id="nunit.exe_2.0" Name="nunit.exe">
+          <!--<Shortcut Id="DesktopShortcut" Directory="DesktopFolder"
+          Name="SNUNITDT" LongName="NUnit $(var.NominalVersion)" 
+          Icon="nunit_icon.exe" IconIndex="0" Show="normal" 
+          Advertise="no" WorkingDirectory="bin" />-->
+        </File>
+        <File Id="nunit.config_2.0" Name="NUNIT.CFG" LongName="nunit.exe.config" />
+      </Component>
+      		
+      <Component Id="nunit_x86.exe" DiskId="1" Guid="3D07B159-305C-4fa9-979B-2B50C439E024">
+        <File Id="nunit_x86.exe" Name="NUNITX86.EXE" LongName="nunit-x86.exe" />
+        <File Id="nunit_x86.config" Name="NUNITX86.CFG" LongName="nunit-x86.exe.config" />
+      </Component>
+
+      <Component Id="DllFileAssociation_2.0" Guid="51496B17-0252-4adf-9850-1E0841E5A51B">
+
+        <Registry Id="R__OpenDllWith_2.0" Root="HKCR" Key=".dll\OpenWithList\nunit.exe"/>
+
+        <Registry Id="R__OpenDll_2.0_1" Root="HKCR" Key="dllfile\shell\OpenWithNUnit"
+          Action="write" Type="string" Value="Run &Tests" />
+
+      </Component>
+      		
+      <Component Id="NUnitProjectFileAssociation_2.0" Guid="74E041CF-5345-4563-BAE6-1D1BFC72CC1F">
+
+        <Registry Id="R__OpenDll_2.0_2" Root="HKCR" Key="dllfile\shell\OpenWithNUnit\command"
+          Action="write" Type="string" Value='"[!nunit.exe_2.0]" "%1"' />
+
+        <Registry Id="R__OpenNUnit_2.0_1" Root="HKCR" Key=".nunit"
+          Action="write" Type="string" Value="NUnitTestProject" />
+
+        <Registry Id="R__OpenNUnit_2.0_2" Root="HKCR" Key="NUnitTestProject"
+          Action="write" Type="string" Value="NUnit Test Project" />
+
+        <Registry Id="R__OpenNUnit_2.0_3" Root="HKCR" Key="NUnitTestProject\DefaultIcon"
+          Action="write" Type="string" Value="[!nunit.exe_2.0],0" />
+
+        <Registry Id="R__OpenNUnit_2.0_4" Root="HKCR" Key="NUnitTestProject\shell\Open"
+          Action="write" Type="string" Value="&Open" />
+
+        <Registry Id="R__OpenNUnit_2.0_5" Root="HKCR" Key="NUnitTestProject\shell\Open\command"
+          Action="write" Type="string" Value='"[!nunit.exe_2.0]" "%1"' />
+
+      </Component>
+
+      <Component Id="MenuShortcut_NUnit" DiskId="1" Guid="55FE94D3-743A-4733-BF01-B296240931C1">
+        <Condition>FRAMEWORK20 = "50727-50727"</Condition>
+        <Shortcut Id="MenuShortcut_NUnit" Name="NUnit" 
+                  Target="[!nunit.exe_2.0]" Advertise="no" Directory="NUnitMenu" 
+                  Icon="nunit_icon.exe" IconIndex="0" Show="normal" 
+                  WorkingDirectory="net_2.0" />
+      </Component>
+      		
+      <Component Id="MenuShortcut_2.0" DiskId="1" Guid="A771FB75-2488-4f2c-BA22-1F4C85D64AC7">
+        <Condition>FRAMEWORK20 = "50727-50727"</Condition>
+        <Shortcut Id="MenuShortcut_2.0" Name="SNUNIT20" LongName="NUnit (.NET 2.0)" 
+                  Target="[!nunit.exe_2.0]" Advertise="no" Directory="RunUnderMenu" 
+                  Icon="nunit_icon.exe" IconIndex="0" Show="normal" 
+                  WorkingDirectory="net_2.0" />
+      </Component>
+      		
+      <Component Id="MenuShortcut_Mono_2.0" DiskId="1" Guid="CDCB0BAA-0C50-4e41-A2B8-5C15027843DF">
+        <Condition>MONODIRECTORY</Condition>
+        <Shortcut Id="MenuShortcut_Mono_2.0" Name="SNUNITMO" LongName="NUnit (Mono 2.0 Profile)" 
+                  Target="[MONODIRECTORY]bin\mono.exe" Arguments="nunit.exe"  Advertise="no"
+                  Directory="RunUnderMenu" Icon="nunit_icon.exe" IconIndex="0" Show="normal" 
+                  WorkingDirectory="net_2.0" />
+      </Component>
+    		     				
+    </DirectoryRef>
+
+    <DirectoryRef Id="lib_2.0" FileSource="bin\net-2.0\lib">
+
+      <Component Id="nunit_gui_runner_2.0" DiskId="1" Guid="7A62D7B2-1D0D-4cb4-9C52-00DBBBDAA0A2">
+        <File Id="nunit_gui_runner_2.0" Name="GUI.DLL" LongName="nunit-gui-runner.dll" />
+      </Component>
+      		
+      <Component Id="nunit.uikit_2.0" DiskId="1" Guid="5B256DDD-668C-4bdd-AC91-7EF0D961F6E6">
+        <File Id="nunit.uikit_2.0" Name="UIKIT.DLL" LongName="nunit.uikit.dll" />
+        <File Id="skipped.png_2.0" Name="SKIPPED.PNG" LongName="skipped.png" />
+        <File Id="success.png_2.0" Name="SUCCESS.PNG" LongName="success.png" />
+        <File Id="failure.png_2.0" Name="FAILURE.PNG" LongName="failure.png" />
+        <File Id="ignored.png_2.0" Name="IGNORED.PNG" LongName="ignored.png" />
+        <File Id="inconclusive.png_2.0" Name="INCNCLSV.PNG" LongName="inconclusive.png" />
+        <RemoveFile Id="RemoveThumbnails_GUI_2.0" On="uninstall" Name="*" />
+      </Component>
+
+      <Component Id="nunit.uiexception.dll" DiskId="1" Guid="0C2AAFD9-3EDC-4e1d-ACC3-9CC2E39210C2">
+        <File Id="nunit.uiexception.dll" Name="UIXCPTN.DLL" LongName="nunit.uiexception.dll" />
+      </Component>
+      		
+    </DirectoryRef>
+
+    <Icon Id="nunit_icon.exe" SourceFile="bin\net-2.0\nunit.exe" />
+	
+  </Fragment>
+</Wix>
\ No newline at end of file
diff --git a/install/samples.wxs b/install/samples.wxs
new file mode 100644
index 0000000..c953008
--- /dev/null
+++ b/install/samples.wxs
@@ -0,0 +1,263 @@
+<Wix xmlns="http://schemas.microsoft.com/wix/2003/01/wi">
+  <Fragment>
+
+	<ComponentGroup Id="SampleComponents">
+		<ComponentRef Id="C__SamplesCommon" />
+		<ComponentRef Id="C__SampleShortcuts" />
+
+		<!-- C# Samples -->
+		<ComponentRef Id="C__CSharp_Samples" />
+		<ComponentRef Id="C__CSharp_Failures" />
+		<ComponentRef Id="C__CSharp_Money" />
+		<ComponentRef Id="C__CSharp_Syntax" />
+	
+		<!-- J# Samples -->
+		<ComponentRef Id="C__JSharp_Samples" />
+		<ComponentRef Id="C__JSharp_Failures" />
+
+		<!-- Managed C++ Samples -->
+		<ComponentRef Id="C__CPP_Managed_Samples" />
+		<ComponentRef Id="C__CPP_Managed_Failures" />
+
+		<!-- C++/CLI Samples -->
+		<ComponentRef Id="C__CPP_CLI_Samples" />
+		<ComponentRef Id="C__CPP_CLI_Failures" />
+		<ComponentRef Id="C__CPP_CLI_Syntax" />
+
+		<!-- VB Sample -->
+		<ComponentRef Id="C__VB_Samples" />
+		<ComponentRef Id="C__VB_Failures" />
+		<ComponentRef Id="C__VB_Money" />
+	    <ComponentRef Id="C__VB_Syntax" />
+		
+		<!-- Core Extensibility Samples -->
+		<ComponentRef Id="C__CoreExtensibility" />
+		<ComponentRef Id="C__MinimalAddin" />
+		<ComponentRef Id="C__SampleSuiteExtension" />
+		<ComponentRef Id="C__SampleSuiteExtension_Tests" />
+		<ComponentRef Id="C__SampleFixtureExtension" />
+		<ComponentRef Id="C__SampleFixtureExtension_Tests" />
+	</ComponentGroup>
+		
+	<!-- Menu Shortcuts to samples -->
+	<DirectoryRef Id="samples" FileSource="$(var.InstallImage)\samples">
+	
+        <Component Id="C__SampleShortcuts" DiskId="1" Guid="CCDAEC65-EED0-4794-89D0-363EB1AC3CC9">
+          <Shortcut Id="S__csharp" Target="[csharp]" Directory="SamplesMenu" Name="SCSHARP" LongName="C#" Show="normal" />
+          <Shortcut Id="S__jsharp" Target="[jsharp]" Directory="SamplesMenu" Name="SJSHARP" LongName="J#" Show="normal" />
+          <Shortcut Id="S__cpp" Target="[cpp]" Directory="SamplesMenu" Name="SCPP" LongName="C++" Show="normal" />
+          <Shortcut Id="S__vb" Target="[vb]" Directory="SamplesMenu" Name="SVB" LongName="VB" Show="normal" />
+          <Shortcut Id="S__extensibility" Target="[extensibility]" Directory="SamplesMenu" Name="SEXTENSI" LongName="Extensibility" Show="normal" />
+	</Component>
+		
+	<Component Id="C__SamplesCommon" DiskId="1" Guid="9FBE1436-920F-450b-9E7E-D85473E727B4">
+	  <File Id="ReadMe.txt" Name="ReadMe.txt" />
+	  <File Id="samples.common" Name="SAMPLES.CMN" LongName="samples.common" />
+	</Component>
+		
+	</DirectoryRef>
+
+    <!-- C# Samples -->	
+    <DirectoryRef Id="csharp" FileSource="$(var.InstallImage)\samples\csharp">
+
+        <Component Id="C__CSharp_Samples" DiskId="1" Guid="16E59CB4-B8E0-46ac-9FE0-D08581D349EA">
+          <File Id="CSharp.sln" Name="CSharp.sln" />
+        </Component>
+	
+        <Directory Id="csharp_failures" Name="failures">
+            <Component Id="C__CSharp_Failures" DiskId="1" Guid="A80777F0-BAF4-4e68-B248-15E811041B87">
+              <File Id="CS_Failures.csproj" Name="CS-FAIL.CSP" LongName="cs-failures.csproj" />
+              <File Id="CS_Failures.build" Name="CS-FAIL.BLD" LongName="cs-failures.build" />
+              <File Id="CSharpTest.cs" Name="CS-FAIL.CS" LongName="CSharpTest.cs" />
+              <File Id="CS_Failures_AssemblyInfo.cs" Name="ASSEMB_1.CS" LongName="AssemblyInfo.cs" />
+            </Component>
+        </Directory>
+        
+        <Directory Id="csharp_money" Name="money">
+            <Component Id="C__CSharp_Money" DiskId="1" Guid="F7B5ED7B-7478-43d3-B376-06FE70EADF1B">
+              <File Id="CS_Money.cs" Name="Money.cs" />
+              <File Id="CS_MoneyTest.cs" Name="MONEYTST.CS" LongName="MoneyTest.cs" />
+              <File Id="CS_MoneyBag.cs" Name="MoneyBag.cs" />
+              <File Id="CS_Money_AssemblyInfo.cs" Name="ASSEMB_1.CS" LongName="AssemblyInfo.cs" />
+              <File Id="CS_Money.csproj" Name="MONEY.CSP" LongName="cs-money.csproj" />
+              <File Id="CS_Money.build" Name="MONEY.BLD" LongName="cs-money.build" />
+              <File Id="CS_IMoney.cs" Name="IMoney.cs" />
+            </Component>
+        </Directory>
+        	
+        <Directory Id="csharp_syntax" Name="syntax">
+            <Component Id="C__CSharp_Syntax" DiskId="1" Guid="5613D9D2-7F4B-4d49-A0C3-AEF43CF08C5B">
+              <File Id="CS_Syntax.csproj" Name="CS-SYNT.CSP" LongName="cs-syntax.csproj" />
+              <File Id="CS_Syntax.build" Name="CS-SYNT.BLD" LongName="cs-syntax.build" />
+              <File Id="CS_AssertSyntaxTests.cs" Name="CS-SYNT.CS" LongName="AssertSyntaxTests.cs" />
+              <File Id="CS_Syntax_AssemblyInfo.cs" Name="ASSEMB_1.CS" LongName="AssemblyInfo.cs" />
+            </Component>
+        </Directory>
+        
+    </DirectoryRef>
+		
+    <!-- J# Samples -->
+    <DirectoryRef Id="jsharp" FileSource="$(var.InstallImage)\samples\jsharp" >
+
+        <Component Id="C__JSharp_Samples" DiskId="1" Guid="14ECAA49-AFA8-4198-A093-B1A893445CF2">
+            <File Id="jsharp.sln" Name="jsharp.sln" />
+        </Component>
+
+        <Directory Id="jsharp_failures" Name="failures">
+          <Component Id="C__JSharp_Failures" DiskId="1" Guid="500ED4A5-E644-473d-904E-CD43D423531B">
+            <File Id="JS_Failures.vjsproj" Name="JS-FAIL.VJS" LongName="jsharp-failures.vjsproj" />
+            <File Id="JS_Failures.build" Name="JS-FAIL.BLD" LongName="jsharp-failures.build" />
+            <File Id="JS_JSharpTest.jsl" Name="JS-FAIL.JSL" LongName="JSharpTest.jsl" />
+            <File Id="JS_Failures_AssemblyInfo.jsl" Name="ASSEMB_1.JSL" LongName="AssemblyInfo.jsl" />
+          </Component>
+        </Directory>
+
+    </DirectoryRef>
+		
+    <!-- C++ Samples -->
+    <DirectoryRef Id="cpp" FileSource="$(var.InstallImage)\samples\cpp" >
+
+		<!-- Managed C++ -->
+		<Directory Id="cpp_managed" Name="managed">
+
+			<Component Id="C__CPP_Managed_Samples" DiskId="1" Guid ="FBD98E2B-FBF4-487a-850F-E133CA863706">
+				<File Id="managed_cpp.sln" Name="MNGDCPP.SLN" LongName="managed-cpp.sln" />
+			</Component>
+
+			<Directory Id="cpp_managed_failures" Name="failures">
+			<Component Id="C__CPP_Managed_Failures" DiskId="1" Guid="A32EB24D-F996-4fc6-9614-D6CD17D0EAC6">
+				<File Id="F__samples_file46" Name="CPP-FAIL.H" LongName="cppsample.h" />
+				<File Id="F__samples_file47" Name="CPP-FAIL.CPP" LongName="cppsample.cpp" />
+				<File Id="CPP_Failures.vcproj" Name="CPP-FAIL.VCP" LongName="cpp-managed-failures.vcproj" />
+				<File Id="CPP_Failures.build" Name="CPP-FAIL.BLD" LongName="cpp-managed-failures.build" />
+				<File Id="F__samples_file50" Name="ASSEMB_1.CPP" LongName="AssemblyInfo.cpp" />
+			</Component>
+			</Directory>
+
+		</Directory>
+
+		<!-- C++/CLI -->  
+		<Directory Id="cpp_cli" Name="cpp-cli">
+
+			<Component Id="C__CPP_CLI_Samples" DiskId="1" Guid="AF5FDFF2-594C-45cd-9913-3EC14D243A1A">
+				<File Id="CPP_CLI.sln" Name="cpp-cli.sln" />
+			</Component>
+
+			<Directory Id="cpp_cli_failures" Name="failures">
+			<Component Id="C__CPP_CLI_Failures" DiskId="1" Guid="9E073533-6798-42e6-8AF2-F619BB358416">
+				<File Id="CPP_CLI_Failures.h" Name="CPP-FAIL.H" LongName="cppsample.h" />
+				<File Id="CPP_CLI_Failures.cpp" Name="CPP-FAIL.CPP" LongName="cppsample.cpp" />
+				<File Id="CPP_CLI_Failures.vcproj" Name="CPP-FAIL.VCP" LongName="cpp-cli-failures.vcproj" />
+				<File Id="CPP_CLI_Failures.build" Name="CPP-FAIL.BLD" LongName="cpp-cli-failures.build" />
+				<File Id="CPP_CLI_Failures_AssemblyInfo" Name="ASSEMB_1.CPP" LongName="AssemblyInfo.cpp" />
+			</Component>
+			</Directory>
+
+			<Directory Id="cpp_cli_syntax" Name="syntax">
+			<Component Id="C__CPP_CLI_Syntax" DiskId="1" Guid="30A34CDA-7A71-48dd-8DC9-6D18EAECB49C">
+				<File Id="CPP_CLI_Syntax.cpp" Name="CPP-SYN.CPP" LongName="cpp-cli-syntax.cpp" />
+				<File Id="CPP_CLI_Syntax.vcproj" Name="CPP-SYN.VCP" LongName="cpp-cli-syntax.vcproj" />
+				<File Id="CPP_CLI_Syntax.build" Name="CPP-SYN.BLD" LongName="cpp-cli-syntax.build" />
+				<File Id="CPP_CLI_Syntax_AssemblyInfo" Name="ASSEMB_1.CPP" LongName="AssemblyInfo.cpp" />
+			</Component>
+			</Directory>
+
+		</Directory>
+	  
+    </DirectoryRef>
+		
+    <!-- VB Samples -->
+    <DirectoryRef Id="vb" FileSource="$(var.InstallImage)\samples\vb" >
+
+        <Component Id="C__VB_Samples" DiskId="1" Guid="D89C7A16-556C-4ff8-8FF3-E00DB2C4A45E">
+            <File Id="vb_samples.sln" Name="VB-SAMP.SLN" LongName="vb-samples.sln" />
+        </Component>
+	
+        <Directory Id="vb_failures" Name="failures">
+          <Component Id="C__VB_Failures" DiskId="1" Guid="05434C61-C0AC-47cb-8189-B1232CA3B5FB">
+            <File Id="vb_failures.vbproj" Name="VB-FAIL.VBP" LongName="vb-failures.vbproj" />
+            <File Id="vb_failures.build" Name="VB-FAIL.BLD" LongName="vb-failures.build" />
+            <File Id="vb_failures.vb" Name="VB-FAIL.VB" LongName="SimpleVBTest.vb" />
+            <File Id="vb_failures_assemblyinfo.vb" Name="ASSEMB_1.VB" LongName="AssemblyInfo.vb" />
+          </Component>
+        </Directory>
+	  
+        <Directory Id="vb_money" Name="money">
+            <Component Id="C__VB_Money" DiskId="1" Guid="AB0D542C-670D-473c-9034-1D277466E60A">
+              <File Id="Money.vbproj" Name="MONEY.VBP" LongName="vb-money.vbproj" />
+              <File Id="VB_Money.build" Name="MONEY.VBP" LongName="vb-money.build" />
+              <File Id="Money.vb" Name="Money.vb" />
+              <File Id="MoneyTest.vb" Name="MONEYTST.VB" LongName="MoneyTest.vb" />
+              <File Id="MoneyBag.vb" Name="MoneyBag.vb" />
+              <File Id="Money_AssemblyInfo.vb" Name="ASSEMB_1.VB" LongName="AssemblyInfo.vb" />
+              <File Id="IMoney.vb" Name="IMoney.vb" />
+            </Component>
+        </Directory>
+
+        <Directory Id="vb_syntax" Name="syntax">
+            <Component Id="C__VB_Syntax" DiskId="1" Guid="036CD103-788B-40c4-8AA3-467F9975E0E0">
+              <File Id="VB_Syntax.vbproj" Name="VB-SYNT.CSP" LongName="vb-syntax.vbproj" />
+              <File Id="VB_Syntax.build" Name="VB-SYNT.BLD" LongName="vb-syntax.build" />
+              <File Id="VB_AssertSyntaxTests.vb" Name="VB-SYNT.CS" LongName="AssertSyntaxTests.vb" />
+              <File Id="VB_Syntax_AssemblyInfo.vb" Name="ASSEMB_1.VB" LongName="AssemblyInfo.vb" />
+            </Component>
+        </Directory>
+        
+    </DirectoryRef>
+	
+    <!-- Extensibility Samples -->
+    <DirectoryRef Id="extensibility" FileSource="$(var.InstallImage)\samples\Extensibility" >
+
+        <Directory Id="core_extensibility" Name="Core">
+
+            <Component Id="C__CoreExtensibility" DiskId="1" Guid="523B3117-5694-4dc2-9D8E-32CD1B843793">
+                <File Id="CoreExtensibility.sln" Name="COREXTNS.SLN" LongName="CoreExtensibility.sln" />
+	    </Component>
+
+        <Directory Id="Minimal" Name="Minimal">
+          <Component Id="C__MinimalAddin" DiskId="1" Guid="7C9C8B34-5318-450b-8DCC-6D256C1259A1">
+            <File Id="Minimal.csproj" Name="MINIMAL.CSP" LongName="Minimal.csproj" />
+            <File Id="Minimal.build" Name="MINIMAL.BLD" LongName="Minimal.build" />
+            <File Id="Minimal.cs" Name="Minimal.cs" />
+          </Component>
+        </Directory>
+
+        <Directory Id="samplesuiteextension" Name="SAMPLE_1" LongName="SampleSuiteExtension">
+          <Component Id="C__SampleSuiteExtension" DiskId="1" Guid="2EDC393E-B725-406f-A9BC-824E3B72EE84">
+            <File Id="SSX_Addin.cs" Name="Addin.cs" />
+              <File Id="SampleSuiteExtensionBuilder.cs" Name="SSX.CS" LongName="SampleSuiteExtensionBuilder.cs" />
+              <File Id="SampleSuiteExtension.csproj" Name="SSX.CSP" LongName="SampleSuiteExtension.csproj" />
+              <File Id="SampleSuiteExtension.build" Name="SSX.BLD" LongName="SampleSuiteExtension.build" />
+              <File Id="SampleSuiteExtensionAttribute.cs" Name="SSX_ATTR.CS" LongName="SampleSuiteExtensionAttribute.cs" />
+              <File Id="SSX_AssemblyInfo.cs" Name="ASSEMBLY.CS" LongName="AssemblyInfo.cs" />
+              <File Id="SampleSuiteExtension.cs" Name="SSX.CS" LongName="SampleSuiteExtension.cs" />
+          </Component>
+          <Directory Id="samplesuiteextention_tests" Name="Tests">
+              <Component Id="C__SampleSuiteExtension_Tests" DiskId="1" Guid="0E72B102-06A7-448d-938E-3EDD83BA496C">
+                <File Id="SampleSuiteExtensionTests.csproj" Name="SSXTESTS.CSP" LongName="SampleSuiteExtensionTests.csproj" />
+                <File Id="SampleSuiteExtensionTests.cs" Name="SSXTESTS.CS" LongName="SampleSuiteExtensionTests.cs" />
+              </Component>
+            </Directory>
+          </Directory>
+
+          <Directory Id="samplefixtureextension" Name="SAMPLE_2" LongName="SampleFixtureExtension">
+            <Component Id="C__SampleFixtureExtension" DiskId="1" Guid="4C209669-C278-4fc7-8D61-3E36E263AADF">
+              <File Id="SampleFixtureExtensionBuilder.cs" Name="SFXBLDR.CS" LongName="SampleFixtureExtensionBuilder.cs" />
+              <File Id="SampleFixtureExtension.cs" Name="SFX.CS" LongName="SampleFixtureExtension.cs" />
+              <File Id="SampleFixtureExtensionAttribute.cs" Name="SFXATTR.CS" LongName="SampleFixtureExtensionAttribute.cs" />
+              <File Id="SampleFixtureExtension.csproj" Name="SFX.CSP" LongName="SampleFixtureExtension.csproj" />
+              <File Id="SampleFixtureExtension.build" Name="SFX.BLD" LongName="SampleFixtureExtension.build" />
+			  <File Id="SFX_AssemblyInfo.cs" Name="ASSEMBLY.CS" LongName="AssemblyInfo.cs" />
+            </Component>
+            <Directory Id="SFX_Tests" Name="Tests">
+              <Component Id="C__SampleFixtureExtension_Tests" DiskId="1" Guid="7A8AF9BF-EE33-462f-AE7F-2CEF2084866F">
+                <File Id="SampleFixtureExtensionTests.cs" Name="SFXTESTS.CS" LongName="SampleFixtureExtensionTests.cs" />
+                <File Id="SampleFixtureExtensionTests.csproj" Name="SFXTESTS.CSP" LongName="SampleFixtureExtensionTests.csproj" />
+              </Component>
+            </Directory>
+          </Directory>
+        </Directory>
+    </DirectoryRef>
+		
+  </Fragment>
+</Wix>
\ No newline at end of file
diff --git a/install/tests.wxs b/install/tests.wxs
new file mode 100644
index 0000000..57f2249
--- /dev/null
+++ b/install/tests.wxs
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Wix xmlns="http://schemas.microsoft.com/wix/2003/01/wi">
+  <Fragment>
+  
+    <ComponentGroup Id="Net_1.1_TestsGroup">
+      <ComponentRef Id="NUnitTestProject_1.1" />
+      <ComponentRef Id="framework_copy_for_tests_1.1" />
+      <ComponentRef Id="base_tests_1.1" />
+      <ComponentRef Id="fit_tests_1.1" />
+      <ComponentRef Id="fit_lib_1.1" />
+    </ComponentGroup>
+	
+    <ComponentGroup Id="Net_2.0_TestsGroup">
+      <ComponentRef Id="NUnitTestProject_2.0" />
+      <ComponentRef Id="framework_copy_for_tests_2.0" />
+      <ComponentRef Id="base_tests_2.0" />
+      <ComponentRef Id="gui_tests_2.0" />
+      <ComponentRef Id="fit_tests_2.0" />
+      <ComponentRef Id="fit_lib_2.0" />
+    </ComponentGroup>
+	
+    <DirectoryRef Id="net_1.1" FileSource="bin\net-1.1">
+
+      <Component Id="NUnitTestProject_1.1" DiskId="1" Guid="6670EEC9-2B3C-4c1f-A91C-BD0EDA0E8B12">
+        <File Id="NUnitTests.nunit_1.1" Name="ALLTESTS.NUN" LongName="NUnitTests.nunit" />
+		    <File Id="NUnitTests.config_1.1" Name="ALLTESTS.CFG" LongName="NUnitTests.config" />
+		  </Component>
+
+      <Component Id="fit_tests_1.1" DiskId="1" Guid="33E1C9B4-254D-4aaa-8BF5-FB18DAE3220E" >
+        <File Id="NUnitFitTests.html_1.1" Name="FITTESTS.HTM" LongName="NUnitFitTests.html" />
+        <File Id="runFile.exe_1.1" Name="runFile.exe"/>
+        <File Id="runFile.exe.config_1.1" Name="runFile.cfg" LongName="runFile.exe.config" />
+      </Component>
+
+    </DirectoryRef>
+
+    <DirectoryRef Id="lib_1.1" FileSource="bin\net-1.1\lib">
+
+      <Component Id="fit_lib_1.1" DiskId="1" Guid="589A4209-3A65-4335-932E-745F9A4D4568" >
+        <File Id="nunit.fixtures.dll_1.1" Name="FIXTURES.DLL" LongName="nunit.fixtures.dll" />
+        <File Id="fit.dll_1.1" Name="fit.dll"/>
+      </Component>
+
+    </DirectoryRef>
+    
+    <DirectoryRef Id="tests_1.1" FileSource="bin\net-1.1\tests">
+      
+      <Component Id="framework_copy_for_tests_1.1" DiskId="1" Guid="2E8EF5D0-6EFE-4d8d-BC55-DF1126262C24">
+	<File Id="nunit.framework.dll_1.1" Name="FRAMEWRK.DLL" LongName="nunit.framework.dll" />
+      </Component>
+        
+      <Component Id="base_tests_1.1" DiskId="1" Guid="85DD0370-9E05-4e9a-8AB4-02A6C24986AB">
+        <File Id="testutilities_1.1" Name="TESTUTIL.DLL" LongName="test-utilities.dll" />
+        <File Id="testassembly_1.1" Name="TESTDATA.DLL" LongName="test-assembly.dll" />		
+        <File Id="loadtestassembly_1.1" Name="LOADTEST.DLL" LongName="loadtest-assembly.dll" />		
+        <File Id="mockassembly_1.1" Name="MOCKASM.DLL" LongName="mock-assembly.dll" />
+        <File Id="nonamespaceassembly_1.1" Name="NONAMESP.DLL" LongName="nonamespace-assembly.dll" />
+        <File Id="timingtests_1.1" Name="TIMING.DLL" LongName="timing-tests.dll" />
+		    <File Id="nunit.util.tests_1.1" Name="TESTUTIL.DLL" LongName="nunit.util.tests.dll" />
+		    <File Id="nunit.framework.tests_1.1" Name="TESTFRAM.DLL" LongName="nunit.framework.tests.dll" />
+		    <File Id="nunit.mocks.tests_1.1" Name="TESTMOCK.DLL" LongName="nunit.mocks.tests.dll" />
+		    <File Id="console.tests_1.1" Name="TESTCONS.DLL" LongName="nunit-console.tests.dll" />
+		    <File Id="nunit.core.tests_1.1" Name="TESTCORE.DLL" LongName="nunit.core.tests.dll" />
+        <!-- <File Id="F__nunit_server_tests_dll_1.1" Name="NUST.DLL" LongName="nunit-server.tests.dll" /> -->
+        <File Id="nunit.fixtures.tests.dll_1.1" Name="FIXTESTS.DLL" LongName="nunit.fixtures.tests.dll" />
+      </Component>
+          
+    </DirectoryRef>
+	
+    <DirectoryRef Id="net_2.0" FileSource="bin\net-2.0">
+
+      <Component Id="NUnitTestProject_2.0" DiskId="1" Guid="6670EEC9-2B3C-4c1f-A91C-BD0EDA0E8B12">
+        <File Id="NUnitTests.nunit_2.0" Name="ALLTESTS.NUN" LongName="NUnitTests.nunit" />
+		    <File Id="NUnitTests.config_2.0" Name="ALLTESTS.CFG" LongName="NUnitTests.config" />
+      </Component>
+
+      <Component Id="fit_tests_2.0" DiskId="1" Guid="33E1C9B4-254D-4aaa-8BF5-FB18DAE3220E" >
+        <File Id="NUnitFitTests.html_2.0" Name="FITTESTS.HTM" LongName="NUnitFitTests.html" />
+        <File Id="runFile.exe_2.0" Name="runFile.exe"/>
+        <File Id="runFile.exe.config_2.0" Name="runFile.cfg" LongName="runFile.exe.config" />
+      </Component>
+
 
+    </DirectoryRef>
+
+    <DirectoryRef Id="lib_2.0" FileSource="bin\net-2.0\lib">
+
+      <Component Id="fit_lib_2.0" DiskId="1" Guid="DD9E8F25-DD22-4791-962E-0717BDE5E21D" >
+        <File Id="nunit.fixtures.dll_2.0" Name="FIXTURES.DLL" LongName="nunit.fixtures.dll" />
+        <File Id="fit.dll_2.0" Name="fit.dll"/>
+      </Component>
+
+    </DirectoryRef>
+    
+    <DirectoryRef Id="tests_2.0" FileSource="bin\net-2.0\tests">
+      
+      <Component Id="framework_copy_for_tests_2.0" DiskId="1" Guid="2E8EF5D0-6EFE-4d8d-BC55-DF1126262C24">
+	      <File Id="nunit.framework.dll_2.0" Name="FRAMEWRK.DLL" LongName="nunit.framework.dll" />
+      </Component>
+        
+      <Component Id="base_tests_2.0" DiskId="1" Guid="85DD0370-9E05-4e9a-8AB4-02A6C24986AB">
+        <File Id="testutilities_2.0" Name="TESTUTIL.DLL" LongName="test-utilities.dll" />
+        <File Id="testassembly_2.0" Name="TESTDATA.DLL" LongName="test-assembly.dll" />		
+        <File Id="loadtestassembly_2.0" Name="LOADTEST.DLL" LongName="loadtest-assembly.dll" />		
+        <File Id="mockassembly_2.0" Name="MOCKASM.DLL" LongName="mock-assembly.dll" />
+        <File Id="nonamespaceassembly_2.0" Name="NONAMESP.DLL" LongName="nonamespace-assembly.dll" />
+        <File Id="timingtests_2.0" Name="TIMING.DLL" LongName="timing-tests.dll" />
+		    <File Id="nunit.util.tests_2.0" Name="TESTUTIL.DLL" LongName="nunit.util.tests.dll" />
+		    <File Id="nunit.framework.tests_2.0" Name="TESTFRAM.DLL" LongName="nunit.framework.tests.dll" />
+		    <File Id="nunit.mocks.tests_2.0" Name="TESTMOCK.DLL" LongName="nunit.mocks.tests.dll" />
+		    <File Id="console.tests_2.0" Name="TESTCONS.DLL" LongName="nunit-console.tests.dll" />
+		    <File Id="nunit.core.tests_2.0" Name="TESTCORE.DLL" LongName="nunit.core.tests.dll" />
+        <!-- <File Id="F__nunit_server_tests_dll_2.0" Name="NUST.DLL" LongName="nunit-server.tests.dll" /> -->
+        <File Id="nunit.fixtures.tests.dll_2.0" Name="FIXTESTS.DLL" LongName="nunit.fixtures.tests.dll" />
+      </Component>
+          
+      <Component Id="gui_tests_2.0" DiskId="1" Guid="C7E0B8E5-DE60-455a-B247-B204A4C28677">
+		    <File Id="nunit.uikit.tests_2.0" Name="TESTUIKI.DLL" LongName="nunit.uikit.tests.dll" />
+                    <File Id="nunit.uiexception.tests.dll" Name="UIXCPTST.DLL" LongName="nunit.uiexception.tests.dll" />
+		    <File Id="gui.tests_2.0" Name="GUITESTS.DLL" LongName="nunit-gui.tests.dll" />
+      </Component>
+
+    </DirectoryRef>
+	
+  </Fragment>
+</Wix>
\ No newline at end of file
diff --git a/license.rtf b/license.rtf
new file mode 100644
index 0000000..b97b9cd
--- /dev/null
+++ b/license.rtf
@@ -0,0 +1,48 @@
+{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch13\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f2\fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}
+{\f13\fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ??????\'a8\'ac???};}{\f37\fnil\fcharset134\fprq2{\*\panose 02010600030101010101}@SimSun;}{\f48\froman\fcharset238\fprq2 Times New Roman CE;}
+{\f49\froman\fcharset204\fprq2 Times New Roman Cyr;}{\f51\froman\fcharset161\fprq2 Times New Roman Greek;}{\f52\froman\fcharset162\fprq2 Times New Roman Tur;}{\f53\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}
+{\f54\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f55\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f56\froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f68\fmodern\fcharset238\fprq1 Courier New CE;}
+{\f69\fmodern\fcharset204\fprq1 Courier New Cyr;}{\f71\fmodern\fcharset161\fprq1 Courier New Greek;}{\f72\fmodern\fcharset162\fprq1 Courier New Tur;}{\f73\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew);}
+{\f74\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic);}{\f75\fmodern\fcharset186\fprq1 Courier New Baltic;}{\f76\fmodern\fcharset163\fprq1 Courier New (Vietnamese);}{\f180\fnil\fcharset0\fprq2 SimSun Western{\*\falt ??????\'a8\'ac???};}
+{\f420\fnil\fcharset0\fprq2 @SimSun Western;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;
+\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{
+\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp1033\langfenp2052 \snext0 Normal;}{\*\cs10 \additive 
+\ssemihidden Default Paragraph Font;}{\*
+\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv 
+\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20 \ltrch\fcs0 \fs20\lang1024\langfe1024\loch\f0\hich\af0\dbch\af13\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}{
+\s15\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af2\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe2052\loch\f2\hich\af2\dbch\af13\cgrid\langnp1033\langfenp2052 \sbasedon0 \snext15 \styrsid9332467 
+Plain Text;}}{\*\latentstyles\lsdstimax156\lsdlockeddef0}{\*\rsidtbl \rsid610709\rsid818068\rsid3100993\rsid5008211\rsid6372847\rsid7476632\rsid8721477\rsid9332467\rsid10426157\rsid11172945\rsid11871043\rsid15552035\rsid16677168}{\*\generator Microsoft Wo
+rd 11.0.8125;}{\info{\title Copyright (c) 2002 James W}{\author James Newkirk}{\operator Charlie Poole}{\creatim\yr2002\mo9\dy11\hr14\min43}{\revtim\yr2009\mo7\dy8\hr7\min28}{\version10}{\edmins16}{\nofpages1}{\nofwords166}{\nofchars950}
+{\*\company Nascent Software, Inc.}{\nofcharsws1114}{\vern24611}{\*\password 00000000}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}\paperw12240\paperh15840\margl1319\margr1319\margt1440\margb1440\gutter0\ltrsect 
+\widowctrl\ftnbj\aenddoc\donotembedsysfont0\donotembedlingdata1\grfdocevents0\validatexml0\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors0\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\formshade\horzdoc\dgmargin
+\dghspace180\dgvspace180\dghorigin1319\dgvorigin1440\dghshow1\dgvshow1
+\jexpand\viewkind1\viewscale120\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct\asianbrkrule\rsidroot15552035 \fet0
+{\*\wgrffmtfilter 013f}\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\endnhere\sectlinegrid360\sectdefaultcl\sectrsid9332467\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}
+{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}
+{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar
+\s15\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid9332467 \rtlch\fcs1 \af2\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe2052\loch\af2\hich\af2\dbch\af13\cgrid\langnp1033\langfenp2052 {\rtlch\fcs1 \af2 
+\ltrch\fcs0 \insrsid16677168\charrsid9332467 \hich\af2\dbch\af13\loch\f2 Copyright }{\rtlch\fcs1 \af2 \ltrch\fcs0 \insrsid6372847 \loch\af2\dbch\af13\hich\f2 \'a9\loch\f2  2002-200\hich\af2\dbch\af13\loch\f2 9}{\rtlch\fcs1 \af2 \ltrch\fcs0 
+\insrsid16677168 \hich\af2\dbch\af13\loch\f2  Charlie Poole
+\par }{\rtlch\fcs1 \af2 \ltrch\fcs0 \insrsid610709\charrsid9332467 \hich\af2\dbch\af13\loch\f2 Copyright }{\rtlch\fcs1 \af2 \ltrch\fcs0 \insrsid10426157 \loch\af2\dbch\af13\hich\f2 \'a9\loch\f2  }{\rtlch\fcs1 \af2 \ltrch\fcs0 \insrsid610709\charrsid9332467 
+\hich\af2\dbch\af13\loch\f2 2002}{\rtlch\fcs1 \af2 \ltrch\fcs0 \insrsid8721477 \hich\af2\dbch\af13\loch\f2 -200}{\rtlch\fcs1 \af2 \ltrch\fcs0 \insrsid11871043 \hich\af2\dbch\af13\loch\f2 4}{\rtlch\fcs1 \af2 \ltrch\fcs0 \insrsid610709\charrsid9332467 
+\hich\af2\dbch\af13\loch\f2  James W. Newkirk, Mich}{\rtlch\fcs1 \af2 \ltrch\fcs0 \insrsid7476632 \hich\af2\dbch\af13\loch\f2 ael C. Two, Alexei A. Vorontsov
+\par }{\rtlch\fcs1 \af2 \ltrch\fcs0 \insrsid16677168 \hich\af2\dbch\af13\loch\f2 \hich\f2 Copyright \'a9\loch\f2  2000-2002}{\rtlch\fcs1 \af2 \ltrch\fcs0 \insrsid610709\charrsid9332467 \hich\af2\dbch\af13\loch\f2  Philip A. Craig
+\par 
+\par \hich\af2\dbch\af13\loch\f2 This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.
+\par 
+\par \hich\af2\dbch\af13\loch\f2 Permissio\hich\af2\dbch\af13\loch\f2 n is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:
+\par 
+\par \hich\af2\dbch\af13\loch\f2 1. The origin of this software must not be misrepresented; you must not clai\hich\af2\dbch\af13\loch\f2 
+m that you wrote the original software. If you use this software in a product, an acknowledgment (see the following) in the product documentation is required.
+\par 
+\par \hich\af2\dbch\af13\loch\f2 Portions }{\rtlch\fcs1 \af2 \ltrch\fcs0 \insrsid16677168\charrsid9332467 \hich\af2\dbch\af13\loch\f2 Copyright }{\rtlch\fcs1 \af2 \ltrch\fcs0 \insrsid6372847 \loch\af2\dbch\af13\hich\f2 \'a9\loch\f2  2002-2009}{\rtlch\fcs1 
+\af2 \ltrch\fcs0 \insrsid16677168 \hich\af2\dbch\af13\loch\f2  Charlie Poole or }{\rtlch\fcs1 \af2 \ltrch\fcs0 \insrsid16677168\charrsid9332467 \hich\af2\dbch\af13\loch\f2 Copyright }{\rtlch\fcs1 \af2 \ltrch\fcs0 \insrsid16677168 
+\loch\af2\dbch\af13\hich\f2 \'a9\loch\f2  2002-2004 }{\rtlch\fcs1 \af2 \ltrch\fcs0 \insrsid10426157 \hich\af2\dbch\af13\loch\f2 James W. Newkirk, }{\rtlch\fcs1 \af2 \ltrch\fcs0 \insrsid610709\charrsid9332467 \hich\af2\dbch\af13\loch\f2 Michae}{
+\rtlch\fcs1 \af2 \ltrch\fcs0 \insrsid16677168 \hich\af2\dbch\af13\loch\f2 l \hich\af2\dbch\af13\loch\f2 C. Two, Alexei A. Vorontsov}{\rtlch\fcs1 \af2 \ltrch\fcs0 \insrsid610709\charrsid9332467 \hich\af2\dbch\af13\loch\f2  or Copyright }{\rtlch\fcs1 \af2 
+\ltrch\fcs0 \insrsid10426157 \loch\af2\dbch\af13\hich\f2 \'a9}{\rtlch\fcs1 \af2 \ltrch\fcs0 \insrsid5008211 \hich\af2\dbch\af13\loch\f2  2000-2002}{\rtlch\fcs1 \af2 \ltrch\fcs0 \insrsid610709\charrsid9332467 \hich\af2\dbch\af13\loch\f2  Philip A. Craig
+
+\par 
+\par \hich\af2\dbch\af13\loch\f2 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+\par 
+\par \hich\af2\dbch\af13\loch\f2 3. This notice may not be removed or altered from any source di\hich\af2\dbch\af13\loch\f2 stribution.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9332467 
+\par }}
\ No newline at end of file
diff --git a/license.txt b/license.txt
index fef6910..ab91df4 100644
--- a/license.txt
+++ b/license.txt
@@ -1,4 +1,4 @@
-Copyright © 2002-2007 Charlie Poole
+Copyright © 2002-2008 Charlie Poole
 Copyright © 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov
 Copyright © 2000-2002 Philip A. Craig
 
@@ -8,7 +8,7 @@ Permission is granted to anyone to use this software for any purpose, including
 
 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment (see the following) in the product documentation is required.
 
-Portions Copyright © 2002-2007 Charlie Poole or Copyright © 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov or Copyright © 2000-2002 Philip A. Craig
+Portions Copyright © 2002-2008 Charlie Poole or Copyright © 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov or Copyright © 2000-2002 Philip A. Craig
 
 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
 
diff --git a/nunit.build b/nunit.build
new file mode 100644
index 0000000..013bfb6
--- /dev/null
+++ b/nunit.build
@@ -0,0 +1,1141 @@
+<?xml version="1.0"?>
+<project name="NUnit" default="help" basedir=".">
+
+<!-- ***************************************************************** -->
+<!-- This script has been tested with the NAnt 0.86 beta 1 release.    -->
+<!--                                                                   -->
+<!-- At least one of the supported runtimes and sdk must be installed. -->
+<!-- In order to build the msi, WiX 2.0 and the WiX tasks for NAnt     -->
+<!-- are required. To run the test coverage target, NCover is          -->
+<!-- required.                                                         -->
+<!--                                                                   -->
+<!-- Currently, the .NET 1.0 builds of the GUI runner cannot be run    -->
+<!-- successfully. However, the .NET 1.1 builds may be run under 1.0.  -->
+<!-- ***************************************************************** -->
+
+<!-- ***************************************************************** -->
+<!-- ********* Common properties that control the build ************** -->
+<!-- ***************************************************************** -->
+ 
+  <!-- Project name - used as a prefix for packages -->
+  <property name="project.name" value="NUnit"/>
+
+  <!-- NUnit Base Package Version - First three digits -->
+  <property name="base.package.version" value="2.5.10"/>
+ 
+  <!-- Nominal version used for install directory and program
+       files menu. Normally the same as the package version, 
+       but may differ when we are in alpha or beta. -->
+  <property name="nominal.version" value="2.5.10" />
+
+  <!-- Determine todays build number -->
+  <property name="temp.now" value="${datetime::now()}"/>
+  <property name="temp.yr" value="${datetime::get-year(temp.now)-2000}"/>
+  <property name="temp.day" value="${string::pad-left(datetime::get-day-of-year(temp.now),3,'0')}"/>
+  <property name="package.build.number" value="${temp.yr}${temp.day}"/>
+
+  <!-- NUnit full package version -->
+  <property name="package.version" value="${base.package.version}.${package.build.number}"/>
+
+  <!-- Package Configuration (Release, Alpha, Beta, etc.) -->
+  <property name="package.configuration" value=""/>
+  
+  <!-- Base name for packages - add suffix for Alpha, Beta, RC -->
+  <property name="package.name" 
+      value="${project.name}-${package.version}"/>
+
+  <!-- Frameworks supported by this build script. The first
+         installed framework found is the default for builds. 
+         The first .NET and Mono frameworks found are the
+         respective net and mono defaults. -->
+  <property name="supported.frameworks" 
+    value="net-2.0,net-3.5,net-4.0,net-1.1,net-1.0,mono-2.0,mono-1.0"/>
+
+  <!-- Packages we normally create -->
+  <!--<property name="standard.packages" value="std,mono" />-->
+  <property name="standard.packages" value="std" />
+
+  <!-- Our standard package for general distribution -->
+  <property name="default.package.config" value="std" />
+
+  <!-- Options for runing the NUnit tests -->
+  <property name="nunit.options" value=""/>
+
+  <!-- Additional internal properties are set in the include file -->
+  <include buildfile="nunit.build.include"/>
+
+<!-- ***************************************************************** -->
+<!-- ***                 Default Help Target                       *** -->
+<!-- ***************************************************************** -->
+
+<target name="help" description="Displays additional help information">
+  <echo>
+    This build file will build NUnitLite for any of the supported
+    runtime frameworks which are actually installed. To add or
+    support for a framework, edit this script
+
+    Running on the current system, the following runtime frameworks
+    are available for building and testing NUnit:
+  </echo>
+
+  <foreach item="String" delim="," 
+      property="framework" in="${installed.frameworks}">
+    <echo message="        ${string::pad-right(framework,15,' ')}${framework::get-description(framework)}"/>
+  </foreach>
+  
+  <property name="default.net.target" value="(Not available)"/>
+  <property name="default.mono.target" value="(Not available)"/>
+  <property name="default.net.target" value="${default.net.runtime}"
+    if="${property::exists('default.net.runtime')}"/>
+  <property name="default.mono.target" value="${default.mono.runtime}"
+    if="${property::exists('default.mono.runtime')}"/>
+
+  <echo>
+    The default build target is the ${default.runtime} debug config.
+    Generic runtime targets use the following defaults:
+        net           ${default.net.target}
+        mono          ${default.mono.target}
+
+    Note that targets that set the build configuration or runtime
+    to be used must come before action targets. For example:
+
+        nant net-1.1 release build
+        nant build-all
+        nant debug clean build
+
+    Use   nant -projecthelp to see a full list of targets.
+  </echo>
+</target>
+
+<!-- ***************************************************************** -->
+<!-- ***          Targets that set the build configuration         *** -->
+<!-- ***     These must come before actions like build or test     *** -->
+<!-- ***************************************************************** -->
+
+  <target name="debug" depends="set-debug-build-config"
+    description="Set config to debug for commands that follow"/>
+
+  <target name="release" depends="set-release-build-config"
+    description="Set config to release for commands that follow"/>
+
+<!-- ***************************************************************** -->
+<!-- ***         Targets that set the runtime configuration        *** -->
+<!-- ***     These must come before actions like build or test     *** -->
+<!-- ***************************************************************** -->
+
+  <target name="net" depends="set-default-dot-net-runtime-config"
+    description="Set runtime to .NET 1.1 for commands that follow"/>
+
+  <target name="net-1.0" depends="set-net-1.0-runtime-config"
+    description="Set runtime to .NET 1.0 for commands that follow"/>
+
+  <target name="net-1.1" depends="set-net-1.1-runtime-config"
+    description="Set runtime to .NET 1.1 for commands that follow"/>
+      
+  <target name="net-2.0" depends="set-net-2.0-runtime-config"
+    description="Set runtime to .NET 2.0 for commands that follow"/>
+
+  <target name="net-3.5" depends="set-net-3.5-runtime-config"
+    description="Set runtime to .NET 3.5 for commands that follow"/>
+      
+  <target name="net-4.0" depends="set-net-4.0-runtime-config"
+    description="Set runtime to .NET 4.0 for commands that follow"/>
+      
+  <target name="mono" depends="set-default-mono-runtime-config"
+    description="Set runtime to Mono 1.0 for commands that follow"/>
+
+  <target name="mono-1.0" depends="set-mono-1.0-runtime-config"
+    description="Set runtime to Mono 1.0 for commands that follow"/>
+  
+  <target name="mono-2.0" depends="set-mono-2.0-runtime-config"
+    description="Set runtime to Mono 2.0 for commands that follow"/>
+
+<!-- ***************************************************************** -->
+<!-- ***             Targets that clean directories                *** -->
+<!-- ***************************************************************** -->
+
+  <target name="clean" depends="set-build-dir"
+      description="Removes output created by the current build config">
+
+    <delete dir="${current.build.dir}" 
+      if="${directory::exists( current.build.dir )}"/>
+
+    <delete file="src/GeneratedAssemblyInfo.cs"
+      if="${file::exists( 'src/GeneratedAssemblyInfo.cs' )}"/>
+
+  </target>
+
+  <target name="clean-all" 
+      description="Removes output created by all build configs">
+ 
+    <delete dir="${project.build.dir}" 
+      if="${directory::exists( project.build.dir )}"/>
+
+    <delete file="src/GeneratedAssemblyInfo.cs"
+      if="${file::exists( 'src/GeneratedAssemblyInfo.cs' )}"/>
+
+  </target>
+
+  <!-- Removes the current package working directory -->
+  <target name="clean-package-dir">
+
+        <delete dir="${package.working.dir}" 
+            if="${directory::exists( package.working.dir )}"/>
+
+  </target>
+
+<!-- ***************************************************************** -->
+<!-- ***              Targets that generate code                   *** -->
+<!-- ***************************************************************** -->
+
+  <!-- Generate AssemblyInfo for this build -->
+  <target name="gen-assembly-info">
+
+    <asminfo output="src/GeneratedAssemblyInfo.cs" language="CSharp">
+      <imports>
+        <import namespace="System.Reflection"/>
+      </imports>
+      <attributes>
+        <attribute type="AssemblyCompanyAttribute" value="NUnit.org"/>
+        <attribute type="AssemblyProductAttribute" value="NUnit"/>
+        <attribute type="AssemblyCopyrightAttribute"
+          value="Copyright (C) 2002-2009 Charlie Poole.&#xD;&#xA;Copyright (C) 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov.&#xD;&#xA;Copyright (C) 2000-2002 Philip Craig.&#xD;&#xA;All Rights Reserved."/>
+        <attribute type="AssemblyTrademarkAttribute" value="NUnit is a trademark of NUnit.org"/>
+        <attribute type="AssemblyVersionAttribute" value="${package.version}"/>
+        <attribute type="AssemblyInformationalVersionAttribute" value="${package.version}"/>
+        <attribute type="AssemblyConfigurationAttribute" value="${package.configuration}"/>
+      </attributes>
+    </asminfo>
+
+  </target>
+
+  <!-- Generate code for the fluent constraint builder interface -->
+  <target name="gen-syntax" 
+    description="Generate code for the fluent constraint builder interface">
+
+    <exec program="GenSyntax.exe"
+      managed="true"
+      basedir="${project.tools.dir}/bin"
+      workingdir="${project.src.dir}/NUnitFramework/framework"
+      commandline="SyntaxElements.txt"/>
+
+  </target>
+
+<!-- ***************************************************************** -->
+<!-- ***              Targets that perform builds                  *** -->
+<!-- ***************************************************************** -->
+
+  <!-- Build NUnit for default runtime version and config -->
+  <target name="build" depends="make-build-dir,gen-assembly-info"
+    description="Build NUnit for default runtime version and config">
+
+    <echo message="*"/>
+    <echo message="* Starting ${runtime.config} ${build.config} build"/>
+    <echo message="*"/>
+
+    <!-- Copy key file to base directory, so second level files can access it -->
+    <copy file="${project.base.dir}/nunit.snk" todir="${project.build.dir}"/>-->
+
+    <!-- Copy lib files to current lib dir dir -->
+    <copy todir="${current.lib.dir}">
+      <fileset basedir="${project.lib.dir}">
+        <include name="*.dll"/>
+      </fileset>
+    </copy>
+
+    <!-- Build NUnit components and tests -->
+    <nant target="build">
+      <buildfiles refid="project.buildfiles"/>
+    </nant>
+
+    <!-- Build GUI if runtime is 2.0 or greater -->
+    <call target="build-gui" if="${build.gui}" />
+
+    <!-- Copy test project for this runtime framework -->
+    <copy file="${project.base.dir}/${runtime.testproj}"
+        tofile="${current.build.dir}/NUnitTests.nunit">
+      <filterchain>
+        <expandproperties/>
+      </filterchain>
+    </copy>
+
+    <!-- Copy other files for running tests -->
+    <copy todir="${current.build.dir}" flatten="true">
+      <fileset basedir="${project.base.dir}">
+        <include name="NUnitTests.config" />
+        <include name="NUnitFitTests.html" />
+        <include name="clr.bat" />
+        <include name="src/PNUnit/*.conf" />
+        <include name="src/PNUnit/runpnunit.bat" />
+      </fileset>
+    </copy>
+
+  </target>
+
+  <!-- Build the Gui -->
+  <target name="build-gui">
+
+    <fail unless="${build.gui}" 
+      message="Runtime 2.0 or greater is required to build the NUnit GUI" />
+
+    <nant target="build">
+      <buildfiles refid="gui.buildfiles"/>
+    </nant>
+
+  </target>
+
+  <!-- Build current config for all available runtimes -->
+  <target name="build-all"
+      description="Build current config for all available runtimes">
+
+    <foreach item="String" delim="," 
+        property="framework" in="${installed.frameworks}">
+
+      <call target="set-${framework}-runtime-config"/>
+      <call target="build"/>
+
+    </foreach>
+
+  </target>
+
+<!-- ***************************************************************** -->
+<!-- ***                 Targets for running tests                 *** -->
+<!-- ***************************************************************** -->
+
+  <target name="test" depends="build,run-test"
+    description="Build and run tests for selected config and runtime"/>
+
+  <target name="run-test"
+      description="Run tests for selected config and runtime (no rebuild)">
+
+    <echo message="*"/>
+    <echo message="* Testing ${runtime.config} ${build.config} build"/>
+    <echo message="*    Running under ${nant.settings.currentframework}"/>
+    <echo message="*"/>
+
+    <!-- We use exec rather than the nunit2 task because we are testing
+         a new build of NUnit which is likely not to be included in the Nant build -->
+    <!-- Mono currently has a SIGSEGV fault if we run in a single AppDomain -->
+
+    <property name="result.file" 
+      value="TestResult-${nant.settings.currentframework}"/>
+    <exec basedir="${current.build.dir}"
+      workingdir="${current.build.dir}" 
+	  program="nunit-console.exe" 
+      managed="strict"
+	  commandline="NUnitTests.nunit ${nunit.options} -xml:${result.file}.xml" />
+
+  </target>
+
+  <target name="test-coverage" depends="build"
+    description="Run tests for a build under NCover to get coverage results">
+
+    <echo message="*"/>
+    <echo message="* Starting ${runtime.config} ${build.config} test coverage run"/>
+    <echo message="*"/>
+
+    <property name="ncover.options" 
+      value="//a nunit.framework;nunit.core;nunit.extensions;nunit.util;nunit.console;nunit.uikit;nunit-gui-runner"/>
+
+    <!-- We use exec rather than the nunit2 task because we are testing
+         a new build of NUnit which is likely not to be included in the Nant build -->
+    <exec basedir="${ncover.dir}"
+          workingdir="${current.build.dir}" 
+	  program="NCover.Console.exe" 
+      managed="strict"
+	  commandline="nunit-console.exe NUnitTests.nunit ${nunit.options} ${ncover.options}"
+	if="${build.win32}" />
+
+    <!-- Mono currently has a SIGSEGV fault if we run in a single AppDomain -->
+         a new build of NUnit which is likely not to be included in the Nant build -->
+    <exec basedir="${ncover.dir}"
+          workingdir="${current.build.dir}" 
+	  program="NCover.Console.exe" 
+          managed="strict"
+	  commandline="nunit-console.exe NUnitTests.nunit ${nunit.options}"
+	unless="${build.win32}" />
+
+  </target>
+
+  <target name="test-all"
+      description="Build and test all runtimes for current config">
+
+    <foreach item="String" delim="," 
+        property="framework" in="${installed.frameworks}">
+
+      <call target="set-${framework}-runtime-config"/>
+      <call target="test" />
+
+    </foreach>
+
+  </target>
+
+  <target name="test-each-runtime" depends="build"
+      description="Run tests for the current build under each runtime">
+
+    <foreach item="String" delim=","
+        property="framework" in="${supported.test.platforms}">
+
+      <if test="${framework::exists( framework )}">
+        <property name="nant.settings.currentframework"
+            value="${framework}" />
+        <call target="run-test" failonerror="false" />
+      </if>
+
+    </foreach>
+
+    <property name="nant.settings.currentframework" value="${runtime.config}" />
+
+    <echo message="*" />
+    <echo message="* Restored runtime to ${nant.settings.currentframework}" />
+    <echo message="*" />
+
+  </target>
+
+  <target name="test-under-net-1.0">
+    <if test="${framework::exists('net-1.0')}">
+      <property name="nant.settings.currentframework" value="net-1.0"/>
+      <call target="run-test"/>
+      <property name="nant.settings.currentframework" value="${runtime.config}" />
+    </if>
+  </target>
+
+  <target name="test-all-under-each"
+      description="Build all runtimes and test the builds under each runtime.">
+
+    <call target="set-release-build-config"/>
+
+    <foreach item="String" delim="," 
+        property="framework" in="${installed.frameworks}">
+
+      <call target="set-${framework}-runtime-config"/>
+      <call target="test-each-runtime" failonerror="false"/>
+
+    </foreach>
+
+  </target>
+
+  <target name="nunit2-test" depends="build"
+    description="Run tests for a build using the nunit2 task">
+
+    <echo message="*"/>
+    <echo message="* Starting ${runtime.config} ${build.config} test run"/>
+    <echo message="*"/>
+
+    <nunit2>
+      <formatter type="Plain"/>
+      <test assemblyname="${current.build.dir}/nunit.framework.tests.dll"/>
+    </nunit2>
+  </target>
+
+  <target name="timing-test" depends="build"
+    description="Run timing tests (long)">
+
+    <echo message="*"/>
+    <echo message="* Starting ${runtime.config} ${build.config} timing tests"/>
+    <echo message="*"/>
+    <echo message="* WARNING: Test may take some time to run"/>
+    <echo message="*"/>
+
+    <exec basedir="${current.build.dir}" 
+      workingdir="${current.build.dir}" 
+      program="nunit-console.exe" 
+      commandline="timing-tests.dll"/>
+
+  </target>
+
+  <target name="gui-test" depends="build"
+    description="Run tests for a build using gui runner">
+
+    <echo message="*"/>
+    <echo message="* Starting ${runtime.config} ${build.config} gui test run"/>
+    <echo message="*"/>
+
+    <exec basedir="${current.build.dir}" 
+      workingdir="${current.build.dir}" 
+      program="nunit.exe" 
+      managed="strict"
+      commandline="NUnitTests.nunit -run"/>
+
+  </target>
+
+  <target name="fit-tests" depends="build"
+    description="Run Fit Acceptance tests on the build">
+
+    <echo message="*"/>
+    <echo message="* Starting ${runtime.config} ${build.config} Fit Tests"/>
+    <echo message="*"/>
+
+    <exec basedir="${current.build.dir}" 
+      workingdir="${current.build.dir}" 
+      program="runfile.exe" 
+      managed="strict"
+      commandline="NUnitFitTests.html TestResults.html ." />
+
+  </target>
+
+
+<!-- ***************************************************************** -->
+<!-- *       Build the NUnit samples - not part of normal build    *** -->
+<!-- ***************************************************************** -->
+
+  <property name="samples.bin.dir"
+    value="${path::combine(project.samples.dir, 'bin')}"/>
+
+  <target name="clean-samples" description="Removes the samples build directory">
+    <delete dir="${samples.bin.dir}" />
+  </target>
+
+  <target name="build-samples" depends="build"
+     description="Build the NUnit samples">
+    
+    <mkdir dir="${samples.bin.dir}" unless="${directory::exists(samples.bin.dir)}" />
+
+    <copy todir="${samples.bin.dir}"
+      file="${path::combine(current.framework.dir,'nunit.framework.dll')}" />
+    <copy todir="${samples.bin.dir}"
+      file="${path::combine(current.lib.dir,'nunit.core.interfaces.dll')}" />
+    <copy todir="${samples.bin.dir}"
+      file="${path::combine(current.lib.dir,'nunit.core.dll')}" />
+
+    <nant target="build">
+      <buildfiles refid="sample.buildfiles" />
+    </nant>
+
+  </target>
+
+<!-- ***************************************************************** -->
+<!-- ***         Targets for packaging the NUnit distribution      *** -->
+<!-- ***************************************************************** -->
+
+  <target name="package-all"
+      description="Create all the standard packages for distribution">
+      
+    <call target="package-src"/>
+
+    <call target="package-docs"/>
+
+    <foreach item="String" delim="," 
+        property="package.config" in="${standard.packages}">
+
+      <call target="set-package-config"/>
+      <call target="package"/>
+
+    </foreach>
+
+  </target>
+
+<!-- ***************************************************************** -->
+<!-- ***            Package Binaries From Current Build            *** -->
+<!-- ***************************************************************** -->
+
+  <target name="package-build" depends="build"
+      description="Create a zip of the current build (not a full installation)">
+
+    <property name="zip.file.name" 
+      value="${package.name}-${runtime.config}${build.suffix}"/>
+
+    <zip ziplevel="9"
+        zipfile="${project.package.dir}/${zip.file.name}.zip">
+      <fileset basedir="${current.build.dir}" prefix="${zip.file.name}">
+        <include name="**"/>
+      </fileset>
+    </zip>
+
+  </target>
+
+<!-- ***************************************************************** -->
+<!-- ***   Package Using the Currently Selected Package Config     *** -->
+<!-- ***      or the default package if none is selected           *** -->
+<!-- ***************************************************************** -->
+
+  <target name="package" depends="build-install-image"
+      description="Create a package using the current or default config">
+
+    <call target="create-zip"/>
+    <call target="create-msi" if="${create.msi}"/>
+
+  </target>
+
+<!-- ***************************************************************** -->
+<!-- ***                    Package as a zip                       *** -->
+<!-- ***************************************************************** -->
+
+  <target name="package-zip" 
+    depends="build-install-image,create-zip"
+    description="Create zip binary distribution package"/>
+
+<!-- ***************************************************************** -->
+<!-- ***                   Package as an msi                       *** -->
+<!-- ***************************************************************** -->
+
+  <target name="package-msi" depends="build-install-image,create-msi" 
+    description="Build standard msi file and deploy it to the package dir"/>
+
+<!-- ***************************************************************** -->
+<!-- ***                     Install the msi                       *** -->
+<!-- ***************************************************************** -->
+
+  <target name="install-msi" description="Install msi file on system" >
+      <exec program="msiexec" workingdir="${project.package.dir}"
+        commandline="/i ${package.name}-${runtime.config}${build.suffix}.msi /passive" />
+  </target>
+
+<!-- ***************************************************************** -->
+<!-- ***                   Uninstall the msi                       *** -->
+<!-- ***************************************************************** -->
+
+  <target name="remove-msi" description="Uninstall an msi" >
+      <exec program="msiexec" workingdir="${project.package.dir}"
+        commandline="/x ${package.name}-${runtime.config}${build.suffix}.msi /passive" /> 
+  </target>
+
+<!-- ***************************************************************** -->
+<!-- ***                    Create the zip                         *** -->
+<!-- ***************************************************************** -->
+
+  <!-- Create zip from existing install image -->
+  <target name="create-zip">
+    <!-- Create the zip file -->
+    <property name="zip.file.name" 
+      value="${package.name}-${package.config}${build.suffix}"
+      unless="${package.config==default.package.config}"/>
+    <property name="zip.file.name" 
+      value="${package.name}${build.suffix}"
+      if="${package.config==default.package.config}"/>
+
+    <zip ziplevel="9"
+        zipfile="${project.package.dir}/${zip.file.name}.zip">
+      <fileset basedir="${package.working.dir}" prefix="${package.name}">
+        <include name="**"/>
+      </fileset>
+    </zip>
+  </target>
+
+<!-- ***************************************************************** -->
+<!-- ***                    Create the msi                         *** -->
+<!-- ***************************************************************** -->
+
+  <!-- Create msi from existing install image -->
+  <target name="create-msi">
+  
+    <fail message="MSI can only be built on the Win32 platform" unless="${platform::is-windows()}"/>
+    <fail message="MSI can only be built for a Win32 runtime" unless="${build.win32}"/>
+
+    <property name="wix.dir"
+      value="${project.tools.dir}/wix"/>
+    <property name="work.dir"
+      value="${package.working.dir}"/>
+    <property name="install.dir"
+      value="${project.base.dir}/install"/>
+
+    <property name="build.suffix" value=""
+      unless="${property::exists('build.suffix')}" />
+    <property name="msi.file.name"
+      value="${package.name}-${package.config}${build.suffix}.msi"
+      unless="${package.config==default.package.config}"/>
+    <property name="msi.file.name"
+      value="${package.name}${build.suffix}.msi"
+      if="${package.config==default.package.config}"/>
+
+
+    <candle out="${work.dir}/" exedir="${wix.dir}">
+      <defines>
+        <define name="ProductVersion" value="${package.version}" />
+        <define name="NominalVersion" value="${nominal.version}" />
+        <define name="InstallImage" value="package\NUnit-${package.version}" />
+      </defines>
+      <sources basedir="${install.dir}">
+        <include name="bin.wxs" />
+        <include name="nunit-gui.wxs" />
+        <include name="doc.wxs" />
+        <include name="tests.wxs" />
+        <include name="samples.wxs" />
+        <include name="pnunit.wxs" />
+        <include name="NUnit.wxs" />
+      </sources>
+    </candle>
+
+    <light exedir="${wix.dir}"
+      out="${project.package.dir}/${msi.file.name}" 
+      locfile="${wix.dir}/WixUI_en-us.wxl">
+      <sources>
+        <include name="${work.dir}/NUnit.wixobj" />
+        <include name="${work.dir}/bin.wixobj" />
+        <include name="${work.dir}/nunit-gui.wixobj" />
+        <include name="${work.dir}/doc.wixobj" />
+        <include name="${work.dir}/samples.wixobj" />
+        <include name="${work.dir}/tests.wixobj" />
+        <include name="${work.dir}/pnunit.wixobj" />
+        <include name="${wix.dir}/wixui.wixlib" />
+      </sources>
+    </light>
+
+  </target>
+
+<!-- ***************************************************************** -->
+<!-- ***                  Package source files                     *** -->
+<!-- ***************************************************************** -->
+
+  <target name="package-src" depends="clean-package-dir"
+    description="Create full source package for developer use">
+
+    <call target="copy-docs"/>
+    <call target="copy-samples"/>
+    <call target="copy-src"/>
+    <call target="copy-tools" />
+
+    <copy file="license.txt" todir="${package.working.dir}" />
+
+    <!-- Create the zip file -->
+    <zip  ziplevel="9"
+        zipfile="${project.package.dir}/${package.name}-src.zip">
+      <fileset basedir="${package.working.dir}" prefix="${package.name}">
+        <include name="**"/>
+      </fileset>
+    </zip>
+  </target>
+
+<!-- ***************************************************************** -->
+<!-- ***                      Package docs                         *** -->
+<!-- ***************************************************************** -->
+
+  <target name="package-docs" depends="clean-package-dir"
+      description="Create a zip of the docs only">
+
+    <call target="copy-docs"/>
+
+    <!-- Create the zip file -->
+    <zip ziplevel="9"
+        zipfile="${project.package.dir}/${package.name}-docs.zip">
+      <fileset basedir="${package.working.dir}" prefix="${package.name}">
+        <include name="**"/>
+      </fileset>
+    </zip>
+    
+  </target>
+  
+<!-- ***************************************************************** -->
+<!-- ***                    Package resources                      *** -->
+<!-- ***************************************************************** -->
+
+  <target name="package-resources" depends="clean-package-dir"
+      description="Package resources for localization - currently not working">
+
+    <copy todir="${package.resource.dir}/nunit-gui-runner">
+      <fileset basedir="GuiRunner/nunit-gui/obj/Release">
+        <include name="*.resources"/>
+      </fileset>
+    </copy>
+
+    <copy todir="${package.resource.dir}/nunit.uikit">
+      <fileset basedir="GuiComponents/UiKit/obj/Release">
+        <include name="NUnit.UiKit.AddConfigurationDialog.resources"/>
+        <include name="NUnit.UiKit.AssemblyPathDialog.resources"/>
+        <include name="NUnit.UiKit.ConfigurationEditor.resources"/>
+        <include name="NUnit.UiKit.RenameConfigurationDialog.resources"/>
+        <include name="NUnit.UiKit.TestPropertiesDialog.resources"/>
+        <include name="NUnit.UiKit.TestTree.resources"/>
+      </fileset>
+    </copy>
+
+    <copy todir="${package.working.dir}">
+      <fileset basedir="${project.tools.dir}/localization">
+        <include name="*.*"/>
+      </fileset>
+    </copy>
+
+    <if test="${property::exists('localize')}">
+    <foreach property="culture" item="String" delim="," 
+        in="${localize}">
+    <foreach property="folder" item="Folder" 
+        in="${package.working.dir}/resources">
+      <property name="proj" 
+        value="${path::get-file-name(folder)}"/>
+      <property name="projdir" 
+        value="${package.working.dir}/${culture}/${proj}"/>
+    <foreach property="file" item="File" in="${folder}">
+      <property name="filename"
+        value="${path::get-file-name-without-extension(file)}"/>
+      <copy file="${file}" 
+        tofile="${projdir}/${filename}.${culture}.resources"/>"
+    </foreach>
+    </foreach>
+    </foreach>   
+    </if>
+
+    <zip  ziplevel="9"
+        zipfile="${project.package.dir}/${package.name}-resources.zip">
+      <fileset basedir="${package.working.dir}" prefix="${package.name}">
+        <include name="**"/>
+      </fileset>
+    </zip>
+
+  </target>
+
+<!-- ***************************************************************** -->
+<!-- ***            Helper targets used for packaging              *** -->
+<!-- ***************************************************************** -->
+
+<!-- ***************************************************************** -->
+<!-- ***            Build install image for a package              *** -->
+<!-- ***************************************************************** -->
+
+  <!-- Create an install image for use by a package -->
+  <target name="build-install-image" depends="clean-package-dir">
+
+    <call target="copy-top-level-files" />
+
+    <foreach item="String" delim="+"
+      property="runtime" in="${package.runtimes}">
+
+      <if test="${framework::exists( runtime )}">
+        <if test="${framework::sdk-exists( runtime )}">
+          <call target="set-${runtime}-runtime-config"/>
+          <call target="copy-bins" />
+        </if>
+      </if>
+    </foreach>
+
+    <call target="copy-docs" />
+    <call target="copy-samples" />
+
+  </target>
+
+  <target name="copy-top-level-files">
+
+    <copy file="license.txt" todir="${package.working.dir}" />
+    <copy file="${project.tools.dir}/fit/license.txt"
+          tofile="${package.working.dir}/fit-license.txt" />
+    <copy file="${project.src.dir}/GuiRunner/nunit-gui/Logo.ico"
+          todir="${package.working.dir}" />
+    <copy file="NUnitFitTests.html"
+          todir="${package.working.dir}" />
+
+  </target>
+
+<!-- ***************************************************************** -->
+<!-- ***           Copy a set of binaries for a package            *** -->
+<!-- ***************************************************************** -->
+
+  <target name="copy-bins" depends="build">
+
+    <mkdir dir="${package.bin.dir}"/>
+    <copy todir="${package.bin.dir}/${runtime.config}">
+      <fileset basedir="${current.build.dir}">
+        <include name="*"/>
+        <include name="lib/*"/>
+        <include name="tests/*"/>
+        <include name="framework/*"/>
+        <exclude name="*.wixobj"/>
+        <exclude name="nunit-server.*"/>
+        <exclude name="nunit-test-server.*"/>
+      </fileset>
+    </copy>
+
+  </target>
+  
+<!-- ***************************************************************** -->
+<!-- ***           Copy the documentation for a package            *** -->
+<!-- ***************************************************************** -->
+
+  <target name="copy-docs">
+    <mkdir dir="${package.doc.dir}"/>
+    <copy todir="${package.doc.dir}">
+      <fileset basedir="${project.doc.dir}">
+        <include name="*.html"/>
+	<include name="nunit.css"/>
+        <include name="codeFuncs.js"/>
+        <include name="favicon.ico"/>
+	<include name="files/*"/>
+	<include name="img/*"/>
+        <exclude name="img/thumbs.db"/>
+      </fileset>
+    </copy>
+  </target>
+
+<!-- ***************************************************************** -->
+<!-- ***            Copy sample programs for a package             *** -->
+<!-- ***************************************************************** -->
+
+  <target name="copy-samples">
+
+    <mkdir dir="${package.samples.dir}"/>
+
+    <!-- Copy files that are not part of an individual project -->
+    <copy todir="${package.samples.dir}">
+      <fileset basedir="${project.samples.dir}">
+        <include name="ReadMe.txt" />
+        <include name="samples.common" />
+        <include name="csharp/CSharp.sln" />
+        <include name="jsharp/jsharp.sln" />
+        <include name="vb/vb-samples.sln" />
+        <include name="cpp/managed/managed-cpp.sln" />
+        <include name="cpp/cpp-cli/cpp-cli.sln" />
+        <include name="Extensibility/Core/CoreExtensibility.sln" />
+        <include name="Extensibility/Core/Install.bat" />
+      </fileset>
+    </copy>
+
+    <!-- Copy each project's files -->
+    <nant target="package">
+      <buildfiles refid="sample.buildfiles"  failonerror="true" />
+    </nant>
+
+  </target>
+
+
+<!-- ***************************************************************** -->
+<!-- ***            Copy the source code for a package             *** -->
+<!-- ***************************************************************** -->
+
+  <target name="copy-src">
+    <delete dir="${package.src.dir}" />
+    <mkdir dir="${package.src.dir}"/>
+
+    <!-- Copy project top level files -->
+    <copy todir="${package.working.dir}">
+      <fileset basedir="${project.base.dir}">
+        <include name="license.rtf"/>
+        <include name="nunit.build"/>
+        <include name="nunit.build.include"/>
+        <include name="nunit.sln"/>
+        <include name="nunit.snk"/>
+        <include name="NUnitFitTests.html"/>
+        <include name="NUnitTests.nunit"/>
+        <include name="NUnitTests.config"/>
+        <include name="NUnitTests.v1.nunit"/>
+        <include name="NUnitTests.v2.nunit"/>
+      </fileset>
+    </copy>
+
+    <!-- Copy src dir files -->
+    <copy todir="${package.src.dir}">
+      <fileset basedir="${project.src.dir}">
+        <include name="nunit.snk"/>
+        <include name="CommonAssemblyInfo.cs"/>
+        <include name="nunit20under21.config"/>
+        <include name="nunit20under22.config"/>
+        <include name="nunit21under22.config"/>
+        <include name="PNUnit/*.conf"/>
+        <include name="PNUnit/runpnunit.bat"/>
+      </fileset>
+    </copy>
+
+    <!-- Copy lib dir files -->
+    <copy todir="${package.lib.dir}">
+      <fileset basedir="${project.lib.dir}">
+        <include name="*.dll"/>
+      </fileset>
+    </copy>
+
+    <!-- Copy install directory files -->
+    <copy todir="${package.install.dir}">
+      <fileset basedir="${project.install.dir}">
+        <include name="bin.wxs" />
+        <include name="nunit-gui.wxs" />
+        <include name="doc.wxs" />
+        <include name="tests.wxs" />
+        <include name="samples.wxs" />
+        <include name="NUnit.wxs"/>
+      </fileset>
+    </copy>
+
+    <!-- Copy individual projects -->
+    <nant target="package" inheritrefs="true">
+      <buildfiles refid="project.buildfiles" />
+    </nant>
+
+    <nant target="package" inheritrefs="true">
+      <buildfiles refid="gui.buildfiles" />
+    </nant>
+
+  </target>
+
+<!-- ***************************************************************** -->
+<!-- ***               Copy the tools for a package                *** -->
+<!-- ***************************************************************** -->
+
+  <target name="copy-tools">
+
+    <mkdir dir="${package.tools.dir}" />
+
+    <copy todir="${package.tools.dir}">
+      <fileset basedir="${project.tools.dir}">
+        <include name="fit/fit.dll"/>
+        <include name="fit/runFile.exe"/>
+        <include name="fit/runFile.exe.config"/>
+        <include name="fit/license.txt"/>
+        <include name="bin/GenSyntax.exe"/>
+        <include name="src/Gensyntax/GenSyntax.build"/>
+        <include name="src/Gensyntax/GenSyntax.csproj"/>
+        <include name="src/Gensyntax/GenSyntax.sln"/>
+        <include name="src/Gensyntax/App.ico"/>
+        <include name="src/GenSyntax/*.cs"/>
+        <include name="src/Gensyntax/Templates/*.cs"/>
+      </fileset>
+    </copy>
+
+  </target>
+
+<!-- ***************************************************************** -->
+<!-- ***        Targets for installing the NUnit distribution      *** -->
+<!-- ***************************************************************** -->
+
+  <target name="install" depends="build-install-image"
+      description="Install NUnit directly from the build">
+
+  </target>
+
+<!-- ***************************************************************** -->
+<!-- ***    Targets for building custom tools used in the build    *** -->
+<!-- ***                                                           *** -->
+<!-- ***    NOTE: Tools are not built automatically. If you are    *** -->
+<!-- ***    building from source and don't have binaries for       *** -->
+<!-- ***    NUnit-specific tools, you can run this target.         *** -->
+<!-- ***************************************************************** -->
+
+  <target name="clean-tools"
+      description="Remove binaries of tools used to build NUnit (DANGEROUS!)">
+
+    <nant target="clean" buildfile="tools/src/GenSyntax/GenSyntax.build"/>
+
+  </target>
+
+  <target name="build-tools"
+      description="Build tools used in building NUnit">
+
+    <nant target="build" buildfile="tools/src/GenSyntax/GenSyntax.build"/>
+
+  </target>
+
+<!-- ***************************************************************** -->
+<!-- ****** Patternsets and Filesets Used by Various Targets  ******** -->
+<!-- ***************************************************************** -->
+
+  <fileset id="project.buildfiles" basedir="${project.src.dir}">
+
+    <!-- NUnit Base -->
+    <include name="NUnitFramework/framework/nunit.framework.build" />
+    <include name="NUnitCore/interfaces/nunit.core.interfaces.build" />
+    <include name="NUnitCore/core/nunit.core.build" />
+    <include name="NUnitMocks/mocks/nunit.mocks.build" />
+    <include name="ClientUtilities/util/nunit.util.build" />
+
+    <!-- Console Runner -->
+    <include name="ConsoleRunner/nunit-console/nunit-console.build" />
+    <include name="ConsoleRunner/nunit-console-exe/nunit-console.exe.build" />
+
+    <!-- Test Server -->
+    <include name="NUnitTestServer/nunit-server-exe/nunit-server.exe.build" />
+    <include name="NUnitTestServer/nunit-agent-exe/nunit-agent.exe.build" />
+
+    <!-- PNUnit -->
+    <include name="PNUnit/pnunit.framework/pnunit.framework.build" />
+    <include name="PNUnit/agent/pnunit-agent.build"/>
+    <include name="PNUnit/launcher/pnunit-launcher.build"/>
+
+    <!-- Test Utilities and Dummy Projects -->
+    <include name="tests/mock-assembly/mock-assembly.build" />
+    <include name="tests/nonamespace-assembly/nonamespace-assembly.build" />
+    <include name="tests/test-assembly/test-assembly.build" />
+    <include name="tests/test-utilities/test-utilities.build" />
+    <include name="tests/loadtest-assembly/loadtest-assembly.build" />
+    <include name="tests/timing-tests/timing-tests.build" />
+
+    <!-- NUnit Base Tests -->
+    <include name="NUnitFramework/tests/nunit.framework.tests.build" />
+    <include name="NUnitCore/tests/nunit.core.tests.build" />
+    <include name="NUnitMocks/tests/nunit.mocks.tests.build" />
+    <include name="ClientUtilities/tests/nunit.util.tests.build" />
+
+    <!-- Console Runner Tests -->
+    <include name="ConsoleRunner/tests/nunit-console.tests.build" />
+
+    <!-- PNUnit Tests -->
+    <include name="PNUnit/tests/pnunit.tests.build"/>
+
+    <!-- FIT Tests -->
+    <include name="NUnitFixtures/fixtures/nunit.fixtures.build" />
+    <include name="NUnitFixtures/tests/nunit.fixtures.tests.build" />
+
+  </fileset>
+
+  <fileset id="gui.buildfiles" basedir="${project.src.dir}">
+
+    <!-- Gui Runner -->
+    <include name="GuiException/UiException/nunit.uiexception.build" />
+    <include name="GuiComponents/UiKit/nunit.uikit.build" />
+    <include name="GuiRunner/nunit-gui/nunit-gui.build" />
+    <include name="GuiRunner/nunit-gui-exe/nunit-gui.exe.build" />
+
+    <!-- GUI Tests -->
+    <include name="GuiException/tests/nunit.uiexception.tests.build" />
+    <include name="GuiComponents/tests/nunit.uikit.tests.build" />
+    <include name="GuiRunner/tests/nunit-gui.tests.build" />
+
+  </fileset>
+
+  <!-- BuildFiles for Samples -->
+  <!-- Note: For each sample, sample.buildfile includes sample.build.
+       The distribution includes sample.build, but not sample.buildfile,
+       because the latter is used by NUnit for packaging. -->
+  <fileset id="sample.buildfiles" basedir="${project.samples.dir}">
+
+    <!-- CSharp Samples -->
+    <include name="csharp/failures/cs-failures.build" />
+    <include name="csharp/money/cs-money.build" />
+    <include name="csharp/syntax/cs-syntax.build" />
+
+    <!-- JSharp Samples -->
+    <include name="jsharp/failures/jsharp-failures.build"
+      if="${task::exists('vjc') and platform::is-windows()}" />
+
+    <!-- VB Samples -->
+    <include name="vb/failures/vb-failures.build"
+      if="${task::exists('vbc') and platform::is-windows()}" />
+    <include name="vb/money/vb-money.build"
+      if="${task::exists('vbc') and platform::is-windows()}" />
+    <include name="vb/syntax/vb-syntax.build"
+      if="${task::exists('vbc') and platform::is-windows()}" />
+
+    <!-- Managed C++ Samples -->
+    <include name="cpp/managed/failures/cpp-managed-failures.build"
+      if="${platform::is-windows()}" />
+
+    <!-- C++/CLI Samples -->
+    <include name="cpp/cpp-cli/failures/cpp-cli-failures.build"
+      if="${platform::is-windows()}" />
+    <include name="cpp/cpp-cli/syntax/cpp-cli-syntax.build"
+      if="${platform::is-windows()}" />
+
+    <!-- Extensibility Samples -->
+    <include name="Extensibility/Core/Minimal/Minimal.build" />
+    <include name="Extensibility/Core/SampleFixtureExtension/SampleFixtureExtension.build" />
+    <include name="Extensibility/Core/SampleSuiteExtension/SampleSuiteExtension.build" />
+  </fileset>
+
+  <!-- Files to be copied to source directories -->
+  <fileset id="source-files" >
+        <include name="**/*.sln" />
+        <include name="**/*.csproj" />
+        <include name="**/*.config" />
+        <include name="**/*.build" />
+        <include name="**/*.cs" />
+        <include name="**/*.xsd" />
+        <include name="**/*.xslt" />
+        <include name="**/*.resx" />
+        <include name="**/*.jpg" />
+        <include name="**/*.gif" />
+        <include name="**/*.ico" />
+        <include name="**/*.txt" />
+        <include name="**/resources/*" />
+
+        <exclude name="**/CVS/**" />
+        <exclude name="**/bin/**" />
+        <exclude name="**/obj/**" />
+        <exclude name="**/Debug/**" />
+        <exclude name="**/Release/**" />
+  </fileset>
+
+</project>
diff --git a/nunit.build.include b/nunit.build.include
new file mode 100644
index 0000000..fc521d2
--- /dev/null
+++ b/nunit.build.include
@@ -0,0 +1,405 @@
+<?xml version="1.0"?>
+<project name="NUnit" default="build" basedir=".">
+
+<!-- ***************************************************************** -->
+<!-- **********Set Properties used by Various targets **************** -->
+<!-- ***************************************************************** -->
+
+  <!-- Project base dir is nant project base dir -->
+  <property name="project.base.dir"
+    value="${project::get-base-directory()}"/>
+
+  <!-- Other directories are derived from base dir -->
+  <property name="project.build.dir" 
+    value="${path::combine(project.base.dir,'build')}"/>
+  <property name="project.package.dir" 
+    value="${path::combine(project.base.dir,'package')}"/>
+  <property name="project.src.dir"
+    value="${path::combine(project.base.dir, 'src')}"/>
+  <property name="project.doc.dir"
+    value="${path::combine(project.base.dir,'doc')}"/>
+  <property name="project.samples.dir"
+    value="${path::combine(project.base.dir,'samples')}"/>
+  <property name="project.solutions.dir"
+    value="${path::combine(project.base.dir,'solutions')}"/>
+  <property name="project.tools.dir"
+    value="${path::combine(project.base.dir,'tools')}"/>
+  <property name="project.lib.dir"
+    value="${path::combine(project.base.dir,'lib')}"/>
+  <property name="project.install.dir"
+    value="${path::combine(project.base.dir, 'install')}"/>
+
+  <!-- Set paths to various package directories -->
+  <property name="package.working.dir" 
+    value="${path::combine(project.package.dir,package.name)}"/>
+  <property name="package.bin.dir" 
+    value="${path::combine(package.working.dir,'bin')}"/>
+  <property name="package.doc.dir" 
+    value="${path::combine(package.working.dir,'doc')}"/>
+  <property name="package.samples.dir" 
+    value="${path::combine(package.working.dir,'samples')}"/>
+  <property name="package.src.dir" 
+    value="${path::combine(package.working.dir,'src')}"/>
+  <property name="package.lib.dir" 
+    value="${path::combine(package.working.dir,'lib')}"/>
+  <property name="package.solutions.dir"
+    value="${path::combine(package.working.dir,'solutions')}"/>
+  <property name="package.tools.dir"
+    value="${path::combine(package.working.dir,'tools')}"/>
+  <property name="package.resource.dir"
+    value="${path::combine(package.working.dir,'resources')}"/>
+  <property name="package.install.dir"
+    value="${path::combine(package.working.dir,'install')}"/>
+
+  <!-- Default build configuration -->
+  <property name="build.config" value="debug"/>
+  <property name="build.defines" value=""/>
+
+  <!-- sdk-exists causes an error if the framework is not installed! -->
+  <!-- Default runtime configuration -->
+  <foreach item="String" delim="," 
+      property="framework" in="${supported.frameworks}">
+    <if test="${framework::exists( framework )}">
+    <if test="${framework::sdk-exists( framework )}">
+      <property name="installed.frameworks" value="${installed.frameworks},${framework}"
+        if="${property::exists('installed.frameworks')}"/>
+      <property name="installed.frameworks" value="${framework}"
+        unless="${property::exists('installed.frameworks')}"/>
+      <property name="default.runtime" value="${framework}"
+        unless="${property::exists('default.runtime')}"/>
+      <property name="default.net.runtime" value="${framework}"
+        if="${string::starts-with(framework,'net')}"
+        unless="${property::exists('default.net.runtime')}"/>
+      <property name="default.mono.runtime" value="${framework}"
+        if="${string::starts-with(framework,'mono')}"
+        unless="${property::exists('default.mono.runtime')}"/>
+    </if>
+    </if>
+  </foreach>
+
+  <call target="set-${default.runtime}-runtime-config" />
+
+  <call target="set-debug-build-config" />
+
+  <call target="set-default-package-config" />
+
+<!-- ***************************************************************** -->
+<!-- ********* Targets for setting the build configuration *********** -->
+<!-- ***************************************************************** -->
+
+  <target name="set-build-config" description="Set the build config">
+    <call target="set-${build.config}-build-config"/>
+  </target>
+
+  <target name="set-debug-build-config">
+    <property name="build.config" value="debug"/>
+    <property name="build.debug" value="true"/>
+    <property name="build.defines" value="DEBUG,TRACE,${runtime.defines}"
+        dynamic="true"/>
+    <property name="build.suffix" value="-dbg"/>
+  </target>
+	
+  <target name="set-release-build-config">
+    <property name="build.config" value="release"/>
+    <property name="build.debug" value="false"/>
+    <property name="build.defines" value="TRACE,${runtime.defines}"
+	dynamic="true"/>
+    <property name="build.suffix" value=""/>
+  </target>
+
+<!-- ***************************************************************** -->
+<!-- ***    Targets for setting the runtime configuration          *** -->
+<!-- ***************************************************************** -->
+
+  <target name="set-runtime-config">   
+    <call target="set-${runtime.config}-runtime-config"/>
+  </target>
+  
+  <target name="set-default-dot-net-runtime-config">
+    <fail unless="${property::exists( 'default.net.runtime' )}"
+      message="No versions of the .NET SDK were found"/>
+
+    <call target="set-${default.net.runtime}-runtime-config" />
+  </target>
+
+  <target name="set-default-mono-runtime-config">
+    <fail unless="${property::exists( 'default.mono.runtime' )}"
+      message="No versions of the Mono runtime were found"/>
+
+    <call target="set-${default.mono.runtime}-runtime-config" />
+  </target>
+
+  <target name="set-net-1.0-runtime-config">
+    <fail unless="${framework::exists('net-1.0') and framework::sdk-exists('net-1.0')}"
+      message="The .NET 1.0 SDK is not configured or not installed"/>
+
+    <property name="runtime.platform" value="net"/>
+    <property name="runtime.version" value="1.0"/>
+    <property name="runtime.config" value="net-1.0"/>
+    <property name="runtime.defines" value="MSNET,NET_1_0"/>
+    <property name="runtime.testproj" value="NUnitTests.v1.nunit"/>
+    <property name="build.mono" value="false"/>
+    <property name="build.win32" value="true"/>
+    <property name="build.x86" value="false"/>
+    <property name="build.gui" value="false"/>
+    <property name="nant.settings.currentframework" 
+      value="net-1.0"/>
+    <property name="supported.test.platforms" 
+      value="net-1.0,net-1.1,net-2.0,mono-1.0,mono-2.0"/>
+  </target>
+	
+  <target name="set-net-1.1-runtime-config">
+    <fail unless="${framework::exists('net-1.1') and framework::sdk-exists('net-1.1')}"
+      message="The .NET 1.1 SDK is not configured or not installed"/>
+
+    <property name="runtime.platform" value="net"/>
+    <property name="runtime.version" value="1.1"/>
+    <property name="runtime.config" value="net-1.1"/>
+    <property name="runtime.defines" value="MSNET,NET_1_1"/>
+    <property name="runtime.testproj" value="NUnitTests.v1.nunit"/>
+    <property name="build.mono" value="false"/>
+    <property name="build.win32" value="true"/>
+    <property name="build.x86" value="false"/>
+    <property name="build.gui" value="false"/>
+    <property name="nant.settings.currentframework" 
+      value="net-1.1"/>
+    <property name="supported.test.platforms"
+      value="net-1.0,net-1.1,net-2.0,mono-1.0,mono-2.0"/>
+  </target>
+	
+  <target name="set-net-2.0-runtime-config">
+    <fail unless="${framework::exists('net-2.0') and framework::sdk-exists('net-2.0')}"
+      message="The .NET 2.0 SDK is not configured or not installed"/>
+
+    <property name="runtime.platform" value="net"/>
+    <property name="runtime.version" value="2.0"/>
+    <property name="runtime.config" value="net-2.0"/>
+    <property name="runtime.defines" value="MSNET,NET_2_0"/>
+    <property name="runtime.testproj" value="NUnitTests.v2.nunit"/>
+    <property name="build.mono" value="false"/>
+    <property name="build.win32" value="true"/>
+    <property name="build.x86" value="true"/>
+    <property name="build.gui" value="true"/>
+    <property name="nant.settings.currentframework" 
+      value="net-2.0"/>
+    <property name="supported.test.platforms" value="net-2.0,mono-2.0"/>
+  </target>
+   
+<!--     
+  <target name="set-net-3.0-runtime-config">
+    <fail unless="${framework::exists('net-3.0') and framework::sdk-exists('net-3.0')}"
+      message="The .NET 3.0 SDK is not configured or not installed"/>
+
+    <property name="runtime.platform" value="net"/>
+    <property name="runtime.version" value="3.0"/>
+    <property name="runtime.config" value="net-3.0"/>
+    <property name="runtime.defines" value="MSNET,NET_3_0"/>
+    <property name="runtime.testproj" value="NUnitTests.v2.nunit"/>
+    <property name="build.mono" value="false"/>
+    <property name="build.win32" value="true"/>
+    <property name="build.x86" value="true"/>
+    <property name="build.gui" value="true"/>
+    <property name="nant.settings.currentframework" 
+      value="net-3.0"/>
+    <property name="supported.test.platforms" value="net-2.0,mono-2.0"/>
+  </target>
+-->
+	
+  <target name="set-net-3.5-runtime-config">
+    <fail unless="${framework::exists('net-3.5') and framework::sdk-exists('net-3.5')}"
+      message="The .NET 3.5 SDK is not configured or not installed"/>
+
+    <property name="runtime.platform" value="net"/>
+    <property name="runtime.version" value="3.5"/>
+    <property name="runtime.config" value="net-3.5"/>
+    <property name="runtime.defines" value="MSNET,NET_2_0,CS_3_0"/>
+    <property name="runtime.testproj" value="NUnitTests.v2.nunit"/>
+    <property name="build.mono" value="false"/>
+    <property name="build.win32" value="true"/>
+    <property name="build.x86" value="true"/>
+    <property name="build.gui" value="true"/>
+    <property name="nant.settings.currentframework" 
+      value="net-3.5"/>
+    <property name="supported.test.platforms" value="net-3.5,mono-3.5"/>
+  </target>
+ 	
+  <target name="set-net-4.0-runtime-config">
+    <fail unless="${framework::exists('net-4.0') and framework::sdk-exists('net-4.0')}"
+      message="The .NET 4.0 SDK is not configured or not installed"/>
+
+    <property name="runtime.platform" value="net"/>
+    <property name="runtime.version" value="4.0"/>
+    <property name="runtime.config" value="net-4.0"/>
+    <property name="runtime.defines" value="MSNET,NET_2_0,CS_3_0"/>
+    <property name="runtime.testproj" value="NUnitTests.v2.nunit"/>
+    <property name="build.mono" value="false"/>
+    <property name="build.win32" value="true"/>
+    <property name="build.x86" value="true"/>
+    <property name="build.gui" value="true"/>
+    <property name="nant.settings.currentframework" 
+      value="net-4.0"/>
+    <property name="supported.test.platforms" value="net-4.0"/>
+  </target>
+ 	
+  <target name="set-mono-1.0-runtime-config">
+    <fail unless="${framework::exists('mono-1.0') and framework::sdk-exists('mono-1.0')}"
+      message="The Mono 1.0 SDK is not configured or not installed"/>
+
+    <property name="runtime.platform" value="mono"/>
+    <property name="runtime.version" value="1.0"/>
+    <property name="runtime.config" value="mono-1.0"/>
+    <property name="runtime.defines" value="MONO,NET_1_1"/>
+    <property name="runtime.testproj" value="NUnitTests.v1.nunit"/>
+    <property name="build.mono" value="true"/>
+    <property name="build.win32" value="false"/>
+    <property name="build.x86" value="false"/>
+    <property name="build.gui" value="false"/>
+    <property name="nant.settings.currentframework" 
+      value="mono-1.0"/>
+    <property name="supported.test.platforms"
+      value="mono-1.0,mono-2.0,net-1.0,net-1.1,net-2.0"/>
+  </target>
+
+  <target name="set-mono-2.0-runtime-config">
+    <fail unless="${framework::exists('mono-2.0') and framework::sdk-exists('mono-2.0')}"
+      message="The Mono 2.0 SDK is not configured or not installed"/>
+
+    <property name="runtime.platform" value="mono"/>
+    <property name="runtime.version" value="2.0"/>
+    <property name="runtime.config" value="mono-2.0"/>
+    <property name="runtime.defines" value="MONO,NET_2_0"/>
+    <property name="build.mono" value="true"/>
+    <property name="runtime.testproj" value="NUnitTests.v2.nunit"/>
+    <property name="build.win32" value="false"/>
+    <property name="build.x86" value="true"/>
+    <property name="build.gui" value="true"/>
+    <property name="nant.settings.currentframework" 
+      value="mono-2.0"/>
+    <property name="supported.test.platforms" value="mono-2.0,net-2.0"/>
+  </target>
+
+<!-- ***************************************************************** -->
+<!-- ***    Targets for setting the package configuration          *** -->
+<!-- ***************************************************************** -->
+
+  <target name="set-package-config">   
+    <call target="set-${package.config}-package-config"/>
+  </target>
+
+  <target name="set-default-package-config">
+    <call target="set-${default.package.config}-package-config"/>
+  </target>
+  
+  <target name="set-std-package-config">
+    <property name="package.config" value="std"/>
+    <property name="package.runtimes" value="net-1.1+net-2.0"/>
+    <property name="create.msi" value="true"/>
+  </target>
+
+  <target name="set-mono-package-config">
+    <property name="package.config" value="mono"/>
+    <property name="package.runtimes" value="mono-1.0+mono-2.0"/>
+    <property name="create.msi" value="false"/>
+  </target>
+
+<!-- ***************************************************************** -->
+<!-- **************** Internally used targets ************************ -->
+<!-- ***************************************************************** -->
+
+  <!-- Set up the build directory -->
+  <target name="set-build-dir"
+    depends="set-build-config,set-runtime-config">
+
+    <property name="runtime.platform.dir"
+      value="${path::combine(project.build.dir,runtime.platform)}"/>
+    <property name="runtime.version.dir"
+      value="${path::combine(runtime.platform.dir,runtime.version)}"/>
+    <property name="current.build.dir" 
+      value="${path::combine(runtime.version.dir,build.config)}"/>
+    <property name="current.lib.dir" 
+      value="${path::combine(current.build.dir,'lib')}"/>
+    <property name="current.test.dir" 
+      value="${path::combine(current.build.dir,'tests')}"/>
+    <property name="current.framework.dir" 
+      value="${path::combine(current.build.dir,'framework')}"/>
+
+<!--    <property name="package.bin.dir" 
+      value="${path::combine(package.working.dir,runtime.config)}"/>-->
+  </target>
+  
+  <target name="make-build-dir" depends="set-build-dir">
+    <mkdir dir="${current.build.dir}"
+      unless="${directory::exists(current.build.dir)}"/>
+    <mkdir dir="${current.lib.dir}"
+      unless="${directory::exists(current.lib.dir)}"/>
+    <mkdir dir="${current.framework.dir}"
+      unless="${directory::exists(current.framework.dir)}"/>
+    <mkdir dir="${current.test.dir}"
+      unless="${directory::exists(current.test.dir)}"/>
+  </target>
+
+<!-- ***************************************************************** -->
+<!-- ***               Display Today's Build Number                *** -->
+<!-- ***************************************************************** -->
+
+  <target name="build-number">
+    <echo message="Today's build number is ${package.build.number}"/>
+  </target>
+
+<!-- ***************************************************************** -->
+<!-- ***           Dump configuration settings for debugging       *** -->
+<!-- ***************************************************************** -->
+
+  <target name="dump-settings" depends="set-build-dir">
+
+    <echo>Project Directories</echo>
+    <echo>  Base:      ${project.base.dir}</echo>
+    <echo>   Doc:      ${project.doc.dir}</echo>
+    <echo>   Samples:  ${project.samples.dir}</echo>
+    <echo>   Source:   ${project.src.dir}</echo>
+    <echo>   Build:    ${project.build.dir}</echo>
+    <echo>   Package:  ${project.package.dir}</echo>
+    <echo>   Tools:    ${project.tools.dir}</echo>
+    <echo></echo>
+    <echo>Runtime Versions</echo>
+    <echo>  Supported: ${supported.frameworks}</echo>
+    <echo>  Installed: ${installed.frameworks}</echo>
+    <echo>  Default:   ${default.runtime}</echo>
+    <if test="${property::exists('default.net.runtime')}">
+    <echo>    .Net:    ${default.net.runtime}</echo>
+    </if>
+    <if test="${not property::exists('default.net.runtime')}">
+    <echo>    .Net:    (none)</echo>
+    </if>
+    <if test="${property::exists('default.mono.runtime')}">
+    <echo>    Mono:    ${default.mono.runtime}</echo>
+    </if>
+    <if test="${not property::exists('default.mono.runtime')}">
+    <echo>    Mono:    (none)</echo>
+    </if>
+    <echo></echo>
+    <echo>Current Build Settings</echo>
+    <echo>  Config:    ${build.config}</echo>
+    <echo>  Runtime:   ${runtime.config}</echo>
+    <echo>  Build Dir: ${current.build.dir}</echo>
+    <echo>  Defines:   ${build.defines}</echo>
+    <echo></echo>
+    <echo>Test Platforms for Current Build</echo>
+    <echo>  Supported: ${supported.test.platforms}</echo>
+    <echo></echo>
+    <echo>Packaging</echo>
+    <echo>  Name:      ${package.name}</echo>
+    <echo>  Version:   ${package.version}</echo>
+    <echo>  Work Dir:  ${package.working.dir}</echo>
+    <echo>   Bin:      ${package.bin.dir}</echo>
+    <echo>   Doc:      ${package.doc.dir}</echo>
+    <echo>   Samples:  ${package.samples.dir}</echo>
+    <echo>   Source:   ${package.src.dir}</echo>
+    <echo></echo>
+    <echo>Current Framework and SDK Directories</echo>
+    <echo>  ${framework::get-framework-directory(framework::get-target-framework())}</echo>
+    <echo>  ${framework::get-sdk-directory(framework::get-target-framework())}</echo>
+
+  </target>
+
+</project>
diff --git a/nunit.sln b/nunit.sln
new file mode 100644
index 0000000..7e1d9f3
--- /dev/null
+++ b/nunit.sln
@@ -0,0 +1,226 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{A65042E1-D8BC-48DD-8DE1-F0991F07EA77}"
+	ProjectSection(SolutionItems) = preProject
+		nunit.build.include = nunit.build.include
+		src\nunit.snk = src\nunit.snk
+		NUnitTests.config = NUnitTests.config
+		NUnitTests.nunit = NUnitTests.nunit
+		nunit.build = nunit.build
+	EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-gui.exe", "src\GuiRunner\nunit-gui-exe\nunit-gui.exe.csproj", "{AAB186A4-FA3D-404D-AD78-7EB5BB861655}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-gui", "src\GuiRunner\nunit-gui\nunit-gui.csproj", "{3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.mocks", "src\NUnitMocks\mocks\nunit.mocks.csproj", "{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.uikit.dll", "src\GuiComponents\UiKit\nunit.uikit.dll.csproj", "{27531BBF-183D-4C3A-935B-D840B9F1A3A4}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.util.dll", "src\ClientUtilities\util\nunit.util.dll.csproj", "{61CE9CE5-943E-44D4-A381-814DC1406767}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.framework.dll", "src\NUnitFramework\framework\nunit.framework.dll.csproj", "{83DD7E12-A705-4DBA-9D71-09C8973D9382}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.mocks.tests", "src\NUnitMocks\tests\nunit.mocks.tests.csproj", "{8667C588-1A05-4773-A9E8-272EB302B8AB}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.uikit.tests", "src\GuiComponents\tests\nunit.uikit.tests.csproj", "{63EC3999-FA6B-4C5B-8805-5A88AF4CBD7B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-console.exe", "src\ConsoleRunner\nunit-console-exe\nunit-console.exe.csproj", "{53BF8787-CB9C-4BB8-AFB4-605DD3A5CA0E}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-console.tests", "src\ConsoleRunner\tests\nunit-console.tests.csproj", "{8597D2C6-804D-48CB-BFC7-ED2404D389B0}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.util.tests", "src\ClientUtilities\tests\nunit.util.tests.csproj", "{74EF7165-117E-48ED-98EA-068EAE438E53}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.framework.tests", "src\NUnitFramework\tests\nunit.framework.tests.csproj", "{8C326431-AE57-4645-ACC1-A90A0B425129}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-gui.tests", "src\GuiRunner\tests\nunit-gui.tests.csproj", "{AAD27267-DE1F-4F61-A1FB-D1680A5B8001}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-server.exe", "src\NUnitTestServer\nunit-server-exe\nunit-server.exe.csproj", "{6431BD41-67B9-4C62-8B7C-4D7527D2E8F0}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.core.dll", "src\NUnitCore\core\nunit.core.dll.csproj", "{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.core.tests", "src\NUnitCore\tests\nunit.core.tests.csproj", "{DD758D21-E5D5-4D40-9450-5F65A32F359C}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "test-assembly", "src\tests\test-assembly\test-assembly.csproj", "{1960CAC4-9A82-47C5-A9B3-55BC37572C3C}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.core.interfaces.dll", "src\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj", "{435428F8-5995-4CE4-8022-93D595A8CC0F}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mock-assembly", "src\tests\mock-assembly\mock-assembly.csproj", "{2E368281-3BA8-4050-B05E-0E0E43F8F446}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nonamespace-assembly", "src\tests\nonamespace-assembly\nonamespace-assembly.csproj", "{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "test-utilities", "src\tests\test-utilities\test-utilities.csproj", "{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "timing-tests", "src\tests\timing-tests\timing-tests.csproj", "{F16DED73-A2AD-4711-BC1B-5DDFC2BF8667}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-console", "src\ConsoleRunner\nunit-console\nunit-console.csproj", "{9367EC89-6A38-42BA-9607-0DC288E4BC3A}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.fixtures", "src\NUnitFixtures\fixtures\nunit.fixtures.csproj", "{A8D36198-BE2F-44E5-AC4F-4E052AFCCF78}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.fixtures.tests", "src\NUnitFixtures\tests\nunit.fixtures.tests.csproj", "{55F2D231-743C-48DD-B79A-00E5A7236CBE}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-agent.exe", "src\NUnitTestServer\nunit-agent-exe\nunit-agent.exe.csproj", "{3E469CD9-FED2-4955-AE4C-669A74CA6767}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "loadtest-assembly", "src\tests\loadtest-assembly\loadtest-assembly.csproj", "{20ABDB3C-EA46-468A-A574-0552299A32DB}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "pnunit.framework", "src\PNUnit\pnunit.framework\pnunit.framework.csproj", "{1AE4D3A7-DA37-45C0-B300-AB7B84DFF216}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "pnunit-agent", "src\PNUnit\agent\pnunit-agent.csproj", "{7521B6A2-35C2-4BD4-9304-29FB186638F2}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "pnunit-launcher", "src\PNUnit\launcher\pnunit-launcher.csproj", "{5E0C72D1-A2A5-4836-BB97-57FF91055B64}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "pnunit.tests", "src\PNUnit\tests\pnunit.tests.csproj", "{319B9238-76BE-4335-9B4D-F8E43C4B124F}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.uiexception.dll", "src\GuiException\UiException\nunit.uiexception.dll.csproj", "{3E87A106-EB20-4147-84C8-95B0BB43A1D4}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.uiexception.tests", "src\GuiException\tests\nunit.uiexception.tests.csproj", "{092486D0-6AB9-4134-932F-0FDA10704455}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{092486D0-6AB9-4134-932F-0FDA10704455}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{092486D0-6AB9-4134-932F-0FDA10704455}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{092486D0-6AB9-4134-932F-0FDA10704455}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{092486D0-6AB9-4134-932F-0FDA10704455}.Release|Any CPU.Build.0 = Release|Any CPU
+		{1960CAC4-9A82-47C5-A9B3-55BC37572C3C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{1960CAC4-9A82-47C5-A9B3-55BC37572C3C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{1960CAC4-9A82-47C5-A9B3-55BC37572C3C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{1960CAC4-9A82-47C5-A9B3-55BC37572C3C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{1AE4D3A7-DA37-45C0-B300-AB7B84DFF216}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{1AE4D3A7-DA37-45C0-B300-AB7B84DFF216}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{1AE4D3A7-DA37-45C0-B300-AB7B84DFF216}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{1AE4D3A7-DA37-45C0-B300-AB7B84DFF216}.Release|Any CPU.Build.0 = Release|Any CPU
+		{20ABDB3C-EA46-468A-A574-0552299A32DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{20ABDB3C-EA46-468A-A574-0552299A32DB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{20ABDB3C-EA46-468A-A574-0552299A32DB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{20ABDB3C-EA46-468A-A574-0552299A32DB}.Release|Any CPU.Build.0 = Release|Any CPU
+		{27531BBF-183D-4C3A-935B-D840B9F1A3A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{27531BBF-183D-4C3A-935B-D840B9F1A3A4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{27531BBF-183D-4C3A-935B-D840B9F1A3A4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{27531BBF-183D-4C3A-935B-D840B9F1A3A4}.Release|Any CPU.Build.0 = Release|Any CPU
+		{2E368281-3BA8-4050-B05E-0E0E43F8F446}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{2E368281-3BA8-4050-B05E-0E0E43F8F446}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{2E368281-3BA8-4050-B05E-0E0E43F8F446}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{2E368281-3BA8-4050-B05E-0E0E43F8F446}.Release|Any CPU.Build.0 = Release|Any CPU
+		{319B9238-76BE-4335-9B4D-F8E43C4B124F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{319B9238-76BE-4335-9B4D-F8E43C4B124F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{319B9238-76BE-4335-9B4D-F8E43C4B124F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{319B9238-76BE-4335-9B4D-F8E43C4B124F}.Release|Any CPU.Build.0 = Release|Any CPU
+		{3E469CD9-FED2-4955-AE4C-669A74CA6767}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{3E469CD9-FED2-4955-AE4C-669A74CA6767}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{3E469CD9-FED2-4955-AE4C-669A74CA6767}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{3E469CD9-FED2-4955-AE4C-669A74CA6767}.Release|Any CPU.Build.0 = Release|Any CPU
+		{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}.Release|Any CPU.Build.0 = Release|Any CPU
+		{3E87A106-EB20-4147-84C8-95B0BB43A1D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{3E87A106-EB20-4147-84C8-95B0BB43A1D4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{3E87A106-EB20-4147-84C8-95B0BB43A1D4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{3E87A106-EB20-4147-84C8-95B0BB43A1D4}.Release|Any CPU.Build.0 = Release|Any CPU
+		{3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}.Release|Any CPU.Build.0 = Release|Any CPU
+		{435428F8-5995-4CE4-8022-93D595A8CC0F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{435428F8-5995-4CE4-8022-93D595A8CC0F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{435428F8-5995-4CE4-8022-93D595A8CC0F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{435428F8-5995-4CE4-8022-93D595A8CC0F}.Release|Any CPU.Build.0 = Release|Any CPU
+		{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}.Release|Any CPU.Build.0 = Release|Any CPU
+		{53BF8787-CB9C-4BB8-AFB4-605DD3A5CA0E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{53BF8787-CB9C-4BB8-AFB4-605DD3A5CA0E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{53BF8787-CB9C-4BB8-AFB4-605DD3A5CA0E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{53BF8787-CB9C-4BB8-AFB4-605DD3A5CA0E}.Release|Any CPU.Build.0 = Release|Any CPU
+		{55F2D231-743C-48DD-B79A-00E5A7236CBE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{55F2D231-743C-48DD-B79A-00E5A7236CBE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{55F2D231-743C-48DD-B79A-00E5A7236CBE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{55F2D231-743C-48DD-B79A-00E5A7236CBE}.Release|Any CPU.Build.0 = Release|Any CPU
+		{5E0C72D1-A2A5-4836-BB97-57FF91055B64}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{5E0C72D1-A2A5-4836-BB97-57FF91055B64}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{5E0C72D1-A2A5-4836-BB97-57FF91055B64}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{5E0C72D1-A2A5-4836-BB97-57FF91055B64}.Release|Any CPU.Build.0 = Release|Any CPU
+		{61CE9CE5-943E-44D4-A381-814DC1406767}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{61CE9CE5-943E-44D4-A381-814DC1406767}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{61CE9CE5-943E-44D4-A381-814DC1406767}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{61CE9CE5-943E-44D4-A381-814DC1406767}.Release|Any CPU.Build.0 = Release|Any CPU
+		{63EC3999-FA6B-4C5B-8805-5A88AF4CBD7B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{63EC3999-FA6B-4C5B-8805-5A88AF4CBD7B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{63EC3999-FA6B-4C5B-8805-5A88AF4CBD7B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{63EC3999-FA6B-4C5B-8805-5A88AF4CBD7B}.Release|Any CPU.Build.0 = Release|Any CPU
+		{6431BD41-67B9-4C62-8B7C-4D7527D2E8F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{6431BD41-67B9-4C62-8B7C-4D7527D2E8F0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{6431BD41-67B9-4C62-8B7C-4D7527D2E8F0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{6431BD41-67B9-4C62-8B7C-4D7527D2E8F0}.Release|Any CPU.Build.0 = Release|Any CPU
+		{74EF7165-117E-48ED-98EA-068EAE438E53}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{74EF7165-117E-48ED-98EA-068EAE438E53}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{74EF7165-117E-48ED-98EA-068EAE438E53}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{74EF7165-117E-48ED-98EA-068EAE438E53}.Release|Any CPU.Build.0 = Release|Any CPU
+		{7521B6A2-35C2-4BD4-9304-29FB186638F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{7521B6A2-35C2-4BD4-9304-29FB186638F2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{7521B6A2-35C2-4BD4-9304-29FB186638F2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{7521B6A2-35C2-4BD4-9304-29FB186638F2}.Release|Any CPU.Build.0 = Release|Any CPU
+		{83DD7E12-A705-4DBA-9D71-09C8973D9382}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{83DD7E12-A705-4DBA-9D71-09C8973D9382}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{83DD7E12-A705-4DBA-9D71-09C8973D9382}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{83DD7E12-A705-4DBA-9D71-09C8973D9382}.Release|Any CPU.Build.0 = Release|Any CPU
+		{8597D2C6-804D-48CB-BFC7-ED2404D389B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{8597D2C6-804D-48CB-BFC7-ED2404D389B0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{8597D2C6-804D-48CB-BFC7-ED2404D389B0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{8597D2C6-804D-48CB-BFC7-ED2404D389B0}.Release|Any CPU.Build.0 = Release|Any CPU
+		{8667C588-1A05-4773-A9E8-272EB302B8AB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{8667C588-1A05-4773-A9E8-272EB302B8AB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{8667C588-1A05-4773-A9E8-272EB302B8AB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{8667C588-1A05-4773-A9E8-272EB302B8AB}.Release|Any CPU.Build.0 = Release|Any CPU
+		{8C326431-AE57-4645-ACC1-A90A0B425129}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{8C326431-AE57-4645-ACC1-A90A0B425129}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{8C326431-AE57-4645-ACC1-A90A0B425129}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{8C326431-AE57-4645-ACC1-A90A0B425129}.Release|Any CPU.Build.0 = Release|Any CPU
+		{9367EC89-6A38-42BA-9607-0DC288E4BC3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{9367EC89-6A38-42BA-9607-0DC288E4BC3A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{9367EC89-6A38-42BA-9607-0DC288E4BC3A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{9367EC89-6A38-42BA-9607-0DC288E4BC3A}.Release|Any CPU.Build.0 = Release|Any CPU
+		{A8D36198-BE2F-44E5-AC4F-4E052AFCCF78}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{A8D36198-BE2F-44E5-AC4F-4E052AFCCF78}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{A8D36198-BE2F-44E5-AC4F-4E052AFCCF78}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{A8D36198-BE2F-44E5-AC4F-4E052AFCCF78}.Release|Any CPU.Build.0 = Release|Any CPU
+		{AAB186A4-FA3D-404D-AD78-7EB5BB861655}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{AAB186A4-FA3D-404D-AD78-7EB5BB861655}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{AAB186A4-FA3D-404D-AD78-7EB5BB861655}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{AAB186A4-FA3D-404D-AD78-7EB5BB861655}.Release|Any CPU.Build.0 = Release|Any CPU
+		{AAD27267-DE1F-4F61-A1FB-D1680A5B8001}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{AAD27267-DE1F-4F61-A1FB-D1680A5B8001}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{AAD27267-DE1F-4F61-A1FB-D1680A5B8001}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{AAD27267-DE1F-4F61-A1FB-D1680A5B8001}.Release|Any CPU.Build.0 = Release|Any CPU
+		{DD758D21-E5D5-4D40-9450-5F65A32F359C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{DD758D21-E5D5-4D40-9450-5F65A32F359C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{DD758D21-E5D5-4D40-9450-5F65A32F359C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{DD758D21-E5D5-4D40-9450-5F65A32F359C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}.Release|Any CPU.Build.0 = Release|Any CPU
+		{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{F16DED73-A2AD-4711-BC1B-5DDFC2BF8667}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{F16DED73-A2AD-4711-BC1B-5DDFC2BF8667}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{F16DED73-A2AD-4711-BC1B-5DDFC2BF8667}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{F16DED73-A2AD-4711-BC1B-5DDFC2BF8667}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(NestedProjects) = preSolution
+	EndGlobalSection
+	GlobalSection(MonoDevelopProperties) = preSolution
+		StartupItem = src\GuiRunner\nunit-gui-exe\nunit-gui.exe.csproj
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
diff --git a/src/nunit.snk b/nunit.snk
similarity index 100%
copy from src/nunit.snk
copy to nunit.snk
diff --git a/samples/Extensibility/Core/CoreExtensibility.sln b/samples/Extensibility/Core/CoreExtensibility.sln
index cecd095..2f1486b 100644
--- a/samples/Extensibility/Core/CoreExtensibility.sln
+++ b/samples/Extensibility/Core/CoreExtensibility.sln
@@ -19,14 +19,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleSuiteExtensionTests",
 	ProjectSection(ProjectDependencies) = postProject
 	EndProjectSection
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MaxTimeDecorator", "MaxTimeDecorator\MaxTimeDecorator.csproj", "{BA74B90C-5B99-482E-8C0A-1B2BE4A198ED}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MaxTimeDecoratorTests", "MaxTimeDecorator\Tests\MaxTimeDecoratorTests.csproj", "{61BAA12A-4160-4180-B289-A0F4032C54F6}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
 Global
 	GlobalSection(SolutionConfiguration) = preSolution
 		Debug = Debug
@@ -53,14 +45,6 @@ Global
 		{9F609A0D-FF7E-4F0C-B2DF-417EBC557CFF}.Debug.Build.0 = Debug|.NET
 		{9F609A0D-FF7E-4F0C-B2DF-417EBC557CFF}.Release.ActiveCfg = Release|.NET
 		{9F609A0D-FF7E-4F0C-B2DF-417EBC557CFF}.Release.Build.0 = Release|.NET
-		{BA74B90C-5B99-482E-8C0A-1B2BE4A198ED}.Debug.ActiveCfg = Debug|.NET
-		{BA74B90C-5B99-482E-8C0A-1B2BE4A198ED}.Debug.Build.0 = Debug|.NET
-		{BA74B90C-5B99-482E-8C0A-1B2BE4A198ED}.Release.ActiveCfg = Release|.NET
-		{BA74B90C-5B99-482E-8C0A-1B2BE4A198ED}.Release.Build.0 = Release|.NET
-		{61BAA12A-4160-4180-B289-A0F4032C54F6}.Debug.ActiveCfg = Debug|.NET
-		{61BAA12A-4160-4180-B289-A0F4032C54F6}.Debug.Build.0 = Debug|.NET
-		{61BAA12A-4160-4180-B289-A0F4032C54F6}.Release.ActiveCfg = Release|.NET
-		{61BAA12A-4160-4180-B289-A0F4032C54F6}.Release.Build.0 = Release|.NET
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 	EndGlobalSection
diff --git a/samples/Extensibility/Core/Install.bat b/samples/Extensibility/Core/Install.bat
deleted file mode 100644
index d811e49..0000000
--- a/samples/Extensibility/Core/Install.bat
+++ /dev/null
@@ -1,40 +0,0 @@
- at echo off
-Rem This is called by the post-build event. You may modify it to copy the addin
-Rem to whatever locations you like. As provided, it copies it to a number of
-Rem directories relative to the target, provided they exist.
-
-setlocal
-set UP6= ..\..\..\..\..\..
-
-Rem See whether we are doing a production or development install
-if exist %UP6%\bin goto prod
-if exist %UP6%\src goto dev
-echo No install locations found - install %1 manually
-goto end
-
-:prod
-Rem For production install, ensure we have an addins directory
-if not exist %UP6%\bin\addins mkdir %UP6%\bin\addins
-copy %1 %UP6%\bin\addins
-echo Installed %1 in bin\addins directory
-goto end
-
-:dev
-Rem For development installs, try each nunit-gui-exe output directory and
-Rem use those that have an addins sub-directory
-call :try %1 Debug
-call :try %1 Debug2005
-call :try %1 Release
-call :try %1 Release2005
-
-goto end
-
-:try
-if not exist %UP6%\src\GuiRunner\nunit-gui-exe\bin\%2 goto end
-if exist %UP6%\src\GuiRunner\nunit-gui-exe\bin\%2\addins goto try2
-md %UP6%\src\GuiRunner\nunit-gui-exe\bin\%2\addins
-:try2
-copy %1 %UP6%\src\GuiRunner\nunit-gui-exe\bin\%2\addins
-echo Installed %1 in nunit-gui-exe\bin\%2\addins directory
-
-:end
\ No newline at end of file
diff --git a/samples/Extensibility/Core/MaxTimeDecorator/MaxTimeAttribute.cs b/samples/Extensibility/Core/MaxTimeDecorator/MaxTimeAttribute.cs
deleted file mode 100644
index 24d0297..0000000
--- a/samples/Extensibility/Core/MaxTimeDecorator/MaxTimeAttribute.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework.Extensions
-{
-	/// <summary>
-	/// Summary description for MaxTimeAttribute.
-	/// </summary>
-	[AttributeUsage( AttributeTargets.Method, AllowMultiple=false, Inherited=false )]
-	public sealed class MaxTimeAttribute : Attribute
-	{
-		private int maxTime;
-		private bool expectFailure;
-
-		public MaxTimeAttribute( int maxTime )
-		{
-			this.maxTime = maxTime;
-		}
-
-		public int MaxTime
-		{
-			get { return maxTime; }
-		}
-
-		/// <summary>
-		/// ExpectFailure is an optional attribute used for testing
-		/// cases where the timeout is actually expected.
-		/// </summary>
-		public bool ExpectFailure
-		{
-			get { return expectFailure; }
-			set { expectFailure = value; }
-		}
-	}
-}
diff --git a/samples/Extensibility/Core/MaxTimeDecorator/MaxTimeDecorator.build b/samples/Extensibility/Core/MaxTimeDecorator/MaxTimeDecorator.build
deleted file mode 100644
index 3fd1bf8..0000000
--- a/samples/Extensibility/Core/MaxTimeDecorator/MaxTimeDecorator.build
+++ /dev/null
@@ -1,76 +0,0 @@
-<?xml version="1.0"?>
-<project name="MinimalAddin" default="build">
-
-  <property name="output.dir" value="../../../bin" />
-  <property name="output.dll" value="../../../bin/MaxTimeDecorator.dll"/>
-  <property name="test.dll" value="../../../bin/MaxTimeDecoratorTests.dll"/>
-
-  <target name="clean">
-    <delete file="${output.dll}" />
-    <delete file="${test.dll}" />
-  </target>
-
-  <target name="build">
-    <mkdir dir="${output.dir}" unless="${directory::exists(output.dir)}" />
-    <copy file="../../../../bin/nunit.framework.dll" todir="${output.dir}" 
-      if="${file::exists('../../../../bin/nunit.framework.dll')}" />
-    <copy file="../../../../bin/nunit.core.interfaces.dll" todir="${output.dir}" 
-      if="${file::exists('../../../../bin/nunit.core.interfaces.dll')}" />
-    <copy file="../../../../bin/nunit.core.interfaces.dll" todir="${output.dir}" 
-      if="${file::exists('../../../../bin/nunit.core.dll')}" />
-
-    <csc target="library" output="${output.dll}">
-      <sources>
-        <include name="*.cs"/>
-      </sources>
-      <references basedir="${output.dir}">
-        <include name="nunit.core.interfaces.dll" />
-        <include name="nunit.core.dll" />
-      </references>
-    </csc>
-
-    <csc target="library" output="${test.dll}">
-      <sources>
-        <include name="Tests/*.cs"/>
-      </sources>
-      <references basedir="${output.dir}">
-        <include name="nunit.framework.dll" />
-        <include name="MaxTimeDecorator.dll"/>
-      </references>
-    </csc>
-  </target>
-
-  <target name="rebuild" depends="clean,build" />
-
-  <target name="package">
-    <copy todir="${package.samples.dir}/Extensibility/Core/MaxTimeDecorator">
-      <fileset basedir=".">
-        <include name="MaxTimeDecorator.csproj" />
-        <include name="MaxTimeDecorator.build" />
-        <include name="AssemblyInfo.cs" />
-        <include name="MaxTimeAttribute.cs" />
-        <include name="MaxTimeDecorator.cs" />
-        <include name="MaxTimeTestCase.cs" />
-        <include name="Tests/MaxTimeDecoratorTests.csproj" />
-        <include name="Tests/AssemblyInfo.cs" />
-        <include name="Tests/MaxTimeDecoratorTests.cs" />
-      </fileset>
-    </copy>
-
-    <xmlpoke 
-      file="${package.samples.dir}/Extensibility/Core/MaxTimeDecorator/MaxTimeDecorator.csproj"
-      xpath="/VisualStudioProject/CSHARP/Build/References/Reference[@Name='nunit.core']/@HintPath"
-      value="..\..\..\..\bin\nunit.core.dll" />
-
-    <xmlpoke 
-      file="${package.samples.dir}/Extensibility/Core/MaxTimeDecorator/MaxTimeDecorator.csproj"
-      xpath="/VisualStudioProject/CSHARP/Build/References/Reference[@Name='nunit.core.interfaces']/@HintPath"
-      value="..\..\..\..\bin\nunit.core.interfaces.dll" />
-
-    <xmlpoke 
-      file="${package.samples.dir}/Extensibility/Core/MaxTimeDecorator/Tests/MaxTimeDecoratorTests.csproj"
-      xpath="/VisualStudioProject/CSHARP/Build/References/Reference[@Name='nunit.framework']/@HintPath"
-      value="..\..\..\..\..\bin\nunit.framework.dll" />
-  </target>
-
-</project>
\ No newline at end of file
diff --git a/samples/Extensibility/Core/MaxTimeDecorator/MaxTimeDecorator.cs b/samples/Extensibility/Core/MaxTimeDecorator/MaxTimeDecorator.cs
deleted file mode 100644
index b68c8a7..0000000
--- a/samples/Extensibility/Core/MaxTimeDecorator/MaxTimeDecorator.cs
+++ /dev/null
@@ -1,58 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-using System.Reflection;
-using NUnit.Core.Extensibility;
-
-namespace NUnit.Core.Extensions
-{
-	/// <summary>
-	/// MaxTimeDecorator is a test decorator which permits specifying a maximum
-	/// time that the test should take. If it takes longer, the test fails.
-	/// 
-	/// The decorator works by replacing the original test with a special
-	/// test case that overrides the run method to measure the time taken.
-	/// </summary>
-	[NUnitAddin(Description="Fails a test if its elapsed time is longer than a given maximum")]
-	public class MaxTimeDecorator : IAddin, ITestDecorator
-	{
-		#region IAddin Members
-
-		public bool Install(IExtensionHost host)
-		{
-			System.Diagnostics.Trace.WriteLine( "MaxTimeDecorator: Install called" );
-			IExtensionPoint decorators = host.GetExtensionPoint( "TestDecorators" );
-			if ( decorators == null ) return false;
-
-			decorators.Install( this );
-			return true;
-		}
-
-		#endregion
-
-		#region ITestDecorator Members
-
-		public Test Decorate(Test test, System.Reflection.MemberInfo member)
-		{
-			if ( test is NUnitTestMethod )
-			{
-				Attribute attr = Reflect.GetAttribute( 
-					member, "NUnit.Framework.Extensions.MaxTimeAttribute", false );
-				if ( attr != null )
-				{
-					int maxTime = (int)Reflect.GetPropertyValue( attr, "MaxTime", BindingFlags.Public | BindingFlags.Instance );
-					bool expectFailure = (bool)Reflect.GetPropertyValue( attr, "ExpectFailure", BindingFlags.Public | BindingFlags.Instance );
-					test = new MaxTimeTestCase( (NUnitTestMethod)test, maxTime, expectFailure );
-				}
-			}
-
-			return test;
-		}
-
-		#endregion
-	}
-}
diff --git a/samples/Extensibility/Core/MaxTimeDecorator/MaxTimeDecorator.csproj b/samples/Extensibility/Core/MaxTimeDecorator/MaxTimeDecorator.csproj
deleted file mode 100644
index e20ae91..0000000
--- a/samples/Extensibility/Core/MaxTimeDecorator/MaxTimeDecorator.csproj
+++ /dev/null
@@ -1,23 +0,0 @@
-<VisualStudioProject>
-  <CSHARP ProjectType="Local" ProductVersion="7.10.3077" SchemaVersion="2.0" ProjectGuid="{BA74B90C-5B99-482E-8C0A-1B2BE4A198ED}">
-    <Build>
-      <Settings ApplicationIcon="" AssemblyKeyContainerName="" AssemblyName="MaxTimeDecorator" AssemblyOriginatorKeyFile="" DefaultClientScript="JScript" DefaultHTMLPageLayout="Grid" DefaultTargetSchema="IE50" DelaySign="false" OutputType="Library" PreBuildEvent="" PostBuildEvent="..\..\..\install.bat $(TargetFileName)" RootNamespace="NUnit.Core.Extensions" RunPostBuildEvent="OnBuildSuccess" StartupObject="">
-        <Config Name="Debug" AllowUnsafeBlocks="false" BaseAddress="285212672" CheckForOverflowUnderflow="false" ConfigurationOverrideFile="" DefineConstants="DEBUG;TRACE" DocumentationFile="" DebugSymbols="true" FileAlignment="4096" IncrementalBuild="false" NoStdLib="false" NoWarn="" Optimize="false" OutputPath="bin\Debug\" RegisterForComInterop="false" RemoveIntegerChecks="false" TreatWarningsAsErrors="false" WarningLevel="4" />
-        <Config Name="Release" AllowUnsafeBlocks="false" BaseAddress="285212672" CheckForOverflowUnderflow="false" ConfigurationOverrideFile="" DefineConstants="TRACE" DocumentationFile="" DebugSymbols="false" FileAlignment="4096" IncrementalBuild="false" NoStdLib="false" NoWarn="" Optimize="true" OutputPath="bin\Release\" RegisterForComInterop="false" RemoveIntegerChecks="false" TreatWarningsAsErrors="false" WarningLevel="4" />
-      </Settings>
-      <References>
-        <Reference Name="System" AssemblyName="System" />
-        <Reference Name="nunit.core" AssemblyName="nunit.core" HintPath="..\..\..\..\bin\nunit.core.dll" AssemblyFolderKey="hkcu\dn\nunit 2.4.5" Private="False" />
-        <Reference Name="nunit.core.interfaces" AssemblyName="nunit.core.interfaces" HintPath="..\..\..\..\bin\nunit.core.interfaces.dll" AssemblyFolderKey="hkcu\dn\nunit 2.4.5" Private="False" />
-      </References>
-    </Build>
-    <Files>
-      <Include>
-        <File RelPath="AssemblyInfo.cs" SubType="Code" BuildAction="Compile" />
-        <File RelPath="MaxTimeAttribute.cs" SubType="Code" BuildAction="Compile" />
-        <File RelPath="MaxTimeDecorator.cs" SubType="Code" BuildAction="Compile" />
-        <File RelPath="MaxTimeTestCase.cs" SubType="Code" BuildAction="Compile" />
-      </Include>
-    </Files>
-  </CSHARP>
-</VisualStudioProject>
\ No newline at end of file
diff --git a/samples/Extensibility/Core/MaxTimeDecorator/MaxTimeTestCase.cs b/samples/Extensibility/Core/MaxTimeDecorator/MaxTimeTestCase.cs
deleted file mode 100644
index 79f2817..0000000
--- a/samples/Extensibility/Core/MaxTimeDecorator/MaxTimeTestCase.cs
+++ /dev/null
@@ -1,76 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-using System.Reflection;
-
-namespace NUnit.Core.Extensions
-{
-	/// <summary>
-	/// MaxTimeTestCase is a special form of test case that measures
-	/// the elapsed time to run a test, failing the test if it
-	/// exceeds a certain amount.
-	/// 
-	/// Implementation Notes
-	/// 
-	/// In implementing a Decorator, you need to honor any propeties
-	/// taht were set on the original test before you decorated it
-	/// and also be ready to deal correctly with any other decorators
-	/// that are applied before or after yours.
-	/// 
-	/// There are three basic approaches to doing this:
-	/// 
-	/// 1) Modify or set properties of the original test case 
-	///    and return it. This avoids all issues of ordering
-	///    but won't work if new properties are needed.
-	/// 2) Replace the test case with a new one implementing
-	///    additional properties. Copy all properties from
-	///    the original case. This is the approach used in
-	///    this example.
-	/// 3) Wrap the test case with a special test case that
-	///    delegates all properties and methods to the
-	///    origial test case. This is quite difficult to
-	///    get right, but is necessary in some cases.
-	/// </summary>
-	public class MaxTimeTestCase : NUnitTestMethod
-	{
-		private int maxTime = 0;
-		bool expectFailure;
-
-		public MaxTimeTestCase( NUnitTestMethod testCase, int maxTime, bool expectFailure )
-			: base( testCase.Method )
-		{
-			this.maxTime = maxTime;
-			this.expectFailure = expectFailure;
-
-			// Copy all the attributes of the original test
-			this.Description = testCase.Description;
-			this.Fixture = testCase.Fixture;
-			this.Parent = testCase.Parent;
-			this.RunState = testCase.RunState;
-			this.IgnoreReason = testCase.IgnoreReason;
-			this.ExceptionExpected = testCase.ExceptionExpected;
-			this.ExpectedExceptionName = testCase.ExpectedExceptionName;
-			this.ExpectedExceptionType = testCase.ExpectedExceptionType;
-			this.ExpectedMessage = testCase.ExpectedMessage;
-			this.Properties = testCase.Properties;
-			this.Categories = testCase.Categories;
-		}
-
-		public override void Run(TestCaseResult result)
-		{
-			base.Run( result );
-			if ( result.IsSuccess && !ExceptionExpected )
-			{
-				int elapsedTime = (int)(result.Time * 1000);
-				if ( elapsedTime > maxTime && !expectFailure)
-					result.Failure( string.Format( "Elapsed time of {0}ms exceeds maximum of {1}ms", elapsedTime, maxTime ), null );
-				else if ( elapsedTime <= maxTime && expectFailure )
-					result.Failure( "Expected a timeout failure, but none occured", null );
-			}
-		}
-	}
-}
diff --git a/samples/Extensibility/Core/MaxTimeDecorator/Tests/AssemblyInfo.cs b/samples/Extensibility/Core/MaxTimeDecorator/Tests/AssemblyInfo.cs
deleted file mode 100644
index 177a4f0..0000000
--- a/samples/Extensibility/Core/MaxTimeDecorator/Tests/AssemblyInfo.cs
+++ /dev/null
@@ -1,58 +0,0 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-
-//
-// General Information about an assembly is controlled through the following 
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-//
-[assembly: AssemblyTitle("")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("")]
-[assembly: AssemblyCopyright("")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]		
-
-//
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version 
-//      Build Number
-//      Revision
-//
-// You can specify all the values or you can default the Revision and Build Numbers 
-// by using the '*' as shown below:
-
-[assembly: AssemblyVersion("1.0.*")]
-
-//
-// In order to sign your assembly you must specify a key to use. Refer to the 
-// Microsoft .NET Framework documentation for more information on assembly signing.
-//
-// Use the attributes below to control which key is used for signing. 
-//
-// Notes: 
-//   (*) If no key is specified, the assembly is not signed.
-//   (*) KeyName refers to a key that has been installed in the Crypto Service
-//       Provider (CSP) on your machine. KeyFile refers to a file which contains
-//       a key.
-//   (*) If the KeyFile and the KeyName values are both specified, the 
-//       following processing occurs:
-//       (1) If the KeyName can be found in the CSP, that key is used.
-//       (2) If the KeyName does not exist and the KeyFile does exist, the key 
-//           in the KeyFile is installed into the CSP and used.
-//   (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
-//       When specifying the KeyFile, the location of the KeyFile should be
-//       relative to the project output directory which is
-//       %Project Directory%\obj\<configuration>. For example, if your KeyFile is
-//       located in the project directory, you would specify the AssemblyKeyFile 
-//       attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
-//   (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
-//       documentation for more information on this.
-//
-[assembly: AssemblyDelaySign(false)]
-[assembly: AssemblyKeyFile("")]
-[assembly: AssemblyKeyName("")]
diff --git a/samples/Extensibility/Core/MaxTimeDecorator/Tests/MaxTimeDecoratorTests.cs b/samples/Extensibility/Core/MaxTimeDecorator/Tests/MaxTimeDecoratorTests.cs
deleted file mode 100644
index 53e1553..0000000
--- a/samples/Extensibility/Core/MaxTimeDecorator/Tests/MaxTimeDecoratorTests.cs
+++ /dev/null
@@ -1,48 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-using NUnit.Framework.Extensions;
-
-namespace Tests
-{
-	/// <summary>
-	/// Tests for MaxTime decoration. Some of these tests are
-	/// actually expected to fail, so the results must be
-	/// examined visually. It would be possible to test these
-	/// automatically by running a second copy of NUnit, but
-	/// this is better handled through an acceptance test
-	/// suite such as FIT.
-	/// </summary>
-	[TestFixture]
-	public class MaxTimeDecoratorTests
-	{
-		[Test,MaxTime(1000)]
-		public void MaxTimeNotExceeded()
-		{
-		}
-
-		[Test,MaxTime(1000), ExpectedException(typeof(AssertionException),ExpectedMessage="Intentional failure")]
-		public void MaxTimeNotExceededButFailed()
-		{
-			Assert.Fail("Intentional failure");
-		}
-
-		[Test,MaxTime(1, ExpectFailure=true), Description("This should fail due to time exceeded")]
-		public void MaxTimeWasExceeded()
-		{
-			System.Threading.Thread.Sleep(100);
-		}
-
-		[Test,MaxTime(1),ExpectedException(typeof(AssertionException),ExpectedMessage="Intentional failure")]
-		public void MaxTimeWasExceededButFailed()
-		{
-			System.Threading.Thread.Sleep(100);
-			Assert.Fail("Intentional failure");
-		}
-	}
-}
diff --git a/samples/Extensibility/Core/MaxTimeDecorator/Tests/MaxTimeDecoratorTests.csproj b/samples/Extensibility/Core/MaxTimeDecorator/Tests/MaxTimeDecoratorTests.csproj
deleted file mode 100644
index 2294b27..0000000
--- a/samples/Extensibility/Core/MaxTimeDecorator/Tests/MaxTimeDecoratorTests.csproj
+++ /dev/null
@@ -1,21 +0,0 @@
-<VisualStudioProject>
-  <CSHARP ProjectType="Local" ProductVersion="7.10.3077" SchemaVersion="2.0" ProjectGuid="{61BAA12A-4160-4180-B289-A0F4032C54F6}">
-    <Build>
-      <Settings ApplicationIcon="" AssemblyKeyContainerName="" AssemblyName="MaxTimeDecoratorTests" AssemblyOriginatorKeyFile="" DefaultClientScript="JScript" DefaultHTMLPageLayout="Grid" DefaultTargetSchema="IE50" DelaySign="false" OutputType="Library" PreBuildEvent="" PostBuildEvent="" RootNamespace="Tests" RunPostBuildEvent="OnBuildSuccess" StartupObject="">
-        <Config Name="Debug" AllowUnsafeBlocks="false" BaseAddress="285212672" CheckForOverflowUnderflow="false" ConfigurationOverrideFile="" DefineConstants="DEBUG;TRACE" DocumentationFile="" DebugSymbols="true" FileAlignment="4096" IncrementalBuild="false" NoStdLib="false" NoWarn="" Optimize="false" OutputPath="bin\Debug\" RegisterForComInterop="false" RemoveIntegerChecks="false" TreatWarningsAsErrors="false" WarningLevel="4" />
-        <Config Name="Release" AllowUnsafeBlocks="false" BaseAddress="285212672" CheckForOverflowUnderflow="false" ConfigurationOverrideFile="" DefineConstants="TRACE" DocumentationFile="" DebugSymbols="false" FileAlignment="4096" IncrementalBuild="false" NoStdLib="false" NoWarn="" Optimize="true" OutputPath="bin\Release\" RegisterForComInterop="false" RemoveIntegerChecks="false" TreatWarningsAsErrors="false" WarningLevel="4" />
-      </Settings>
-      <References>
-        <Reference Name="System" AssemblyName="System" />
-        <Reference Name="MaxTimeDecorator" Project="{BA74B90C-5B99-482E-8C0A-1B2BE4A198ED}" Package="{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}" />
-        <Reference Name="nunit.framework" AssemblyName="nunit.framework, Version=2.4.4.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77" HintPath="..\..\..\..\..\bin\nunit.framework.dll" />
-      </References>
-    </Build>
-    <Files>
-      <Include>
-        <File RelPath="AssemblyInfo.cs" SubType="Code" BuildAction="Compile" />
-        <File RelPath="MaxTimeDecoratorTests.cs" SubType="Code" BuildAction="Compile" />
-      </Include>
-    </Files>
-  </CSHARP>
-</VisualStudioProject>
\ No newline at end of file
diff --git a/samples/Extensibility/Core/Minimal/Minimal.build b/samples/Extensibility/Core/Minimal/Minimal.build
index 71d8cdf..3002e34 100644
--- a/samples/Extensibility/Core/Minimal/Minimal.build
+++ b/samples/Extensibility/Core/Minimal/Minimal.build
@@ -1,47 +1,21 @@
 <?xml version="1.0"?>
-<project name="MinimalAddin" default="build">
+<project name="Minimal" default="build" basedir=".">
 
-  <property name="output.dir" value="../../../bin" />
-  <property name="output.dll" value="../../../bin/Minimal.dll" />
+  <include buildfile="../../../samples.common" />
 
-  <target name="clean">
-    <delete file="${output.dll}" />
-  </target>
-
-  <target name="build">
-    <mkdir dir="${output.dir}" unless="${directory::exists(output.dir)}" />
-    <copy file="../../../../bin/nunit.framework.dll" todir="${output.dir}" 
-      if="${file::exists('../../../../bin/nunit.framework.dll')}" />
-    <copy file="../../../../bin/nunit.core.interfaces.dll" todir="${output.dir}" 
-      if="${file::exists('../../../../bin/nunit.core.interfaces.dll')}" />
-
-    <csc target="library" output="${output.dll}">
-      <sources>
-        <include name="*.cs"/>
-      </sources>
-      <references basedir="${output.dir}">
-        <include name="nunit.framework.dll" />
-        <include name="nunit.core.interfaces.dll" />
-      </references>
-    </csc>
-  </target>
-
-  <target name="rebuild" depends="clean,build" />
+  <patternset id="source-files">
+    <include name="Minimal.cs" />
+  </patternset>
 
-  <target name="package">
+  <target name="packagex">
     <copy todir="${package.samples.dir}/Extensibility/Core/Minimal">
       <fileset basedir=".">
         <include name="Minimal.csproj" />
         <include name="Minimal.build" />
-        <include name="Minimal.cs" />
-        <include name="ReadMe.txt" />
+        <include name="Readme.txt" />
+        <patternset refid="source-files" />
       </fileset>
     </copy>
-
-    <xmlpoke 
-      file="${package.samples.dir}/Extensibility/Core/Minimal/Minimal.csproj"
-      xpath="/VisualStudioProject/CSHARP/Build/References/Reference[@Name='nunit.core.interfaces']/@HintPath"
-      value="..\..\..\..\bin\nunit.core.interfaces.dll" />
   </target>
 
 </project>
\ No newline at end of file
diff --git a/samples/Extensibility/Core/Minimal/Minimal.csproj b/samples/Extensibility/Core/Minimal/Minimal.csproj
index 916d7d7..68454c7 100644
--- a/samples/Extensibility/Core/Minimal/Minimal.csproj
+++ b/samples/Extensibility/Core/Minimal/Minimal.csproj
@@ -1,19 +1,89 @@
 <VisualStudioProject>
-  <CSHARP ProjectType="Local" ProductVersion="7.10.3077" SchemaVersion="2.0" ProjectGuid="{EF428E5B-B3E7-4C2F-B005-98DE7D6E7CDB}">
-    <Build>
-      <Settings ApplicationIcon="" AssemblyKeyContainerName="" AssemblyName="Minimal" AssemblyOriginatorKeyFile="" DefaultClientScript="JScript" DefaultHTMLPageLayout="Grid" DefaultTargetSchema="IE50" DelaySign="false" OutputType="Library" PreBuildEvent="" PostBuildEvent="call ..\..\..\Install.bat $(TargetFileName)" RootNamespace="NUnit.Samples.Extensibility" RunPostBuildEvent="OnBuildSuccess" StartupObject="">
-        <Config Name="Debug" AllowUnsafeBlocks="false" BaseAddress="285212672" CheckForOverflowUnderflow="false" ConfigurationOverrideFile="" DefineConstants="DEBUG;TRACE" DocumentationFile="" DebugSymbols="true" FileAlignment="4096" IncrementalBuild="false" NoStdLib="false" NoWarn="" Optimize="false" OutputPath="bin\Debug\" RegisterForComInterop="false" RemoveIntegerChecks="false" TreatWarningsAsErrors="false" WarningLevel="4" />
-        <Config Name="Release" AllowUnsafeBlocks="false" BaseAddress="285212672" CheckForOverflowUnderflow="false" ConfigurationOverrideFile="" DefineConstants="TRACE" DocumentationFile="" DebugSymbols="false" FileAlignment="4096" IncrementalBuild="false" NoStdLib="false" NoWarn="" Optimize="true" OutputPath="bin\Release\" RegisterForComInterop="false" RemoveIntegerChecks="false" TreatWarningsAsErrors="false" WarningLevel="4" />
-      </Settings>
-      <References>
-        <Reference Name="System" AssemblyName="System" />
-        <Reference Name="nunit.core.interfaces" AssemblyName="nunit.core.interfaces, Version=2.4.4.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77" HintPath="..\..\..\..\bin\nunit.core.interfaces.dll" Private="False" />
-      </References>
-    </Build>
-    <Files>
-      <Include>
-        <File RelPath="Minimal.cs" SubType="Code" BuildAction="Compile" />
-      </Include>
-    </Files>
-  </CSHARP>
-</VisualStudioProject>
\ No newline at end of file
+    <CSHARP
+        ProjectType = "Local"
+        ProductVersion = "7.10.3077"
+        SchemaVersion = "2.0"
+        ProjectGuid = "{EF428E5B-B3E7-4C2F-B005-98DE7D6E7CDB}"
+    >
+        <Build>
+            <Settings
+                ApplicationIcon = ""
+                AssemblyKeyContainerName = ""
+                AssemblyName = "Minimal"
+                AssemblyOriginatorKeyFile = ""
+                DefaultClientScript = "JScript"
+                DefaultHTMLPageLayout = "Grid"
+                DefaultTargetSchema = "IE50"
+                DelaySign = "false"
+                OutputType = "Library"
+                PreBuildEvent = ""
+                PostBuildEvent = ""
+                RootNamespace = "NUnit.Samples.Extensibility"
+                RunPostBuildEvent = "OnBuildSuccess"
+                StartupObject = ""
+            >
+                <Config
+                    Name = "Debug"
+                    AllowUnsafeBlocks = "false"
+                    BaseAddress = "285212672"
+                    CheckForOverflowUnderflow = "false"
+                    ConfigurationOverrideFile = ""
+                    DefineConstants = "DEBUG;TRACE"
+                    DocumentationFile = ""
+                    DebugSymbols = "true"
+                    FileAlignment = "4096"
+                    IncrementalBuild = "false"
+                    NoStdLib = "false"
+                    NoWarn = ""
+                    Optimize = "false"
+                    OutputPath = "bin\Debug\"
+                    RegisterForComInterop = "false"
+                    RemoveIntegerChecks = "false"
+                    TreatWarningsAsErrors = "false"
+                    WarningLevel = "4"
+                />
+                <Config
+                    Name = "Release"
+                    AllowUnsafeBlocks = "false"
+                    BaseAddress = "285212672"
+                    CheckForOverflowUnderflow = "false"
+                    ConfigurationOverrideFile = ""
+                    DefineConstants = "TRACE"
+                    DocumentationFile = ""
+                    DebugSymbols = "false"
+                    FileAlignment = "4096"
+                    IncrementalBuild = "false"
+                    NoStdLib = "false"
+                    NoWarn = ""
+                    Optimize = "true"
+                    OutputPath = "bin\Release\"
+                    RegisterForComInterop = "false"
+                    RemoveIntegerChecks = "false"
+                    TreatWarningsAsErrors = "false"
+                    WarningLevel = "4"
+                />
+            </Settings>
+            <References>
+                <Reference
+                    Name = "System"
+                    AssemblyName = "System"
+                />
+                <Reference
+                    Name = "nunit.core.interfaces"
+                    AssemblyName = "nunit.core.interfaces"
+                    HintPath = "..\..\..\..\solutions\vs2003\NUnitCore\interfaces\bin\Debug\nunit.core.interfaces.dll"
+                />
+            </References>
+        </Build>
+        <Files>
+            <Include>
+                <File
+                    RelPath = "Minimal.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+            </Include>
+        </Files>
+    </CSHARP>
+</VisualStudioProject>
+
diff --git a/samples/Extensibility/Core/SampleFixtureExtension/SampleFixtureExtension.build b/samples/Extensibility/Core/SampleFixtureExtension/SampleFixtureExtension.build
index 789f19e..394dbe5 100644
--- a/samples/Extensibility/Core/SampleFixtureExtension/SampleFixtureExtension.build
+++ b/samples/Extensibility/Core/SampleFixtureExtension/SampleFixtureExtension.build
@@ -1,77 +1,18 @@
 <?xml version="1.0"?>
-<project name="MinimalAddin" default="build">
-
-  <property name="output.dir" value="../../../bin" />
-  <property name="output.dll" value="../../../bin/SampleFixtureExtension.dll"/>
-  <property name="test.dll" value="../../../bin/SampleFixtureExtensionTests.dll"/>
-
-  <target name="clean">
-    <delete file="${output.dll}" />
-    <delete file="${test.dll}" />
-  </target>
-
-  <target name="build">
-    <mkdir dir="${output.dir}" unless="${directory::exists(output.dir)}" />
-    <copy file="../../../../bin/nunit.framework.dll" todir="${output.dir}" 
-      if="${file::exists('../../../../bin/nunit.framework.dll')}" />
-    <copy file="../../../../bin/nunit.core.interfaces.dll" todir="${output.dir}" 
-      if="${file::exists('../../../../bin/nunit.core.interfaces.dll')}" />
-    <copy file="../../../../bin/nunit.core.interfaces.dll" todir="${output.dir}" 
-      if="${file::exists('../../../../bin/nunit.core.dll')}" />
-
-    <csc target="library" output="${output.dll}">
-      <sources>
-        <include name="*.cs"/>
-      </sources>
-      <references basedir="${output.dir}">
-        <include name="nunit.core.interfaces.dll" />
-        <include name="nunit.core.dll" />
-      </references>
-    </csc>
-
-    <csc target="library" output="${test.dll}">
-      <sources>
-        <include name="Tests/*.cs"/>
-      </sources>
-      <references basedir="${output.dir}">
-        <include name="nunit.framework.dll" />
-        <include name="SampleFixtureExtension.dll"/>
-      </references>
-    </csc>
-  </target>
-
-  <target name="rebuild" depends="clean,build" />
-
-  <target name="package">
-    <copy todir="${package.samples.dir}/Extensibility/Core/SampleFixtureExtension">
-      <fileset basedir=".">
-        <include name="SampleFixtureExtension.csproj" />
-        <include name="SampleFixtureExtension.build" />
-        <include name="AssemblyInfo.cs" />
-        <include name="SampleFixtureExtension.cs" />
-        <include name="SampleFixtureExtensionAttribute.cs" />
-        <include name="SampleFixtureExtensionBuilder.cs" />
-        <include name="ReadMe.txt" />
-        <include name="Tests/SampleFixtureExtensionTests.csproj" />
-        <include name="Tests/AssemblyInfo.cs" />
-        <include name="Tests/SampleFixtureExtensionTests.cs" />
-      </fileset>
-    </copy>
-
-    <xmlpoke 
-      file="${package.samples.dir}/Extensibility/Core/SampleFixtureExtension/SampleFixtureExtension.csproj"
-      xpath="/VisualStudioProject/CSHARP/Build/References/Reference[@Name='nunit.core']/@HintPath"
-      value="..\..\..\..\bin\nunit.core.dll" />
-
-    <xmlpoke 
-      file="${package.samples.dir}/Extensibility/Core/SampleFixtureExtension/SampleFixtureExtension.csproj"
-      xpath="/VisualStudioProject/CSHARP/Build/References/Reference[@Name='nunit.core.interfaces']/@HintPath"
-      value="..\..\..\..\bin\nunit.core.interfaces.dll" />
-
-    <xmlpoke 
-      file="${package.samples.dir}/Extensibility/Core/SampleFixtureExtension/Tests/SampleFixtureExtensionTests.csproj"
-      xpath="/VisualStudioProject/CSHARP/Build/References/Reference[@Name='nunit.framework']/@HintPath"
-      value="..\..\..\..\..\bin\nunit.framework.dll" />
-  </target>
-
+<project name="SampleFixtureExtension" default="build" basedir=".">
+
+  <include buildfile="../../../samples.common" />
+
+  <patternset id="source-files">
+    <include name="AssemblyInfo.cs" />
+    <include name="SampleFixtureExtension.cs" />
+    <include name="SampleFixtureExtensionAttribute.cs" />
+    <include name="SampleFixtureExtensionBuilder.cs" />
+  </patternset>
+
+  <patternset id="test-files">
+    <include name="AssemblyInfo.cs" />
+    <include name="SampleFixtureExtensionTests.cs" />
+  </patternset>
+  
 </project>
\ No newline at end of file
diff --git a/samples/Extensibility/Core/SampleFixtureExtension/SampleFixtureExtension.csproj b/samples/Extensibility/Core/SampleFixtureExtension/SampleFixtureExtension.csproj
index fbda818..52c3a78 100644
--- a/samples/Extensibility/Core/SampleFixtureExtension/SampleFixtureExtension.csproj
+++ b/samples/Extensibility/Core/SampleFixtureExtension/SampleFixtureExtension.csproj
@@ -1,23 +1,109 @@
 <VisualStudioProject>
-  <CSHARP ProjectType="Local" ProductVersion="7.10.3077" SchemaVersion="2.0" ProjectGuid="{ED281A23-9579-4A70-B608-1B86DCDEB78C}">
-    <Build>
-      <Settings ApplicationIcon="" AssemblyKeyContainerName="" AssemblyName="SampleFixtureExtension" AssemblyOriginatorKeyFile="" DefaultClientScript="JScript" DefaultHTMLPageLayout="Grid" DefaultTargetSchema="IE50" DelaySign="false" OutputType="Library" PreBuildEvent="" PostBuildEvent="call ..\..\..\install.bat $(TargetFileName)" RootNamespace="SampleFixtureExtension" RunPostBuildEvent="OnBuildSuccess" StartupObject="">
-        <Config Name="Debug" AllowUnsafeBlocks="false" BaseAddress="285212672" CheckForOverflowUnderflow="false" ConfigurationOverrideFile="" DefineConstants="DEBUG;TRACE" DocumentationFile="" DebugSymbols="true" FileAlignment="4096" IncrementalBuild="false" NoStdLib="false" NoWarn="" Optimize="false" OutputPath="bin\Debug\" RegisterForComInterop="false" RemoveIntegerChecks="false" TreatWarningsAsErrors="false" WarningLevel="4" />
-        <Config Name="Release" AllowUnsafeBlocks="false" BaseAddress="285212672" CheckForOverflowUnderflow="false" ConfigurationOverrideFile="" DefineConstants="TRACE" DocumentationFile="" DebugSymbols="false" FileAlignment="4096" IncrementalBuild="false" NoStdLib="false" NoWarn="" Optimize="true" OutputPath="bin\Release\" RegisterForComInterop="false" RemoveIntegerChecks="false" TreatWarningsAsErrors="false" WarningLevel="4" />
-      </Settings>
-      <References>
-        <Reference Name="System" AssemblyName="System" />
-        <Reference Name="nunit.core.interfaces" AssemblyName="nunit.core.interfaces, Version=2.4.4.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77" HintPath="..\..\..\..\bin\nunit.core.interfaces.dll" Private="False" />
-        <Reference Name="nunit.core" AssemblyName="nunit.core, Version=2.4.4.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77" HintPath="..\..\..\..\bin\nunit.core.dll" Private="False" />
-      </References>
-    </Build>
-    <Files>
-      <Include>
-        <File RelPath="AssemblyInfo.cs" SubType="Code" BuildAction="Compile" />
-        <File RelPath="SampleFixtureExtension.cs" SubType="Code" BuildAction="Compile" />
-        <File RelPath="SampleFixtureExtensionAttribute.cs" SubType="Code" BuildAction="Compile" />
-        <File RelPath="SampleFixtureExtensionBuilder.cs" SubType="Code" BuildAction="Compile" />
-      </Include>
-    </Files>
-  </CSHARP>
-</VisualStudioProject>
\ No newline at end of file
+    <CSHARP
+        ProjectType = "Local"
+        ProductVersion = "7.10.3077"
+        SchemaVersion = "2.0"
+        ProjectGuid = "{ED281A23-9579-4A70-B608-1B86DCDEB78C}"
+    >
+        <Build>
+            <Settings
+                ApplicationIcon = ""
+                AssemblyKeyContainerName = ""
+                AssemblyName = "SampleFixtureExtension"
+                AssemblyOriginatorKeyFile = ""
+                DefaultClientScript = "JScript"
+                DefaultHTMLPageLayout = "Grid"
+                DefaultTargetSchema = "IE50"
+                DelaySign = "false"
+                OutputType = "Library"
+                PreBuildEvent = ""
+                PostBuildEvent = ""
+                RootNamespace = "SampleFixtureExtension"
+                RunPostBuildEvent = "OnBuildSuccess"
+                StartupObject = ""
+            >
+                <Config
+                    Name = "Debug"
+                    AllowUnsafeBlocks = "false"
+                    BaseAddress = "285212672"
+                    CheckForOverflowUnderflow = "false"
+                    ConfigurationOverrideFile = ""
+                    DefineConstants = "DEBUG;TRACE"
+                    DocumentationFile = ""
+                    DebugSymbols = "true"
+                    FileAlignment = "4096"
+                    IncrementalBuild = "false"
+                    NoStdLib = "false"
+                    NoWarn = ""
+                    Optimize = "false"
+                    OutputPath = "bin\Debug\"
+                    RegisterForComInterop = "false"
+                    RemoveIntegerChecks = "false"
+                    TreatWarningsAsErrors = "false"
+                    WarningLevel = "4"
+                />
+                <Config
+                    Name = "Release"
+                    AllowUnsafeBlocks = "false"
+                    BaseAddress = "285212672"
+                    CheckForOverflowUnderflow = "false"
+                    ConfigurationOverrideFile = ""
+                    DefineConstants = "TRACE"
+                    DocumentationFile = ""
+                    DebugSymbols = "false"
+                    FileAlignment = "4096"
+                    IncrementalBuild = "false"
+                    NoStdLib = "false"
+                    NoWarn = ""
+                    Optimize = "true"
+                    OutputPath = "bin\Release\"
+                    RegisterForComInterop = "false"
+                    RemoveIntegerChecks = "false"
+                    TreatWarningsAsErrors = "false"
+                    WarningLevel = "4"
+                />
+            </Settings>
+            <References>
+                <Reference
+                    Name = "System"
+                    AssemblyName = "System"
+                />
+                <Reference
+                    Name = "nunit.core.interfaces"
+                    AssemblyName = "nunit.core.interfaces"
+                    HintPath = "..\..\..\..\solutions\vs2003\NUnitCore\interfaces\bin\Debug\nunit.core.interfaces.dll"
+                />
+                <Reference
+                    Name = "nunit.core"
+                    AssemblyName = "nunit.core"
+                    HintPath = "..\..\..\..\solutions\vs2003\NUnitCore\core\bin\Debug\nunit.core.dll"
+                />
+            </References>
+        </Build>
+        <Files>
+            <Include>
+                <File
+                    RelPath = "AssemblyInfo.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "SampleFixtureExtension.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "SampleFixtureExtensionAttribute.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "SampleFixtureExtensionBuilder.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+            </Include>
+        </Files>
+    </CSHARP>
+</VisualStudioProject>
+
diff --git a/samples/Extensibility/Core/SampleFixtureExtension/SampleFixtureExtensionBuilder.cs b/samples/Extensibility/Core/SampleFixtureExtension/SampleFixtureExtensionBuilder.cs
index 0447ae2..abdb1df 100644
--- a/samples/Extensibility/Core/SampleFixtureExtension/SampleFixtureExtensionBuilder.cs
+++ b/samples/Extensibility/Core/SampleFixtureExtension/SampleFixtureExtensionBuilder.cs
@@ -15,7 +15,7 @@ namespace NUnit.Core.Extensions
 	/// a MockFixtureExtension.
 	/// </summary>
 	[NUnitAddin(Description="Wraps an NUnitTestFixture with an additional level of SetUp and TearDown")]
-	public class SampleFixtureExtensionBuilder : NUnitTestFixtureBuilder, IAddin
+	public class SampleFixtureExtensionBuilder : ISuiteBuilder, IAddin
 	{	
 		#region NUnitTestFixtureBuilder Overrides
 		/// <summary>
@@ -23,19 +23,24 @@ namespace NUnit.Core.Extensions
 		/// </summary>
 		/// <param name="type">The type to be used</param>
 		/// <returns>A SampleFixtureExtension as a TestSuite</returns>
-		protected override TestSuite MakeSuite(Type type)
-		{
-			return new SampleFixtureExtension( type );
-		}
+//		protected override TestSuite MakeSuite(Type type)
+//		{
+//			return new SampleFixtureExtension( type );
+//		}
 
 		// The builder recognizes the types that it can use by the presense
 		// of SampleFixtureExtensionAttribute. Note that an attribute does not
 		// have to be used. You can use any arbitrary set of rules that can be 
 		// implemented using reflection on the type.
-		public override bool CanBuildFrom(Type type)
+		public bool CanBuildFrom(Type type)
 		{
 			return Reflect.HasAttribute( type, "NUnit.Core.Extensions.SampleFixtureExtensionAttribute", false );
 		}
+
+		public Test BuildFrom(Type type)
+		{
+			return null;
+		}
 		#endregion
 
 		#region IAddin Members
diff --git a/samples/Extensibility/Core/SampleFixtureExtension/Tests/SampleFixtureExtensionTests.csproj b/samples/Extensibility/Core/SampleFixtureExtension/Tests/SampleFixtureExtensionTests.csproj
index 5f7e50d..e367ade 100644
--- a/samples/Extensibility/Core/SampleFixtureExtension/Tests/SampleFixtureExtensionTests.csproj
+++ b/samples/Extensibility/Core/SampleFixtureExtension/Tests/SampleFixtureExtensionTests.csproj
@@ -1,20 +1,94 @@
 <VisualStudioProject>
-  <CSHARP ProjectType="Local" ProductVersion="7.10.3077" SchemaVersion="2.0" ProjectGuid="{0DE6C90F-BB74-4BC8-887A-2222DB56D2EB}">
-    <Build>
-      <Settings ApplicationIcon="" AssemblyKeyContainerName="" AssemblyName="SampleFixtureExtensionTests" AssemblyOriginatorKeyFile="" DefaultClientScript="JScript" DefaultHTMLPageLayout="Grid" DefaultTargetSchema="IE50" DelaySign="false" OutputType="Library" PreBuildEvent="" PostBuildEvent="" RootNamespace="Tests" RunPostBuildEvent="OnBuildSuccess" StartupObject="">
-        <Config Name="Debug" AllowUnsafeBlocks="false" BaseAddress="285212672" CheckForOverflowUnderflow="false" ConfigurationOverrideFile="" DefineConstants="DEBUG;TRACE" DocumentationFile="" DebugSymbols="true" FileAlignment="4096" IncrementalBuild="false" NoStdLib="false" NoWarn="" Optimize="false" OutputPath="bin\Debug\" RegisterForComInterop="false" RemoveIntegerChecks="false" TreatWarningsAsErrors="false" WarningLevel="4" />
-        <Config Name="Release" AllowUnsafeBlocks="false" BaseAddress="285212672" CheckForOverflowUnderflow="false" ConfigurationOverrideFile="" DefineConstants="TRACE" DocumentationFile="" DebugSymbols="false" FileAlignment="4096" IncrementalBuild="false" NoStdLib="false" NoWarn="" Optimize="true" OutputPath="bin\Release\" RegisterForComInterop="false" RemoveIntegerChecks="false" TreatWarningsAsErrors="false" WarningLevel="4" />
-      </Settings>
-      <References>
-        <Reference Name="System" AssemblyName="System" />
-        <Reference Name="nunit.framework" AssemblyName="nunit.framework, Version=2.4.4.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77" HintPath="..\..\..\..\..\bin\nunit.framework.dll" />
-        <Reference Name="SampleFixtureExtension" Project="{ED281A23-9579-4A70-B608-1B86DCDEB78C}" Package="{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}" />
-      </References>
-    </Build>
-    <Files>
-      <Include>
-        <File RelPath="SampleFixtureExtensionTests.cs" SubType="Code" BuildAction="Compile" />
-      </Include>
-    </Files>
-  </CSHARP>
-</VisualStudioProject>
\ No newline at end of file
+    <CSHARP
+        ProjectType = "Local"
+        ProductVersion = "7.10.3077"
+        SchemaVersion = "2.0"
+        ProjectGuid = "{0DE6C90F-BB74-4BC8-887A-2222DB56D2EB}"
+    >
+        <Build>
+            <Settings
+                ApplicationIcon = ""
+                AssemblyKeyContainerName = ""
+                AssemblyName = "SampleFixtureExtensionTests"
+                AssemblyOriginatorKeyFile = ""
+                DefaultClientScript = "JScript"
+                DefaultHTMLPageLayout = "Grid"
+                DefaultTargetSchema = "IE50"
+                DelaySign = "false"
+                OutputType = "Library"
+                PreBuildEvent = ""
+                PostBuildEvent = ""
+                RootNamespace = "Tests"
+                RunPostBuildEvent = "OnBuildSuccess"
+                StartupObject = ""
+            >
+                <Config
+                    Name = "Debug"
+                    AllowUnsafeBlocks = "false"
+                    BaseAddress = "285212672"
+                    CheckForOverflowUnderflow = "false"
+                    ConfigurationOverrideFile = ""
+                    DefineConstants = "DEBUG;TRACE"
+                    DocumentationFile = ""
+                    DebugSymbols = "true"
+                    FileAlignment = "4096"
+                    IncrementalBuild = "false"
+                    NoStdLib = "false"
+                    NoWarn = ""
+                    Optimize = "false"
+                    OutputPath = "bin\Debug\"
+                    RegisterForComInterop = "false"
+                    RemoveIntegerChecks = "false"
+                    TreatWarningsAsErrors = "false"
+                    WarningLevel = "4"
+                />
+                <Config
+                    Name = "Release"
+                    AllowUnsafeBlocks = "false"
+                    BaseAddress = "285212672"
+                    CheckForOverflowUnderflow = "false"
+                    ConfigurationOverrideFile = ""
+                    DefineConstants = "TRACE"
+                    DocumentationFile = ""
+                    DebugSymbols = "false"
+                    FileAlignment = "4096"
+                    IncrementalBuild = "false"
+                    NoStdLib = "false"
+                    NoWarn = ""
+                    Optimize = "true"
+                    OutputPath = "bin\Release\"
+                    RegisterForComInterop = "false"
+                    RemoveIntegerChecks = "false"
+                    TreatWarningsAsErrors = "false"
+                    WarningLevel = "4"
+                />
+            </Settings>
+            <References>
+                <Reference
+                    Name = "System"
+                    AssemblyName = "System"
+                />
+                <Reference
+                    Name = "SampleFixtureExtension"
+                    Project = "{ED281A23-9579-4A70-B608-1B86DCDEB78C}"
+                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
+                />
+                <Reference
+                    Name = "nunit.framework"
+                    AssemblyName = "nunit.framework"
+                    HintPath = "..\..\..\bin\nunit.framework.dll"
+                />
+            </References>
+        </Build>
+        <Files>
+            <Include>
+                <File
+                    RelPath = "SampleFixtureExtensionTests.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+            </Include>
+        </Files>
+    </CSHARP>
+</VisualStudioProject>
+
diff --git a/samples/Extensibility/Core/SampleSuiteExtension/SampleSuiteExtension.build b/samples/Extensibility/Core/SampleSuiteExtension/SampleSuiteExtension.build
index b0a34be..5444fdc 100644
--- a/samples/Extensibility/Core/SampleSuiteExtension/SampleSuiteExtension.build
+++ b/samples/Extensibility/Core/SampleSuiteExtension/SampleSuiteExtension.build
@@ -1,77 +1,18 @@
 <?xml version="1.0"?>
-<project name="MinimalAddin" default="build">
+<project name="SampleSuiteExtension" default="build" basedir=".">
 
-  <property name="output.dir" value="../../../bin" />
-  <property name="output.dll" value="../../../bin/SampleSuiteExtension.dll"/>
-  <property name="test.dll" value="../../../bin/SampleSuiteExtensionTests.dll"/>
+  <include buildfile="../../../samples.common" />
 
-  <target name="clean">
-    <delete file="${output.dll}" />
-    <delete file="${test.dll}" />
-  </target>
+  <patternset id="source-files">
+    <include name="Addin.cs" />
+    <include name="AssemblyInfo.cs" />
+    <include name="SampleSuiteExtension.cs" />
+    <include name="SampleSuiteExtensionAttribute.cs" />
+    <include name="SampleSuiteExtensionBuilder.cs" />
+  </patternset>
 
-  <target name="build">
-    <mkdir dir="${output.dir}" unless="${directory::exists(output.dir)}" />
-    <copy file="../../../../bin/nunit.framework.dll" todir="${output.dir}" 
-      if="${file::exists('../../../../bin/nunit.framework.dll')}" />
-    <copy file="../../../../bin/nunit.core.interfaces.dll" todir="${output.dir}" 
-      if="${file::exists('../../../../bin/nunit.core.interfaces.dll')}" />
-    <copy file="../../../../bin/nunit.core.interfaces.dll" todir="${output.dir}" 
-      if="${file::exists('../../../../bin/nunit.core.dll')}" />
+  <patternset id="test-files">
+    <include name="SampleSuiteExtensionTests.cs" />
+  </patternset>
 
-    <csc target="library" output="${output.dll}">
-      <sources>
-        <include name="*.cs"/>
-      </sources>
-      <references basedir="${output.dir}">
-        <include name="nunit.core.interfaces.dll" />
-        <include name="nunit.core.dll" />
-      </references>
-    </csc>
-
-    <csc target="library" output="${test.dll}">
-      <sources>
-        <include name="Tests/*.cs"/>
-      </sources>
-      <references basedir="${output.dir}">
-        <include name="nunit.framework.dll" />
-        <include name="SampleSuiteExtension.dll"/>
-      </references>
-    </csc>
-  </target>
-
-  <target name="rebuild" depends="clean,build" />
-
-  <target name="package">
-    <copy todir="${package.samples.dir}/Extensibility/Core/SampleSuiteExtension">
-      <fileset>
-        <include name="SampleSuiteExtension.csproj" />
-        <include name="SampleSuiteExtension.build" />
-        <include name="Addin.cs" />
-        <include name="AssemblyInfo.cs" />
-        <include name="SampleSuiteExtension.cs" />
-        <include name="SampleSuiteExtensionAttribute.cs" />
-        <include name="SampleSuiteExtensionBuilder.cs" />
-        <include name="ReadMe.txt" />
-        <include name="Tests/SampleSuiteExtensionTests.csproj" />
-        <include name="Tests/AssemblyInfo.cs" />
-        <include name="Tests/SampleSuiteExtensionTests.cs" />
-      </fileset>
-    </copy>
-
-    <xmlpoke 
-      file="${package.samples.dir}/Extensibility/Core/SampleSuiteExtension/SampleSuiteExtension.csproj"
-      xpath="/VisualStudioProject/CSHARP/Build/References/Reference[@Name='nunit.core']/@HintPath"
-      value="..\..\..\..\bin\nunit.core.dll" />
-
-    <xmlpoke 
-      file="${package.samples.dir}/Extensibility/Core/SampleSuiteExtension/SampleSuiteExtension.csproj"
-      xpath="/VisualStudioProject/CSHARP/Build/References/Reference[@Name='nunit.core.interfaces']/@HintPath"
-      value="..\..\..\..\bin\nunit.core.interfaces.dll" />
-
-    <xmlpoke 
-      file="${package.samples.dir}/Extensibility/Core/SampleSuiteExtension/Tests/SampleSuiteExtensionTests.csproj"
-      xpath="/VisualStudioProject/CSHARP/Build/References/Reference[@Name='nunit.framework']/@HintPath"
-      value="..\..\..\..\..\bin\nunit.framework.dll" />
-  </target>
 </project>
\ No newline at end of file
diff --git a/samples/Extensibility/Core/SampleSuiteExtension/SampleSuiteExtension.csproj b/samples/Extensibility/Core/SampleSuiteExtension/SampleSuiteExtension.csproj
index 582c7d6..06383d2 100644
--- a/samples/Extensibility/Core/SampleSuiteExtension/SampleSuiteExtension.csproj
+++ b/samples/Extensibility/Core/SampleSuiteExtension/SampleSuiteExtension.csproj
@@ -1,24 +1,114 @@
 <VisualStudioProject>
-  <CSHARP ProjectType="Local" ProductVersion="7.10.3077" SchemaVersion="2.0" ProjectGuid="{0C4269EE-3266-45DD-9062-E356C067FBEF}">
-    <Build>
-      <Settings ApplicationIcon="" AssemblyKeyContainerName="" AssemblyName="SampleSuiteExtension" AssemblyOriginatorKeyFile="" DefaultClientScript="JScript" DefaultHTMLPageLayout="Grid" DefaultTargetSchema="IE50" DelaySign="false" OutputType="Library" PreBuildEvent="" PostBuildEvent="call ..\..\..\Install.bat $(TargetFileName)&#xD;&#xA;" RootNamespace="SampleSuiteExtension" RunPostBuildEvent="OnBuildSuccess" StartupObject="">
-        <Config Name="Debug" AllowUnsafeBlocks="false" BaseAddress="285212672" CheckForOverflowUnderflow="false" ConfigurationOverrideFile="" DefineConstants="DEBUG;TRACE" DocumentationFile="" DebugSymbols="true" FileAlignment="4096" IncrementalBuild="false" NoStdLib="false" NoWarn="" Optimize="false" OutputPath="bin\Debug\" RegisterForComInterop="false" RemoveIntegerChecks="false" TreatWarningsAsErrors="false" WarningLevel="4" />
-        <Config Name="Release" AllowUnsafeBlocks="false" BaseAddress="285212672" CheckForOverflowUnderflow="false" ConfigurationOverrideFile="" DefineConstants="TRACE" DocumentationFile="" DebugSymbols="false" FileAlignment="4096" IncrementalBuild="false" NoStdLib="false" NoWarn="" Optimize="true" OutputPath="bin\Release\" RegisterForComInterop="false" RemoveIntegerChecks="false" TreatWarningsAsErrors="false" WarningLevel="4" />
-      </Settings>
-      <References>
-        <Reference Name="System" AssemblyName="System" />
-        <Reference Name="nunit.core.interfaces" AssemblyName="nunit.core.interfaces, Version=2.4.4.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77" HintPath="..\..\..\..\bin\nunit.core.interfaces.dll" Private="False" />
-        <Reference Name="nunit.core" AssemblyName="nunit.core, Version=2.4.4.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77" HintPath="..\..\..\..\bin\nunit.core.dll" Private="False" />
-      </References>
-    </Build>
-    <Files>
-      <Include>
-        <File RelPath="Addin.cs" SubType="Code" BuildAction="Compile" />
-        <File RelPath="AssemblyInfo.cs" SubType="Code" BuildAction="Compile" />
-        <File RelPath="SampleSuiteExtension.cs" SubType="Code" BuildAction="Compile" />
-        <File RelPath="SampleSuiteExtensionAttribute.cs" SubType="Code" BuildAction="Compile" />
-        <File RelPath="SampleSuiteExtensionBuilder.cs" SubType="Code" BuildAction="Compile" />
-      </Include>
-    </Files>
-  </CSHARP>
-</VisualStudioProject>
\ No newline at end of file
+    <CSHARP
+        ProjectType = "Local"
+        ProductVersion = "7.10.3077"
+        SchemaVersion = "2.0"
+        ProjectGuid = "{0C4269EE-3266-45DD-9062-E356C067FBEF}"
+    >
+        <Build>
+            <Settings
+                ApplicationIcon = ""
+                AssemblyKeyContainerName = ""
+                AssemblyName = "SampleSuiteExtension"
+                AssemblyOriginatorKeyFile = ""
+                DefaultClientScript = "JScript"
+                DefaultHTMLPageLayout = "Grid"
+                DefaultTargetSchema = "IE50"
+                DelaySign = "false"
+                OutputType = "Library"
+                PreBuildEvent = ""
+                PostBuildEvent = ""
+                RootNamespace = "SampleSuiteExtension"
+                RunPostBuildEvent = "OnBuildSuccess"
+                StartupObject = ""
+            >
+                <Config
+                    Name = "Debug"
+                    AllowUnsafeBlocks = "false"
+                    BaseAddress = "285212672"
+                    CheckForOverflowUnderflow = "false"
+                    ConfigurationOverrideFile = ""
+                    DefineConstants = "DEBUG;TRACE"
+                    DocumentationFile = ""
+                    DebugSymbols = "true"
+                    FileAlignment = "4096"
+                    IncrementalBuild = "false"
+                    NoStdLib = "false"
+                    NoWarn = ""
+                    Optimize = "false"
+                    OutputPath = "bin\Debug\"
+                    RegisterForComInterop = "false"
+                    RemoveIntegerChecks = "false"
+                    TreatWarningsAsErrors = "false"
+                    WarningLevel = "4"
+                />
+                <Config
+                    Name = "Release"
+                    AllowUnsafeBlocks = "false"
+                    BaseAddress = "285212672"
+                    CheckForOverflowUnderflow = "false"
+                    ConfigurationOverrideFile = ""
+                    DefineConstants = "TRACE"
+                    DocumentationFile = ""
+                    DebugSymbols = "false"
+                    FileAlignment = "4096"
+                    IncrementalBuild = "false"
+                    NoStdLib = "false"
+                    NoWarn = ""
+                    Optimize = "true"
+                    OutputPath = "bin\Release\"
+                    RegisterForComInterop = "false"
+                    RemoveIntegerChecks = "false"
+                    TreatWarningsAsErrors = "false"
+                    WarningLevel = "4"
+                />
+            </Settings>
+            <References>
+                <Reference
+                    Name = "System"
+                    AssemblyName = "System"
+                />
+                <Reference
+                    Name = "nunit.core.interfaces"
+                    AssemblyName = "nunit.core.interfaces"
+                    HintPath = "..\..\..\bin\nunit.core.interfaces.dll"
+                />
+                <Reference
+                    Name = "nunit.core"
+                    AssemblyName = "nunit.core"
+                    HintPath = "..\..\..\bin\nunit.core.dll"
+                />
+            </References>
+        </Build>
+        <Files>
+            <Include>
+                <File
+                    RelPath = "Addin.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "AssemblyInfo.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "SampleSuiteExtension.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "SampleSuiteExtensionAttribute.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "SampleSuiteExtensionBuilder.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+            </Include>
+        </Files>
+    </CSHARP>
+</VisualStudioProject>
+
diff --git a/samples/Extensibility/Core/SampleSuiteExtension/Tests/AssemblyInfo.cs b/samples/Extensibility/Core/SampleSuiteExtension/Tests/AssemblyInfo.cs
deleted file mode 100644
index 177a4f0..0000000
--- a/samples/Extensibility/Core/SampleSuiteExtension/Tests/AssemblyInfo.cs
+++ /dev/null
@@ -1,58 +0,0 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-
-//
-// General Information about an assembly is controlled through the following 
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-//
-[assembly: AssemblyTitle("")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("")]
-[assembly: AssemblyCopyright("")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]		
-
-//
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version 
-//      Build Number
-//      Revision
-//
-// You can specify all the values or you can default the Revision and Build Numbers 
-// by using the '*' as shown below:
-
-[assembly: AssemblyVersion("1.0.*")]
-
-//
-// In order to sign your assembly you must specify a key to use. Refer to the 
-// Microsoft .NET Framework documentation for more information on assembly signing.
-//
-// Use the attributes below to control which key is used for signing. 
-//
-// Notes: 
-//   (*) If no key is specified, the assembly is not signed.
-//   (*) KeyName refers to a key that has been installed in the Crypto Service
-//       Provider (CSP) on your machine. KeyFile refers to a file which contains
-//       a key.
-//   (*) If the KeyFile and the KeyName values are both specified, the 
-//       following processing occurs:
-//       (1) If the KeyName can be found in the CSP, that key is used.
-//       (2) If the KeyName does not exist and the KeyFile does exist, the key 
-//           in the KeyFile is installed into the CSP and used.
-//   (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
-//       When specifying the KeyFile, the location of the KeyFile should be
-//       relative to the project output directory which is
-//       %Project Directory%\obj\<configuration>. For example, if your KeyFile is
-//       located in the project directory, you would specify the AssemblyKeyFile 
-//       attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
-//   (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
-//       documentation for more information on this.
-//
-[assembly: AssemblyDelaySign(false)]
-[assembly: AssemblyKeyFile("")]
-[assembly: AssemblyKeyName("")]
diff --git a/samples/Extensibility/Core/SampleSuiteExtension/Tests/SampleSuiteExtensionTests.csproj b/samples/Extensibility/Core/SampleSuiteExtension/Tests/SampleSuiteExtensionTests.csproj
index c14e707..b849ada 100644
--- a/samples/Extensibility/Core/SampleSuiteExtension/Tests/SampleSuiteExtensionTests.csproj
+++ b/samples/Extensibility/Core/SampleSuiteExtension/Tests/SampleSuiteExtensionTests.csproj
@@ -1,20 +1,94 @@
 <VisualStudioProject>
-  <CSHARP ProjectType="Local" ProductVersion="7.10.3077" SchemaVersion="2.0" ProjectGuid="{9F609A0D-FF7E-4F0C-B2DF-417EBC557CFF}">
-    <Build>
-      <Settings ApplicationIcon="" AssemblyKeyContainerName="" AssemblyName="SampleSuiteExtensionTests" AssemblyOriginatorKeyFile="" DefaultClientScript="JScript" DefaultHTMLPageLayout="Grid" DefaultTargetSchema="IE50" DelaySign="false" OutputType="Library" PreBuildEvent="" PostBuildEvent="" RootNamespace="Tests" RunPostBuildEvent="OnBuildSuccess" StartupObject="">
-        <Config Name="Debug" AllowUnsafeBlocks="false" BaseAddress="285212672" CheckForOverflowUnderflow="false" ConfigurationOverrideFile="" DefineConstants="DEBUG;TRACE" DocumentationFile="" DebugSymbols="true" FileAlignment="4096" IncrementalBuild="false" NoStdLib="false" NoWarn="" Optimize="false" OutputPath="bin\Debug\" RegisterForComInterop="false" RemoveIntegerChecks="false" TreatWarningsAsErrors="false" WarningLevel="4" />
-        <Config Name="Release" AllowUnsafeBlocks="false" BaseAddress="285212672" CheckForOverflowUnderflow="false" ConfigurationOverrideFile="" DefineConstants="TRACE" DocumentationFile="" DebugSymbols="false" FileAlignment="4096" IncrementalBuild="false" NoStdLib="false" NoWarn="" Optimize="true" OutputPath="bin\Release\" RegisterForComInterop="false" RemoveIntegerChecks="false" TreatWarningsAsErrors="false" WarningLevel="4" />
-      </Settings>
-      <References>
-        <Reference Name="System" AssemblyName="System" />
-        <Reference Name="SampleSuiteExtension" Project="{0C4269EE-3266-45DD-9062-E356C067FBEF}" Package="{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}" />
-        <Reference Name="nunit.framework" AssemblyName="nunit.framework, Version=2.4.4.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77" HintPath="..\..\..\..\..\bin\nunit.framework.dll" />
-      </References>
-    </Build>
-    <Files>
-      <Include>
-        <File RelPath="SampleSuiteExtensionTests.cs" SubType="Code" BuildAction="Compile" />
-      </Include>
-    </Files>
-  </CSHARP>
-</VisualStudioProject>
\ No newline at end of file
+    <CSHARP
+        ProjectType = "Local"
+        ProductVersion = "7.10.3077"
+        SchemaVersion = "2.0"
+        ProjectGuid = "{9F609A0D-FF7E-4F0C-B2DF-417EBC557CFF}"
+    >
+        <Build>
+            <Settings
+                ApplicationIcon = ""
+                AssemblyKeyContainerName = ""
+                AssemblyName = "SampleSuiteExtensionTests"
+                AssemblyOriginatorKeyFile = ""
+                DefaultClientScript = "JScript"
+                DefaultHTMLPageLayout = "Grid"
+                DefaultTargetSchema = "IE50"
+                DelaySign = "false"
+                OutputType = "Library"
+                PreBuildEvent = ""
+                PostBuildEvent = ""
+                RootNamespace = "Tests"
+                RunPostBuildEvent = "OnBuildSuccess"
+                StartupObject = ""
+            >
+                <Config
+                    Name = "Debug"
+                    AllowUnsafeBlocks = "false"
+                    BaseAddress = "285212672"
+                    CheckForOverflowUnderflow = "false"
+                    ConfigurationOverrideFile = ""
+                    DefineConstants = "DEBUG;TRACE"
+                    DocumentationFile = ""
+                    DebugSymbols = "true"
+                    FileAlignment = "4096"
+                    IncrementalBuild = "false"
+                    NoStdLib = "false"
+                    NoWarn = ""
+                    Optimize = "false"
+                    OutputPath = "bin\Debug\"
+                    RegisterForComInterop = "false"
+                    RemoveIntegerChecks = "false"
+                    TreatWarningsAsErrors = "false"
+                    WarningLevel = "4"
+                />
+                <Config
+                    Name = "Release"
+                    AllowUnsafeBlocks = "false"
+                    BaseAddress = "285212672"
+                    CheckForOverflowUnderflow = "false"
+                    ConfigurationOverrideFile = ""
+                    DefineConstants = "TRACE"
+                    DocumentationFile = ""
+                    DebugSymbols = "false"
+                    FileAlignment = "4096"
+                    IncrementalBuild = "false"
+                    NoStdLib = "false"
+                    NoWarn = ""
+                    Optimize = "true"
+                    OutputPath = "bin\Release\"
+                    RegisterForComInterop = "false"
+                    RemoveIntegerChecks = "false"
+                    TreatWarningsAsErrors = "false"
+                    WarningLevel = "4"
+                />
+            </Settings>
+            <References>
+                <Reference
+                    Name = "System"
+                    AssemblyName = "System"
+                />
+                <Reference
+                    Name = "SampleSuiteExtension"
+                    Project = "{0C4269EE-3266-45DD-9062-E356C067FBEF}"
+                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
+                />
+                <Reference
+                    Name = "nunit.framework"
+                    AssemblyName = "nunit.framework"
+                    HintPath = "..\..\..\..\bin\nunit.framework.dll"
+                />
+            </References>
+        </Build>
+        <Files>
+            <Include>
+                <File
+                    RelPath = "SampleSuiteExtensionTests.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+            </Include>
+        </Files>
+    </CSHARP>
+</VisualStudioProject>
+
diff --git a/samples/cpp/cpp-cli/failures/cpp-cli-failures.build b/samples/cpp/cpp-cli/failures/cpp-cli-failures.build
index 891cee1..99aabd3 100644
--- a/samples/cpp/cpp-cli/failures/cpp-cli-failures.build
+++ b/samples/cpp/cpp-cli/failures/cpp-cli-failures.build
@@ -1,39 +1,15 @@
 <?xml version="1.0"?>
-<project name="Cpp-Cli-Failures" default="build">
+<project name="cpp-cli-failures" default="build">
 
-  <property name="output.dir" value="../../../bin" />
-  <property name="output.dll" value="../../../bin/cpp-cli-failures.dll" />
+  <include buildfile="../../../samples.common"/>
 
-  <target name="clean">
-    <delete file="${output.dll}" />
-  </target>
-
-  <target name="build">
-
-    <readregistry property="vs.2005.path" 
-      key="Software\Microsoft\VisualStudio\8.0\InstallDir" 
-      hive="LocalMachine" failonerror="false"
-      unless="${property::exists( 'vs.2005.path' )}"/>
-
-    <fail message="VS 2005 must be installed to build this sample"
-      unless="${property::exists( 'vs.2005.path' )}"/>
-
-    <property name="build.config" value="Debug"
-      unless="${property::exists('build.config')}" />
-
-    <mkdir dir="${output.dir}" unless="${directory::exists(output.dir)}" />
-    <copy file="../../../../bin/nunit.framework.dll" todir="${output.dir}" 
-      if="${file::exists('../../../../bin/nunit.framework.dll')}" />
-
-    <exec program="devenv.exe"
-      basedir="${vs.2005.path}" workingdir="."
-      commandline="cpp-cli-failures.sln /build ${build.config} /out ${output.dll}"/>
-
-  </target>
-
-  <target name="rebuild" depends="clean,build" />
+  <patternset id="source-files">
+    <include name="AssemblyInfo.cpp" />
+    <include name="cppsample.cpp" />
+    <include name="cppsample.h" />
+  </patternset>
 
-  <target name="package">
+  <target name="packagex">
     <copy todir="${package.samples.dir}/cpp/cpp-cli/failures">
       <fileset basedir=".">
         <include name="cpp-cli-failures.vcproj" />
diff --git a/samples/cpp/cpp-cli/failures/cpp-cli-failures.vcproj b/samples/cpp/cpp-cli/failures/cpp-cli-failures.vcproj
index 233d2d6..e11541d 100644
--- a/samples/cpp/cpp-cli/failures/cpp-cli-failures.vcproj
+++ b/samples/cpp/cpp-cli/failures/cpp-cli-failures.vcproj
@@ -99,7 +99,7 @@
 			ConfigurationType="2"
 			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
 			CharacterSet="2"
-			ManagedExtensions="4"
+			ManagedExtensions="1"
 			>
 			<Tool
 				Name="VCPreBuildEventTool"
@@ -120,10 +120,11 @@
 				Name="VCCLCompilerTool"
 				Optimization="2"
 				InlineFunctionExpansion="1"
-				AdditionalUsingDirectories="..\..\src\NUnitFramework\framework\bin\Release;..\..\src\NUnitFramework\framework\bin\Debug"
+				AdditionalUsingDirectories=""
 				PreprocessorDefinitions="WIN32;NDEBUG"
 				MinimalRebuild="false"
-				UsePrecompiledHeader="2"
+				RuntimeLibrary="2"
+				UsePrecompiledHeader="0"
 				WarningLevel="3"
 			/>
 			<Tool
@@ -137,7 +138,7 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				OutputFile="$(OutDir)/cpp-sample.dll"
+				OutputFile="$(OutDir)/cpp-cli-failures.dll"
 				LinkIncremental="1"
 				GenerateDebugInformation="true"
 			/>
@@ -169,8 +170,8 @@
 	</Configurations>
 	<References>
 		<AssemblyReference
-			RelativePath="c:\Program Files\NUnit 2.4.4\bin\nunit.framework.dll"
-			AssemblyName="nunit.framework, Version=2.4.4.0, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL"
+			RelativePath="..\..\..\..\solutions\vs2005\NUnitFramework\framework\bin\Debug\nunit.framework.dll"
+			AssemblyName="nunit.framework, Version=2.5.0.0, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL"
 		/>
 	</References>
 	<Files>
diff --git a/samples/cpp/cpp-cli/syntax/cpp-cli-syntax.build b/samples/cpp/cpp-cli/syntax/cpp-cli-syntax.build
index 815fbd9..3ac3260 100644
--- a/samples/cpp/cpp-cli/syntax/cpp-cli-syntax.build
+++ b/samples/cpp/cpp-cli/syntax/cpp-cli-syntax.build
@@ -1,47 +1,11 @@
 <?xml version="1.0"?>
-<project name="Cpp-Cli-Syntax" default="build">
+<project name="cpp-cli-syntax" default="build">
 
-  <property name="output.dir" value="../../../bin" />
-  <property name="output.dll" value="../../../bin/cpp-cli-syntax.dll" />
-
-  <target name="clean">
-    <delete file="${output.dll}" />
-  </target>
-
-  <target name="build">
-
-    <readregistry property="vs.2005.path" 
-      key="Software\Microsoft\VisualStudio\8.0\InstallDir" 
-      hive="LocalMachine" failonerror="false"
-      unless="${property::exists( 'vs.2005.path' )}"/>
-
-    <fail message="VS 2005 must be installed to build this sample"
-      unless="${property::exists( 'vs.2005.path' )}"/>
-
-    <property name="build.config" value="Debug"
-      unless="${property::exists('build.config')}" />
-
-    <mkdir dir="${output.dir}" unless="${directory::exists(output.dir)}" />
-    <copy file="../../../../bin/nunit.framework.dll" todir="${output.dir}" 
-      if="${file::exists('../../../../bin/nunit.framework.dll')}" />
-
-    <exec program="devenv.exe"
-      basedir="${vs.2005.path}" workingdir="."
-      commandline="cpp-cli-syntax.sln /build ${build.config} /out ${output.dll}"/>
-
-  </target>
-
-  <target name="rebuild" depends="clean,build" />
-
-  <target name="package">
-    <copy todir="${package.samples.dir}/cpp/cpp-cli/syntax">
-      <fileset basedir=".">
-        <include name="cpp-cli-syntax.vcproj" />
-        <include name="cpp-cli-syntax.build" />
-        <include name="AssemblyInfo.cpp" />
-        <include name="cpp-cli-syntax.cpp" />
-      </fileset>
-    </copy>
-  </target>
+  <include buildfile="../../../samples.common"/>
 
+  <patternset id="source-files">
+    <include name="AssemblyInfo.cpp" />
+    <include name="cpp-cli-syntax.cpp" />
+  </patternset>
+  
 </project>
\ No newline at end of file
diff --git a/samples/cpp/cpp-cli/syntax/cpp-cli-syntax.cpp b/samples/cpp/cpp-cli/syntax/cpp-cli-syntax.cpp
index 222474e..81e013c 100644
--- a/samples/cpp/cpp-cli/syntax/cpp-cli-syntax.cpp
+++ b/samples/cpp/cpp-cli/syntax/cpp-cli-syntax.cpp
@@ -5,10 +5,10 @@
 // ****************************************************************
 
 using namespace NUnit::Framework;
-using NUnit::Framework::SyntaxHelpers::Is;
-using NUnit::Framework::SyntaxHelpers::Text;
-using NUnit::Framework::SyntaxHelpers::List;
-using NUnit::Framework::SyntaxHelpers::Has;
+using NUnit::Framework::Is;
+using NUnit::Framework::Text;
+using NUnit::Framework::List;
+using NUnit::Framework::Has;
 using System::String;
 
 namespace NUnitSamples
@@ -20,14 +20,16 @@ namespace NUnitSamples
 		[Test]
 		void IsNull()
 		{
+			Object ^nada = nullptr;
+
 			// Classic syntax
-			Assert::IsNull(nullptr);
+			Assert::IsNull(nada);
 
 			// Helper syntax
-			Assert::That(nullptr, Is::Null);
+			Assert::That(nada, Is::Null);
 
 			// Inherited syntax
-			Expect(nullptr, Null);
+			Expect(nada, Null);
 		}
 
 		[Test]
@@ -548,16 +550,16 @@ namespace NUnitSamples
 			array<String^>^ strings = { "abc", "bca", "xyz" };
 
 			// Helper syntax
-			Assert::That( "Hello", Has::Property("Length", 5) );
-			Assert::That( "Hello", Has::Length( 5 ) );
-			Assert::That( strings , Has::All->Property( "Length", 3 ) );
-			Assert::That( strings, Has::All->Length( 3 ) );
+			Assert::That( "Hello", Has::Property("Length")->EqualTo(5) );
+			Assert::That( "Hello", Has::Length->EqualTo( 5 ) );
+			Assert::That( strings , Has::All->Property( "Length")->EqualTo(3) );
+			Assert::That( strings, Has::All->Length->EqualTo( 3 ) );
 
 			// Inherited syntax
-			Expect( "Hello", Property("Length", 5) );
-			Expect( "Hello", Length( 5 ) );
-			Expect( strings, All->Property("Length", 3 ) );
-			Expect( strings, All->Length( 3 ) );
+			Expect( "Hello", Property("Length")->EqualTo(5) );
+			Expect( "Hello", Length->EqualTo( 5 ) );
+			Expect( strings, All->Property("Length")->EqualTo(3) );
+			Expect( strings, All->Length->EqualTo( 3 ) );
 		}
 
 		[Test]
diff --git a/samples/cpp/cpp-cli/syntax/cpp-cli-syntax.vcproj b/samples/cpp/cpp-cli/syntax/cpp-cli-syntax.vcproj
index 68d9f19..d16dd41 100644
--- a/samples/cpp/cpp-cli/syntax/cpp-cli-syntax.vcproj
+++ b/samples/cpp/cpp-cli/syntax/cpp-cli-syntax.vcproj
@@ -167,8 +167,8 @@
 			AssemblyName="System, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"
 		/>
 		<AssemblyReference
-			RelativePath="c:\Program Files\NUnit 2.4.4\bin\nunit.framework.dll"
-			AssemblyName="nunit.framework, Version=2.4.4.0, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL"
+			RelativePath="..\..\..\..\solutions\vs2005\NUnitFramework\framework\bin\Debug\nunit.framework.dll"
+			AssemblyName="nunit.framework, Version=2.5.0.0, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL"
 		/>
 	</References>
 	<Files>
diff --git a/samples/cpp/managed/failures/cpp-managed-failures.build b/samples/cpp/managed/failures/cpp-managed-failures.build
index ec45cb7..40cf2b9 100644
--- a/samples/cpp/managed/failures/cpp-managed-failures.build
+++ b/samples/cpp/managed/failures/cpp-managed-failures.build
@@ -1,38 +1,15 @@
 <?xml version="1.0"?>
-<project name="Cpp-Managed-Failures" default="build">
+<project name="cpp-managed-failures" default="build">
 
-  <property name="output.dir" value="../../../bin" />
-  <property name="output.dll" value="../../../bin/cpp-managed-failures.dll" />
+  <include buildfile="../../../samples.common" />
 
-  <target name="clean">
-    <delete file="${output.dll}" />
-  </target>
-
-  <target name="build">
-
-    <readregistry property="vs.2003.path" 
-      key="Software\Microsoft\VisualStudio\7.1\InstallDir" 
-      hive="LocalMachine" failonerror="false"
-      unless="${property::exists( 'vs.2003.path' )}"/>
-
-    <property name="build.config" value="Debug"
-      unless="${property::exists('build.config')}" />
-
-    <fail message="VS 2003 must be installed to build this sample"
-      unless="${property::exists( 'vs.2003.path' )}"/>
-
-    <mkdir dir="${output.dir}" unless="${directory::exists(output.dir)}" />
-    <copy file="../../../../bin/nunit.framework.dll" todir="${output.dir}" 
-      if="${file::exists('../../../../bin/nunit.framework.dll')}" />
-
-    <exec program="devenv.exe" basedir="${vs.2003.path}" workingdir="."
-      commandline="cpp-managed-failures.sln /build ${build.config} /out ${output.dll}" />
-
-  </target>
-
-  <target name="rebuild" depends="clean,build" />
+  <patternset id="source-files">
+    <include name="AssemblyInfo.cpp" />
+    <include name="cppsample.cpp" />
+    <include name="cppsample.h" />
+  </patternset>
 
-  <target name="package">
+  <target name="packagex">
     <copy todir="${package.samples.dir}/cpp/managed/failures">
       <fileset basedir=".">
         <include name="cpp-managed-failures.build" />
diff --git a/samples/cpp/managed/failures/cpp-managed-failures.vcproj b/samples/cpp/managed/failures/cpp-managed-failures.vcproj
index 21cae77..c978c5f 100644
--- a/samples/cpp/managed/failures/cpp-managed-failures.vcproj
+++ b/samples/cpp/managed/failures/cpp-managed-failures.vcproj
@@ -17,7 +17,7 @@
 			ConfigurationType="2"
 			CharacterSet="2"
 			ManagedExtensions="TRUE"
-			ReferencesPath=""D:\Dev\NUnit\nunit-2.4\src\NUnitFramework\framework\bin\Debug"">
+			ReferencesPath=""D:\Dev\NUnit\nunit-2.5\solutions\vs2005\NUnitFramework\framework\bin\Release"">
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
@@ -63,7 +63,8 @@
 			IntermediateDirectory="Release"
 			ConfigurationType="2"
 			CharacterSet="2"
-			ManagedExtensions="TRUE">
+			ManagedExtensions="TRUE"
+			ReferencesPath=""D:\Dev\NUnit\nunit-2.5\solutions\vs2005\NUnitFramework\framework\bin\Release"">
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="2"
@@ -71,7 +72,7 @@
 				AdditionalUsingDirectories="..\..\src\NUnitFramework\framework\bin\Release;..\..\src\NUnitFramework\framework\bin\Debug"
 				PreprocessorDefinitions="WIN32;NDEBUG"
 				MinimalRebuild="FALSE"
-				UsePrecompiledHeader="3"
+				UsePrecompiledHeader="0"
 				WarningLevel="3"/>
 			<Tool
 				Name="VCCustomBuildTool"/>
@@ -104,11 +105,11 @@
 	</Configurations>
 	<References>
 		<AssemblyReference
-			RelativePath="{ReferencesPath}\mscorlib.dll"/>
+			RelativePath="mscorlib.dll"/>
 		<AssemblyReference
-			RelativePath="..\..\..\..\bin\nunit.framework.dll"/>
+			RelativePath="$(SolutionDir)..\..\bin\nunit.framework.dll"/>
 		<AssemblyReference
-			RelativePath="{ReferencesPath}\System.dll"/>
+			RelativePath="System.dll"/>
 	</References>
 	<Files>
 		<Filter
diff --git a/samples/csharp/CSharp.sln b/samples/csharp/CSharp.sln
index 4827f6d..456b6f0 100644
--- a/samples/csharp/CSharp.sln
+++ b/samples/csharp/CSharp.sln
@@ -7,10 +7,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cs-money", "money\cs-money.
 	ProjectSection(ProjectDependencies) = postProject
 	EndProjectSection
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cs-money-port", "money-port\cs-money-port.csproj", "{A257E931-6755-4655-A474-7CAB1B3775D2}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cs-syntax", "syntax\cs-syntax.csproj", "{06F46FA2-687B-4B46-A912-C1B0B4CC1B20}"
 	ProjectSection(ProjectDependencies) = postProject
 	EndProjectSection
@@ -29,10 +25,6 @@ Global
 		{11EDF872-A04D-4F75-A1BF-71168DC86AF3}.Debug.Build.0 = Debug|.NET
 		{11EDF872-A04D-4F75-A1BF-71168DC86AF3}.Release.ActiveCfg = Release|.NET
 		{11EDF872-A04D-4F75-A1BF-71168DC86AF3}.Release.Build.0 = Release|.NET
-		{A257E931-6755-4655-A474-7CAB1B3775D2}.Debug.ActiveCfg = Debug|.NET
-		{A257E931-6755-4655-A474-7CAB1B3775D2}.Debug.Build.0 = Debug|.NET
-		{A257E931-6755-4655-A474-7CAB1B3775D2}.Release.ActiveCfg = Release|.NET
-		{A257E931-6755-4655-A474-7CAB1B3775D2}.Release.Build.0 = Release|.NET
 		{06F46FA2-687B-4B46-A912-C1B0B4CC1B20}.Debug.ActiveCfg = Debug|.NET
 		{06F46FA2-687B-4B46-A912-C1B0B4CC1B20}.Debug.Build.0 = Debug|.NET
 		{06F46FA2-687B-4B46-A912-C1B0B4CC1B20}.Release.ActiveCfg = Release|.NET
diff --git a/samples/csharp/failures/cs-failures.build b/samples/csharp/failures/cs-failures.build
index 4b39c98..e104e6a 100644
--- a/samples/csharp/failures/cs-failures.build
+++ b/samples/csharp/failures/cs-failures.build
@@ -1,44 +1,11 @@
 <?xml version="1.0"?>
-<project name="CSharpFailures" default="build">
+<project name="cs-failures" default="build">
 
-  <property name="output.dir" value="../../bin" />
-  <property name="output.dll" value="../../bin/cs-failures.dll" />
+  <include buildfile="../../samples.common"/>
 
-  <target name="clean">
-    <delete file="${output.dll}" />
-  </target>
-
-  <target name="build">
-    <mkdir dir="${output.dir}" unless="${directory::exists(output.dir)}" />
-    <copy file="../../../bin/nunit.framework.dll" todir="${output.dir}" 
-      if="${file::exists('../../../bin/nunit.framework.dll')}" />
-
-    <csc target="library" output="${output.dll}">
-      <sources>
-        <include name="*.cs"/>
-      </sources>
-      <references basedir="${output.dir}">
-        <include name="nunit.framework.dll" />
-      </references>
-    </csc>
-  </target>
-
-  <target name="rebuild" depends="clean,build" />
-
-  <target name="package">
-    <copy todir="${package.samples.dir}/csharp/failures" includeemptydirs="false">
-      <fileset basedir=".">
-        <include name="cs-failures.csproj" />
-        <include name="cs-failures.build" />
-        <include name="AssemblyInfo.cs" />
-        <include name="CSharpTest.cs" />
-      </fileset>
-    </copy>
-
-    <xmlpoke 
-      file="${package.samples.dir}/csharp/failures/cs-failures.csproj"
-      xpath="/VisualStudioProject/CSHARP/Build/References/Reference[@Name='nunit.framework']/@HintPath"
-      value="..\..\..\bin\nunit.framework.dll" />
-  </target>
+  <patternset id="source-files">
+    <include name="AssemblyInfo.cs" />
+    <include name="CSharpTest.cs" />
+  </patternset>
 
 </project>
\ No newline at end of file
diff --git a/samples/csharp/failures/cs-failures.csproj b/samples/csharp/failures/cs-failures.csproj
index f34caa4..2811109 100644
--- a/samples/csharp/failures/cs-failures.csproj
+++ b/samples/csharp/failures/cs-failures.csproj
@@ -7,7 +7,7 @@
       </Settings>
       <References>
         <Reference Name="System" AssemblyName="System" />
-        <Reference Name="nunit.framework" AssemblyName="nunit.framework, Version=2.4.4.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77" HintPath="..\..\..\bin\nunit.framework.dll" />
+        <Reference Name="nunit.framework" AssemblyName="nunit.framework, Version=2.5, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77" HintPath="..\..\..\bin\net-1.1\framework\nunit.framework.dll" />
       </References>
     </Build>
     <Files>
diff --git a/samples/csharp/money-port/AssemblyInfo.cs b/samples/csharp/money-port/AssemblyInfo.cs
deleted file mode 100644
index 2861f83..0000000
--- a/samples/csharp/money-port/AssemblyInfo.cs
+++ /dev/null
@@ -1,58 +0,0 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-
-//
-// General Information about an assembly is controlled through the following 
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-//
-[assembly: AssemblyTitle("")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("")]
-[assembly: AssemblyCopyright("")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]		
-
-//
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version 
-//      Build Number
-//      Revision
-//
-// You can specify all the values or you can default the Revision and Build Numbers 
-// by using the '*' as shown below:
-
-[assembly: AssemblyVersion("2.2.0.0")]
-
-//
-// In order to sign your assembly you must specify a key to use. Refer to the 
-// Microsoft .NET Framework documentation for more information on assembly signing.
-//
-// Use the attributes below to control which key is used for signing. 
-//
-// Notes: 
-//   (*) If no key is specified, the assembly is not signed.
-//   (*) KeyName refers to a key that has been installed in the Crypto Service
-//       Provider (CSP) on your machine. KeyFile refers to a file which contains
-//       a key.
-//   (*) If the KeyFile and the KeyName values are both specified, the 
-//       following processing occurs:
-//       (1) If the KeyName can be found in the CSP, that key is used.
-//       (2) If the KeyName does not exist and the KeyFile does exist, the key 
-//           in the KeyFile is installed into the CSP and used.
-//   (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
-//       When specifying the KeyFile, the location of the KeyFile should be
-//       relative to the project output directory which is
-//       %Project Directory%\obj\<configuration>. For example, if your KeyFile is
-//       located in the project directory, you would specify the AssemblyKeyFile 
-//       attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
-//   (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
-//       documentation for more information on this.
-//
-[assembly: AssemblyDelaySign(false)]
-[assembly: AssemblyKeyFile("")]
-[assembly: AssemblyKeyName("")]
diff --git a/samples/csharp/money-port/IMoney.cs b/samples/csharp/money-port/IMoney.cs
deleted file mode 100644
index 6611832..0000000
--- a/samples/csharp/money-port/IMoney.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-namespace NUnit.Samples.Money 
-{
-
-  /// <summary>The common interface for simple Monies and MoneyBags.</summary>
-  interface IMoney {
-
-    /// <summary>Adds a money to this money.</summary>
-    IMoney Add(IMoney m);
-
-    /// <summary>Adds a simple Money to this money. This is a helper method for
-    /// implementing double dispatch.</summary>
-    IMoney AddMoney(Money m);
-
-    /// <summary>Adds a MoneyBag to this money. This is a helper method for
-    /// implementing double dispatch.</summary>
-    IMoney AddMoneyBag(MoneyBag s);
-
-    /// <value>True if this money is zero.</value>
-    bool IsZero { get; }
-
-    /// <summary>Multiplies a money by the given factor.</summary>
-    IMoney Multiply(int factor);
-
-    /// <summary>Negates this money.</summary>
-    IMoney Negate();
-
-    /// <summary>Subtracts a money from this money.</summary>
-    IMoney Subtract(IMoney m);
-  }
-}
diff --git a/samples/csharp/money-port/Money.cs b/samples/csharp/money-port/Money.cs
deleted file mode 100644
index d754016..0000000
--- a/samples/csharp/money-port/Money.cs
+++ /dev/null
@@ -1,88 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-namespace NUnit.Samples.Money 
-{
-
-  using System;
-  using System.Text;
-
-  /// <summary>A simple Money.</summary>
-  class Money: IMoney {
-
-    private int fAmount;
-    private String fCurrency;
-        
-    /// <summary>Constructs a money from the given amount and
-    /// currency.</summary>
-    public Money(int amount, String currency) {
-      fAmount= amount;
-      fCurrency= currency;
-    }
-
-    /// <summary>Adds a money to this money. Forwards the request to
-    /// the AddMoney helper.</summary>
-    public IMoney Add(IMoney m) {
-      return m.AddMoney(this);
-    }
-
-    public IMoney AddMoney(Money m) {
-      if (m.Currency.Equals(Currency) )
-        return new Money(Amount+m.Amount, Currency);
-      return new MoneyBag(this, m);
-    }
-
-    public IMoney AddMoneyBag(MoneyBag s) {
-      return s.AddMoney(this);
-    }
-
-    public int Amount {
-      get { return fAmount; }
-    }
-
-    public String Currency {
-      get { return fCurrency; }
-    }
-
-    public override bool Equals(Object anObject) {
-      if (IsZero)
-        if (anObject is IMoney)
-          return ((IMoney)anObject).IsZero;
-      if (anObject is Money) {
-        Money aMoney= (Money)anObject;
-        return aMoney.Currency.Equals(Currency)
-          && Amount == aMoney.Amount;
-      }
-      return false;
-    }
-
-    public override int GetHashCode() {
-      return fCurrency.GetHashCode()+fAmount;
-    }
-
-    public bool IsZero {
-      get { return Amount == 0; }
-    }
-
-    public IMoney Multiply(int factor) {
-      return new Money(Amount*factor, Currency);
-    }
-
-    public IMoney Negate() {
-      return new Money(-Amount, Currency);
-    }
-
-    public IMoney Subtract(IMoney m) {
-      return Add(m.Negate());
-    }
-
-    public override String ToString() {
-      StringBuilder buffer = new StringBuilder();
-      buffer.Append("["+Amount+" "+Currency+"]");
-      return buffer.ToString();
-    }
-  }
-}
diff --git a/samples/csharp/money-port/MoneyBag.cs b/samples/csharp/money-port/MoneyBag.cs
deleted file mode 100644
index a694648..0000000
--- a/samples/csharp/money-port/MoneyBag.cs
+++ /dev/null
@@ -1,144 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-namespace NUnit.Samples.Money 
-{
-
-  using System;
-  using System.Collections;
-  using System.Text;
-
-  /// <summary>A MoneyBag defers exchange rate conversions.</summary>
-  /// <remarks>For example adding 
-  /// 12 Swiss Francs to 14 US Dollars is represented as a bag 
-  /// containing the two Monies 12 CHF and 14 USD. Adding another
-  /// 10 Swiss francs gives a bag with 22 CHF and 14 USD. Due to 
-  /// the deferred exchange rate conversion we can later value a 
-  /// MoneyBag with different exchange rates.
-  ///
-  /// A MoneyBag is represented as a list of Monies and provides 
-  /// different constructors to create a MoneyBag.</remarks>
-  class MoneyBag: IMoney {
-    private ArrayList fMonies= new ArrayList(5);
-
-    private MoneyBag() {
-    }
-    public MoneyBag(Money[] bag) {
-      for (int i= 0; i < bag.Length; i++) {
-        if (!bag[i].IsZero)
-          AppendMoney(bag[i]);
-      }
-    }
-    public MoneyBag(Money m1, Money m2) {
-      AppendMoney(m1);
-      AppendMoney(m2);
-    }
-    public MoneyBag(Money m, MoneyBag bag) {
-      AppendMoney(m);
-      AppendBag(bag);
-    }
-    public MoneyBag(MoneyBag m1, MoneyBag m2) {
-      AppendBag(m1);
-      AppendBag(m2);
-    }
-    public IMoney Add(IMoney m) {
-      return m.AddMoneyBag(this);
-    }
-    public IMoney AddMoney(Money m) {
-      return (new MoneyBag(m, this)).Simplify();
-    }
-    public IMoney AddMoneyBag(MoneyBag s) {
-      return (new MoneyBag(s, this)).Simplify();
-    }
-    private void AppendBag(MoneyBag aBag) {
-      foreach (Money m in aBag.fMonies)
-        AppendMoney(m);
-    }
-    private void AppendMoney(Money aMoney) {
-      IMoney old= FindMoney(aMoney.Currency);
-      if (old == null) {
-        fMonies.Add(aMoney);
-        return;
-      }
-      fMonies.Remove(old);
-      IMoney sum= old.Add(aMoney);
-      if (sum.IsZero) 
-        return;
-      fMonies.Add(sum);
-    }
-    private bool Contains(Money aMoney) {
-      Money m= FindMoney(aMoney.Currency);
-      return m.Amount == aMoney.Amount;
-    }
-    public override bool Equals(Object anObject) {
-      if (IsZero)
-        if (anObject is IMoney)
-          return ((IMoney)anObject).IsZero;
-            
-      if (anObject is MoneyBag) {
-        MoneyBag aMoneyBag= (MoneyBag)anObject;
-        if (aMoneyBag.fMonies.Count != fMonies.Count)
-          return false;
-                
-        foreach (Money m in fMonies) {
-          if (!aMoneyBag.Contains(m))
-            return false;
-        }
-        return true;
-      }
-      return false;
-    }
-    private Money FindMoney(String currency) {
-      foreach (Money m in fMonies) {
-        if (m.Currency.Equals(currency))
-          return m;
-      }
-      return null;
-    }
-    public override int GetHashCode() {
-      int hash= 0;
-      foreach (Money m in fMonies) {
-        hash^= m.GetHashCode();
-      }
-      return hash;
-    }
-    public bool IsZero {
-      get { return fMonies.Count == 0; }
-    }
-    public IMoney Multiply(int factor) {
-      MoneyBag result= new MoneyBag();
-      if (factor != 0) {
-        foreach (Money m in fMonies) {
-          result.AppendMoney((Money)m.Multiply(factor));
-        }
-      }
-      return result;
-    }
-    public IMoney Negate() {
-      MoneyBag result= new MoneyBag();
-      foreach (Money m in fMonies) {
-        result.AppendMoney((Money)m.Negate());
-      }
-      return result;
-    }
-    private IMoney Simplify() {
-      if (fMonies.Count == 1)
-        return (IMoney)fMonies[0];
-      return this;
-    }
-    public IMoney Subtract(IMoney m) {
-      return Add(m.Negate());
-    }
-    public override String ToString() {
-      StringBuilder buffer = new StringBuilder();
-      buffer.Append("{");
-      foreach (Money m in fMonies)
-        buffer.Append(m);
-      buffer.Append("}");
-      return buffer.ToString();
-    }
-  }
-}
diff --git a/samples/csharp/money-port/MoneyTest.cs b/samples/csharp/money-port/MoneyTest.cs
deleted file mode 100644
index 7e4c626..0000000
--- a/samples/csharp/money-port/MoneyTest.cs
+++ /dev/null
@@ -1,249 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-namespace NUnit.Samples.Money.Port
-{
-	using System;
-	using NUnit.Framework;
-	/// <summary>
-	/// 
-	/// </summary>
-	public class MoneyTest: TestCase 
-	{
-		private Money f12CHF;
-		private Money f14CHF;
-		private Money f7USD;
-		private Money f21USD;
-        
-		private MoneyBag fMB1;
-		private MoneyBag fMB2;
-
-		/// <summary>
-		/// 
-		/// </summary>
-		protected override void SetUp() 
-		{
-			f12CHF= new Money(12, "CHF");
-			f14CHF= new Money(14, "CHF");
-			f7USD= new Money( 7, "USD");
-			f21USD= new Money(21, "USD");
-
-			fMB1= new MoneyBag(f12CHF, f7USD);
-			fMB2= new MoneyBag(f14CHF, f21USD);
-		}
-		/// <summary>
-		/// 
-		/// </summary>
-		public void TestBagMultiply() 
-		{
-			// {[12 CHF][7 USD]} *2 == {[24 CHF][14 USD]}
-			Money[] bag = { new Money(24, "CHF"), new Money(14, "USD") };
-			MoneyBag expected= new MoneyBag(bag);
-			Assertion.AssertEquals(expected, fMB1.Multiply(2));
-			Assertion.AssertEquals(fMB1, fMB1.Multiply(1));
-			Assertion.Assert(fMB1.Multiply(0).IsZero);
-		}
-		/// <summary>
-		/// 
-		/// </summary>
-		public void TestBagNegate() 
-		{
-			// {[12 CHF][7 USD]} negate == {[-12 CHF][-7 USD]}
-			Money[] bag= { new Money(-12, "CHF"), new Money(-7, "USD") };
-			MoneyBag expected= new MoneyBag(bag);
-			Assertion.AssertEquals(expected, fMB1.Negate());
-		}
-		/// <summary>
-		/// 
-		/// </summary>
-		public void TestBagSimpleAdd() 
-		{
-			// {[12 CHF][7 USD]} + [14 CHF] == {[26 CHF][7 USD]}
-			Money[] bag= { new Money(26, "CHF"), new Money(7, "USD") };
-			MoneyBag expected= new MoneyBag(bag);
-			Assertion.AssertEquals(expected, fMB1.Add(f14CHF));
-		}
-		/// <summary>
-		/// 
-		/// </summary>
-		public void TestBagSubtract() 
-		{
-			// {[12 CHF][7 USD]} - {[14 CHF][21 USD] == {[-2 CHF][-14 USD]}
-			Money[] bag= { new Money(-2, "CHF"), new Money(-14, "USD") };
-			MoneyBag expected= new MoneyBag(bag);
-			Assertion.AssertEquals(expected, fMB1.Subtract(fMB2));
-		}
-		/// <summary>
-		/// 
-		/// </summary>
-		public void TestBagSumAdd() 
-		{
-			// {[12 CHF][7 USD]} + {[14 CHF][21 USD]} == {[26 CHF][28 USD]}
-			Money[] bag= { new Money(26, "CHF"), new Money(28, "USD") };
-			MoneyBag expected= new MoneyBag(bag);
-			Assertion.AssertEquals(expected, fMB1.Add(fMB2));
-		}
-		/// <summary>
-		/// 
-		/// </summary>
-		public void TestIsZero() 
-		{
-			Assertion.Assert(fMB1.Subtract(fMB1).IsZero);
-
-			Money[] bag = { new Money(0, "CHF"), new Money(0, "USD") };
-			Assertion.Assert(new MoneyBag(bag).IsZero);
-		}
-		/// <summary>
-		/// 
-		/// </summary>
-		public void TestMixedSimpleAdd() 
-		{
-			// [12 CHF] + [7 USD] == {[12 CHF][7 USD]}
-			Money[] bag= { f12CHF, f7USD };
-			MoneyBag expected= new MoneyBag(bag);
-			Assertion.AssertEquals(expected, f12CHF.Add(f7USD));
-		}
-		/// <summary>
-		/// 
-		/// </summary>
-		public void TestMoneyBagEquals() 
-		{
-			Assertion.Assert(!fMB1.Equals(null)); 
-
-			Assertion.AssertEquals(fMB1, fMB1);
-			MoneyBag equal= new MoneyBag(new Money(12, "CHF"), new Money(7, "USD"));
-			Assertion.Assert(fMB1.Equals(equal));
-			Assertion.Assert(!fMB1.Equals(f12CHF));
-			Assertion.Assert(!f12CHF.Equals(fMB1));
-			Assertion.Assert(!fMB1.Equals(fMB2));
-		}
-		/// <summary>
-		/// 
-		/// </summary>
-		public void TestMoneyBagHash() 
-		{
-			MoneyBag equal= new MoneyBag(new Money(12, "CHF"), new Money(7, "USD"));
-			Assertion.AssertEquals(fMB1.GetHashCode(), equal.GetHashCode());
-		}
-		/// <summary>
-		/// 
-		/// </summary>
-		public void TestMoneyEquals() 
-		{
-			Assertion.Assert(!f12CHF.Equals(null)); 
-			Money equalMoney= new Money(12, "CHF");
-			Assertion.AssertEquals(f12CHF, f12CHF);
-			Assertion.AssertEquals(f12CHF, equalMoney);
-			Assertion.AssertEquals(f12CHF.GetHashCode(), equalMoney.GetHashCode());
-			Assertion.Assert(!f12CHF.Equals(f14CHF));
-		}
-		/// <summary>
-		/// 
-		/// </summary>
-		public void TestMoneyHash() 
-		{
-			Assertion.Assert(!f12CHF.Equals(null)); 
-			Money equal= new Money(12, "CHF");
-			Assertion.AssertEquals(f12CHF.GetHashCode(), equal.GetHashCode());
-		}
-		/// <summary>
-		/// 
-		/// </summary>
-		public void TestNormalize() 
-		{
-			Money[] bag= { new Money(26, "CHF"), new Money(28, "CHF"), new Money(6, "CHF") };
-			MoneyBag moneyBag= new MoneyBag(bag);
-			Money[] expected = { new Money(60, "CHF") };
-			// note: expected is still a MoneyBag
-			MoneyBag expectedBag= new MoneyBag(expected);
-			Assertion.AssertEquals(expectedBag, moneyBag);
-		}
-		/// <summary>
-		/// 
-		/// </summary>
-		public void TestNormalize2() 
-		{
-			// {[12 CHF][7 USD]} - [12 CHF] == [7 USD]
-			Money expected= new Money(7, "USD");
-			Assertion.AssertEquals(expected, fMB1.Subtract(f12CHF));
-		}
-		/// <summary>
-		/// 
-		/// </summary>
-		public void TestNormalize3() 
-		{
-			// {[12 CHF][7 USD]} - {[12 CHF][3 USD]} == [4 USD]
-			Money[] s1 = { new Money(12, "CHF"), new Money(3, "USD") };
-			MoneyBag ms1= new MoneyBag(s1);
-			Money expected= new Money(4, "USD");
-			Assertion.AssertEquals(expected, fMB1.Subtract(ms1));
-		}
-		/// <summary>
-		/// 
-		/// </summary>
-		public void TestNormalize4() 
-		{
-			// [12 CHF] - {[12 CHF][3 USD]} == [-3 USD]
-			Money[] s1 = { new Money(12, "CHF"), new Money(3, "USD") };
-			MoneyBag ms1= new MoneyBag(s1);
-			Money expected= new Money(-3, "USD");
-			Assertion.AssertEquals(expected, f12CHF.Subtract(ms1));
-		}
-		/// <summary>
-		/// 
-		/// </summary>
-		public void TestPrint() 
-		{
-			Assertion.AssertEquals("[12 CHF]", f12CHF.ToString());
-		}
-		/// <summary>
-		/// 
-		/// </summary>
-		public void TestSimpleAdd() 
-		{
-			// [12 CHF] + [14 CHF] == [26 CHF]
-			Money expected= new Money(26, "CHF");
-			Assertion.AssertEquals(expected, f12CHF.Add(f14CHF));
-		}
-		/// <summary>
-		/// 
-		/// </summary>
-		public void TestSimpleBagAdd() 
-		{
-			// [14 CHF] + {[12 CHF][7 USD]} == {[26 CHF][7 USD]}
-			Money[] bag= { new Money(26, "CHF"), new Money(7, "USD") };
-			MoneyBag expected= new MoneyBag(bag);
-			Assertion.AssertEquals(expected, f14CHF.Add(fMB1));
-		}
-		/// <summary>
-		/// 
-		/// </summary>
-		public void TestSimpleMultiply() 
-		{
-			// [14 CHF] *2 == [28 CHF]
-			Money expected= new Money(28, "CHF");
-			Assertion.AssertEquals(expected, f14CHF.Multiply(2));
-		}
-		/// <summary>
-		/// 
-		/// </summary>
-		public void TestSimpleNegate() 
-		{
-			// [14 CHF] negate == [-14 CHF]
-			Money expected= new Money(-14, "CHF");
-			Assertion.AssertEquals(expected, f14CHF.Negate());
-		}
-		/// <summary>
-		/// 
-		/// </summary>
-		public void TestSimpleSubtract() 
-		{
-			// [14 CHF] - [12 CHF] == [2 CHF]
-			Money expected= new Money(2, "CHF");
-			Assertion.AssertEquals(expected, f14CHF.Subtract(f12CHF));
-		}
-	}
-}
\ No newline at end of file
diff --git a/samples/csharp/money-port/cs-money-port.build b/samples/csharp/money-port/cs-money-port.build
deleted file mode 100644
index 7d118d8..0000000
--- a/samples/csharp/money-port/cs-money-port.build
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0"?>
-<project name="CSharpMoneyPort" default="build">
-
-  <property name="output.dir" value="../../bin" />
-  <property name="output.dll" value="../../bin/cs-money-port.dll" />
-
-  <target name="clean">
-    <delete file="${output.dll}" />
-  </target>
-
-  <target name="build">
-    <mkdir dir="${output.dir}" unless="${directory::exists(output.dir)}" />
-    <copy file="../../../bin/nunit.framework.dll" todir="${output.dir}" 
-      if="${file::exists('../../../bin/nunit.framework.dll')}" />
-
-    <csc target="library" output="${output.dll}">
-      <sources>
-        <include name="*.cs"/>
-      </sources>
-      <nowarn>
-        <warning number="618"/>
-        <warning number="672"/>
-      </nowarn>
-      <references basedir="${output.dir}">
-        <include name="nunit.framework.dll" />
-      </references>
-    </csc>
-  </target>
-
-  <target name="rebuild" depends="clean,build" />
-
-  <target name="package">
-    <copy todir="${package.samples.dir}/csharp/money-port">
-      <fileset basedir=".">
-        <include name="cs-money-port.csproj" />
-        <include name="cs-money-port.build" />
-        <include name="cs-money-port.dll.config" />
-        <include name="AssemblyInfo.cs" />
-        <include name="IMoney.cs" />
-        <include name="Money.cs" />
-        <include name="MoneyBag.cs" />
-        <include name="MoneyTest.cs" />
-      </fileset>
-    </copy>
-
-    <xmlpoke 
-      file="${package.samples.dir}/csharp/money-port/cs-money-port.csproj"
-      xpath="/VisualStudioProject/CSHARP/Build/References/Reference[@Name='nunit.framework']/@HintPath"
-      value="..\..\..\bin\nunit.framework.dll" />
-  </target>
-
-</project>
\ No newline at end of file
diff --git a/samples/csharp/money-port/cs-money-port.csproj b/samples/csharp/money-port/cs-money-port.csproj
deleted file mode 100644
index 07a0232..0000000
--- a/samples/csharp/money-port/cs-money-port.csproj
+++ /dev/null
@@ -1,24 +0,0 @@
-<VisualStudioProject>
-  <CSHARP ProjectType="Local" ProductVersion="7.10.3077" SchemaVersion="2.0" ProjectGuid="{A257E931-6755-4655-A474-7CAB1B3775D2}">
-    <Build>
-      <Settings ApplicationIcon="" AssemblyKeyContainerName="" AssemblyName="cs-money-port" AssemblyOriginatorKeyFile="" DefaultClientScript="JScript" DefaultHTMLPageLayout="Grid" DefaultTargetSchema="IE50" DelaySign="false" OutputType="Library" PreBuildEvent="" PostBuildEvent="copy ..\..\cs-money-port.dll.config" RootNamespace="money_port" RunPostBuildEvent="OnBuildSuccess" StartupObject="">
-        <Config Name="Debug" AllowUnsafeBlocks="false" BaseAddress="285212672" CheckForOverflowUnderflow="false" ConfigurationOverrideFile="" DefineConstants="DEBUG;TRACE" DocumentationFile="" DebugSymbols="true" FileAlignment="4096" IncrementalBuild="true" NoStdLib="false" NoWarn="618,672" Optimize="false" OutputPath="bin\Debug\" RegisterForComInterop="false" RemoveIntegerChecks="false" TreatWarningsAsErrors="false" WarningLevel="4" />
-        <Config Name="Release" AllowUnsafeBlocks="false" BaseAddress="285212672" CheckForOverflowUnderflow="false" ConfigurationOverrideFile="" DefineConstants="TRACE" DocumentationFile="" DebugSymbols="false" FileAlignment="4096" IncrementalBuild="false" NoStdLib="false" NoWarn="618,672" Optimize="true" OutputPath="bin\Release\" RegisterForComInterop="false" RemoveIntegerChecks="false" TreatWarningsAsErrors="false" WarningLevel="4" />
-      </Settings>
-      <References>
-        <Reference Name="System" AssemblyName="System" />
-        <Reference Name="nunit.framework" AssemblyName="nunit.framework, Version=2.4.4.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77" HintPath="..\..\..\bin\nunit.framework.dll" />
-      </References>
-    </Build>
-    <Files>
-      <Include>
-        <File RelPath="AssemblyInfo.cs" SubType="Code" BuildAction="Compile" />
-        <File RelPath="cs-money-port.dll.config" BuildAction="None" />
-        <File RelPath="IMoney.cs" SubType="Code" BuildAction="Compile" />
-        <File RelPath="Money.cs" SubType="Code" BuildAction="Compile" />
-        <File RelPath="MoneyBag.cs" SubType="Code" BuildAction="Compile" />
-        <File RelPath="MoneyTest.cs" SubType="Code" BuildAction="Compile" />
-      </Include>
-    </Files>
-  </CSHARP>
-</VisualStudioProject>
\ No newline at end of file
diff --git a/samples/csharp/money-port/cs-money-port.dll.config b/samples/csharp/money-port/cs-money-port.dll.config
deleted file mode 100644
index 2547858..0000000
--- a/samples/csharp/money-port/cs-money-port.dll.config
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<configuration>
-  <configSections>
-	<sectionGroup name="NUnit">
-		<section name="TestCaseBuilder" type="System.Configuration.NameValueSectionHandler"/>
-	</sectionGroup>
-  </configSections>
-
-  <NUnit>
-    <TestCaseBuilder>
-        <!-- Set to true to recognize old style test 
-             cases starting with "Test..." -->
-		<add key="OldStyleTestCases" value="true" />
-    </TestCaseBuilder>
-  </NUnit>
-</configuration>
diff --git a/samples/csharp/money/cs-money.build b/samples/csharp/money/cs-money.build
index 87424a7..b6993eb 100644
--- a/samples/csharp/money/cs-money.build
+++ b/samples/csharp/money/cs-money.build
@@ -1,49 +1,14 @@
 <?xml version="1.0"?>
-<project name="CSharpMoney" default="build">
-
-  <property name="output.dir" value="../../bin" />
-  <property name="output.dll" value="../../bin/cs-money.dll" />
-
-  <target name="clean">
-    <delete file="${output.dll}" />
-  </target>
-
-  <target name="build">
-    <mkdir dir="${output.dir}" unless="${directory::exists(output.dir)}" />
-    <copy file="../../../bin/nunit.framework.dll" todir="${output.dir}" 
-      if="${file::exists('../../../bin/nunit.framework.dll')}" />
-
-    <csc target="library" output="${output.dll}">
-      <sources>
-        <include name="*.cs"/>
-      </sources>
-      <references basedir="${output.dir}">
-        <include name="nunit.framework.dll" />
-      </references>
-    </csc>
-  </target>
-
-  <target name="rebuild" depends="clean,build" />
-
-  <target name="package">
-
-    <copy todir="${package.samples.dir}/csharp/money">start ..
-      <fileset basedir=".">
-        <include name="cs-money.csproj" />
-        <include name="cs-money.build" />
-        <include name="AssemblyInfo.cs" />
-        <include name="IMoney.cs" />
-        <include name="Money.cs" />
-        <include name="MoneyBag.cs" />
-        <include name="MoneyTest.cs" />
-      </fileset>
-    </copy>
-
-    <xmlpoke 
-      file="${package.samples.dir}/csharp/money/cs-money.csproj"
-      xpath="/VisualStudioProject/CSHARP/Build/References/Reference[@Name='nunit.framework']/@HintPath"
-      value="..\..\..\bin\nunit.framework.dll" />
-
-  </target>
+<project name="cs-money" default="build">
+
+  <include buildfile="../../samples.common" />
+  
+  <patternset id="source-files">
+    <include name="AssemblyInfo.cs" />
+    <include name="IMoney.cs" />
+    <include name="Money.cs" />
+    <include name="MoneyBag.cs" />
+    <include name="MoneyTest.cs" />
+  </patternset>
 
 </project>
\ No newline at end of file
diff --git a/samples/csharp/money/cs-money.csproj b/samples/csharp/money/cs-money.csproj
index 786a4ba..84e76ae 100644
--- a/samples/csharp/money/cs-money.csproj
+++ b/samples/csharp/money/cs-money.csproj
@@ -7,7 +7,7 @@
       </Settings>
       <References>
         <Reference Name="System" AssemblyName="System" />
-        <Reference Name="nunit.framework" AssemblyName="nunit.framework, Version=2.4.4.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77" HintPath="..\..\..\bin\nunit.framework.dll" />
+        <Reference Name="nunit.framework" AssemblyName="nunit.framework, Version=2.5, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77" HintPath="..\..\..\bin\net-1.1\framework\nunit.framework.dll" />
       </References>
     </Build>
     <Files>
diff --git a/samples/csharp/syntax/AssertSyntaxTests.cs b/samples/csharp/syntax/AssertSyntaxTests.cs
index 2af1d57..7978c87 100644
--- a/samples/csharp/syntax/AssertSyntaxTests.cs
+++ b/samples/csharp/syntax/AssertSyntaxTests.cs
@@ -7,7 +7,6 @@
 using System;
 using System.Collections;
 using NUnit.Framework.Constraints;
-using NUnit.Framework.SyntaxHelpers;
 
 namespace NUnit.Framework.Tests
 {
@@ -31,14 +30,16 @@ namespace NUnit.Framework.Tests
 		[Test]
 		public void IsNull()
 		{
+			object nada = null;
+
 			// Classic syntax
-			Assert.IsNull(null);
+			Assert.IsNull(nada);
 
 			// Helper syntax
-			Assert.That(null, Is.Null);
+			Assert.That(nada, Is.Null);
 
 			// Inherited syntax
-			Expect(null, Null);
+			Expect(nada, Null);
 		}
 
 		[Test]
@@ -157,16 +158,16 @@ namespace NUnit.Framework.Tests
 		public void InstanceOfTypeTests()
 		{
 			// Classic syntax
-			Assert.IsInstanceOfType(typeof(string), "Hello");
-			Assert.IsNotInstanceOfType(typeof(string), 5);
+			Assert.IsInstanceOf(typeof(string), "Hello");
+			Assert.IsNotInstanceOf(typeof(string), 5);
 
 			// Helper syntax
-			Assert.That("Hello", Is.InstanceOfType(typeof(string)));
-			Assert.That(5, Is.Not.InstanceOfType(typeof(string)));
+			Assert.That("Hello", Is.InstanceOf(typeof(string)));
+			Assert.That(5, Is.Not.InstanceOf(typeof(string)));
 
 			// Inherited syntax
-			Expect("Hello", InstanceOfType(typeof(string)));
-			Expect(5, Not.InstanceOfType(typeof(string)));
+			Expect("Hello", InstanceOf(typeof(string)));
+			Expect(5, Not.InstanceOf(typeof(string)));
 		}
 
 		[Test]
@@ -488,7 +489,7 @@ namespace NUnit.Framework.Tests
 			Assert.That(strings, Text.All.Contains( "a" ) );
 			Assert.That(strings, Has.All.Contains( "a" ) );
 			Assert.That(strings, Has.Some.StartsWith( "ba" ) );
-			Assert.That( strings, Has.Some.Property( "Length", 3 ) );
+			Assert.That( strings, Has.Some.Property( "Length" ).EqualTo( 3 ) );
 			Assert.That( strings, Has.Some.StartsWith( "BA" ).IgnoreCase );
 			Assert.That( doubles, Has.Some.EqualTo( 1.0 ).Within( .05 ) );
 		
@@ -564,15 +565,15 @@ namespace NUnit.Framework.Tests
 			CollectionAssert.Contains(iarray, 3);
 			CollectionAssert.Contains(sarray, "b");
 			CollectionAssert.DoesNotContain(sarray, "x");
-			// Showing that Contains uses object equality
-			CollectionAssert.DoesNotContain( iarray, 1.0d );
+			// Showing that Contains uses NUnit equality
+			CollectionAssert.Contains( iarray, 1.0d );
 
 			// Helper syntax
 			Assert.That(iarray, Has.Member(3));
 			Assert.That(sarray, Has.Member("b"));
 			Assert.That(sarray, Has.No.Member("x"));
-			// Showing that Contains uses object equality
-			Assert.That(iarray, Has.No.Member( 1.0d ));
+			// Showing that Contains uses NUnit equality
+			Assert.That(iarray, Has.Member( 1.0d ));
 
 			// Only available using the new syntax
 			// Note that EqualTo and SameAs do NOT give
@@ -584,7 +585,7 @@ namespace NUnit.Framework.Tests
 			Assert.That(sarray, Has.None.EqualTo("x"));
 			Assert.That(iarray, Has.None.SameAs( 1.0d ));
 			Assert.That(iarray, Has.All.LessThan(10));
-			Assert.That(sarray, Has.All.Length(1));
+			Assert.That(sarray, Has.All.Length.EqualTo(1));
 			Assert.That(sarray, Has.None.Property("Length").GreaterThan(3));
 		
 			// Inherited syntax
@@ -600,7 +601,7 @@ namespace NUnit.Framework.Tests
 			Expect(sarray, Some.EqualTo("b"));
 			Expect(sarray, None.EqualTo("x"));
 			Expect(iarray, All.LessThan(10));
-			Expect(sarray, All.Length(1));
+			Expect(sarray, All.Length.EqualTo(1));
 			Expect(sarray, None.Property("Length").GreaterThan(3));
 		}
 
@@ -668,27 +669,27 @@ namespace NUnit.Framework.Tests
 			Assert.That( list, Has.Property( "Count" ) );
 			Assert.That( list, Has.No.Property( "Length" ) );
 
-			Assert.That( "Hello", Has.Property("Length", 5) );
-			Assert.That( "Hello", Has.Length( 5 ) );
+			Assert.That( "Hello", Has.Length.EqualTo( 5 ) );
+			Assert.That( "Hello", Has.Length.LessThan( 10 ) );
 			Assert.That( "Hello", Has.Property("Length").EqualTo(5) );
 			Assert.That( "Hello", Has.Property("Length").GreaterThan(3) );
 
-			Assert.That( array, Has.Property( "Length", 4 ) );
-			Assert.That( array, Has.Length( 4 ) );
+			Assert.That( array, Has.Property( "Length" ).EqualTo( 4 ) );
+			Assert.That( array, Has.Length.EqualTo( 4 ) );
 			Assert.That( array, Has.Property( "Length" ).LessThan( 10 ) );
 
-			Assert.That( array, Has.All.Property("Length", 3) );
-			Assert.That( array, Has.All.Length( 3 ) );
-			Assert.That( array, Is.All.Length( 3 ) );
+			Assert.That( array, Has.All.Property("Length").EqualTo(3) );
+			Assert.That( array, Has.All.Length.EqualTo( 3 ) );
+			Assert.That( array, Is.All.Length.EqualTo( 3 ) );
 			Assert.That( array, Has.All.Property("Length").EqualTo(3) );
 			Assert.That( array, Is.All.Property("Length").EqualTo(3) );
 			
-			Assert.That( array2, Has.Some.Property("Length", 2) );
-			Assert.That( array2, Has.Some.Length(2) );
+			Assert.That( array2, Has.Some.Property("Length").EqualTo(2) );
+			Assert.That( array2, Has.Some.Length.EqualTo(2) );
 			Assert.That( array2, Has.Some.Property("Length").GreaterThan(2) );
 
-			Assert.That( array2, Is.Not.Property("Length", 4) );
-			Assert.That( array2, Is.Not.Length( 4 ) );
+			Assert.That( array2, Is.Not.Property("Length").EqualTo(4) );
+			Assert.That( array2, Is.Not.Length.EqualTo( 4 ) );
 			Assert.That( array2, Has.No.Property("Length").GreaterThan(3) );
 
 			Assert.That( List.Map( array2 ).Property("Length"), Is.EqualTo( new int[] { 1, 2, 3 } ) );
@@ -696,31 +697,29 @@ namespace NUnit.Framework.Tests
 			Assert.That( List.Map( array2 ).Property("Length"), Is.SubsetOf( new int[] { 1, 2, 3, 4, 5 } ) );
 			Assert.That( List.Map( array2 ).Property("Length"), Is.Unique );
 
-			Assert.That( list, Has.Count( 4 ) );
+			Assert.That( list, Has.Count.EqualTo( 4 ) );
 			
 			// Inherited syntax
 			Expect( list, Property( "Count" ) );
 			Expect( list, Not.Property( "Nada" ) );
 
-			Expect( "Hello", Property("Length", 5) );
-			Expect( "Hello", Length( 5 ) );
+			Expect( "Hello", Length.EqualTo( 5 ) );
 			Expect( "Hello", Property("Length").EqualTo(5) );
 			Expect( "Hello", Property("Length").GreaterThan(0) );
 
-			Expect( array, Property("Length", 4) );
-			Expect( array, Length(4) );
+			Expect( array, Property("Length").EqualTo(4) );
+			Expect( array, Length.EqualTo(4) );
 			Expect( array, Property("Length").LessThan(10));
 
-			Expect( array, All.Property("Length", 3 ) );
-			Expect( array, All.Length( 3 ) );
+			Expect( array, All.Length.EqualTo( 3 ) );
 			Expect( array, All.Property("Length").EqualTo(3));
 
-			Expect( array2, Some.Property("Length", 2) );
-			Expect( array2, Some.Length( 2 ) );
+			Expect( array2, Some.Property("Length").EqualTo(2) );
+			Expect( array2, Some.Length.EqualTo( 2 ) );
 			Expect( array2, Some.Property("Length").GreaterThan(2));
 
-			Expect( array2, None.Property("Length", 4) );
-			Expect( array2, None.Length( 4 ) );
+			Expect( array2, None.Property("Length").EqualTo(4) );
+			Expect( array2, None.Length.EqualTo( 4 ) );
 			Expect( array2, None.Property("Length").GreaterThan(3));
 
 			Expect( Map( array2 ).Property("Length"), EqualTo( new int[] { 1, 2, 3 } ) );
@@ -728,7 +727,7 @@ namespace NUnit.Framework.Tests
 			Expect( Map( array2 ).Property("Length"), SubsetOf( new int[] { 1, 2, 3, 4, 5 } ) );
 			Expect( Map( array2 ).Property("Length"), Unique );
 
-			Expect( list, Count( 4 ) );
+			Expect( list, Count.EqualTo( 4 ) );
 
 		}
 		#endregion
diff --git a/samples/csharp/syntax/cs-syntax.build b/samples/csharp/syntax/cs-syntax.build
index 33024bf..56bf9d9 100644
--- a/samples/csharp/syntax/cs-syntax.build
+++ b/samples/csharp/syntax/cs-syntax.build
@@ -1,44 +1,11 @@
 <?xml version="1.0"?>
-<project name="CSharpSyntax" default="build">
+<project name="cs-syntax" default="build">
 
-  <property name="output.dir" value="../../bin" />
-  <property name="output.dll" value="../../bin/cs-syntax.dll" />
+  <include buildfile="../../samples.common" />
 
-  <target name="clean">
-    <delete file="${output.dll}" />
-  </target>
-
-  <target name="build">
-    <mkdir dir="${output.dir}" unless="${directory::exists(output.dir)}" />
-    <copy file="../../../bin/nunit.framework.dll" todir="${output.dir}" 
-      if="${file::exists('../../../bin/nunit.framework.dll')}" />
-
-    <csc target="library" output="${output.dll}">
-      <sources>
-        <include name="*.cs"/>
-      </sources>
-      <references basedir="${output.dir}">
-        <include name="nunit.framework.dll" />
-      </references>
-    </csc>
-  </target>
-
-  <target name="rebuild" depends="clean,build" />
-
-  <target name="package">
-    <copy todir="${package.samples.dir}/csharp/syntax" includeemptydirs="false">
-      <fileset basedir=".">
-        <include name="cs-syntax.csproj" />
-        <include name="cs-syntax.build" />
-        <include name="AssemblyInfo.cs" />
-        <include name="AssertSyntaxTests.cs" />
-      </fileset>
-    </copy>
-
-    <xmlpoke 
-      file="${package.samples.dir}/csharp/syntax/cs-syntax.csproj"
-      xpath="/VisualStudioProject/CSHARP/Build/References/Reference[@Name='nunit.framework']/@HintPath"
-      value="..\..\..\bin\nunit.framework.dll" />
-  </target>
+  <patternset id="source-files">
+    <include name="AssemblyInfo.cs" />
+    <include name="AssertSyntaxTests.cs" />
+  </patternset>
 
 </project>
\ No newline at end of file
diff --git a/samples/csharp/syntax/cs-syntax.csproj b/samples/csharp/syntax/cs-syntax.csproj
index 0cc89f4..f3a9282 100644
--- a/samples/csharp/syntax/cs-syntax.csproj
+++ b/samples/csharp/syntax/cs-syntax.csproj
@@ -7,7 +7,7 @@
       </Settings>
       <References>
         <Reference Name="System" AssemblyName="System" />
-        <Reference Name="nunit.framework" AssemblyName="nunit.framework, Version=2.4.4.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77" HintPath="..\..\..\bin\nunit.framework.dll" />
+        <Reference Name="nunit.framework" AssemblyName="nunit.framework, Version=2.5, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77" HintPath="..\..\..\bin\net-1.1\framework\nunit.framework.dll" />
       </References>
     </Build>
     <Files>
diff --git a/samples/jsharp/failures/jsharp-failures.build b/samples/jsharp/failures/jsharp-failures.build
index 2757629..a4b2f60 100644
--- a/samples/jsharp/failures/jsharp-failures.build
+++ b/samples/jsharp/failures/jsharp-failures.build
@@ -1,46 +1,11 @@
 <?xml version="1.0"?>
-<project name="JSharpFailures" default="build">
-
-  <property name="output.dir" value="../../bin" />
-  <property name="output.dll" value="../../bin/jsharp-failures.dll" />
-
-  <target name="clean">
-    <delete file="${output.dll}" />
-  </target>
-
-  <target name="build">
-
-    <mkdir dir="${output.dir}" unless="${directory::exists(output.dir)}" />
-    <copy file="../../../bin/nunit.framework.dll" todir="${output.dir}" 
-      if="${file::exists('../../../bin/nunit.framework.dll')}" />
-
-    <vjc target="library" output="${output.dll}">
-      <sources>
-        <include name="*.jsl"/>
-      </sources>
-      <references basedir="${output.dir}">
-        <include name="nunit.framework.dll" />
-      </references>
-    </vjc>
-
-  </target>
-
-  <target name="rebuild" depends="clean,build" />
-
-  <target name="package">
-    <copy todir="${package.samples.dir}/jsharp/failures">
-      <fileset basedir=".">
-        <include name="jsharp-failures.vjsproj" />
-        <include name="jsharp-failures.build" />
-        <include name="AssemblyInfo.jsl" />
-        <include name="JSharpTest.jsl" />
-      </fileset>
-    </copy>
-
-    <xmlpoke 
-      file="${package.samples.dir}/jsharp/failures/jsharp-failures.vjsproj"
-      xpath="/VisualStudioProject/VISUALJSHARP/Build/References/Reference[@Name='nunit.framework']/@HintPath"
-      value="..\..\..\bin\nunit.framework.dll" />
-  </target>
+<project name="jsharp-failures" default="build">
+
+  <include buildfile="../../samples.common" />
+  
+  <patternset id="source-files">
+    <include name="AssemblyInfo.jsl" />
+    <include name="JSharpTest.jsl" />
+  </patternset>
 
 </project>
\ No newline at end of file
diff --git a/samples/jsharp/failures/jsharp-failures.vjsproj b/samples/jsharp/failures/jsharp-failures.vjsproj
index a9a26df..0baa0ce 100644
--- a/samples/jsharp/failures/jsharp-failures.vjsproj
+++ b/samples/jsharp/failures/jsharp-failures.vjsproj
@@ -8,7 +8,7 @@
       <References>
         <Reference Name="vjslib" AssemblyName="vjslib" />
         <Reference Name="System" AssemblyName="System" />
-        <Reference Name="nunit.framework" AssemblyName="nunit.framework, Version=2.4.4.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77" HintPath="..\..\..\bin\nunit.framework.dll" />
+        <Reference Name="nunit.framework" AssemblyName="nunit.framework, Version=2.5, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77" HintPath="..\..\..\bin\net-1.1\framework\nunit.framework.dll" />
       </References>
     </Build>
     <Files>
diff --git a/samples/samples.common b/samples/samples.common
new file mode 100644
index 0000000..20cb16d
--- /dev/null
+++ b/samples/samples.common
@@ -0,0 +1,308 @@
+<?xml version="1.0"?>
+<project>
+
+  <property name="project.base" value="${project::get-base-directory()}" />
+
+  <property name="samples.base" value="${path::get-full-path('../..')}" />
+  <!-- Duplicate the following if more levels are added -->te
+  <property name="samples.base" value="${path::get-full-path('../../..')}"
+            unless="${path::get-file-name(samples.base)=='samples'}" />
+
+  <property name="output.dir" value="${samples.base}/bin" />
+
+  <property name="nunit.bin.dir"
+            value="${path::combine(path::get-directory-name(samples.base), 'bin')}" />
+  <property name="nunit.framework.dll"
+            value="${path::combine(nunit.bin.dir,'net-1.1/framework/nunit.framework.dll')}" />
+  <property name="nunit.core.dll"
+            value="${path::combine(nunit.bin.dir,'net-1.1/nunit.core.dll')}" />
+  <property name="nunit.core.interfaces.dll"
+            value="${path::combine(nunit.bin.dir,'net-1.1/nunit.core.interfaces.dll')}" />
+
+  <property name="sample" value="${project::get-name()}"
+            unless="${property::exists('sample')}"/>
+  <property name="sample.dll" value="${sample}.dll" />
+
+  <property name="sample.type"
+          value="${path::get-file-name(path::get-directory-name(project.base))}" />
+  <property name="sample.type" value="addin" if="${sample.type=='Core'}" />
+
+  <if test="${directory::exists(path::combine(project.base, 'Tests'))}" >
+    <property name="tests" value="${sample}Tests"
+          unless="${property::exists('tests')}" />
+    <property name="test.dll" value="${tests}.dll" />
+  </if>
+  
+  <property name="nunit.build" value="false"
+    unless="${property::exists('project.package.dir')}"/>
+  <property name="nunit.build" value="true" 
+    if="${property::exists('project.package.dir')}"/>
+
+  <property name="build.debug" value="true"
+            unless="${property::exists('build.debug')}" />
+  <property name="build.config" value="Debug"
+            if="${build.debug}" />
+  <property name="build.config" value="Release"
+            unless="${build.debug}" />
+
+
+  <target name="clean" description="Remove files created by build">
+
+    <delete file="${output.dir}/${sample.dll}" />
+    <delete file="${output.dir}/${sample}.pdb" />
+
+    <if test="${property::exists('test.dll')}">
+      <delete file="${output.dir}/${test.dll}" />
+      <delete file="${output.dir}/${path::change-extension(test.dll, '.pdb')}" />
+    </if>
+
+  </target>
+
+  <target name="init">
+
+    <mkdir dir="${output.dir}" unless="${directory::exists(output.dir)}" />
+
+    <copy file="${nunit.framework.dll}" todir="${output.dir}"
+          if="${not nunit.build and file::exists(nunit.framework.dll)}" />
+
+  </target>
+
+  <target name="init-addin">
+
+    <mkdir dir="${output.dir}" unless="${directory::exists(output.dir)}" />
+
+    <copy file="${nunit.core.dll}" todir="${output.dir}"
+          if="${not nunit.build and file::exists(nunit.core.dll)}" />
+    <copy file="${nunit.core.interfaces.dll}" todir="${output.dir}"
+          if="${not nunit.build and file::exists(nunit.core.interfaces.dll)}" />
+
+  </target>
+
+  <target name="build" Description="Build the sample">
+    <call target="build-${sample.type}"/>
+  </target>
+  
+  <target name="build-csharp" depends="init">
+
+    <csc target="library" output="${output.dir}/${sample.dll}" debug="${build.debug}">
+      <sources>
+        <patternset refid="source-files"/>
+      </sources>
+      <references basedir="${output.dir}">
+        <include name="nunit.framework.dll" />
+      </references>
+    </csc>
+
+  </target>
+
+  <target name="build-addin" depends="init-addin">
+
+    <csc target="library" output="${output.dir}/${sample}.dll" debug="${build.debug}">
+      <sources>
+        <patternset refid="source-files"/>
+      </sources>
+      <references basedir="${output.dir}">
+        <include name="nunit.core.interfaces.dll" />
+        <include name="nunit.core.dll" />
+      </references>
+    </csc>
+
+    <call target="build-addin-test" if="${property::exists('test.dll')}" />
+
+  </target>
+
+  <target name="build-addin-test">
+
+    <csc target="library" output="${output.dir}/${test.dll}" debug="${build.debug}">
+      <sources basedir="Tests">
+        <patternset refid="test-files"/>
+      </sources>
+      <references basedir="${output.dir}">
+        <include name="nunit.framework.dll" />
+        <include name="${sample}.dll" />
+      </references>
+    </csc>
+
+  </target>
+
+  <target name="build-vb" depends="init">
+
+    <vbc target="library"
+        output="${output.dir}/${sample.dll}" debug="${build.debug}">
+      <imports>
+        <import namespace="System"/>
+        <import namespace="System.Collections"/>
+      </imports>
+      <sources>
+        <patternset refid="source-files"/>
+      </sources>
+      <references basedir="${output.dir}">
+        <include name="System.dll" />
+        <include name="nunit.framework.dll" />
+      </references>
+    </vbc>
+
+  </target>
+
+  <target name="build-jsharp" depends="init">
+
+    <vjc target="library" output="${output.dir}/${sample.dll}" debug="${build.debug}">
+      <sources>
+        <patternset refid="source-files"/>
+      </sources>
+      <references basedir="${output.dir}">
+        <include name="nunit.framework.dll" />
+      </references>
+    </vjc>
+
+  </target>
+
+  <target name="build-managed" depends="init">
+
+    <readregistry property="vs.2003.path"
+      key="Software\Microsoft\VisualStudio\7.1\InstallDir"
+      hive="LocalMachine" failonerror="false"
+      unless="${property::exists( 'vs.2003.path' )}"/>
+
+    <fail message="VS 2003 must be installed to build this sample"
+      unless="${property::exists( 'vs.2003.path' )}"/>
+
+    <exec program="devenv.exe" basedir="${vs.2003.path}" workingdir="."
+      commandline="${sample}.vcproj /build ${build.config} /out ${output.dir}/${sample.dll}" />
+
+  </target>
+
+  <target name="build-cpp-cli" depends="init">
+
+    <readregistry property="vs.2005.path"
+      key="Software\Microsoft\VisualStudio\8.0\InstallDir"
+      hive="LocalMachine" failonerror="false"
+      unless="${property::exists( 'vs.2005.path' )}"/>
+
+    <fail message="VS 2005 must be installed to build this sample"
+      unless="${property::exists( 'vs.2005.path' )}"/>
+
+    <exec program="devenv.exe"
+      basedir="${vs.2005.path}" workingdir="."
+      commandline="${sample}.vcproj /build ${build.config} /out ${output.dir}/${sample.dll}"/>
+
+  </target>
+
+  <!-- ************************************************************* -->
+  <!-- Package targets are only used by the NUnit build script in    -->
+  <!-- order to package the samples for distribution.                -->
+  <!-- ************************************************************* -->
+  
+  <target name="package">
+
+    <fail message="Can't use package target directly - it must be called from the NUnit build script."
+          unless="${nunit.build}"/>
+
+    <property name="sample.path"
+              value="${string::replace(project.base, samples.base, package.samples.dir)}" />
+
+    <call target="package-${sample.type}" />
+
+  </target>
+
+  <target name="package-csharp">
+
+    <property name="sample.proj" value="${sample}.csproj" />
+
+    <call target="copy-source-files" />
+    <call target="update-framework-ref" />
+
+  </target>
+
+  <target name="package-jsharp">
+    
+    <property name="sample.proj" value="${sample}.vjsproj" />
+
+    <call target="copy-source-files" />
+    <call target="update-framework-ref" />
+
+  </target>
+
+  <target name="update-framework-ref">
+    
+    <xmlpoke
+      file="${sample.path}/${sample.proj}"
+      xpath="/VisualStudioProject/*/Build/References/Reference[@Name='nunit.framework']/@HintPath"
+      value="..\..\..\bin\net-1.1\framework\nunit.framework.dll" />
+
+  </target>
+
+  <target name="package-vb">
+    
+    <property name="sample.proj" value="${sample}.vbproj" />
+
+    <call target="copy-source-files" />
+    <call target="update-framework-ref" />
+
+  </target>
+
+  <target name="package-managed">
+    
+    <property name="sample.proj" value="${sample}.vcproj" />
+
+    <call target="copy-source-files" />
+
+    <copy todir="${package.samples.dir}/cpp/managed/failures"
+        file="./cpp-managed-failures.vcproj">
+      <filterchain>
+        <replacestring from="$(SolutionDir)..\..\..\src\NUnitFramework\framework\bin\Debug\nunit.framework.dll"
+          to="..\..\..\..\bin\nunit.framework.dll"/>
+      </filterchain>
+    </copy>
+
+  </target>
+
+  <target name="package-cpp-cli">
+    
+    <property name="sample.proj" value="${sample}.vcproj" />
+
+    <call target="copy-source-files" />
+
+    <xmlpoke
+      file="${sample.path}/${sample.proj}"
+      xpath="/VisualStudioProject/References/AssemblyReference[@AssemblyName='nunit.framework']/@RelativePath"
+      value="..\..\..\..\bin\net-2.0\framework\nunit.framework.dll" />
+
+  </target>
+
+  <target name="package-addin">
+    
+    <property name="sample.proj" value="${sample}.csproj" />
+
+    <call target="copy-source-files" />
+    <call target="copy-test-files" 
+      if="${property::exists('test.dll')}"/>
+
+  </target>
+
+  <target name="copy-source-files">
+
+    <copy todir="${sample.path}" includeemptydirs="false">
+      <fileset basedir=".">
+        <include name="${sample.proj}" />
+        <include name="${sample}.build" />
+        <include name="Readme.txt" />
+        <patternset refid="source-files" />
+      </fileset>
+    </copy>
+
+  </target>
+
+  <target name="copy-test-files">
+
+    <copy todir="${sample.path}/Tests" includeemptydirs="false">
+      <fileset basedir="Tests">
+        <include name="${sample}Tests.csproj" />
+        <include name="${sample}Tests.build" />
+        <patternset refid="test-files" />
+      </fileset>
+    </copy>
+
+  </target>
+
+</project>
\ No newline at end of file
diff --git a/samples/vb/failures/vb-failures.build b/samples/vb/failures/vb-failures.build
index f8bfd4f..37ab1cb 100644
--- a/samples/vb/failures/vb-failures.build
+++ b/samples/vb/failures/vb-failures.build
@@ -1,50 +1,11 @@
 <?xml version="1.0"?>
-<project name="VBFailures" default="build">
+<project name="vb-failures" default="build">
 
-  <property name="output.dir" value="../../bin" />
-  <property name="output.dll" value="../../bin/vb-failures.dll" />
+  <include buildfile="../../samples.common" />
 
-  <target name="clean">
-    <delete file="${output.dll}" />
-  </target>
-
-  <target name="build">
-
-    <mkdir dir="${output.dir}" unless="${directory::exists(output.dir)}" />
-    <copy file="../../../bin/nunit.framework.dll" todir="${output.dir}" 
-      if="${file::exists('../../../bin/nunit.framework.dll')}" />
-
-    <vbc target="library" 
-        output="${output.dll}">
-      <imports>
-        <import namespace="System"/>
-      </imports>
-      <sources>
-        <include name="*.vb"/>
-      </sources>
-      <references basedir="${output.dir}">
-        <include name="System.dll" />
-        <include name="nunit.framework.dll" />
-      </references>
-    </vbc>
-  </target>
-
-  <target name="rebuild" depends="clean,build" />
-
-  <target name="package">
-    <copy todir="${package.samples.dir}/vb/failures">
-      <fileset basedir=".">
-        <include name="vb-failures.vbproj" />
-        <include name="vb-failures.build" />
-        <include name="AssemblyInfo.vb" />
-        <include name="SimpleVBTest.vb" />
-      </fileset>
-    </copy>
-
-    <xmlpoke 
-      file="${package.samples.dir}/vb/failures/vb-failures.vbproj"
-      xpath="/VisualStudioProject/VisualBasic/Build/References/Reference[@Name='nunit.framework']/@HintPath"
-      value="..\..\..\bin\nunit.framework.dll" />
-  </target>
+  <patternset id="source-files">
+    <include name="AssemblyInfo.vb" />
+    <include name="SimpleVBTest.vb" />
+  </patternset>
 
 </project>
\ No newline at end of file
diff --git a/samples/vb/failures/vb-failures.vbproj b/samples/vb/failures/vb-failures.vbproj
index 4ce4063..4eff16b 100644
--- a/samples/vb/failures/vb-failures.vbproj
+++ b/samples/vb/failures/vb-failures.vbproj
@@ -7,7 +7,7 @@
       </Settings>
       <References>
         <Reference Name="System" AssemblyName="System" />
-        <Reference Name="nunit.framework" AssemblyName="nunit.framework, Version=2.4.4.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77" HintPath="..\..\..\bin\nunit.framework.dll" />
+        <Reference Name="nunit.framework" AssemblyName="nunit.framework, Version=2.5, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77" HintPath="..\..\..\bin\net-1.1\framework\nunit.framework.dll" />
       </References>
       <Imports>
         <Import Namespace="Microsoft.VisualBasic" />
diff --git a/samples/vb/money/Money.vb b/samples/vb/money/Money.vb
index 65bac58..13d7f6f 100644
--- a/samples/vb/money/Money.vb
+++ b/samples/vb/money/Money.vb
@@ -40,13 +40,13 @@ Namespace NUnit.Samples
             Return s.AddMoney(Me)
         End Function
 
-        Public ReadOnly Property Amount()
+        Public ReadOnly Property Amount() As Integer
             Get
                 Return fAmount
             End Get
         End Property
 
-        Public ReadOnly Property Currency()
+        Public ReadOnly Property Currency() As String
             Get
                 Return fCurrency
             End Get
diff --git a/samples/vb/money/MoneyBag.vb b/samples/vb/money/MoneyBag.vb
index c386b9d..bebb43c 100644
--- a/samples/vb/money/MoneyBag.vb
+++ b/samples/vb/money/MoneyBag.vb
@@ -106,7 +106,7 @@ Namespace NUnit.Samples
             Return False
         End Function
 
-        Private Function FindMoney(ByVal currency As String)
+        Private Function FindMoney(ByVal currency As String) As Money
             For Each m As Money In fmonies
                 If m.Currency.Equals(currency) Then
                     Return m
diff --git a/samples/vb/money/MoneyTest.vb b/samples/vb/money/MoneyTest.vb
index 0bd6cb8..4df897f 100644
--- a/samples/vb/money/MoneyTest.vb
+++ b/samples/vb/money/MoneyTest.vb
@@ -38,7 +38,7 @@ Namespace NUnit.Samples
         <Test()> _
         Public Sub BagMultiply()
             ' {[12 CHF][7 USD]} *2 == {[24 CHF][14 USD]}
-            Dim bag() = New Money() {New Money(24, "CHF"), New Money(14, "USD")}
+            Dim bag() As Money = New Money() {New Money(24, "CHF"), New Money(14, "USD")}
             Dim expected As New MoneyBag(bag)
             Assert.AreEqual(expected, fMB1.Multiply(2))
             Assert.AreEqual(fMB1, fMB1.Multiply(1))
@@ -48,7 +48,7 @@ Namespace NUnit.Samples
         <Test()> _
         Public Sub BagNegate()
             ' {[12 CHF][7 USD]} negate == {[-12 CHF][-7 USD]}
-            Dim bag() = New Money() {New Money(-12, "CHF"), New Money(-7, "USD")}
+            Dim bag() As Money = New Money() {New Money(-12, "CHF"), New Money(-7, "USD")}
             Dim expected As New MoneyBag(bag)
             Assert.AreEqual(expected, fMB1.Negate())
         End Sub
@@ -66,7 +66,7 @@ Namespace NUnit.Samples
         <Test()> _
         Public Sub BagSubtract()
             ' {[12 CHF][7 USD]} - {[14 CHF][21 USD] == {[-2 CHF][-14 USD]}
-            Dim bag() = New Money() {New Money(-2, "CHF"), New Money(-14, "USD")}
+            Dim bag() As Money = New Money() {New Money(-2, "CHF"), New Money(-14, "USD")}
             Dim expected As New MoneyBag(bag)
             Assert.AreEqual(expected, fMB1.Subtract(fMB2))
         End Sub
@@ -74,7 +74,7 @@ Namespace NUnit.Samples
         <Test()> _
         Public Sub BagSumAdd()
             ' {[12 CHF][7 USD]} + {[14 CHF][21 USD]} == {[26 CHF][28 USD]}
-            Dim bag() = New Money() {New Money(26, "CHF"), New Money(28, "USD")}
+            Dim bag() As Money = New Money() {New Money(26, "CHF"), New Money(28, "USD")}
             Dim expected As New MoneyBag(bag)
             Assert.AreEqual(expected, fMB1.Add(fMB2))
         End Sub
@@ -83,14 +83,14 @@ Namespace NUnit.Samples
         Public Sub IsZero()
             Assert.IsTrue(fMB1.Subtract(fMB1).IsZero)
 
-            Dim bag() = New Money() {New Money(0, "CHF"), New Money(0, "USD")}
+            Dim bag() As Money = New Money() {New Money(0, "CHF"), New Money(0, "USD")}
             Assert.IsTrue(New MoneyBag(bag).IsZero)
         End Sub
 
         <Test()> _
         Public Sub MixedSimpleAdd()
             ' [12 CHF] + [7 USD] == {[12 CHF][7 USD]}
-            Dim bag() = New Money() {f12CHF, f7USD}
+            Dim bag() As Money = New Money() {f12CHF, f7USD}
             Dim expected As New MoneyBag(bag)
             Assert.AreEqual(expected, f12CHF.Add(f7USD))
         End Sub
@@ -103,7 +103,7 @@ Namespace NUnit.Samples
             Assert.IsFalse(fMB1.Equals(Nothing))
 
             Assert.IsTrue(fMB1.Equals(fMB1))
-            Dim equal = New MoneyBag(New Money(12, "CHF"), New Money(7, "USD"))
+            Dim equal As MoneyBag = New MoneyBag(New Money(12, "CHF"), New Money(7, "USD"))
             Assert.IsTrue(fMB1.Equals(equal))
             Assert.IsFalse(fMB1.Equals(f12CHF))
             Assert.IsFalse(f12CHF.Equals(fMB1))
@@ -112,7 +112,7 @@ Namespace NUnit.Samples
 
         <Test()> _
         Public Sub MoneyBagHash()
-            Dim equal = New MoneyBag(New Money(12, "CHF"), New Money(7, "USD"))
+            Dim equal As MoneyBag = New MoneyBag(New Money(12, "CHF"), New Money(7, "USD"))
             Assert.AreEqual(fMB1.GetHashCode(), equal.GetHashCode())
         End Sub
 
@@ -122,7 +122,7 @@ Namespace NUnit.Samples
             ' objects are equal. But here we are testing the MoneyBag.Equals()
             ' method itself, so using AreEqual would not serve the purpose.
             Assert.IsFalse(f12CHF.Equals(Nothing))
-            Dim equalMoney = New Money(12, "CHF")
+            Dim equalMoney As Money = New Money(12, "CHF")
             Assert.IsTrue(f12CHF.Equals(f12CHF))
             Assert.IsTrue(f12CHF.Equals(equalMoney))
             Assert.IsFalse(f12CHF.Equals(f14CHF))
@@ -131,15 +131,15 @@ Namespace NUnit.Samples
         <Test()> _
         Public Sub MoneyHash()
             Assert.IsFalse(f12CHF.Equals(Nothing))
-            Dim equal = New Money(12, "CHF")
+            Dim equal As Money = New Money(12, "CHF")
             Assert.AreEqual(f12CHF.GetHashCode(), equal.GetHashCode())
         End Sub
 
         <Test()> _
         Public Sub Normalize()
-            Dim bag() = New Money() {New Money(26, "CHF"), New Money(28, "CHF"), New Money(6, "CHF")}
+            Dim bag() As Money = New Money() {New Money(26, "CHF"), New Money(28, "CHF"), New Money(6, "CHF")}
             Dim moneyBag As New MoneyBag(bag)
-            Dim expected() = New Money() {New Money(60, "CHF")}
+            Dim expected() As Money = New Money() {New Money(60, "CHF")}
             '	// note: expected is still a MoneyBag
             Dim expectedBag As New MoneyBag(expected)
             Assert.AreEqual(expectedBag, moneyBag)
@@ -148,14 +148,14 @@ Namespace NUnit.Samples
         <Test()> _
         Public Sub Normalize2()
             ' {[12 CHF][7 USD]} - [12 CHF] == [7 USD]
-            Dim expected = New Money(7, "USD")
+            Dim expected As Money = New Money(7, "USD")
             Assert.AreEqual(expected, fMB1.Subtract(f12CHF))
         End Sub
 
         <Test()> _
         Public Sub Normalize3()
             ' {[12 CHF][7 USD]} - {[12 CHF][3 USD]} == [4 USD]
-            Dim s1() = New Money() {New Money(12, "CHF"), New Money(3, "USD")}
+            Dim s1() As Money = New Money() {New Money(12, "CHF"), New Money(3, "USD")}
             Dim ms1 As New MoneyBag(s1)
             Dim expected As New Money(4, "USD")
             Assert.AreEqual(expected, fMB1.Subtract(ms1))
@@ -164,7 +164,7 @@ Namespace NUnit.Samples
         <Test()> _
         Public Sub Normalize4()
             ' [12 CHF] - {[12 CHF][3 USD]} == [-3 USD]
-            Dim s1() = New Money() {New Money(12, "CHF"), New Money(3, "USD")}
+            Dim s1() As Money = New Money() {New Money(12, "CHF"), New Money(3, "USD")}
             Dim ms1 As New MoneyBag(s1)
             Dim expected As New Money(-3, "USD")
             Assert.AreEqual(expected, f12CHF.Subtract(ms1))
@@ -179,7 +179,7 @@ Namespace NUnit.Samples
         Public Sub SimpleAdd()
 
             ' [12 CHF] + [14 CHF] == [26 CHF]
-            Dim expected = New Money(26, "CHF")
+            Dim expected As Money = New Money(26, "CHF")
             Assert.AreEqual(expected, f12CHF.Add(f14CHF))
 
         End Sub
diff --git a/samples/vb/money/vb-money.build b/samples/vb/money/vb-money.build
index a52bc88..d6cc609 100644
--- a/samples/vb/money/vb-money.build
+++ b/samples/vb/money/vb-money.build
@@ -1,53 +1,14 @@
 <?xml version="1.0"?>
-<project name="VBMoney" default="build">
+<project name="vb-money" default="build">
 
-  <property name="output.dir" value="../../bin" />
-  <property name="output.dll" value="../../bin/vb-money.dll" />
+  <include buildfile="../../samples.common" />
 
-  <target name="clean">
-    <delete file="${output.dll}" />
-  </target>
-
-  <target name="build">
-
-    <mkdir dir="${output.dir}" unless="${directory::exists(output.dir)}" />
-    <copy file="../../../bin/nunit.framework.dll" todir="${output.dir}" 
-      if="${file::exists('../../../bin/nunit.framework.dll')}" />
-
-    <vbc target="library" 
-        output="${output.dll}">
-      <imports>
-        <import namespace="System"/>
-        <import namespace="System.Collections"/>
-      </imports>
-      <sources>
-        <include name="*.vb"/>
-      </sources>
-      <references basedir="${output.dir}">
-        <include name="nunit.framework.dll" />
-      </references>
-    </vbc>
-  </target>
-
-  <target name="rebuild" depends="clean,build" />
-
-  <target name="package">
-    <copy todir="${package.samples.dir}/vb/money">
-      <fileset basedir=".">
-        <include name="vb-money.vbproj" />
-        <include name="vb-money.build" />
-        <include name="AssemblyInfo.vb" />
-        <include name="IMoney.vb" />
-        <include name="Money.vb" />
-        <include name="MoneyBag.vb" />
-        <include name="MoneyTest.vb" />
-      </fileset>
-    </copy>
-
-    <xmlpoke 
-      file="${package.samples.dir}/vb/money/vb-money.vbproj"
-      xpath="/VisualStudioProject/VisualBasic/Build/References/Reference[@Name='nunit.framework']/@HintPath"
-      value="..\..\..\bin\nunit.framework.dll" />
-  </target>
+  <patternset id="source-files">
+    <include name="AssemblyInfo.vb" />
+    <include name="IMoney.vb" />
+    <include name="Money.vb" />
+    <include name="MoneyBag.vb" />
+    <include name="MoneyTest.vb" />
+  </patternset>
 
 </project>
\ No newline at end of file
diff --git a/samples/vb/money/vb-money.vbproj b/samples/vb/money/vb-money.vbproj
index 6f4c68b..b98e920 100644
--- a/samples/vb/money/vb-money.vbproj
+++ b/samples/vb/money/vb-money.vbproj
@@ -7,7 +7,7 @@
       </Settings>
       <References>
         <Reference Name="System" AssemblyName="System" />
-        <Reference Name="nunit.framework" AssemblyName="nunit.framework, Version=2.4.4.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77" HintPath="..\..\..\bin\nunit.framework.dll" />
+        <Reference Name="nunit.framework" AssemblyName="nunit.framework, Version=2.5, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77" HintPath="..\..\..\bin\net-1.1\framework\nunit.framework.dll" />
       </References>
       <Imports>
         <Import Namespace="Microsoft.VisualBasic" />
diff --git a/samples/vb/syntax/AssertSyntaxTests.vb b/samples/vb/syntax/AssertSyntaxTests.vb
index de51ae4..dbb5246 100644
--- a/samples/vb/syntax/AssertSyntaxTests.vb
+++ b/samples/vb/syntax/AssertSyntaxTests.vb
@@ -9,8 +9,7 @@ Option Explicit On
 Imports System
 Imports NUnit.Framework
 Imports NUnit.Framework.Constraints
-Imports NUnit.Framework.SyntaxHelpers
-Imports Text = NUnit.Framework.SyntaxHelpers.Text
+Imports Text = NUnit.Framework.Text
 
 Namespace NUnit.Samples
 
@@ -33,14 +32,16 @@ Namespace NUnit.Samples
 #Region "Simple Constraint Tests"
         <Test()> _
         Public Sub IsNull()
+            Dim nada As Object = Nothing
+
             ' Classic syntax
-            Assert.IsNull(Nothing)
+            Assert.IsNull(nada)
 
             ' Helper syntax
-            Assert.That(Nothing, Iz.Null)
+            Assert.That(nada, Iz.Null)
 
             ' Inherited syntax
-            Expect(Nothing, Null)
+            Expect(nada, Null)
         End Sub
 
 
@@ -156,16 +157,16 @@ Namespace NUnit.Samples
         <Test()> _
         Public Sub InstanceOfTypeTests()
             ' Classic syntax
-            Assert.IsInstanceOfType(GetType(String), "Hello")
-            Assert.IsNotInstanceOfType(GetType(String), 5)
+            Assert.IsInstanceOf(GetType(String), "Hello")
+            Assert.IsNotInstanceOf(GetType(String), 5)
 
             ' Helper syntax
-            Assert.That("Hello", Iz.InstanceOfType(GetType(String)))
-            Assert.That(5, Iz.Not.InstanceOfType(GetType(String)))
+            Assert.That("Hello", Iz.InstanceOf(GetType(String)))
+            Assert.That(5, Iz.Not.InstanceOf(GetType(String)))
 
             ' Inherited syntax
-            Expect("Hello", InstanceOfType(GetType(String)))
-            Expect(5, Iz.Not.InstanceOfType(GetType(String)))
+            Expect("Hello", InstanceOf(GetType(String)))
+            Expect(5, Iz.Not.InstanceOf(GetType(String)))
         End Sub
 
         <Test()> _
@@ -469,7 +470,7 @@ Namespace NUnit.Samples
             Assert.That(strings, Text.All.Contains("a"))
             Assert.That(strings, Has.All.Contains("a"))
             Assert.That(strings, Has.Some.StartsWith("ba"))
-            Assert.That(strings, Has.Some.Property("Length", 3))
+            Assert.That(strings, Has.Some.Property("Length").EqualTo(3))
             Assert.That(strings, Has.Some.StartsWith("BA").IgnoreCase)
             Assert.That(doubles, Has.Some.EqualTo(1.0).Within(0.05))
 
@@ -544,15 +545,15 @@ Namespace NUnit.Samples
             CollectionAssert.Contains(iarray, 3)
             CollectionAssert.Contains(sarray, "b")
             CollectionAssert.DoesNotContain(sarray, "x")
-            ' Showing that Contains uses object equality
-            CollectionAssert.DoesNotContain(iarray, 1.0R)
+            ' Showing that Contains uses NUnit equality
+            CollectionAssert.Contains(iarray, 1.0R)
 
             ' Helper syntax
             Assert.That(iarray, Has.Member(3))
             Assert.That(sarray, Has.Member("b"))
             Assert.That(sarray, Has.No.Member("x"))
-            ' Showing that Contains uses object equality
-            Assert.That(iarray, Has.No.Member(1.0R))
+            ' Showing that Contains uses NUnit equality
+            Assert.That(iarray, Has.Member(1.0R))
 
             ' Only available using the new syntax
             ' Note that EqualTo and SameAs do NOT give
@@ -564,7 +565,7 @@ Namespace NUnit.Samples
             Assert.That(sarray, Has.None.EqualTo("x"))
             Assert.That(iarray, Has.None.SameAs(1.0R))
             Assert.That(iarray, Has.All.LessThan(10))
-            Assert.That(sarray, Has.All.Length(1))
+            Assert.That(sarray, Has.All.Length.EqualTo(1))
             Assert.That(sarray, Has.None.Property("Length").GreaterThan(3))
 
             ' Inherited syntax
@@ -580,7 +581,7 @@ Namespace NUnit.Samples
             Expect(sarray, Some.EqualTo("b"))
             Expect(sarray, None.EqualTo("x"))
             Expect(iarray, All.LessThan(10))
-            Expect(sarray, All.Length(1))
+            Expect(sarray, All.Length.EqualTo(1))
             Expect(sarray, None.Property("Length").GreaterThan(3))
         End Sub
 
@@ -646,31 +647,30 @@ Namespace NUnit.Samples
             ' Assert.That(list, Has.Property("Count"))
             ' Assert.That(list, Has.No.Property("Length"))
 
-            Assert.That("Hello", Has.Property("Length", 5))
-            Assert.That("Hello", Has.Length(5))
+            Assert.That("Hello", Has.Length.EqualTo(5))
             Assert.That("Hello", Has.Property("Length").EqualTo(5))
             Assert.That("Hello", Has.Property("Length").GreaterThan(3))
 
-            Assert.That(array, Has.Property("Length", 4))
-            Assert.That(array, Has.Length(4))
+            Assert.That(array, Has.Property("Length").EqualTo(4))
+            Assert.That(array, Has.Length.EqualTo(4))
             Assert.That(array, Has.Property("Length").LessThan(10))
 
-            Assert.That(array, Has.All.Property("Length", 3))
-            Assert.That(array, Has.All.Length(3))
-            Assert.That(array, Iz.All.Length(3))
+            Assert.That(array, Has.All.Property("Length").EqualTo(3))
+            Assert.That(array, Has.All.Length.EqualTo(3))
+            Assert.That(array, Iz.All.Length.EqualTo(3))
             Assert.That(array, Has.All.Property("Length").EqualTo(3))
             Assert.That(array, Iz.All.Property("Length").EqualTo(3))
 
-            Assert.That(array2, Iz.Not.Property("Length", 4))
-            Assert.That(array2, Iz.Not.Length(4))
+            Assert.That(array2, Iz.Not.Property("Length").EqualTo(4))
+            Assert.That(array2, Iz.Not.Length.EqualTo(4))
             Assert.That(array2, Has.No.Property("Length").GreaterThan(3))
 
             ' Inherited syntax
             ' Expect(list, Has.Property("Count"))
             ' Expect(list, Has.No.Property("Nada"))
 
-            Expect(array, All.Property("Length", 3))
-            Expect(array, All.Length(3))
+            Expect(array, All.Property("Length").EqualTo(3))
+            Expect(array, All.Length.EqualTo(3))
         End Sub
 #End Region
 
diff --git a/samples/vb/syntax/vb-syntax.build b/samples/vb/syntax/vb-syntax.build
index f8cd8a2..0d253cf 100644
--- a/samples/vb/syntax/vb-syntax.build
+++ b/samples/vb/syntax/vb-syntax.build
@@ -1,48 +1,11 @@
 <?xml version="1.0"?>
-<project name="VBSyntax" default="build">
-
-  <property name="output.dir" value="../../bin" />
-  <property name="output.dll" value="../../bin/vb-syntax.dll" />
-
-  <target name="clean">
-    <delete file="${output.dll}" />
-  </target>
-
-  <target name="build">
-    <mkdir dir="${output.dir}" unless="${directory::exists(output.dir)}" />
-    <copy file="../../../bin/nunit.framework.dll" todir="${output.dir}" 
-      if="${file::exists('../../../bin/nunit.framework.dll')}" />
-
-    <vbc target="library" output="${output.dll}">
-      <imports>
-        <import namespace="System"/>
-        <import namespace="System.Collections"/>
-      </imports>
-      <sources>
-        <include name="*.vb"/>
-      </sources>
-      <references basedir="${output.dir}">
-        <include name="nunit.framework.dll" />
-      </references>
-    </vbc>
-  </target>
-
-  <target name="rebuild" depends="clean,build" />
-
-  <target name="package">
-    <copy todir="${package.samples.dir}/vb/syntax" includeemptydirs="false">
-      <fileset basedir=".">
-        <include name="vb-syntax.vbproj" />
-        <include name="vb-syntax.build" />
-        <include name="AssemblyInfo.vb" />
-        <include name="AssertSyntaxTests.vb" />
-      </fileset>
-    </copy>
-
-    <xmlpoke 
-      file="${package.samples.dir}/vb/syntax/vb-syntax.vbproj"
-      xpath="/VisualStudioProject/VisualBasic/Build/References/Reference[@Name='nunit.framework']/@HintPath"
-      value="..\..\..\bin\nunit.framework.dll" />
-  </target>
+<project name="vb-syntax" default="build">
+
+  <include buildfile="../../samples.common" />
+  
+  <patternset id="source-files">
+    <include name="AssemblyInfo.vb" />
+    <include name="AssertSyntaxTests.vb" />
+  </patternset>
 
 </project>
\ No newline at end of file
diff --git a/samples/vb/syntax/vb-syntax.vbproj b/samples/vb/syntax/vb-syntax.vbproj
index 81d8abb..5dac155 100644
--- a/samples/vb/syntax/vb-syntax.vbproj
+++ b/samples/vb/syntax/vb-syntax.vbproj
@@ -9,7 +9,7 @@
         <Reference Name="System" AssemblyName="System" />
         <Reference Name="System.Data" AssemblyName="System.Data" />
         <Reference Name="System.XML" AssemblyName="System.Xml" />
-        <Reference Name="nunit.framework" AssemblyName="nunit.framework, Version=2.4.4.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77" HintPath="..\..\..\bin\nunit.framework.dll" />
+        <Reference Name="nunit.framework" AssemblyName="nunit.framework, Version=2.5, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77" HintPath="..\..\..\bin\net-1.1\framework\nunit.framework.dll" />
       </References>
       <Imports>
         <Import Namespace="Microsoft.VisualBasic" />
diff --git a/src/ClientUtilities/tests/AssemblyListTests.cs b/src/ClientUtilities/tests/AssemblyListTests.cs
index 3ee27cf..abda24d 100644
--- a/src/ClientUtilities/tests/AssemblyListTests.cs
+++ b/src/ClientUtilities/tests/AssemblyListTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
diff --git a/src/ClientUtilities/tests/CategoryManagerTest.cs b/src/ClientUtilities/tests/CategoryManagerTest.cs
index 121cdd4..2a03498 100644
--- a/src/ClientUtilities/tests/CategoryManagerTest.cs
+++ b/src/ClientUtilities/tests/CategoryManagerTest.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -16,6 +16,7 @@ namespace NUnit.Util.Tests
 	public class CategoryManagerTest
 	{
 		private CategoryManager categoryManager;
+        string mockDll = MockAssembly.AssemblyPath;
 
 		[SetUp]
 		public void CreateCategoryManager()
@@ -59,9 +60,9 @@ namespace NUnit.Util.Tests
 		public void CanAddTestCategories()
 		{
 			TestSuiteBuilder builder = new TestSuiteBuilder();
-			Test suite = builder.Build( new TestPackage( "mock-assembly.dll" ) );
+			Test suite = builder.Build( new TestPackage( mockDll ) );
 			
-			Test test = TestFinder.Find( "MockTest3", suite );
+			Test test = TestFinder.Find( "MockTest3", suite, true );
 			categoryManager.AddCategories( test );
 			Assert.AreEqual( 2, categoryManager.Categories.Count );
 		}
@@ -70,7 +71,7 @@ namespace NUnit.Util.Tests
 		public void CanAddAllAvailableCategoriesInTestTree()
 		{
 			TestSuiteBuilder builder = new TestSuiteBuilder();
-			Test suite = builder.Build( new TestPackage( "mock-assembly.dll" ) );
+			Test suite = builder.Build( new TestPackage( mockDll ) );
 			
 			categoryManager.AddAllCategories( suite );
 			Assert.AreEqual( MockAssembly.Categories, categoryManager.Categories.Count );
diff --git a/src/ClientUtilities/tests/CategoryParseTests.cs b/src/ClientUtilities/tests/CategoryParseTests.cs
index ad01e08..3848b98 100644
--- a/src/ClientUtilities/tests/CategoryParseTests.cs
+++ b/src/ClientUtilities/tests/CategoryParseTests.cs
@@ -1,6 +1,11 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
 using System;
 using NUnit.Framework;
-using NUnit.Framework.SyntaxHelpers;
 using NUnit.Core;
 using NUnit.Core.Filters;
 
diff --git a/src/ClientUtilities/tests/DomainManagerTests.cs b/src/ClientUtilities/tests/DomainManagerTests.cs
new file mode 100644
index 0000000..d20c1e4
--- /dev/null
+++ b/src/ClientUtilities/tests/DomainManagerTests.cs
@@ -0,0 +1,91 @@
+using System;
+using System.Collections;
+using System.IO;
+using NUnit.Framework;
+
+namespace NUnit.Util.Tests
+{
+    public class DomainManagerTests
+    {
+        static string path1 = TestPath("/test/bin/debug/test1.dll");
+        static string path2 = TestPath("/test/bin/debug/test2.dll");
+        static string path3 = TestPath("/test/utils/test3.dll");
+
+        [Test]
+        public void GetPrivateBinPath()
+        {
+            string[] assemblies = new string[] { path1, path2, path3 };
+
+            Assert.AreEqual(
+                TestPath("bin/debug") + Path.PathSeparator + TestPath("utils"),
+                DomainManager.GetPrivateBinPath(TestPath("/test"), assemblies));
+        }
+
+        [Test]
+        public void GetCommonAppBase_OneElement()
+        {
+            string[] assemblies = new string[] { path1 };
+
+            Assert.AreEqual(
+                TestPath("/test/bin/debug"),
+                DomainManager.GetCommonAppBase(assemblies));
+        }
+
+        [Test]
+        public void GetCommonAppBase_TwoElements_SameDirectory()
+        {
+            string[] assemblies = new string[] { path1, path2 };
+
+            Assert.AreEqual(
+                TestPath("/test/bin/debug"),
+                DomainManager.GetCommonAppBase(assemblies));
+        }
+
+        [Test]
+        public void GetCommonAppBase_TwoElements_DifferentDirectories()
+        {
+            string[] assemblies = new string[] { path1, path3 };
+
+            Assert.AreEqual(
+                TestPath("/test"),
+                DomainManager.GetCommonAppBase(assemblies));
+        }
+
+        [Test]
+        public void GetCommonAppBase_ThreeElements_DiferentDirectories()
+        {
+            string[] assemblies = new string[] { path1, path2, path3 };
+
+            Assert.AreEqual(
+                TestPath("/test"),
+                DomainManager.GetCommonAppBase(assemblies));
+        }
+
+        [Test]
+        public void UnloadUnloadedDomain()
+        {
+            AppDomain domain = AppDomain.CreateDomain("DomainManagerTests-domain");
+            AppDomain.Unload(domain);
+
+            DomainManager manager = new DomainManager();
+            manager.Unload(domain);
+        }
+
+        /// <summary>
+        /// Take a valid Linux path and make a valid windows path out of it
+        /// if we are on Windows. Change slashes to backslashes and, if the
+        /// path starts with a slash, add C: in front of it.
+        /// </summary>
+        private static string TestPath(string path)
+        {
+            if (Path.DirectorySeparatorChar != '/')
+            {
+                path = path.Replace('/', Path.DirectorySeparatorChar);
+                if (path[0] == Path.DirectorySeparatorChar)
+                    path = "C:" + path;
+            }
+
+            return path;
+        }
+    }
+}
diff --git a/src/ClientUtilities/tests/EventDispatcherTests.cs b/src/ClientUtilities/tests/EventDispatcherTests.cs
index aeabe70..791a94d 100644
--- a/src/ClientUtilities/tests/EventDispatcherTests.cs
+++ b/src/ClientUtilities/tests/EventDispatcherTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -23,7 +23,6 @@ namespace NUnit.Util.Tests
 		private readonly string FILENAME = "MyTestFileName";
 		private readonly string TESTNAME = "MyTestName";
 		private readonly string MESSAGE = "My message!";
-		private readonly string RSLTNAME = "MyResult";
 
 		[SetUp]
 		public void SetUp()
@@ -31,7 +30,7 @@ namespace NUnit.Util.Tests
 			dispatcher = new TestEventDispatcher();
 			catcher = new TestEventCatcher( dispatcher );
 			test = new TestInfo( new TestSuite( TESTNAME ) );
-			result = new TestSuiteResult( test, RSLTNAME );
+			result = new TestResult( test );
 			exception = new Exception( MESSAGE );
 		}
 
@@ -228,7 +227,7 @@ namespace NUnit.Util.Tests
 		private void CheckEvent( TestAction action, TestResult result )
 		{
 			CheckEvent( action );
-			Assert.AreEqual( RSLTNAME, result.Name );
+			Assert.AreEqual( TESTNAME, result.Name );
 		}
 
 		private void CheckEvent( TestAction action, Exception exception )
diff --git a/src/ClientUtilities/tests/FileWatcherTest.cs b/src/ClientUtilities/tests/FileWatcherTest.cs
index e61634a..ed5f82b 100644
--- a/src/ClientUtilities/tests/FileWatcherTest.cs
+++ b/src/ClientUtilities/tests/FileWatcherTest.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -14,25 +14,29 @@ namespace NUnit.Util.Tests
 {
 	[TestFixture]
 	[Platform( Exclude = "Win95,Win98,WinMe" )]
-	[Platform( Exclude = "Mono", Reason = "NYI on Mono under Windows" )]
 	public class FileWatcherTest
 	{
 		private AssemblyWatcher watcher;
 		private CounterEventHandler handler;
 		private static int watcherDelayMs = 100;
-		private static readonly String fileName = "temp.txt";
-		private static readonly String tempFileName = "newTempFile.txt";
+		private string fileName;
+		private string tempFileName;
 
 		[SetUp]
 		public void CreateFile()
 		{
+            string tempDir = Path.GetTempPath();
+            fileName = Path.Combine(tempDir, "temp.txt");
+            tempFileName = Path.Combine(tempDir, "newTempFile.txt");
+
 			StreamWriter writer = new StreamWriter( fileName );
 			writer.Write( "Hello" );
 			writer.Close();
 
 			handler = new CounterEventHandler();
-			watcher = new AssemblyWatcher(watcherDelayMs, fileName);
-			watcher.AssemblyChangedEvent += new AssemblyWatcher.AssemblyChangedHandler( handler.OnChanged );
+			watcher = new AssemblyWatcher();
+			watcher.Setup(watcherDelayMs, fileName);
+			watcher.AssemblyChanged += new AssemblyChangedHandler( handler.OnChanged );
 			watcher.Start();
 		}
 
@@ -48,7 +52,9 @@ namespace NUnit.Util.Tests
 		}
 
 		[Test]
-		public void MultipleCloselySpacedChangesTriggerWatcherOnlyOnce()
+        // TODO: Exclusion should really only apply to Mono on Windows
+        [Platform(Exclude = "Mono")]
+        public void MultipleCloselySpacedChangesTriggerWatcherOnlyOnce()
 		{
 			for(int i=0; i<3; i++)
 			{
@@ -63,7 +69,9 @@ namespace NUnit.Util.Tests
 		}
 
 		[Test]
-		public void ChangingFileTriggersWatcher()
+        // TODO: Exclusion should really only apply to Mono on Windows
+        [Platform(Exclude = "Mono")]
+        public void ChangingFileTriggersWatcher()
 		{
 			StreamWriter writer = new StreamWriter( fileName );
 			writer.Write( "Goodbye" );
@@ -75,6 +83,7 @@ namespace NUnit.Util.Tests
 		}
 
 		[Test]
+		[Platform( Exclude = "Linux", Reason = "Attribute change triggers watcher" )]	
 		public void ChangingAttributesDoesNotTriggerWatcher()
 		{
 			FileInfo fi = new FileInfo(fileName);
diff --git a/src/ClientUtilities/tests/MemorySettingsStorageTests.cs b/src/ClientUtilities/tests/MemorySettingsStorageTests.cs
index be60ba6..6ad0b16 100644
--- a/src/ClientUtilities/tests/MemorySettingsStorageTests.cs
+++ b/src/ClientUtilities/tests/MemorySettingsStorageTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/ClientUtilities/tests/MockAssemblyWatcher.cs b/src/ClientUtilities/tests/MockAssemblyWatcher.cs
index 288ee71..2619186 100644
--- a/src/ClientUtilities/tests/MockAssemblyWatcher.cs
+++ b/src/ClientUtilities/tests/MockAssemblyWatcher.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -21,9 +21,6 @@ namespace NUnit.Util.Tests
 		private DateTime triggerTime;
 		private DateTime publishTime;
 
-		public MockAssemblyWatcher( int delay, string assemblyFileName )
-			: base( delay, assemblyFileName ) { }
-		
 		public bool EventPublished
 		{
 			get { return eventPublished; }
diff --git a/src/ClientUtilities/tests/NUnitProjectFileTests.cs b/src/ClientUtilities/tests/NUnitProjectFileTests.cs
deleted file mode 100644
index 446780e..0000000
--- a/src/ClientUtilities/tests/NUnitProjectFileTests.cs
+++ /dev/null
@@ -1,87 +0,0 @@
-using System;
-using System.IO;
-using System.Xml.Serialization;
-using NUnit.Framework;
-
-namespace NUnit.Util.Tests
-{
-	/// <summary>
-	/// Summary description for NUnitProjectFileTests.
-	/// </summary>
-	[TestFixture]
-	public class NUnitProjectFileTests
-	{
-		[Test]
-		public void SerializeProject()
-		{
-			NUnitProjectFile project = new NUnitProjectFile();
-
-			XmlSerializer serializer = new XmlSerializer( typeof( NUnitProjectFile ) );
-			StringWriter writer = new StringWriter();
-			serializer.Serialize( writer, project );
-			Console.WriteLine( writer );
-		}
-	}
-
-	[Serializable]
-	public class NUnitProjectFile
-	{
-		public struct ProjectSettings
-		{
-			[XmlAttribute]
-			public string appbase;
-
-			[XmlAttribute]
-			public string activeConfig;
-
-			public ProjectSettings( string appbase, string activeConfig )
-			{
-				this.appbase = appbase;
-				this.activeConfig = activeConfig;
-			}
-		}
-
-		public struct ProjectConfig
-		{
-			[XmlAttribute]
-			public string name;
-
-			[XmlAttribute]
-			public string appbase;
-
-			[XmlAttribute]
-			public string configfile;
-
-			[XmlAttribute]
-			public string binpath;
-
-			[XmlAttribute]
-			public string binpathtype;
-
-			[XmlElement]
-			public AssemblyItem[] assembly;
-		}
-
-		public ProjectSettings Settings = new ProjectSettings( null, "Release" );
-
-		[XmlElement("Config")]
-		public ProjectConfig[] Configs;
-
-		public NUnitProjectFile()
-		{
-			Configs = new ProjectConfig[2];
-
-			Configs[0].name = "Debug";
-			Configs[0].binpathtype = "Auto";
-			Configs[0].assembly = new AssemblyItem[2];
-			Configs[0].assembly[0].path = @"NUnitFramework\tests\bin\Debug\nunit.framework.tests.dll";
-			Configs[0].assembly[1].path = @"NUnitCore\tests\bin\Debug\nunit.core.tests.dll";
-
-			Configs[1].name = "Release";
-			Configs[1].binpathtype = "Auto";
-			Configs[1].assembly = new AssemblyItem[2];
-			Configs[1].assembly[0].path = @"NUnitFramework\tests\bin\Release\nunit.framework.tests.dll";
-			Configs[1].assembly[1].path = @"NUnitCore\tests\bin\Release\nunit.core.tests.dll";
-		}
-	}
-}
diff --git a/src/ClientUtilities/tests/NUnitProjectLoad.cs b/src/ClientUtilities/tests/NUnitProjectLoad.cs
index e8c1ca1..e5af34a 100644
--- a/src/ClientUtilities/tests/NUnitProjectLoad.cs
+++ b/src/ClientUtilities/tests/NUnitProjectLoad.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System.IO;
@@ -16,14 +16,16 @@ namespace NUnit.Util.Tests
 	public class NUnitProjectLoad
 	{
 		static readonly string xmlfile = "test.nunit";
-		static readonly string resourceDir = "resources";
+        static readonly string mockDll = NUnit.Tests.Assemblies.MockAssembly.AssemblyPath;
 
+		private ProjectService projectService;
 		private NUnitProject project;
 
 		[SetUp]
 		public void SetUp()
 		{
-			project = NUnitProject.EmptyProject();
+			projectService = new ProjectService();
+			project = projectService.EmptyProject();
 		}
 
 		[TearDown]
@@ -89,9 +91,9 @@ namespace NUnit.Util.Tests
 		[Test]
 		public void FromAssembly()
 		{
-			NUnitProject project = NUnitProject.FromAssembly( "nunit.util.tests.dll" );
+			NUnitProject project = projectService.WrapAssembly(mockDll);
 			Assert.AreEqual( "Default", project.ActiveConfigName );
-			Assert.AreEqual( Path.GetFullPath( "nunit.util.tests.dll" ), project.ActiveConfig.Assemblies[0] );
+			Assert.AreEqual( mockDll, project.ActiveConfig.Assemblies[0] );
 			Assert.IsTrue( project.IsLoadable, "Not loadable" );
 			Assert.IsTrue( project.IsAssemblyWrapper, "Not wrapper" );
 			Assert.IsFalse( project.IsDirty, "Not dirty" );
@@ -100,135 +102,10 @@ namespace NUnit.Util.Tests
 		[Test]
 		public void SaveClearsAssemblyWrapper()
 		{
-			NUnitProject project = NUnitProject.FromAssembly( "nunit.util.tests.dll" );
+			NUnitProject project = projectService.WrapAssembly(mockDll);
 			project.Save( xmlfile );
 			Assert.IsFalse( project.IsAssemblyWrapper,
 				"Changed project should no longer be wrapper");
 		}
-
-		private void AssertCanLoadVsProject( string resourceName )
-		{
-			string fileName = Path.GetFileNameWithoutExtension( resourceName );
-			using( TempResourceFile file = new TempResourceFile( this.GetType(), resourceDir + "." + resourceName, resourceName ) )
-			{
-				NUnitProject project = NUnitProject.FromVSProject( file.Path );
-				Assert.AreEqual( fileName, project.Name );
-				Assert.AreEqual( project.Configs[0].Name, project.ActiveConfigName );
-				Assert.AreEqual( fileName.ToLower(), Path.GetFileNameWithoutExtension( project.Configs[0].Assemblies[0].ToLower() ) );
-				Assert.IsTrue( project.IsLoadable, "Not loadable" );
-				Assert.IsFalse( project.IsDirty, "Project should not be dirty" );
-			}
-		}
-
-		[Test]
-		public void FromCSharpProject()
-		{
-			AssertCanLoadVsProject( "csharp-sample.csproj" );
-		}
-
-		[Test]
-		public void FromVBProject()
-		{
-			AssertCanLoadVsProject( "vb-sample.vbproj" );
-		}
-
-		[Test]
-		public void FromJsharpProject()
-		{
-			AssertCanLoadVsProject( "jsharp.vjsproj" );
-		}
-
-		[Test]
-		public void FromCppProject()
-		{
-			AssertCanLoadVsProject( "cpp-sample.vcproj" );
-		}
-
-		[Test]
-		public void FromProjectWithHebrewFileIncluded()
-		{
-			AssertCanLoadVsProject( "HebrewFileProblem.csproj" );
-		}
-
-		[Test]
-		public void FromVSSolution2003()
-		{
-			using(new TempResourceFile(this.GetType(), "resources.csharp-sample.csproj", @"csharp\csharp-sample.csproj"))
-			using(new TempResourceFile(this.GetType(), "resources.jsharp.vjsproj", @"jsharp\jsharp.vjsproj"))
-			using(new TempResourceFile(this.GetType(), "resources.vb-sample.vbproj", @"vb\vb-sample.vbproj"))
-			using(new TempResourceFile(this.GetType(), "resources.cpp-sample.vcproj", @"cpp-sample\cpp-sample.vcproj"))
-			using(TempResourceFile file = new TempResourceFile(this.GetType(), "resources.samples.sln", "samples.sln" ))
-			{
-				NUnitProject project = NUnitProject.FromVSSolution( file.Path );
-				Assert.AreEqual( 4, project.Configs.Count );
-				Assert.AreEqual( 3, project.Configs["Debug"].Assemblies.Count );
-				Assert.AreEqual( 3, project.Configs["Release"].Assemblies.Count );
-				Assert.AreEqual( 1, project.Configs["Debug|Win32"].Assemblies.Count );
-				Assert.AreEqual( 1, project.Configs["Release|Win32"].Assemblies.Count );
-				Assert.IsTrue( project.IsLoadable, "Not loadable" );
-				Assert.IsFalse( project.IsDirty, "Project should not be dirty" );
-			}
-		}
-
-		[Test]
-		public void FromVSSolution2005()
-		{
-			using(new TempResourceFile(this.GetType(), "resources.csharp-sample_VS2005.csproj", @"csharp\csharp-sample_VS2005.csproj"))
-			using(new TempResourceFile(this.GetType(), "resources.jsharp_VS2005.vjsproj", @"jsharp\jsharp_VS2005.vjsproj"))
-			using(new TempResourceFile(this.GetType(), "resources.vb-sample_VS2005.vbproj", @"vb\vb-sample_VS2005.vbproj"))
-			using(new TempResourceFile(this.GetType(), "resources.cpp-sample_VS2005.vcproj", @"cpp-sample\cpp-sample_VS2005.vcproj"))
-			using(TempResourceFile file = new TempResourceFile(this.GetType(), "resources.samples_VS2005.sln", "samples_VS2005.sln"))
-			{
-				NUnitProject project = NUnitProject.FromVSSolution( file.Path );
-				Assert.AreEqual( 4, project.Configs.Count );
-				Assert.AreEqual( 3, project.Configs["Debug"].Assemblies.Count );
-				Assert.AreEqual( 3, project.Configs["Release"].Assemblies.Count );
-				Assert.AreEqual( 1, project.Configs["Debug|Win32"].Assemblies.Count );
-				Assert.AreEqual( 1, project.Configs["Release|Win32"].Assemblies.Count );
-				Assert.IsTrue( project.IsLoadable, "Not loadable" );
-				Assert.IsFalse( project.IsDirty, "Project should not be dirty" );
-			}
-		}
-
-		[Test]
-		public void FromWebApplication()
-		{
-			using( new TempResourceFile(this.GetType(), "resources.ClassLibrary1.csproj", @"ClassLibrary1\ClassLibrary1.csproj" ) )
-			using( TempResourceFile file = new TempResourceFile( this.GetType(), "resources.WebApplication1.sln", "WebApplication1.sln" ) )
-			{
-				NUnitProject project = NUnitProject.FromVSSolution( Path.GetFullPath( file.Path ) );
-				Assert.AreEqual( 2, project.Configs.Count );
-				Assert.AreEqual( 1, project.Configs["Debug"].Assemblies.Count );
-				Assert.AreEqual( 1, project.Configs["Release"].Assemblies.Count );
-			}
-		}
-
-		[Test]
-		public void WithUnmanagedCpp()
-		{
-			using( new TempResourceFile( this.GetType(), "resources.ClassLibrary1.csproj", @"ClassLibrary1\ClassLibrary1.csproj" ) )
-			using( new TempResourceFile( this.GetType(), "resources.Unmanaged.vcproj", @"Unmanaged\Unmanaged.vcproj" ) )
-			using( TempResourceFile file = new TempResourceFile( this.GetType(), "resources.Solution1.sln", "Solution1.sln" ) ) 
-			{
-				NUnitProject project = NUnitProject.FromVSSolution( file.Path );
-				Assert.AreEqual( 4, project.Configs.Count );
-				Assert.AreEqual( 1, project.Configs["Debug"].Assemblies.Count );
-				Assert.AreEqual( 1, project.Configs["Release"].Assemblies.Count );
-				Assert.AreEqual( 1, project.Configs["Debug|Win32"].Assemblies.Count );
-				Assert.AreEqual( 1, project.Configs["Release|Win32"].Assemblies.Count );
-			}
-		}
-
-		[Test]
-		public void FromMakefileProject()
-		{
-			using( TempResourceFile file = new TempResourceFile( this.GetType(), "resources.MakeFileProject.vcproj", "MakeFileProject.vcproj" ) )
-			{
-				NUnitProject project = NUnitProject.FromVSProject( file.Path );
-				Assert.AreEqual( 2, project.Configs.Count );
-				Assert.AreEqual( 1, project.Configs["Debug|Win32"].Assemblies.Count );
-				Assert.AreEqual( 1, project.Configs["Release|Win32"].Assemblies.Count );
-			}
-		}
 	}
 }
diff --git a/src/ClientUtilities/tests/NUnitProjectSave.cs b/src/ClientUtilities/tests/NUnitProjectSave.cs
index b4469c3..af0d254 100644
--- a/src/ClientUtilities/tests/NUnitProjectSave.cs
+++ b/src/ClientUtilities/tests/NUnitProjectSave.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -22,7 +22,7 @@ namespace NUnit.Util.Tests
 		[SetUp]
 		public void SetUp()
 		{
-			project = NUnitProject.EmptyProject();
+			project = new ProjectService().EmptyProject();
 		}
 
 		[TearDown]
diff --git a/src/ClientUtilities/tests/NUnitProjectTests.cs b/src/ClientUtilities/tests/NUnitProjectTests.cs
index 965c441..4791701 100644
--- a/src/ClientUtilities/tests/NUnitProjectTests.cs
+++ b/src/ClientUtilities/tests/NUnitProjectTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -16,17 +16,16 @@ namespace NUnit.Util.Tests
 	public class NUnitProjectTests
 	{
 		static readonly string xmlfile = "test.nunit";
+        static readonly string mockDll = NUnit.Tests.Assemblies.MockAssembly.AssemblyPath;
 
 		private NUnitProject project;
-		private ProjectEventArgs lastEvent;
+		private ProjectService projectService;
 
 		[SetUp]
 		public void SetUp()
 		{
-			NUnitProject.ProjectSeed = 0;
-			project = NUnitProject.EmptyProject();
-			project.Changed += new ProjectEventHandler( OnProjectChanged );
-			lastEvent = null;
+			projectService = new ProjectService();
+			project = projectService.EmptyProject();
 		}
 
 		[TearDown]
@@ -36,16 +35,11 @@ namespace NUnit.Util.Tests
 				File.Delete( xmlfile );
 		}
 
-		private void OnProjectChanged( object sender, ProjectEventArgs e )
-		{
-			lastEvent = e;
-		}
-
 		[Test]
 		public void IsProjectFile()
 		{
-			Assert.IsTrue( NUnitProject.IsProjectFile( @"\x\y\test.nunit" ) );
-			Assert.IsFalse( NUnitProject.IsProjectFile( @"\x\y\test.junit" ) );
+			Assert.IsTrue( NUnitProject.IsNUnitProjectFile( @"\x\y\test.nunit" ) );
+			Assert.IsFalse( NUnitProject.IsNUnitProjectFile( @"\x\y\test.junit" ) );
 		}
 
 		[Test]
@@ -66,7 +60,7 @@ namespace NUnit.Util.Tests
 		{
 			Assert.AreEqual( Path.GetFullPath( "Project1" ), project.ProjectPath );
 			Assert.AreEqual( "Project1", project.Name );
-			NUnitProject another = NUnitProject.EmptyProject();
+			NUnitProject another = projectService.EmptyProject();
 			Assert.AreEqual( Path.GetFullPath( "Project2" ), another.ProjectPath );
 		}
 
@@ -109,17 +103,17 @@ namespace NUnit.Util.Tests
 		[Test]
 		public void ConfigurationFileFromAssembly() 
 		{
-			NUnitProject project = NUnitProject.FromAssembly("mock-assembly.dll");
+			NUnitProject project = projectService.WrapAssembly(mockDll);
 			string config = Path.GetFileName( project.ConfigurationFile );
-			Assert.AreEqual("mock-assembly.dll.config", config);
+			Assert.That(config, Is.EqualTo("mock-assembly.dll.config").IgnoreCase);
 		}
 
 		[Test]
 		public void ConfigurationFileFromAssemblies() 
 		{
-			NUnitProject project = NUnitProject.FromAssemblies(new string[] {"mock-assembly.dll"});
+			NUnitProject project = projectService.WrapAssemblies(new string[] {mockDll});
 			string config = Path.GetFileName( project.ConfigurationFile );
-			Assert.AreEqual("mock-assembly.dll.config", config);
+			Assert.That(config, Is.EqualTo("mock-assembly.dll.config").IgnoreCase);
 		}
 
 		[Test]
@@ -133,7 +127,7 @@ namespace NUnit.Util.Tests
 		public void LoadMakesProjectNotDirty()
 		{
 			project.Save( xmlfile );
-			NUnitProject project2 = NUnitProject.LoadProject( xmlfile );
+			NUnitProject project2 = new ProjectService().LoadProject( xmlfile );
 			Assert.IsFalse( project2.IsDirty );
 		}
 
@@ -181,7 +175,6 @@ namespace NUnit.Util.Tests
 		{
 			project.Configs.Add("Debug");
 			Assert.IsTrue( project.IsDirty );
-			Assert.AreEqual( ProjectChangeType.AddConfig, lastEvent.type );
 		}
 
 		[Test]
@@ -191,7 +184,6 @@ namespace NUnit.Util.Tests
 			project.IsDirty = false;
 			project.Configs[0].Name = "New";
 			Assert.IsTrue( project.IsDirty );
-			Assert.AreEqual( ProjectChangeType.UpdateConfig, lastEvent.type );
 		}
 
 		[Test]
@@ -217,7 +209,6 @@ namespace NUnit.Util.Tests
 			project.IsDirty = false;
 			project.Configs.Remove("Debug");
 			Assert.IsTrue( project.IsDirty );
-			Assert.AreEqual( ProjectChangeType.RemoveConfig, lastEvent.type );
 		}
 
 		[Test]
@@ -239,7 +230,6 @@ namespace NUnit.Util.Tests
 			project.IsDirty = false;
 			project.SetActiveConfig( "Release" );
 			Assert.IsTrue( project.IsDirty );
-			Assert.AreEqual( ProjectChangeType.ActiveConfig, lastEvent.type );
 		}
 
 		[Test]
@@ -248,7 +238,7 @@ namespace NUnit.Util.Tests
 			project.Save( xmlfile );
 			Assert.IsTrue( File.Exists( xmlfile ) );
 
-			NUnitProject project2 = NUnitProject.LoadProject( xmlfile );
+			NUnitProject project2 = projectService.LoadProject( xmlfile );
 
 			Assert.AreEqual( 0, project2.Configs.Count );
 		}
@@ -262,7 +252,7 @@ namespace NUnit.Util.Tests
 
 			Assert.IsTrue( File.Exists( xmlfile ) );
 
-			NUnitProject project2 = NUnitProject.LoadProject( xmlfile );
+			NUnitProject project2 = projectService.LoadProject( xmlfile );
 
 			Assert.AreEqual( 2, project2.Configs.Count );
 			Assert.IsTrue( project2.Configs.Contains( "Debug" ) );
@@ -286,7 +276,7 @@ namespace NUnit.Util.Tests
 
 			Assert.IsTrue( File.Exists( xmlfile ) );
 
-			NUnitProject project2 = NUnitProject.LoadProject( xmlfile );
+			NUnitProject project2 = projectService.LoadProject( xmlfile );
 
 			Assert.AreEqual( 2, project2.Configs.Count );
 
diff --git a/src/ClientUtilities/tests/NUnitProjectXml.cs b/src/ClientUtilities/tests/NUnitProjectXml.cs
index da9b2f8..d44371f 100644
--- a/src/ClientUtilities/tests/NUnitProjectXml.cs
+++ b/src/ClientUtilities/tests/NUnitProjectXml.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
diff --git a/src/ClientUtilities/tests/NUnitRegistryTests.cs b/src/ClientUtilities/tests/NUnitRegistryTests.cs
index 22cf5ae..a4f4da1 100644
--- a/src/ClientUtilities/tests/NUnitRegistryTests.cs
+++ b/src/ClientUtilities/tests/NUnitRegistryTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -37,17 +37,6 @@ namespace NUnit.Util.Tests
 		}
 
 		[Test]
-		public void LocalMachine()
-		{
-			NUnitRegistry.TestMode = false;
-			using( RegistryKey key = NUnitRegistry.LocalMachine )
-			{
-				Assert.IsNotNull( key );
-				StringAssert.EndsWith( @"Software\nunit.org\Nunit\2.4".ToLower(), key.Name.ToLower() );
-			}
-		}
-
-		[Test]
 		public void CurrentUserTestMode()
 		{
 
@@ -60,17 +49,6 @@ namespace NUnit.Util.Tests
 		}
 
 		[Test]
-		public void LocalMachineTestMode()
-		{
-			NUnitRegistry.TestMode = true;
-			using( RegistryKey key = NUnitRegistry.LocalMachine )
-			{
-				Assert.IsNotNull( key );
-				StringAssert.EndsWith( @"Software\nunit.org\Nunit-Test".ToLower(), key.Name.ToLower() );
-			}
-		}
-
-		[Test]
 		public void TestClearRoutines()
 		{
 			NUnitRegistry.TestMode = true;
diff --git a/src/ClientUtilities/tests/PathUtilTests.cs b/src/ClientUtilities/tests/PathUtilTests.cs
index c0dba10..839f1e5 100644
--- a/src/ClientUtilities/tests/PathUtilTests.cs
+++ b/src/ClientUtilities/tests/PathUtilTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -50,18 +50,17 @@ namespace NUnit.Util.Tests
 	}
 
 	[TestFixture]
-	[Platform(Exclude="Linux")]
 	public class PathUtilTests_Windows : PathUtils
 	{
 		[TestFixtureSetUp]
-		public void SetUpUnixSeparators()
+		public static void SetUpUnixSeparators()
 		{
 			PathUtils.DirectorySeparatorChar = '\\';
 			PathUtils.AltDirectorySeparatorChar = '/';
 		}
 
 		[TestFixtureTearDown]
-		public void RestoreDefaultSeparators()
+		public static void RestoreDefaultSeparators()
 		{
 			PathUtils.DirectorySeparatorChar = System.IO.Path.DirectorySeparatorChar;
 			PathUtils.AltDirectorySeparatorChar = System.IO.Path.AltDirectorySeparatorChar;
@@ -91,6 +90,7 @@ namespace NUnit.Util.Tests
 		}
 
 		[Test]
+		[Platform(Exclude="Linux")]
 		public void RelativePath()
 		{
 			Assert.AreEqual( @"folder2\folder3", PathUtils.RelativePath( 
@@ -101,7 +101,29 @@ namespace NUnit.Util.Tests
 				@"c:\folder1", @"bin\debug" ) );
 			Assert.IsNull( PathUtils.RelativePath( @"C:\folder", @"D:\folder" ),
 				"Unrelated paths should return null" );
-		}
+            Assert.IsNull(PathUtils.RelativePath(@"C:\", @"D:\"),
+                "Unrelated roots should return null");
+            Assert.IsNull(PathUtils.RelativePath(@"C:", @"D:"),
+                "Unrelated roots (no trailing separators) should return null");
+            Assert.AreEqual(string.Empty,
+                PathUtils.RelativePath(@"C:\folder1", @"C:\folder1"));
+            Assert.AreEqual(string.Empty,
+                PathUtils.RelativePath(@"C:\", @"C:\"));
+
+            // First path consisting just of a root:
+            Assert.AreEqual(@"folder1\folder2", PathUtils.RelativePath(
+                @"C:\", @"C:\folder1\folder2"));
+            
+            // Trailing directory separator in first path shall be ignored:
+            Assert.AreEqual(@"folder2\folder3", PathUtils.RelativePath(
+                @"c:\folder1\", @"c:\folder1\folder2\folder3"));
+            
+            // Case-insensitive behaviour, preserving 2nd path directories in result:
+            Assert.AreEqual(@"Folder2\Folder3", PathUtils.RelativePath(
+                @"C:\folder1", @"c:\folder1\Folder2\Folder3"));
+            Assert.AreEqual(@"..\Folder2\folder3", PathUtils.RelativePath(
+                @"c:\folder1", @"C:\Folder2\folder3"));
+        }
 
 		[Test]
 		public void SamePath()
@@ -140,14 +162,14 @@ namespace NUnit.Util.Tests
 	public class PathUtilTests_Unix : PathUtils
 	{
 		[TestFixtureSetUp]
-		public void SetUpUnixSeparators()
+		public static void SetUpUnixSeparators()
 		{
 			PathUtils.DirectorySeparatorChar = '/';
 			PathUtils.AltDirectorySeparatorChar = '\\';
 		}
 
 		[TestFixtureTearDown]
-		public void RestoreDefaultSeparators()
+		public static void RestoreDefaultSeparators()
 		{
 			PathUtils.DirectorySeparatorChar = System.IO.Path.DirectorySeparatorChar;
 			PathUtils.AltDirectorySeparatorChar = System.IO.Path.AltDirectorySeparatorChar;
@@ -189,7 +211,24 @@ namespace NUnit.Util.Tests
 				PathUtils.RelativePath( "/folder", "/other/folder" ) );
 			Assert.AreEqual( "../../d",
 				PathUtils.RelativePath( "/a/b/c", "/a/d" ) );
-		}
+            Assert.AreEqual(string.Empty,
+                PathUtils.RelativePath("/a/b", "/a/b"));
+            Assert.AreEqual(string.Empty,
+                PathUtils.RelativePath("/", "/"));
+            
+            // First path consisting just of a root:
+            Assert.AreEqual("folder1/folder2", PathUtils.RelativePath(
+                "/", "/folder1/folder2"));
+            
+            // Trailing directory separator in first path shall be ignored:
+            Assert.AreEqual("folder2/folder3", PathUtils.RelativePath(
+                "/folder1/", "/folder1/folder2/folder3"));
+            
+            // Case-sensitive behaviour:
+            Assert.AreEqual("../Folder1/Folder2/folder3",
+                PathUtils.RelativePath("/folder1", "/Folder1/Folder2/folder3"),
+                "folders differing in case");
+        }
 
 		[Test]
 		public void SamePath()
diff --git a/src/ClientUtilities/tests/ProcessRunnerTests.cs b/src/ClientUtilities/tests/ProcessRunnerTests.cs
index 3f39fc8..a5dd37b 100644
--- a/src/ClientUtilities/tests/ProcessRunnerTests.cs
+++ b/src/ClientUtilities/tests/ProcessRunnerTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System.Diagnostics;
@@ -9,30 +9,44 @@ using System.IO;
 using NUnit.Core;
 using NUnit.Core.Tests;
 using NUnit.Framework;
+using NUnit.Tests.Assemblies;
 
 namespace NUnit.Util.Tests
 {
 	/// <summary>
 	/// Summary description for ProcessRunnerTests.
 	/// </summary>
-	// Exclude for release[TestFixture,Platform(Exclude="Mono",Reason="Process Start not working correctly")]
-	public class ProcessRunnerTests : BasicRunnerTests
-	{
-		private ProcessRunner myRunner;
+    [TestFixture, Timeout(30000)]
+    [Platform(Exclude = "Mono", Reason = "Process Start not working correctly")]
+    public class ProcessRunnerTests : BasicRunnerTests
+    {
+        private ProcessRunner myRunner;
 
-		protected override TestRunner CreateRunner( int runnerID )
-		{
-			myRunner = new ProcessRunner( runnerID );
-			NTrace.Debug( "Creating ProcessRunner" );
-			return myRunner;
-		}
+        protected override TestRunner CreateRunner(int runnerID)
+        {
+            myRunner = new ProcessRunner(runnerID);
+            return myRunner;
+        }
 
-		[TestFixtureTearDown]
-		public void DestroyRunner()
-		{
-			NTrace.Debug( "Destroying ProcessRunner" );
-			if ( myRunner != null )
-				myRunner.Dispose();
-		}
-	}
+        protected override void DestroyRunner()
+        {
+            if (myRunner != null)
+            {
+                myRunner.Unload();
+                myRunner.Dispose();
+            }
+        }
+
+        [Test]
+        public void  TestProcessIsReused()
+        {
+            TestPackage package = new TestPackage(MockAssembly.AssemblyPath);
+            myRunner.Load(package);
+            int processId = ((TestAssemblyInfo)myRunner.AssemblyInfo[0]).ProcessId;
+            Assert.AreNotEqual(Process.GetCurrentProcess().Id, processId, "Not in separate process");
+            myRunner.Unload();
+            myRunner.Load(package);
+            Assert.AreEqual(processId, ((TestAssemblyInfo)myRunner.AssemblyInfo[0]).ProcessId, "Reloaded in different process");
+        }
+    }
 }
diff --git a/src/ClientUtilities/tests/ProjectConfigCollectionTests.cs b/src/ClientUtilities/tests/ProjectConfigCollectionTests.cs
deleted file mode 100644
index a9f4245..0000000
--- a/src/ClientUtilities/tests/ProjectConfigCollectionTests.cs
+++ /dev/null
@@ -1,77 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-using System;
-using System.IO;
-using NUnit.Framework;
-
-namespace NUnit.Util.Tests
-{
-	/// <summary>
-	/// Summary description for ProjectConfigCollectionTests.
-	/// </summary>
-	[TestFixture]
-	public class ProjectConfigCollectionTests
-	{
-		private ProjectConfigCollection configs;
-		private NUnitProject project = new NUnitProject( Path.DirectorySeparatorChar + "tests" + Path.DirectorySeparatorChar + "myproject.nunit" );
-
-		[SetUp]
-		public void SetUp()
-		{
-			configs = new ProjectConfigCollection( project );
-		}
-
-		[Test]
-		public void EmptyCollection()
-		{
-			Assert.AreEqual( 0, configs.Count );
-		}
-
-		[Test]
-		public void AddConfig()
-		{
-			configs.Add("Debug");
-			configs["Debug"].Assemblies.Add( Path.DirectorySeparatorChar + "tests" + Path.DirectorySeparatorChar + "bin" + Path.DirectorySeparatorChar + "debug" + Path.DirectorySeparatorChar + "assembly1.dll" );
-			configs["Debug"].Assemblies.Add( Path.DirectorySeparatorChar + "tests" + Path.DirectorySeparatorChar + "bin" + Path.DirectorySeparatorChar + "debug" + Path.DirectorySeparatorChar + "assembly2.dll" );
-
-			Assert.AreEqual( 2, configs["Debug"].Assemblies.Count );
-		}
-
-		[Test]
-		public void AddMakesProjectDirty()
-		{
-			configs.Add("Debug");
-			Assert.IsTrue( project.IsDirty );
-		}
-
-		[Test]
-		public void BuildConfigAndAdd()
-		{
-			ProjectConfig config = new ProjectConfig("Debug");
-			config.Assemblies.Add( Path.DirectorySeparatorChar + "tests" + Path.DirectorySeparatorChar + "bin" + Path.DirectorySeparatorChar + "debug" + Path.DirectorySeparatorChar + "assembly1.dll" );
-			config.Assemblies.Add( Path.DirectorySeparatorChar + "tests" + Path.DirectorySeparatorChar + "bin" + Path.DirectorySeparatorChar + "debug" + Path.DirectorySeparatorChar + "assembly2.dll" );
-
-			configs.Add( config );
-
-			Assert.AreEqual( 2, configs["Debug"].Assemblies.Count );
-		}
-
-		[Test]
-		public void AddTwoConfigs()
-		{
-			configs.Add("Debug");
-			configs.Add("Release");
-			configs["Debug"].Assemblies.Add( Path.DirectorySeparatorChar + "tests" + Path.DirectorySeparatorChar + "bin" + Path.DirectorySeparatorChar + "debug" + Path.DirectorySeparatorChar + "assembly1.dll" );
-			configs["Debug"].Assemblies.Add( Path.DirectorySeparatorChar + "tests" + Path.DirectorySeparatorChar + "bin" + Path.DirectorySeparatorChar + "debug" + Path.DirectorySeparatorChar + "assembly2.dll" );
-			configs["Release"].Assemblies.Add( Path.DirectorySeparatorChar + "tests" + Path.DirectorySeparatorChar + "bin" + Path.DirectorySeparatorChar + "release" + Path.DirectorySeparatorChar + "assembly3.dll" );
-
-			Assert.AreEqual( 2, configs.Count );
-			Assert.AreEqual( 2, configs["Debug"].Assemblies.Count );
-			Assert.AreEqual( 1, configs["Release"].Assemblies.Count );
-		}
-	}
-}
diff --git a/src/ClientUtilities/tests/ProjectConfigTests.cs b/src/ClientUtilities/tests/ProjectConfigTests.cs
index c743b3e..561aa6f 100644
--- a/src/ClientUtilities/tests/ProjectConfigTests.cs
+++ b/src/ClientUtilities/tests/ProjectConfigTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -17,15 +17,20 @@ namespace NUnit.Util.Tests
 	[TestFixture]
 	public class ProjectConfigTests
 	{
-		private ProjectConfig config;
+		private ProjectConfig activeConfig;
+        private ProjectConfig inactiveConfig;
 		private NUnitProject project;
 
 		[SetUp]
 		public void SetUp()
 		{
-			config = new ProjectConfig( "Debug" );
+			activeConfig = new ProjectConfig( "Debug" );
+            inactiveConfig = new ProjectConfig("Release");
 			project = new NUnitProject( TestPath( "/test/myproject.nunit" ) );
-			project.Configs.Add( config );
+			project.Configs.Add( activeConfig );
+            project.Configs.Add(inactiveConfig);
+            project.IsDirty = false;
+            project.HasChangesRequiringReload = false;
 		}
 
         /// <summary>
@@ -48,8 +53,8 @@ namespace NUnit.Util.Tests
 		[Test]
 		public void EmptyConfig()
 		{
-			Assert.AreEqual( "Debug", config.Name );
-			Assert.AreEqual( 0, config.Assemblies.Count );
+			Assert.AreEqual( "Debug", activeConfig.Name );
+			Assert.AreEqual( 0, activeConfig.Assemblies.Count );
 		}
 
 		[Test]
@@ -57,11 +62,11 @@ namespace NUnit.Util.Tests
 		{
             string path1 = TestPath("/test/assembly1.dll");
             string path2 = TestPath("/test/assembly2.dll");
-            config.Assemblies.Add(path1);
-			config.Assemblies.Add( path2 );
-			Assert.AreEqual( 2, config.Assemblies.Count );
-			Assert.AreEqual( path1, config.Assemblies[0] );
-			Assert.AreEqual( path2, config.Assemblies[1] );
+            activeConfig.Assemblies.Add(path1);
+			activeConfig.Assemblies.Add( path2 );
+			Assert.AreEqual( 2, activeConfig.Assemblies.Count );
+			Assert.AreEqual( path1, activeConfig.Assemblies[0] );
+			Assert.AreEqual( path2, activeConfig.Assemblies[1] );
 		}
 
 		[Test]
@@ -69,145 +74,310 @@ namespace NUnit.Util.Tests
 		{
             string path1 = TestPath("/test/assembly1.dll");
             string path2 = TestPath("/test/assembly2.dll");
-            config.Assemblies.Add( path1 );
-			config.Assemblies.Add( path2 );
+            activeConfig.Assemblies.Add( path1 );
+			activeConfig.Assemblies.Add( path2 );
 
-			string[] files = config.Assemblies.ToArray();
+			string[] files = activeConfig.Assemblies.ToArray();
 			Assert.AreEqual( path1, files[0] );
 			Assert.AreEqual( path2, files[1] );
 		}
 
-		[Test]
-		public void AddMarksProjectDirty()
-		{
-			config.Assemblies.Add( TestPath( "/test/bin/debug/assembly1.dll" ) );
-			Assert.IsTrue( project.IsDirty );
-		}
+        [Test]
+        public void AddToActiveConfigMarksProjectDirty()
+        {
+            activeConfig.Assemblies.Add(TestPath("/test/bin/debug/assembly1.dll"));
+            Assert.IsTrue(project.IsDirty);
+        }
 
-		[Test]
-		public void RenameMarksProjectDirty()
-		{
-			config.Name = "Renamed";
-			Assert.IsTrue( project.IsDirty );
-		}
+        [Test]
+        public void AddToActiveConfigRequiresReload()
+        {
+            activeConfig.Assemblies.Add(TestPath("/test/bin/debug/assembly1.dll"));
+            Assert.IsTrue(project.HasChangesRequiringReload);
+        }
 
-		[Test]
-		public void RemoveMarksProjectDirty()
-		{
+        [Test]
+        public void AddToInactiveConfigMarksProjectDirty()
+        {
+            inactiveConfig.Assemblies.Add(TestPath("/test/bin/release/assembly1.dll"));
+            Assert.IsTrue(project.IsDirty);
+        }
+
+        [Test]
+        public void AddToInactiveConfigDoesNotRequireReload()
+        {
+            inactiveConfig.Assemblies.Add(TestPath("/test/bin/release/assembly1.dll"));
+            Assert.IsFalse(project.HasChangesRequiringReload);
+        }
+
+        [Test]
+        public void AddingConfigMarksProjectDirty()
+        {
+            project.Configs.Add("New");
+            Assert.IsTrue(project.IsDirty);
+        }
+
+        [Test]
+        public void AddingInitialConfigRequiresReload()
+        {
+            NUnitProject newProj = new NUnitProject("/junk");
+            newProj.HasChangesRequiringReload = false;
+            newProj.Configs.Add("New");
+            Assert.That(newProj.HasChangesRequiringReload);
+        }
+
+        [Test]
+        public void AddingSubsequentConfigDoesNotRequireReload()
+        {
+            project.Configs.Add("New");
+            Assert.IsFalse(project.HasChangesRequiringReload);
+        }
+
+        [Test]
+        public void RenameActiveConfigMarksProjectDirty()
+        {
+            activeConfig.Name = "Renamed";
+            Assert.IsTrue(project.IsDirty);
+        }
+
+        [Test]
+        public void RenameActiveConfigRequiresReload()
+        {
+            activeConfig.Name = "Renamed";
+            Assert.IsTrue(project.HasChangesRequiringReload);
+        }
+
+        [Test]
+        public void RenameInctiveConfigMarksProjectDirty()
+        {
+            inactiveConfig.Name = "Renamed";
+            Assert.IsTrue(project.IsDirty);
+        }
+
+        [Test]
+        public void RenameInactiveConfigDoesNotRequireReload()
+        {
+            inactiveConfig.Name = "Renamed";
+            Assert.IsFalse(project.HasChangesRequiringReload);
+        }
+
+        [Test]
+        public void RemoveActiveConfigMarksProjectDirty()
+        {
             string path1 = TestPath("/test/bin/debug/assembly1.dll");
-			config.Assemblies.Add( path1 );
-			project.IsDirty = false;
-			config.Assemblies.Remove( path1 );
-			Assert.IsTrue( project.IsDirty );			
-		}
+            activeConfig.Assemblies.Add(path1);
+            project.IsDirty = false;
+            activeConfig.Assemblies.Remove(path1);
+            Assert.IsTrue(project.IsDirty);
+        }
 
-		[Test]
-		public void SettingApplicationBaseMarksProjectDirty()
-		{
-			config.BasePath = TestPath( "/junk" );
-			Assert.IsTrue( project.IsDirty );
-		}
+        [Test]
+        public void RemoveActiveConfigRequiresReload()
+        {
+            string path1 = TestPath("/test/bin/debug/assembly1.dll");
+            activeConfig.Assemblies.Add(path1);
+            project.IsDirty = false;
+            activeConfig.Assemblies.Remove(path1);
+            Assert.IsTrue(project.HasChangesRequiringReload);
+        }
 
-		[Test]
+        [Test]
+        public void RemoveInactiveConfigMarksProjectDirty()
+        {
+            string path1 = TestPath("/test/bin/debug/assembly1.dll");
+            inactiveConfig.Assemblies.Add(path1);
+            project.IsDirty = false;
+            inactiveConfig.Assemblies.Remove(path1);
+            Assert.IsTrue(project.IsDirty);
+        }
+
+        [Test]
+        public void RemoveInactiveConfigDoesNotRequireReload()
+        {
+            string path1 = TestPath("/test/bin/debug/assembly1.dll");
+            inactiveConfig.Assemblies.Add(path1);
+            project.HasChangesRequiringReload = false;
+            inactiveConfig.Assemblies.Remove(path1);
+            Assert.IsFalse(project.HasChangesRequiringReload);
+        }
+
+        [Test]
+        public void SettingActiveConfigApplicationBaseMarksProjectDirty()
+        {
+            activeConfig.BasePath = TestPath("/junk");
+            Assert.IsTrue(project.IsDirty);
+        }
+
+        [Test]
+        public void SettingActiveConfigApplicationBaseRequiresReload()
+        {
+            activeConfig.BasePath = TestPath("/junk");
+            Assert.IsTrue(project.HasChangesRequiringReload);
+        }
+
+        [Test]
+        public void SettingInactiveConfigApplicationBaseMarksProjectDirty()
+        {
+            inactiveConfig.BasePath = TestPath("/junk");
+            Assert.IsTrue(project.IsDirty);
+        }
+
+        [Test]
+        public void SettingInactiveConfigApplicationBaseDoesNotRequireReload()
+        {
+            inactiveConfig.BasePath = TestPath("/junk");
+            Assert.IsFalse(project.HasChangesRequiringReload);
+        }
+
+        [Test]
 		public void AbsoluteBasePath()
 		{
-            config.BasePath = TestPath("/junk");
+            activeConfig.BasePath = TestPath("/junk");
             string path1 = TestPath( "/junk/bin/debug/assembly1.dll" );
-			config.Assemblies.Add( path1 );
-			Assert.AreEqual( path1, config.Assemblies[0] );
+			activeConfig.Assemblies.Add( path1 );
+			Assert.AreEqual( path1, activeConfig.Assemblies[0] );
 		}
 
 		[Test]
 		public void RelativeBasePath()
 		{
-			config.BasePath = @"junk";
+			activeConfig.BasePath = @"junk";
             string path1 = TestPath("/test/junk/bin/debug/assembly1.dll");
-            config.Assemblies.Add( path1 );
-			Assert.AreEqual( path1, config.Assemblies[0] );
+            activeConfig.Assemblies.Add( path1 );
+			Assert.AreEqual( path1, activeConfig.Assemblies[0] );
 		}
 
 		[Test]
 		public void NoBasePathSet()
 		{
             string path1 = TestPath( "/test/bin/debug/assembly1.dll" );
-			config.Assemblies.Add( path1 );
-			Assert.AreEqual( path1, config.Assemblies[0] );
+			activeConfig.Assemblies.Add( path1 );
+			Assert.AreEqual( path1, activeConfig.Assemblies[0] );
 		}
 
-		[Test]
-		public void SettingConfigurationFileMarksProjectDirty()
-		{
-			config.ConfigurationFile = "MyProject.config";
-			Assert.IsTrue( project.IsDirty );
-		}
+        [Test]
+        public void SettingActiveConfigConfigurationFileMarksProjectDirty()
+        {
+            activeConfig.ConfigurationFile = "MyProject.config";
+            Assert.IsTrue(project.IsDirty);
+        }
 
-		[Test]
+        [Test]
+        public void SettingActiveConfigConfigurationFileRequiresReload()
+        {
+            activeConfig.ConfigurationFile = "MyProject.config";
+            Assert.IsTrue(project.HasChangesRequiringReload);
+        }
+
+        [Test]
+        public void SettingInactiveConfigConfigurationFileMarksProjectDirty()
+        {
+            inactiveConfig.ConfigurationFile = "MyProject.config";
+            Assert.IsTrue(project.IsDirty);
+        }
+
+        [Test]
+        public void SettingInactiveConfigConfigurationFileDoesNotRequireReload()
+        {
+            inactiveConfig.ConfigurationFile = "MyProject.config";
+            Assert.IsFalse(project.HasChangesRequiringReload);
+        }
+
+        [Test]
 		public void DefaultConfigurationFile()
 		{
-			Assert.AreEqual( "myproject.config", config.ConfigurationFile );
-			Assert.AreEqual( TestPath( "/test/myproject.config" ), config.ConfigurationFilePath );
+			Assert.AreEqual( "myproject.config", activeConfig.ConfigurationFile );
+			Assert.AreEqual( TestPath( "/test/myproject.config" ), activeConfig.ConfigurationFilePath );
 		}
 
 		[Test]
 		public void AbsoluteConfigurationFile()
 		{
             string path1 = TestPath("/configs/myconfig.config");
-			config.ConfigurationFile = path1;
-			Assert.AreEqual( path1, config.ConfigurationFilePath );
+			activeConfig.ConfigurationFile = path1;
+			Assert.AreEqual( path1, activeConfig.ConfigurationFilePath );
 		}
 
 		[Test]
 		public void RelativeConfigurationFile()
 		{
-			config.ConfigurationFile = "myconfig.config";
-			Assert.AreEqual( TestPath( "/test/myconfig.config" ), config.ConfigurationFilePath );
+			activeConfig.ConfigurationFile = "myconfig.config";
+			Assert.AreEqual( TestPath( "/test/myconfig.config" ), activeConfig.ConfigurationFilePath );
 		}
 
-		[Test]
-		public void SettingPrivateBinPathMarksProjectDirty()
-		{
-			config.PrivateBinPath = TestPath( "/junk" ) + Path.PathSeparator + TestPath( "/bin" );
-			Assert.IsTrue( project.IsDirty );
-		}
+        [Test]
+        public void SettingActiveConfigPrivateBinPathMarksProjectDirty()
+        {
+            activeConfig.PrivateBinPath = TestPath("/junk") + Path.PathSeparator + TestPath("/bin");
+            Assert.IsTrue(project.IsDirty);
+        }
 
-		[Test]
-		public void SettingBinPathTypeMarksProjectDirty()
-		{
-			config.BinPathType = BinPathType.Manual;
-			Assert.IsTrue( project.IsDirty );
-		}
+        [Test]
+        public void SettingActiveConfigPrivateBinPathRequiresReload()
+        {
+            activeConfig.PrivateBinPath = TestPath("/junk") + Path.PathSeparator + TestPath("/bin");
+            Assert.IsTrue(project.HasChangesRequiringReload);
+        }
 
-// TODO: Move to DomainManagerTests
-//		[Test]
-//		public void GetPrivateBinPath()
-//		{
-//            string path1 = TestPath("/test/bin/debug/test1.dll");
-//            string path2 = TestPath("/test/bin/debug/test2.dll");
-//            string path3 = TestPath("/test/utils/test3.dll");
-//            config.Assemblies.Add( path1 );
-//            config.Assemblies.Add(path2);
-//            config.Assemblies.Add(path3);
-//
-//			Assert.AreEqual( TestPath( "bin/debug" ) + Path.PathSeparator + TestPath( "utils" ), config.PrivateBinPath ); 
-//		}
+        [Test]
+        public void SettingInactiveConfigPrivateBinPathMarksProjectDirty()
+        {
+            inactiveConfig.PrivateBinPath = TestPath("/junk") + Path.PathSeparator + TestPath("/bin");
+            Assert.IsTrue(project.IsDirty);
+        }
+
+        [Test]
+        public void SettingInactiveConfigPrivateBinPathDoesNotRequireReload()
+        {
+            inactiveConfig.PrivateBinPath = TestPath("/junk") + Path.PathSeparator + TestPath("/bin");
+            Assert.IsFalse(project.HasChangesRequiringReload);
+        }
+
+        [Test]
+        public void SettingActiveConfigBinPathTypeMarksProjectDirty()
+        {
+            activeConfig.BinPathType = BinPathType.Manual;
+            Assert.IsTrue(project.IsDirty);
+        }
+
+        [Test]
+        public void SettingActiveConfigBinPathTypeRequiresReload()
+        {
+            activeConfig.BinPathType = BinPathType.Manual;
+            Assert.IsTrue(project.HasChangesRequiringReload);
+        }
+
+        [Test]
+        public void SettingInactiveConfigBinPathTypeMarksProjectDirty()
+        {
+            inactiveConfig.BinPathType = BinPathType.Manual;
+            Assert.IsTrue(project.IsDirty);
+        }
+
+        [Test]
+        public void SettingInactiveConfigBinPathTypeDoesNotRequireReload()
+        {
+            inactiveConfig.BinPathType = BinPathType.Manual;
+            Assert.IsFalse(project.HasChangesRequiringReload);
+        }
 
 		[Test]
 		public void NoPrivateBinPath()
 		{
-			config.Assemblies.Add( TestPath( "/bin/assembly1.dll" ) );
-			config.Assemblies.Add( TestPath( "/bin/assembly2.dll" ) );
-			config.BinPathType = BinPathType.None;
-			Assert.IsNull( config.PrivateBinPath );
+			activeConfig.Assemblies.Add( TestPath( "/bin/assembly1.dll" ) );
+			activeConfig.Assemblies.Add( TestPath( "/bin/assembly2.dll" ) );
+			activeConfig.BinPathType = BinPathType.None;
+			Assert.IsNull( activeConfig.PrivateBinPath );
 		}
 
 		[Test]
 		public void ManualPrivateBinPath()
 		{
-			config.Assemblies.Add( TestPath( "/test/bin/assembly1.dll" ) );
-			config.Assemblies.Add( TestPath( "/test/bin/assembly2.dll" ) );
-			config.BinPathType = BinPathType.Manual;
-			config.PrivateBinPath = TestPath( "/test" );
-			Assert.AreEqual( TestPath( "/test" ), config.PrivateBinPath );
+			activeConfig.Assemblies.Add( TestPath( "/test/bin/assembly1.dll" ) );
+			activeConfig.Assemblies.Add( TestPath( "/test/bin/assembly2.dll" ) );
+			activeConfig.BinPathType = BinPathType.Manual;
+			activeConfig.PrivateBinPath = TestPath( "/test" );
+			Assert.AreEqual( TestPath( "/test" ), activeConfig.PrivateBinPath );
 		}
 
 // TODO: Move to DomainManagerTests
diff --git a/src/ClientUtilities/tests/RecentFileEntryTests.cs b/src/ClientUtilities/tests/RecentFileEntryTests.cs
index 7db0b3b..78706cf 100644
--- a/src/ClientUtilities/tests/RecentFileEntryTests.cs
+++ b/src/ClientUtilities/tests/RecentFileEntryTests.cs
@@ -1,3 +1,9 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
 using System;
 using System.Collections;
 using System.Text;
diff --git a/src/ClientUtilities/tests/RecentFilesTests.cs b/src/ClientUtilities/tests/RecentFilesTests.cs
index 8521770..ccdc275 100644
--- a/src/ClientUtilities/tests/RecentFilesTests.cs
+++ b/src/ClientUtilities/tests/RecentFilesTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 namespace NUnit.Util.Tests
diff --git a/src/ClientUtilities/tests/RegistrySettingsStorageTests.cs b/src/ClientUtilities/tests/RegistrySettingsStorageTests.cs
index c1d07d1..278dc9d 100644
--- a/src/ClientUtilities/tests/RegistrySettingsStorageTests.cs
+++ b/src/ClientUtilities/tests/RegistrySettingsStorageTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
diff --git a/src/ClientUtilities/tests/RemoteTestResultTest.cs b/src/ClientUtilities/tests/RemoteTestResultTest.cs
index 0e585fd..1255cc0 100644
--- a/src/ClientUtilities/tests/RemoteTestResultTest.cs
+++ b/src/ClientUtilities/tests/RemoteTestResultTest.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -13,6 +13,8 @@ namespace NUnit.Util.Tests
 	[TestFixture]
 	public class RemoteTestResultTest
 	{
+        private static readonly string mockDll = 
+            NUnit.Tests.Assemblies.MockAssembly.AssemblyPath; 
         private TestDomain domain;
 
         [SetUp]
@@ -31,12 +33,10 @@ namespace NUnit.Util.Tests
 		[Test]
 		public void ResultStillValidAfterDomainUnload() 
 		{
-			TestPackage package = new TestPackage( "mock-assembly.dll" );
+			TestPackage package = new TestPackage( mockDll );
 			Assert.IsTrue( domain.Load( package ) );
 			TestResult result = domain.Run( new NullListener() );
-			TestSuiteResult suite = result as TestSuiteResult;
-			Assert.IsNotNull(suite);
-			TestCaseResult caseResult = findCaseResult(suite);
+			TestResult caseResult = findCaseResult(result);
 			Assert.IsNotNull(caseResult);
 			TestResultItem item = new TestResultItem(caseResult);
 			string message = item.GetMessage();
@@ -47,22 +47,22 @@ namespace NUnit.Util.Tests
         public void AppDomainUnloadedBug()
         {
             TestDomain domain = new TestDomain();
-            domain.Load( new TestPackage( "mock-assembly.dll" ) );
+            domain.Load( new TestPackage( mockDll ) );
             domain.Run(new NullListener());
             domain.Unload();
         }
 
-		private TestCaseResult findCaseResult(TestSuiteResult suite) 
+		private TestResult findCaseResult(TestResult suite) 
 		{
 			foreach (TestResult r in suite.Results) 
 			{
-				if (r is TestCaseResult)
+				if (!r.Test.IsSuite)
 				{
-					return (TestCaseResult) r;
+					return r;
 				}
 				else 
 				{
-					TestCaseResult result = findCaseResult((TestSuiteResult)r);
+					TestResult result = findCaseResult(r);
 					if (result != null)
 						return result;
 				}
diff --git a/src/ClientUtilities/tests/RuntimeFrameworkSelectorTests.cs b/src/ClientUtilities/tests/RuntimeFrameworkSelectorTests.cs
new file mode 100644
index 0000000..0f08020
--- /dev/null
+++ b/src/ClientUtilities/tests/RuntimeFrameworkSelectorTests.cs
@@ -0,0 +1,55 @@
+using System;
+using NUnit.Core;
+using NUnit.Framework;
+
+namespace NUnit.Util.Tests
+{
+    [TestFixture]
+    public class RuntimeFrameworkSelectorTests
+    {
+        TestPackage package = new TestPackage("/dummy.dll");
+
+        [Datapoints]
+        internal RuntimeFramework[] frameworks = new RuntimeFramework[] { 
+            RuntimeFramework.Parse("net-1.0"), 
+            RuntimeFramework.Parse("net-1.1"), 
+            RuntimeFramework.Parse("net-2.0"),
+            RuntimeFramework.Parse("net-4.0"),
+            RuntimeFramework.Parse("mono-1.0"),
+            RuntimeFramework.Parse("mono-2.0"),
+            RuntimeFramework.Parse("v1.1"),
+            RuntimeFramework.Parse("v2.0"),
+            RuntimeFramework.Parse("v4.0")
+            // TODO: Figure out a way to run these
+            //RuntimeFramework.Parse("net"),
+            //RuntimeFramework.Parse("mono"),
+            //RuntimeFramework.Parse("any")
+        };
+
+        [Theory]
+        public void RequestForSpecificFrameworkIsHonored(RuntimeFramework requestedFramework)
+        {
+            Assume.That(requestedFramework.Runtime, Is.Not.EqualTo(RuntimeType.Any));
+
+            RuntimeFrameworkSelector selector = new RuntimeFrameworkSelector();
+            package.Settings["RuntimeFramework"] = requestedFramework;
+
+            RuntimeFramework selectedFramework = selector.SelectRuntimeFramework(package);
+            Assert.That(selectedFramework.Runtime, Is.EqualTo(requestedFramework.Runtime));
+            Assert.That(selectedFramework.ClrVersion, Is.EqualTo(requestedFramework.ClrVersion));
+        }
+
+        [Theory]
+        public void RequestForSpecificVersionIsHonored(RuntimeFramework requestedFramework)
+        {
+            Assume.That(requestedFramework.Runtime, Is.EqualTo(RuntimeType.Any));
+
+            RuntimeFrameworkSelector selector = new RuntimeFrameworkSelector();
+            package.Settings["RuntimeFramework"] = requestedFramework;
+
+            RuntimeFramework selectedFramework = selector.SelectRuntimeFramework(package);
+            Assert.That(selectedFramework.Runtime, Is.EqualTo(RuntimeFramework.CurrentFramework.Runtime));
+            Assert.That(selectedFramework.ClrVersion, Is.EqualTo(requestedFramework.ClrVersion));
+        }
+    }
+}
diff --git a/src/ClientUtilities/tests/ServerUtilityTests.cs b/src/ClientUtilities/tests/ServerUtilityTests.cs
index fb7fe25..d81e748 100644
--- a/src/ClientUtilities/tests/ServerUtilityTests.cs
+++ b/src/ClientUtilities/tests/ServerUtilityTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 using System.Collections;
diff --git a/src/ClientUtilities/tests/ServiceManagerSetUpFixture.cs b/src/ClientUtilities/tests/ServiceManagerSetUpFixture.cs
index b971538..2279b92 100644
--- a/src/ClientUtilities/tests/ServiceManagerSetUpFixture.cs
+++ b/src/ClientUtilities/tests/ServiceManagerSetUpFixture.cs
@@ -1,3 +1,9 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
 using System;
 using NUnit.Framework;
 
@@ -19,9 +25,10 @@ namespace NUnit.Util.Tests
 		[SetUp]
 		public void CreateServicesForTestDomain()
 		{
-			ServiceManager.Services.AddService( new SettingsService() );
+			ServiceManager.Services.AddService( new DummySettingsService() );
 			ServiceManager.Services.AddService( new DomainManager() );
-			ServiceManager.Services.AddService( new TestAgency( "TestDomain_TestAgency", 9200 ) );
+			ServiceManager.Services.AddService( new ProjectService() );
+			ServiceManager.Services.AddService( new TestAgency( "TestDomain_TestAgency", 0 ) );
 			Services.TestAgency.Start();
 		}
 
@@ -32,4 +39,24 @@ namespace NUnit.Util.Tests
 			ServiceManager.Services.ClearServices();
 		}
 	}
+
+    class DummySettingsService : SettingsGroup, NUnit.Core.IService
+    {
+        public DummySettingsService()
+        {
+            this.storage = new MemorySettingsStorage();
+        }
+
+        #region IService Members
+
+        public void InitializeService()
+        {
+        }
+
+        public void UnloadService()
+        {
+        }
+
+        #endregion
+    }
 }
diff --git a/src/ClientUtilities/tests/SettingsGroupTests.cs b/src/ClientUtilities/tests/SettingsGroupTests.cs
index 5fc6ac6..f3391b1 100644
--- a/src/ClientUtilities/tests/SettingsGroupTests.cs
+++ b/src/ClientUtilities/tests/SettingsGroupTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
diff --git a/src/ClientUtilities/tests/SummaryResultFixture.cs b/src/ClientUtilities/tests/SummaryResultFixture.cs
index 66e7984..24a1aa0 100644
--- a/src/ClientUtilities/tests/SummaryResultFixture.cs
+++ b/src/ClientUtilities/tests/SummaryResultFixture.cs
@@ -1,13 +1,15 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
 using System.Collections;
 using NUnit.Framework;
 using NUnit.Core;
+using NUnit.Tests.Assemblies;
+using NUnit.TestUtilities;
 	
 namespace NUnit.Util.Tests
 {
@@ -17,88 +19,30 @@ namespace NUnit.Util.Tests
 	[TestFixture]
 	public class SummaryResultFixture
 	{
-		private TestCaseResult testCase;
-		private double time = 0.456;
+		private TestResult result;
 
-		private TestSuiteResult NotRunTestSuite()
+		[SetUp]
+		public void CreateResult()
 		{
-			TestSuiteResult result = new TestSuiteResult("RootSuite");
-			result.RunState = RunState.Executed;
-
-			TestCaseResult testCaseResult = new TestCaseResult("NonRunTestCase");
-			testCaseResult.Ignore("No Reason");
-			result.AddResult(testCaseResult);
-
-			return result;
-		}
-
-		[Test]
-		public void TestCountNotRunSuites()
-		{
-			ResultSummarizer summary = new ResultSummarizer(NotRunTestSuite());
-			Assert.AreEqual(1,summary.TestsNotRun);
-
-		}
-		private TestSuiteResult MockSuiteResult(string suiteName, bool failure)
-		{
-			TestSuiteResult result = new TestSuiteResult(suiteName);
-			result.Time = time;
-			result.RunState = RunState.Executed;
-
-			TestSuiteResult level1SuiteA = new TestSuiteResult("level 1 A");
-			result.AddResult(level1SuiteA);
-			level1SuiteA.RunState = RunState.Executed;
-
-			TestSuiteResult level1SuiteB = new TestSuiteResult("level 1 B");
-			result.AddResult(level1SuiteB);
-			level1SuiteB.RunState = RunState.Executed;
-
-			testCase = new TestCaseResult("a test case");
-			if(failure) testCase.Failure("argument exception",null);
-			else testCase.Success();
-			
-			level1SuiteA.AddResult(testCase);
-
-			testCase = new TestCaseResult("a successful test");
-			testCase.Success();
-			level1SuiteB.AddResult(testCase);
-
-			testCase = new TestCaseResult("a not run test");
-			testCase.Ignore("test not run");
-			level1SuiteB.AddResult(testCase);
-
-			return result;
-		}
-
-		[Test]
-		public void TotalCountSuccess()
-		{
-			string suiteName = "Base";
-			ResultSummarizer summary = new ResultSummarizer(MockSuiteResult(suiteName, false));
-
-			Assert.AreEqual(suiteName, summary.Name);
-			Assert.IsTrue(summary.Success);
-			Assert.AreEqual(2, summary.ResultCount);
-			Assert.AreEqual(0, summary.FailureCount);
-			Assert.AreEqual(1, summary.TestsNotRun);
-		}
-
-		[Test]
-		public void Failure()
-		{
-			ResultSummarizer summary = new ResultSummarizer(MockSuiteResult("Base", true));
-
-			Assert.IsFalse(summary.Success);
-			Assert.AreEqual(2, summary.ResultCount);
-			Assert.AreEqual(1, summary.FailureCount);
-			Assert.AreEqual(1, summary.TestsNotRun);
+			Test testFixture = TestFixtureBuilder.BuildFrom( typeof( MockTestFixture ) );
+            result = testFixture.Run(NullListener.NULL, TestFilter.Empty);
 		}
 
 		[Test]
-		public void TestTime()
+		public void SummaryMatchesResult()
 		{
-			ResultSummarizer summary = new ResultSummarizer(MockSuiteResult("Base", false));
-			Assert.AreEqual(time, summary.Time);
+			ResultSummarizer summary = new ResultSummarizer( result );
+
+			Assert.AreEqual(result.Name, summary.Name);
+			Assert.AreEqual(result.Time, summary.Time);
+			Assert.AreEqual(result.IsSuccess, summary.Success, "Success");
+        
+            Assert.AreEqual(MockTestFixture.ResultCount, summary.ResultCount );
+			Assert.AreEqual(MockTestFixture.TestsRun, summary.TestsRun, "TestsRun");
+			Assert.AreEqual(MockTestFixture.Failures, summary.Failures, "Failures");
+            Assert.AreEqual(MockTestFixture.Errors, summary.Errors, "Errors");
+			Assert.AreEqual(MockTestFixture.Ignored, summary.Ignored, "Ignored");
+            Assert.AreEqual(MockTestFixture.NotRunnable, summary.NotRunnable, "NotRunnable");
 		}
 	}
 }
diff --git a/src/ClientUtilities/tests/TestAgencyTests.cs b/src/ClientUtilities/tests/TestAgencyTests.cs
index 1d578ac..350229d 100644
--- a/src/ClientUtilities/tests/TestAgencyTests.cs
+++ b/src/ClientUtilities/tests/TestAgencyTests.cs
@@ -1,67 +1,69 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
 using System;
 using System.Diagnostics;
 using NUnit.Framework;
-using NUnit.Framework.SyntaxHelpers;
+using NUnit.Core;
 using System.Runtime.Remoting.Channels;
 using System.Runtime.Remoting.Channels.Tcp;
 
 namespace NUnit.Util.Tests
 {
-	// Exclude for release [TestFixture,Platform(Exclude="Mono")]
-	public class TestAgencyTests
-	{
-		private TestAgency agency;
-
-		[SetUp]
-		public void CreateAgency()
-		{
-			agency = new TestAgency("TempTestAgency", 9300);
-			agency.Start();
-		}
+    [TestFixture]
+    public class TestAgencyTests
+    {
+        private TestAgency agency;
 
-		[TearDown]
-		public void StopAgency()
-		{
-			agency.Stop();
-		}
+        [SetUp]
+        public void CreateAgency()
+        {
+            agency = new TestAgency("TempTestAgency", 0);
+            agency.Start();
+        }
 
-		[Test]
-		public void CanConnectToAgency()
-		{
-			object obj = Activator.GetObject( typeof( TestAgency ), ServerUtilities.MakeUrl("TempTestAgency", 9300) );
-			Assert.IsNotNull( obj );
-			Assert.That( obj is TestAgency );
-		}
+        [TearDown]
+        public void StopAgency()
+        {
+            agency.Stop();
+        }
 
-		[Test]
-		public void CanLaunchAndConnectToAgent()
-		{
-			TestAgent agent = null;
-			try
-			{
-				agent = agency.GetAgent(AgentType.ProcessAgent, 2000);
-				Assert.IsNotNull( agent );
-			}
-			finally
-			{
-				agency.ReleaseAgent(agent);
-			}
-		}
+        [Test]
+        public void CanConnectToAgency()
+        {
+            object obj = Activator.GetObject(typeof(TestAgency), agency.ServerUrl);
+            Assert.IsNotNull(obj);
+            Assert.That(obj is TestAgency);
+        }
 
-		[Test,ExpectedException(typeof(ArgumentException))]
-		public void UnsupportedAgentTypeRequestThrowsException()
-		{
-			TestAgent agent = agency.GetAgent( AgentType.DomainAgent );
-		}
+        [Test, Platform(Exclude="Mono")]
+        public void CanLaunchAndConnectToAgent()
+        {
+            TestAgent agent = null;
+            try
+            {
+                agent = agency.GetAgent(10000);
+                Assert.IsNotNull(agent);
+            }
+            finally
+            {
+                if ( agent != null )
+                    agency.ReleaseAgent(agent);
+            }
+        }
 
-		[Test]
-		public void CanReuseReleasedAgents()
-		{
-			TestAgent agent1 = agency.GetAgent(AgentType.ProcessAgent, 2000);
-			int id1 = agent1.Id;
-			agency.ReleaseAgent( agent1 );
-			TestAgent agent2 = agency.GetAgent(AgentType.ProcessAgent, 2000);
-			Assert.AreEqual( id1, agent2.Id );
-		}
-	}
+        // TODO: Decide if we really want to do this
+        //[Test]
+        public void CanReuseReleasedAgents()
+        {
+            TestAgent agent1 = agency.GetAgent(20000);
+            Guid id1 = agent1.Id;
+            agency.ReleaseAgent(agent1);
+            TestAgent agent2 = agency.GetAgent(20000);
+            Assert.AreEqual(id1, agent2.Id);
+        }
+    }
 }
diff --git a/src/ClientUtilities/tests/TestAgentManagerTests.cs b/src/ClientUtilities/tests/TestAgentManagerTests.cs
deleted file mode 100644
index 75c58b5..0000000
--- a/src/ClientUtilities/tests/TestAgentManagerTests.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-using System;
-using NUnit.Framework;
-using NUnit.Framework.SyntaxHelpers;
-using System.Runtime.Remoting.Channels;
-using System.Runtime.Remoting.Channels.Tcp;
-
-namespace NUnit.Util.Tests
-{
-	[TestFixture]
-	public class TestAgentManagerTests
-	{
-		[Test]
-		public void CanConnectToRegistry()
-		{
-			using ( TestAgentManager registry = new TestAgentManager("TestAgentManagerForTesting", 9200) )
-			{
-				registry.Start();
-
-				//ChannelServices.RegisterChannel( ServerUtilities.GetTcpChannel( "TestAgentManagerTestChannel" ) );
-
-				object obj = Activator.GetObject( typeof( TestAgentManager ), "tcp://127.0.0.1:9200/TestAgentManagerForTesting" );
-				Assert.IsNotNull( obj );
-				Assert.That( obj is TestAgentManager );
-			}
-		}
-
-		[Test]
-		public void RegistryStoresRunnersById()
-		{
-			object o = new object();
-
-			using ( TestAgentManager registry = new TestAgentManager("TestAgentManagerForTesting", 9200) )
-			{
-				registry.Start();
-				registry.Register( o, 911 );
-				Assert.AreEqual( o, registry.GetTestRunner(911) );
-			}
-		}
-	}
-}
diff --git a/src/ClientUtilities/tests/TestAgentTests.cs b/src/ClientUtilities/tests/TestAgentTests.cs
index a356eb5..ae245f4 100644
--- a/src/ClientUtilities/tests/TestAgentTests.cs
+++ b/src/ClientUtilities/tests/TestAgentTests.cs
@@ -1,24 +1,52 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
 using System;
 using System.Diagnostics;
 using NUnit.Framework;
 
 namespace NUnit.Util.Tests
 {
-	// Exclude for release [TestFixture]
-	public class RemoteTestAgentTests
-	{
-		[Test]
-		public void AgentReturnsProcessId()
-		{
-			RemoteTestAgent agent = new RemoteTestAgent("dummy");
-			Assert.AreEqual( Process.GetCurrentProcess().Id, agent.ProcessId );
-		}
+    [TestFixture]
+    public class RemoteTestAgentTests
+    {
+        [Test]
+        public void AgentReturnsProcessId()
+        {
+            RemoteTestAgent agent = new RemoteTestAgent(Guid.NewGuid(), null);
+            Assert.AreEqual(Process.GetCurrentProcess().Id, agent.ProcessId);
+        }
+
+        [Test]
+        public void CanLocateAgentExecutable()
+        {
+            string path = NUnit.Core.NUnitConfiguration.GetTestAgentExePath(Environment.Version);
+            Assert.That(System.IO.File.Exists(path), "Cannot find " + path);
+        }
+
+        [Test]
+        public void CanLocateBinDirForAllInstalledVersions()
+        {
+            foreach (NUnit.Core.RuntimeFramework availableVersion in NUnit.Core.RuntimeFramework.AvailableFrameworks)
+            {
+                string path = NUnit.Core.NUnitConfiguration.GetNUnitBinDirectory(availableVersion.ClrVersion);
+                if (path != null) // All version may not be installed
+                    Assert.That(System.IO.Directory.Exists(path), "Directory {0} does not exist", path);
+            }
+        }
 
-		[Test]
-		public void CanLocateAgentExecutable()
-		{
-			string path = TestAgency.TestAgentExePath;
-			Assert.That( System.IO.File.Exists( path ), "Cannot find " + path  );
-		}
-	}
+        [Test]
+        public void CanLocateAgentExeForAllInstalledVersions()
+        {
+            foreach (NUnit.Core.RuntimeFramework availableVersion in NUnit.Core.RuntimeFramework.AvailableFrameworks)
+            {
+                string path = NUnit.Core.NUnitConfiguration.GetTestAgentExePath(availableVersion.ClrVersion);
+                if (path != null)
+                    Assert.That(System.IO.File.Exists(path), "File {0} does not exist", path);
+            }
+        }
+    }
 }
diff --git a/src/ClientUtilities/tests/TestDomainFixture.cs b/src/ClientUtilities/tests/TestDomainFixture.cs
index b52a096..32c5617 100644
--- a/src/ClientUtilities/tests/TestDomainFixture.cs
+++ b/src/ClientUtilities/tests/TestDomainFixture.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -18,17 +18,18 @@ namespace NUnit.Util.Tests
 	{
 		private static TestDomain testDomain; 
 		private static ITest loadedTest;
+        private static readonly string mockDll = MockAssembly.AssemblyPath;
 
 		[TestFixtureSetUp]
-		public void MakeAppDomain()
+		public static void MakeAppDomain()
 		{
 			testDomain = new TestDomain();
-			testDomain.Load( new TestPackage( "mock-assembly.dll" ) );
+			testDomain.Load( new TestPackage(mockDll));
 			loadedTest = testDomain.Test;
 		}
 
 		[TestFixtureTearDown]
-		public void UnloadTestDomain()
+		public static void UnloadTestDomain()
 		{
             if ( testDomain != null )
                 testDomain.Unload();
@@ -48,15 +49,19 @@ namespace NUnit.Util.Tests
 		{
 			AppDomain domain = testDomain.AppDomain;
 			AppDomainSetup setup = testDomain.AppDomain.SetupInformation;
-			
-			Assert.AreEqual( "Tests", setup.ApplicationName, "ApplicationName" );
-			Assert.AreEqual( Environment.CurrentDirectory, setup.ApplicationBase, "ApplicationBase" );
-			Assert.AreEqual( "mock-assembly.dll.config", Path.GetFileName( setup.ConfigurationFile ), "ConfigurationFile" );
+
+            Assert.That(setup.ApplicationName, Is.StringStarting("Tests_"));
+			Assert.AreEqual( Path.GetDirectoryName(mockDll), setup.ApplicationBase, "ApplicationBase" );
+			Assert.That( 
+                Path.GetFileName( setup.ConfigurationFile ),
+                Is.EqualTo("mock-assembly.dll.config").IgnoreCase,
+                "ConfigurationFile");
 			Assert.AreEqual( null, setup.PrivateBinPath, "PrivateBinPath" );
-			Assert.AreEqual( Environment.CurrentDirectory, setup.ShadowCopyDirectories, "ShadowCopyDirectories" );
+			Assert.AreEqual( Path.GetDirectoryName(mockDll), setup.ShadowCopyDirectories, "ShadowCopyDirectories" );
 
-			Assert.AreEqual( Environment.CurrentDirectory, domain.BaseDirectory, "BaseDirectory" );
-			Assert.AreEqual( "domain-mock-assembly.dll", domain.FriendlyName, "FriendlyName" );
+			Assert.AreEqual( Path.GetDirectoryName(mockDll), domain.BaseDirectory, "BaseDirectory" );
+            Assert.That(domain.FriendlyName, 
+                Is.EqualTo("test-domain-mock-assembly.dll").IgnoreCase, "FriendlyName");
 			Assert.IsTrue( testDomain.AppDomain.ShadowCopyFiles, "ShadowCopyFiles" );
 		}	
 
@@ -65,12 +70,13 @@ namespace NUnit.Util.Tests
 		{
 			TestResult result = testDomain.Run( NullListener.NULL );
 			Assert.IsNotNull(result);
-			Assert.AreEqual(false, result.IsFailure, "Test run failed");
-			
-			ResultSummarizer summarizer = new ResultSummarizer(result);
-			Assert.AreEqual(MockAssembly.Tests - MockAssembly.NotRun, summarizer.ResultCount);
-			Assert.AreEqual(MockAssembly.Ignored, summarizer.TestsNotRun);
-		}
+
+            ResultSummarizer summarizer = new ResultSummarizer(result);
+            Assert.AreEqual(MockAssembly.TestsRun, summarizer.TestsRun, "TestsRun");
+            Assert.AreEqual(MockAssembly.Ignored, summarizer.Ignored, "Ignored");
+            Assert.AreEqual(MockAssembly.Errors, summarizer.Errors, "Errors");
+            Assert.AreEqual(MockAssembly.Failures, summarizer.Failures, "Failures");
+        }
 	}
 
 	[TestFixture]
@@ -87,6 +93,7 @@ namespace NUnit.Util.Tests
 	public class TestDomainTests
 	{ 
 		private TestDomain testDomain;
+        private static readonly string mockDll = MockAssembly.AssemblyPath;
 
 		[SetUp]
 		public void SetUp()
@@ -104,13 +111,13 @@ namespace NUnit.Util.Tests
 		[ExpectedException(typeof(FileNotFoundException))]
 		public void FileNotFound()
 		{
-			testDomain.Load( new TestPackage( "xxxx.dll" ) );
+			testDomain.Load( new TestPackage( "/xxxx.dll" ) );
 		}
 
 		[Test]
 		public void InvalidTestFixture()
 		{
-			TestPackage package = new TestPackage( "mock-assembly.dll" );
+			TestPackage package = new TestPackage(mockDll);
 			package.TestName = "NUnit.Tests.Assemblies.Bogus";
 			Assert.IsFalse( testDomain.Load( package ) );
 		}
@@ -120,8 +127,7 @@ namespace NUnit.Util.Tests
 		//[ExpectedException(typeof(BadImageFormatException))]
 		public void FileFoundButNotValidAssembly()
 		{
-			string badfile = "x.dll";
-			//FileInfo file = new FileInfo( badfile );
+			string badfile = Path.GetFullPath("x.dll");
 			try
 			{
 				StreamWriter sw = new StreamWriter( badfile );
@@ -144,23 +150,24 @@ namespace NUnit.Util.Tests
 		[Test]
 		public void SpecificTestFixture()
 		{
-			TestPackage package = new TestPackage( "mock-assembly.dll" );
+			TestPackage package = new TestPackage(mockDll);
 			package.TestName = "NUnit.Tests.Assemblies.MockTestFixture";
 			testDomain.Load( package );
 
 			TestResult result = testDomain.Run( NullListener.NULL );
-			Assert.AreEqual(true, result.IsSuccess);
-			
-			ResultSummarizer summarizer = new ResultSummarizer(result);
-			Assert.AreEqual(MockTestFixture.Tests - MockTestFixture.NotRun, summarizer.ResultCount);
-			Assert.AreEqual(MockTestFixture.Ignored, summarizer.TestsNotRun);
-		}
+
+            ResultSummarizer summarizer = new ResultSummarizer(result);
+            Assert.AreEqual(MockTestFixture.TestsRun, summarizer.TestsRun, "TestsRun");
+            Assert.AreEqual(MockTestFixture.Ignored, summarizer.Ignored, "Ignored");
+            Assert.AreEqual(MockTestFixture.Errors, summarizer.Errors, "Errors");
+            Assert.AreEqual(MockTestFixture.Failures, summarizer.Failures, "Failures");
+        }
 
 		[Test]
 		public void ConfigFileOverrideIsHonored()
 		{
 			TestPackage package = new TestPackage( "MyProject.nunit" );
-			package.Assemblies.Add( "mock-assembly.dll" );
+			package.Assemblies.Add(mockDll);
 			package.ConfigurationFile = "override.config";
 
 			testDomain.Load( package );
@@ -173,7 +180,7 @@ namespace NUnit.Util.Tests
 		public void BasePathOverrideIsHonored()
 		{
 			TestPackage package = new TestPackage( "MyProject.nunit" );
-			package.Assemblies.Add( "mock-assembly.dll" );
+			package.Assemblies.Add( MockAssembly.AssemblyPath );
 			package.BasePath = Path.GetDirectoryName( Environment.CurrentDirectory );
 			package.PrivateBinPath = Path.GetFileName( Environment.CurrentDirectory );
 
@@ -186,7 +193,7 @@ namespace NUnit.Util.Tests
 		public void BinPathOverrideIsHonored()
 		{
 			TestPackage package = new TestPackage( "MyProject.nunit" );
-			package.Assemblies.Add( "mock-assembly.dll" );
+			package.Assemblies.Add( MockAssembly.AssemblyPath );
 			package.PrivateBinPath = "dummy;junk";
 
 			testDomain.Load( package );
@@ -198,10 +205,10 @@ namespace NUnit.Util.Tests
 		// Turning off shadow copy only works when done for the primary app domain
 		// So this test can only work if it's already off
 		// This doesn't seem to be documented anywhere
-		[Test]
+		[Test, Platform(Exclude="mono-1.0", Reason="Test hangs under the 1.0 profile")]
 		public void TurnOffShadowCopy()
 		{
-			TestPackage package = new TestPackage( "mock-assembly.dll" );
+			TestPackage package = new TestPackage(mockDll);
 			package.Settings["ShadowCopyFiles"] = false;
 			testDomain.Load( package );
 			Assert.IsFalse( testDomain.AppDomain.ShadowCopyFiles );
diff --git a/src/ClientUtilities/tests/TestDomainTests_Multiple.cs b/src/ClientUtilities/tests/TestDomainTests_Multiple.cs
index 80e4c39..321c992 100644
--- a/src/ClientUtilities/tests/TestDomainTests_Multiple.cs
+++ b/src/ClientUtilities/tests/TestDomainTests_Multiple.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System.IO;
@@ -20,8 +20,8 @@ namespace NUnit.Util.Tests
 		private TestDomain domain; 
 		private ITest loadedSuite;
 
-		private static string path1 = Path.GetFullPath( "nonamespace-assembly.dll" );
-		private static string path2 = Path.GetFullPath( "mock-assembly.dll" );
+		private static string path1 = NoNamespaceTestFixture.AssemblyPath;
+		private static string path2 = MockAssembly.AssemblyPath;
 
 		private string name = "Multiple Assemblies Test";
 
@@ -77,8 +77,8 @@ namespace NUnit.Util.Tests
 			TestResult result = domain.Run(NullListener.NULL);
 			ResultSummarizer summary = new ResultSummarizer(result);
 			Assert.AreEqual(
-				NoNamespaceTestFixture.Tests + MockAssembly.Tests - MockAssembly.NotRun, 
-				summary.ResultCount);
+				NoNamespaceTestFixture.Tests + MockAssembly.TestsRun, 
+				summary.TestsRun);
 		}
 	}
 
@@ -90,9 +90,9 @@ namespace NUnit.Util.Tests
 		{
 			TestDomain domain = new TestDomain();
 			TestPackage package = new TestPackage( "Multiple Assemblies Test" );
-			package.Assemblies.Add( Path.GetFullPath( "nonamespace-assembly.dll" ) );
-			package.Assemblies.Add( Path.GetFullPath( "mock-assembly.dll" ) );
-			package.TestName = "NUnit.Tests.Assemblies.MockTestFixture";
+			package.Assemblies.Add(NoNamespaceTestFixture.AssemblyPath);
+			package.Assemblies.Add(MockAssembly.AssemblyPath);
+            package.TestName = "NUnit.Tests.Assemblies.MockTestFixture";
             try
             {
                 domain.Load(package);
diff --git a/src/ClientUtilities/tests/TestEventCatcher.cs b/src/ClientUtilities/tests/TestEventCatcher.cs
index 3ed5a63..b42da34 100644
--- a/src/ClientUtilities/tests/TestEventCatcher.cs
+++ b/src/ClientUtilities/tests/TestEventCatcher.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -30,6 +30,8 @@ namespace NUnit.Util.Tests
 
 		private TestEventArgsCollection events;
 
+        public bool GotRunFinished = false;
+
 		public TestEventCatcher( ITestEvents source )
 		{
 			events = new TestEventArgsCollection();
@@ -71,6 +73,8 @@ namespace NUnit.Util.Tests
 		private void OnTestEvent( object sender, TestEventArgs e )
 		{
 			events.Add( e );
+            if (e.Action == TestAction.RunFinished)
+                GotRunFinished = true;
 		}
 	}
 }
diff --git a/src/ClientUtilities/tests/TestLoaderAssemblyTests.cs b/src/ClientUtilities/tests/TestLoaderAssemblyTests.cs
index ad07d1e..aac05d6 100644
--- a/src/ClientUtilities/tests/TestLoaderAssemblyTests.cs
+++ b/src/ClientUtilities/tests/TestLoaderAssemblyTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -19,8 +19,8 @@ namespace NUnit.Util.Tests
 	[TestFixture]
 	public class TestLoaderAssemblyTests
 	{
-		private readonly string assembly = "mock-assembly.dll";
-		private readonly string badFile = "x.dll";
+		private readonly string assembly = MockAssembly.AssemblyPath;
+		private readonly string badFile = "/x.dll";
 
 		private TestLoader loader;
 		private TestEventCatcher catcher;
@@ -36,10 +36,6 @@ namespace NUnit.Util.Tests
 		public void SetUp()
 		{
 			loader = new TestLoader( );
-			loader.MergeAssemblies = false;
-			loader.AutoNamespaceSuites = true;
-			loader.MultiDomain = false;
-
 			catcher = new TestEventCatcher( loader.Events );
 		}
 
@@ -139,9 +135,9 @@ namespace NUnit.Util.Tests
 		[Test]
 		public void AssemblyWithNoTests()
 		{
-			LoadTest( "notestfixtures-assembly.dll" );
+			LoadTest( "nunit.framework.dll" );
 			Assert.IsTrue( loader.IsProjectLoaded, "Project not loaded" );
-			Assert.IsTrue( loader.IsTestLoaded, "Test should be loaded" );
+			Assert.IsTrue( loader.IsTestLoaded, "Test not loaded" );
 			Assert.AreEqual( 4, catcher.Events.Count );
 			Assert.AreEqual( TestAction.TestLoaded, ((TestEventArgs)catcher.Events[3]).Action );
 		}
@@ -151,7 +147,7 @@ namespace NUnit.Util.Tests
 		[Test]
 		public void RunTest()
 		{
-			loader.ReloadOnRun = false;
+            //loader.ReloadOnRun = false;
 			
 			LoadTest( assembly );
 			loader.RunTests();
@@ -160,11 +156,21 @@ namespace NUnit.Util.Tests
 				// TODO: Find a more robust way of handling this
 				Thread.Sleep( 500 );
 			}
-			while( loader.Running );
-			
-			Assert.AreEqual( 48, catcher.Events.Count );
-			Assert.AreEqual( TestAction.RunStarting, ((TestEventArgs)catcher.Events[4]).Action );
-			Assert.AreEqual( TestAction.RunFinished, ((TestEventArgs)catcher.Events[47]).Action );
+			while( !catcher.GotRunFinished );
+
+            Assert.AreEqual(TestAction.ProjectLoading, ((TestEventArgs)catcher.Events[0]).Action);
+            Assert.AreEqual(TestAction.ProjectLoaded, ((TestEventArgs)catcher.Events[1]).Action);
+            Assert.AreEqual(TestAction.TestLoading, ((TestEventArgs)catcher.Events[2]).Action);
+            Assert.AreEqual(TestAction.TestLoaded, ((TestEventArgs)catcher.Events[3]).Action);
+            Assert.AreEqual(TestAction.RunStarting, ((TestEventArgs)catcher.Events[4]).Action);
+
+            int eventCount = 4 /* for loading */+ 2 * (MockAssembly.Nodes - MockAssembly.Explicit);
+            if (eventCount != catcher.Events.Count)
+                foreach (TestEventArgs e in catcher.Events)
+                    Console.WriteLine(e.Action);
+            Assert.AreEqual(eventCount, catcher.Events.Count);
+
+            Assert.AreEqual(TestAction.RunFinished, ((TestEventArgs)catcher.Events[eventCount - 1]).Action);
 
 			int nTests = 0;
 			int nRun = 0;
@@ -179,8 +185,8 @@ namespace NUnit.Util.Tests
 						++nRun;
 				}
 			}
-			Assert.AreEqual( MockAssembly.Tests - MockAssembly.Explicit, nTests );
-			Assert.AreEqual( MockAssembly.Tests - MockAssembly.NotRun, nRun );
+			Assert.AreEqual( MockAssembly.ResultCount, nTests );
+			Assert.AreEqual( MockAssembly.TestsRun, nRun );
 		}
 	}
 }
diff --git a/src/ClientUtilities/tests/TestLoaderWatcherTests.cs b/src/ClientUtilities/tests/TestLoaderWatcherTests.cs
new file mode 100644
index 0000000..87ad040
--- /dev/null
+++ b/src/ClientUtilities/tests/TestLoaderWatcherTests.cs
@@ -0,0 +1,167 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using NUnit.Tests.Assemblies;
+
+namespace NUnit.Util.Tests
+{
+	[TestFixture]
+	public class TestLoaderWatcherTests
+	{
+		private readonly string assembly = MockAssembly.AssemblyPath;
+		private MockAssemblyWatcher2 mockWatcher;
+		private ITestLoader testLoader;
+		private const string ReloadOnChangeSetting = "Options.TestLoader.ReloadOnChange";
+
+		[SetUp]
+		public void PreprareTestLoader()
+		{
+			// arrange
+			mockWatcher = new MockAssemblyWatcher2();
+			testLoader = new TestLoader(mockWatcher);
+			testLoader.LoadProject(assembly);
+		}
+
+		[TearDown]
+		public void CleanUpSettings()
+		{
+			Services.UserSettings.RemoveSetting(ReloadOnChangeSetting);
+		}
+
+		private void AssertWatcherIsPrepared()
+		{
+			Assert.IsTrue(mockWatcher.IsWatching);
+			CollectionAssert.AreEquivalent(new string[] { assembly }, mockWatcher.AssembliesToWatch);
+		}
+
+		[Test]
+		public void LoadShouldStartWatcher()
+		{
+			// act
+			testLoader.LoadTest();
+
+			// assert
+			AssertWatcherIsPrepared();
+            Assert.AreEqual(1, mockWatcher.DelegateCount);
+        }
+
+		[Test]
+		public void ReloadShouldStartWatcher()
+		{
+			// arrange
+			testLoader.LoadTest();
+			mockWatcher.AssembliesToWatch = null;
+			mockWatcher.IsWatching = false;
+
+			// act
+			testLoader.ReloadTest();
+
+			// assert
+			AssertWatcherIsPrepared();
+            Assert.AreEqual(1, mockWatcher.DelegateCount);
+        }
+
+		[Test]
+		public void UnloadShouldStopWatcherAndFreeResources()
+		{
+			// act
+			testLoader.LoadTest();
+			testLoader.UnloadTest();
+
+			// assert
+			Assert.IsFalse(mockWatcher.IsWatching);
+			Assert.IsTrue(mockWatcher.AreResourcesFreed);
+            Assert.AreEqual(0, mockWatcher.DelegateCount);
+        }
+
+		[Test]
+		public void LoadShouldStartWatcherDependingOnSettings()
+		{
+			// arrange
+			Services.UserSettings.SaveSetting(ReloadOnChangeSetting, false);
+			testLoader.LoadTest();
+
+			// assert
+			Assert.IsFalse(mockWatcher.IsWatching);
+            Assert.AreEqual(0, mockWatcher.DelegateCount);
+        }
+
+		[Test]
+		public void ReloadShouldStartWatcherDependingOnSettings()
+		{
+			// arrange
+			Services.UserSettings.SaveSetting(ReloadOnChangeSetting, false);
+			testLoader.LoadTest();
+			testLoader.ReloadTest();
+
+			// assert
+			Assert.IsFalse(mockWatcher.IsWatching);
+            Assert.AreEqual(0, mockWatcher.DelegateCount);
+        }
+	}
+
+	internal class MockAssemblyWatcher2 : IAssemblyWatcher
+	{
+		public bool IsWatching;
+#if NET_2_0 || NET_4_0
+        public System.Collections.Generic.IList<string> AssembliesToWatch;
+#else
+		public System.Collections.IList AssembliesToWatch;
+#endif
+		public bool AreResourcesFreed;
+
+		public void Stop()
+		{
+			IsWatching = false;
+		}
+
+		public void Start()
+		{
+			IsWatching = true;
+		}
+
+#if NET_2_0 || NET_4_0
+		public void Setup(int delayInMs, System.Collections.Generic.IList<string> assemblies)
+#else
+        public void Setup(int delayInMs, System.Collections.IList assemblies)
+#endif
+		{
+			AssembliesToWatch = assemblies;
+		}
+
+		public void Setup(int delayInMs, string assemblyFileName)
+		{
+			Setup(delayInMs, new string[] {assemblyFileName});
+		}
+
+		public void FreeResources()
+		{
+			AreResourcesFreed = true;
+		}
+
+        // This method is not used. It exists only to supress a 
+        // warning about AssemblyChanged never being used
+        public void FireAssemblyChanged(string path)
+        {
+            if (AssemblyChanged != null)
+                AssemblyChanged(path);
+        }
+
+        public int DelegateCount
+        {
+            get 
+            { 
+                return AssemblyChanged == null
+                    ? 0
+                    : AssemblyChanged.GetInvocationList().Length; 
+            }
+        }
+
+		public event AssemblyChangedHandler AssemblyChanged;
+    }
+}
\ No newline at end of file
diff --git a/src/ClientUtilities/tests/TestRunnerFactoryTests.cs b/src/ClientUtilities/tests/TestRunnerFactoryTests.cs
new file mode 100644
index 0000000..ce3e2e6
--- /dev/null
+++ b/src/ClientUtilities/tests/TestRunnerFactoryTests.cs
@@ -0,0 +1,46 @@
+using System;
+using NUnit.Core;
+using NUnit.Framework;
+
+namespace NUnit.Util.Tests
+{
+    [TestFixture]
+    public class TestRunnerFactoryTests
+    {
+        private RuntimeFramework currentFramework = RuntimeFramework.CurrentFramework;
+        private string testDll = "/test.dll";
+        private DefaultTestRunnerFactory factory;
+        private TestPackage package;
+
+        [SetUp]
+        public void Init()
+        {
+            factory = new DefaultTestRunnerFactory();
+            package = new TestPackage(testDll);
+        }
+
+        [Test]
+        public void SameFrameworkUsesTestDomain()
+        {
+            package.Settings["RuntimeFramework"] = currentFramework;
+            Assert.That( factory.MakeTestRunner(package), Is.TypeOf(typeof(TestDomain)));
+        }
+
+        [Test]
+        public void DifferentRuntimeUsesProcessRunner()
+        {
+            RuntimeType runtime = currentFramework.Runtime == RuntimeType.Net
+                ? RuntimeType.Mono : RuntimeType.Net;
+            package.Settings["RuntimeFramework"] = new RuntimeFramework(runtime, currentFramework.ClrVersion);
+            Assert.That(factory.MakeTestRunner(package), Is.TypeOf(typeof(ProcessRunner)));
+        }
+
+        [Test]
+        public void DifferentVersionUsesProcessRunner()
+        {
+            int major = currentFramework.ClrVersion.Major == 2 ? 4 : 2;
+            package.Settings["RuntimeFramework"] = new RuntimeFramework(currentFramework.Runtime, new Version(major,0));
+            Assert.That(factory.MakeTestRunner(package), Is.TypeOf(typeof(ProcessRunner)));
+        }
+    }
+}
diff --git a/src/ClientUtilities/tests/TestServerTests.cs b/src/ClientUtilities/tests/TestServerTests.cs
index dd4535a..3c9341b 100644
--- a/src/ClientUtilities/tests/TestServerTests.cs
+++ b/src/ClientUtilities/tests/TestServerTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 using System.IO;
@@ -18,63 +18,63 @@ namespace NUnit.Util.Tests
 	/// Summary description for TestServerTests.
 	/// </summary>
 	// Exclude for release [TestFixture,Platform(Exclude="Mono")]
-	public class TestServerTests
-	{
-		private string serverPath = "nunit-server.exe";
+    //public class TestServerTests
+    //{
+    //    private string serverPath = "nunit-server.exe";
 
-		[TestFixtureSetUp]
-		public void SetServerPath()
-		{
-			if ( File.Exists(serverPath) )
-				return;
+    //    [TestFixtureSetUp]
+    //    public void SetServerPath()
+    //    {
+    //        if ( File.Exists(serverPath) )
+    //            return;
 
-			DirectoryInfo cwd = new DirectoryInfo( Environment.CurrentDirectory );
-			if( cwd.Parent.Name == "bin" )
-			{
-				string path = cwd.Parent.Parent.Parent.Parent.FullName;
-				path = Path.Combine( path, "NUnitTestServer" );
-				path = Path.Combine( path, "nunit-server-exe" );
-				path = Path.Combine( path, "bin" );
-				path = Path.Combine( path, cwd.Name );
-				path = Path.Combine( path, "nunit-server.exe" );
-				if( File.Exists( path ) )
-				{
-					serverPath = path;
-					return;
-				}
-			}
+    //        DirectoryInfo cwd = new DirectoryInfo( Environment.CurrentDirectory );
+    //        if( cwd.Parent.Name == "bin" )
+    //        {
+    //            string path = cwd.Parent.Parent.Parent.Parent.FullName;
+    //            path = Path.Combine( path, "NUnitTestServer" );
+    //            path = Path.Combine( path, "nunit-server-exe" );
+    //            path = Path.Combine( path, "bin" );
+    //            path = Path.Combine( path, cwd.Name );
+    //            path = Path.Combine( path, "nunit-server.exe" );
+    //            if( File.Exists( path ) )
+    //            {
+    //                serverPath = path;
+    //                return;
+    //            }
+    //        }
 
-			Assert.Fail( "Unable to find server" );
-		}
+    //        Assert.Fail( "Unable to find server" );
+    //    }
 
-		[Test]
-		public void CanConnect()
-		{
-			using( TestServer server = new TestServer( "TestServer", 9000 ) )
-			{
-				server.Start();
-				object obj = Activator.GetObject( typeof(TestRunner), ServerUtilities.MakeUrl("TestServer", 9000) );
-				Assert.IsNotNull( obj, "Unable to connect" );
-			}
-		}
+    //    [Test]
+    //    public void CanConnect()
+    //    {
+    //        using( TestServer server = new TestServer( "TestServer", 9000 ) )
+    //        {
+    //            server.Start();
+    //            object obj = Activator.GetObject( typeof(TestRunner), ServerUtilities.MakeUrl("TestServer", 9000) );
+    //            Assert.IsNotNull( obj, "Unable to connect" );
+    //        }
+    //    }
 
-		[Test]
-		public void CanConnectOutOfProcess()
-		{
-			Process process = null;
-			try
-			{
-				process = Process.Start( serverPath, "TestServer" );
-				System.Threading.Thread.Sleep( 1000 );
-				TestServer server = (TestServer)Activator.GetObject( typeof(TestRunner), "tcp://localhost:9000/TestServer" );
-				Assert.IsNotNull( server, "Unable to connect" );
-				server.Stop();
-			}
-			finally
-			{
-				if ( process != null && !process.HasExited )
-					process.Kill();
-			}
-		}
-	}
+    //    [Test]
+    //    public void CanConnectOutOfProcess()
+    //    {
+    //        Process process = null;
+    //        try
+    //        {
+    //            process = Process.Start( serverPath, "TestServer" );
+    //            System.Threading.Thread.Sleep( 1000 );
+    //            TestServer server = (TestServer)Activator.GetObject( typeof(TestRunner), "tcp://localhost:9000/TestServer" );
+    //            Assert.IsNotNull( server, "Unable to connect" );
+    //            server.Stop();
+    //        }
+    //        finally
+    //        {
+    //            if ( process != null && !process.HasExited )
+    //                process.Kill();
+    //        }
+    //    }
+    //}
 }
diff --git a/src/ClientUtilities/tests/VSProjectTests.cs b/src/ClientUtilities/tests/VSProjectTests.cs
index 5ffc392..ef0751d 100644
--- a/src/ClientUtilities/tests/VSProjectTests.cs
+++ b/src/ClientUtilities/tests/VSProjectTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -55,7 +55,7 @@ namespace NUnit.Util.Tests
 			Assert.IsFalse(VSProject.IsProjectFile( @"\MyProject\http://localhost/web.csproj") );
 		}
 
-		private void AssertCanLoadProject( string resourceName, params string[] configNames )
+		private void AssertCanLoadProject( string resourceName )
 		{
 			string fileName = Path.GetFileNameWithoutExtension( resourceName );
 			using( TempResourceFile file = new TempResourceFile( this.GetType(), resourceDir + "." + resourceName, resourceName ) )
@@ -64,87 +64,62 @@ namespace NUnit.Util.Tests
 				Assert.AreEqual( fileName, project.Name );
 				Assert.AreEqual( Path.GetFullPath( file.Path ), project.ProjectPath );
 				Assert.AreEqual( fileName.ToLower(), Path.GetFileNameWithoutExtension( project.Configs[0].Assemblies[0].ToString().ToLower() ) );
-				if ( configNames != null )
-				{
-					Assert.AreEqual( configNames.Length, project.Configs.Count );
-					for( int index = 0; index < configNames.Length; index++ )
-						Assert.AreEqual( configNames[index], project.Configs[index].Name );
-				}
 			}
 		}
 
 		[Test]
 		public void LoadCsharpProject()
 		{
-			AssertCanLoadProject( "csharp-sample.csproj", "Debug", "Release" );
+			AssertCanLoadProject( "csharp-sample.csproj" );
 		}
 
 		[Test]
 		public void LoadCsharpProjectVS2005()
 		{
-			AssertCanLoadProject( "csharp-sample_VS2005.csproj", "Debug", "Release" );
-		}
-
-        [Test]
-        public void LoadCsharpProjectVS2005WithoutPlatforms()
-        {
-            AssertCanLoadProject("csharp-sample_VS2005_noplatform.csproj", "Debug", "Release" );
-        }
-
-		[Test]
-		public void LoadCsharpProjectWithMultiplePlatforms()
-		{
-			AssertCanLoadProject( "MultiplePlatformProject.csproj", "Debug", "Release",
-				"Debug|x64", "Release|x64", "Debug|x86", "Release|x86" );
-		}
-
-		[Test]
-		public void LoadXNAWindowsProject()
-		{
-			AssertCanLoadProject("XNAWindowsProject.csproj", "Debug|x86", "Release|x86" );
+			AssertCanLoadProject( "csharp-sample_VS2005.csproj" );
 		}
 
 		[Test]
 		public void LoadVbProject()
 		{
-			AssertCanLoadProject( "vb-sample.vbproj", "Debug", "Release" );
+			AssertCanLoadProject( "vb-sample.vbproj" );
 		}
 
 
 		[Test]
 		public void LoadVbProjectVS2005()
 		{
-			AssertCanLoadProject( "vb-sample_VS2005.vbproj", "Debug", "Release" );
+			AssertCanLoadProject( "vb-sample_VS2005.vbproj" );
 		}
 
 		[Test]
 		public void LoadJsharpProject()
 		{
-			AssertCanLoadProject( "jsharp.vjsproj", "Debug", "Release" );
+			AssertCanLoadProject( "jsharp.vjsproj" );
 		}
 
 		[Test]
 		public void LoadJsharpProjectVS2005()
 		{
-			AssertCanLoadProject( "jsharp_VS2005.vjsproj", "Debug", "Release" );
+			AssertCanLoadProject( "jsharp_VS2005.vjsproj" );
 		}
 
 		[Test]
 		public void LoadCppProject()
 		{
-			AssertCanLoadProject( "cpp-sample.vcproj", "Debug|Win32", "Release|Win32" );
+			AssertCanLoadProject( "cpp-sample.vcproj" );
 		}
 
 		[Test]
 		public void LoadCppProjectVS2005()
 		{
-			AssertCanLoadProject( "cpp-sample_VS2005.vcproj", "Debug|Win32", "Release|Win32" );
+			AssertCanLoadProject( "cpp-sample_VS2005.vcproj" );
 		}
 
 		[Test]
 		public void LoadProjectWithHebrewFileIncluded()
 		{
-			AssertCanLoadProject( "HebrewFileProblem.csproj", "Debug", "Release" );
+			AssertCanLoadProject( "HebrewFileProblem.csproj" );
 		}
 
 		[Test]
diff --git a/src/ClientUtilities/tests/VisualStudioConverterTests.cs b/src/ClientUtilities/tests/VisualStudioConverterTests.cs
new file mode 100644
index 0000000..2497afe
--- /dev/null
+++ b/src/ClientUtilities/tests/VisualStudioConverterTests.cs
@@ -0,0 +1,153 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.IO;
+using NUnit.Framework;
+using NUnit.TestUtilities;
+using NUnit.Util.ProjectConverters;
+
+namespace NUnit.Util.Tests
+{
+	[TestFixture]
+	public class VisualStudioConverterTests
+	{
+		static readonly string resourceDir = "resources";
+
+		private VisualStudioConverter converter;
+		
+		private void AssertCanLoadVsProject( string resourceName )
+		{
+			string fileName = Path.GetFileNameWithoutExtension( resourceName );
+			using( TempResourceFile file = new TempResourceFile( this.GetType(), resourceDir + "." + resourceName, resourceName ) )
+			{
+				NUnitProject project = converter.ConvertFrom( file.Path );
+				Assert.AreEqual( fileName, project.Name );
+				Assert.AreEqual( project.Configs[0].Name, project.ActiveConfigName );
+				Assert.AreEqual( fileName.ToLower(), Path.GetFileNameWithoutExtension( project.Configs[0].Assemblies[0].ToLower() ) );
+				Assert.IsTrue( project.IsLoadable, "Not loadable" );
+				Assert.IsFalse( project.IsDirty, "Project should not be dirty" );
+			}
+		}
+
+		[SetUp]
+		public void CreateImporter()
+		{
+			converter = new VisualStudioConverter();
+		}
+
+		[Test]
+		public void FromCSharpProject()
+		{
+			AssertCanLoadVsProject( "csharp-sample.csproj" );
+		}
+
+		[Test]
+		public void FromVBProject()
+		{
+			AssertCanLoadVsProject( "vb-sample.vbproj" );
+		}
+
+		[Test]
+		public void FromJsharpProject()
+		{
+			AssertCanLoadVsProject( "jsharp.vjsproj" );
+		}
+
+		[Test]
+		public void FromCppProject()
+		{
+			AssertCanLoadVsProject( "cpp-sample.vcproj" );
+		}
+
+		[Test]
+		public void FromProjectWithHebrewFileIncluded()
+		{
+			AssertCanLoadVsProject( "HebrewFileProblem.csproj" );
+		}
+
+		[Test]
+		public void FromVSSolution2003()
+		{
+			using(new TempResourceFile(this.GetType(), "resources.csharp-sample.csproj", @"csharp\csharp-sample.csproj"))
+			using(new TempResourceFile(this.GetType(), "resources.jsharp.vjsproj", @"jsharp\jsharp.vjsproj"))
+			using(new TempResourceFile(this.GetType(), "resources.vb-sample.vbproj", @"vb\vb-sample.vbproj"))
+			using(new TempResourceFile(this.GetType(), "resources.cpp-sample.vcproj", @"cpp-sample\cpp-sample.vcproj"))
+			using(TempResourceFile file = new TempResourceFile(this.GetType(), "resources.samples.sln", "samples.sln" ))
+			{
+				NUnitProject project = converter.ConvertFrom( file.Path );
+				Assert.AreEqual( 4, project.Configs.Count );
+				Assert.AreEqual( 3, project.Configs["Debug"].Assemblies.Count );
+				Assert.AreEqual( 3, project.Configs["Release"].Assemblies.Count );
+				Assert.AreEqual( 1, project.Configs["Debug|Win32"].Assemblies.Count );
+				Assert.AreEqual( 1, project.Configs["Release|Win32"].Assemblies.Count );
+				Assert.IsTrue( project.IsLoadable, "Not loadable" );
+				Assert.IsFalse( project.IsDirty, "Project should not be dirty" );
+			}
+		}
+
+		[Test]
+		public void FromVSSolution2005()
+		{
+			using(new TempResourceFile(this.GetType(), "resources.csharp-sample_VS2005.csproj", @"csharp\csharp-sample_VS2005.csproj"))
+			using(new TempResourceFile(this.GetType(), "resources.jsharp_VS2005.vjsproj", @"jsharp\jsharp_VS2005.vjsproj"))
+			using(new TempResourceFile(this.GetType(), "resources.vb-sample_VS2005.vbproj", @"vb\vb-sample_VS2005.vbproj"))
+			using(new TempResourceFile(this.GetType(), "resources.cpp-sample_VS2005.vcproj", @"cpp-sample\cpp-sample_VS2005.vcproj"))
+			using(TempResourceFile file = new TempResourceFile(this.GetType(), "resources.samples_VS2005.sln", "samples_VS2005.sln"))
+			{
+				NUnitProject project = converter.ConvertFrom( file.Path );
+				Assert.AreEqual( 4, project.Configs.Count );
+				Assert.AreEqual( 3, project.Configs["Debug"].Assemblies.Count );
+				Assert.AreEqual( 3, project.Configs["Release"].Assemblies.Count );
+				Assert.AreEqual( 1, project.Configs["Debug|Win32"].Assemblies.Count );
+				Assert.AreEqual( 1, project.Configs["Release|Win32"].Assemblies.Count );
+				Assert.IsTrue( project.IsLoadable, "Not loadable" );
+				Assert.IsFalse( project.IsDirty, "Project should not be dirty" );
+			}
+		}
+
+		[Test]
+		public void FromWebApplication()
+		{
+			using( new TempResourceFile(this.GetType(), "resources.ClassLibrary1.csproj", @"ClassLibrary1\ClassLibrary1.csproj" ) )
+			using( TempResourceFile file = new TempResourceFile( this.GetType(), "resources.WebApplication1.sln", "WebApplication1.sln" ) )
+			{
+				NUnitProject project = converter.ConvertFrom( Path.GetFullPath( file.Path ) );
+				Assert.AreEqual( 2, project.Configs.Count );
+				Assert.AreEqual( 1, project.Configs["Debug"].Assemblies.Count );
+				Assert.AreEqual( 1, project.Configs["Release"].Assemblies.Count );
+			}
+		}
+
+		[Test]
+		public void WithUnmanagedCpp()
+		{
+			using( new TempResourceFile( this.GetType(), "resources.ClassLibrary1.csproj", @"ClassLibrary1\ClassLibrary1.csproj" ) )
+			using( new TempResourceFile( this.GetType(), "resources.Unmanaged.vcproj", @"Unmanaged\Unmanaged.vcproj" ) )
+			using( TempResourceFile file = new TempResourceFile( this.GetType(), "resources.Solution1.sln", "Solution1.sln" ) ) 
+			{
+				NUnitProject project = converter.ConvertFrom( file.Path );
+				Assert.AreEqual( 4, project.Configs.Count );
+				Assert.AreEqual( 1, project.Configs["Debug"].Assemblies.Count );
+				Assert.AreEqual( 1, project.Configs["Release"].Assemblies.Count );
+				Assert.AreEqual( 1, project.Configs["Debug|Win32"].Assemblies.Count );
+				Assert.AreEqual( 1, project.Configs["Release|Win32"].Assemblies.Count );
+			}
+		}
+
+		[Test]
+		public void FromMakefileProject()
+		{
+			using( TempResourceFile file = new TempResourceFile( this.GetType(), "resources.MakeFileProject.vcproj", "MakeFileProject.vcproj" ) )
+			{
+				NUnitProject project = converter.ConvertFrom( file.Path );
+				Assert.AreEqual( 2, project.Configs.Count );
+				Assert.AreEqual( 1, project.Configs["Debug|Win32"].Assemblies.Count );
+				Assert.AreEqual( 1, project.Configs["Release|Win32"].Assemblies.Count );
+			}
+		}
+	}
+}
diff --git a/src/ClientUtilities/tests/XmlResultVisitorTest.cs b/src/ClientUtilities/tests/XmlResultVisitorTest.cs
deleted file mode 100644
index 978eaf9..0000000
--- a/src/ClientUtilities/tests/XmlResultVisitorTest.cs
+++ /dev/null
@@ -1,137 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-using System.Collections;
-using NUnit.Framework;
-using NUnit.Core;
-using System.IO;
-using System.Text;
-using System.Text.RegularExpressions;
-using System.Xml;
-using System.Globalization;
-
-namespace NUnit.Util.Tests
-{
-	[TestFixture]
-	public class XmlResultVisitorTest
-	{
-		private XmlDocument resultDoc;
-
-		[TestFixtureSetUp]
-		public void RunMockTests()
-		{
-			string testsDll = "mock-assembly.dll";
-			TestSuiteBuilder suiteBuilder = new TestSuiteBuilder();
-			Test suite = suiteBuilder.Build( new TestPackage( testsDll ) );
-
-			TestResult result = suite.Run(NullListener.NULL);
-			StringBuilder builder = new StringBuilder();
-			StringWriter writer = new StringWriter(builder);
-			XmlResultVisitor visitor = new XmlResultVisitor(writer, result);
-			result.Accept(visitor);
-			visitor.Write();
-
-			string resultXml = builder.ToString();
-
-			resultDoc = new XmlDocument();
-			resultDoc.LoadXml(resultXml);
-		}
-
-		[Test]
-		public void SuiteResultHasCategories()
-		{
-			XmlNodeList categories = resultDoc.SelectNodes("//test-suite[@name=\"MockTestFixture\"]/categories/category");
-			Assert.IsNotNull(categories);
-			Assert.AreEqual(1, categories.Count);
-			Assert.AreEqual("FixtureCategory", categories[0].Attributes["name"].Value);
-		}
-
-		[Test]
-		public void HasSingleCategory()
-		{
-			XmlNodeList categories = resultDoc.SelectNodes("//test-case[@name=\"NUnit.Tests.Assemblies.MockTestFixture.MockTest2\"]/categories/category");
-			Assert.IsNotNull(categories);
-			Assert.AreEqual(1, categories.Count);
-			Assert.AreEqual("MockCategory", categories[0].Attributes["name"].Value);
-		}
-
-		[Test]
-		public void HasSingleProperty()
-		{
-			XmlNodeList properties = resultDoc.SelectNodes("//test-case[@name=\"NUnit.Tests.Assemblies.MockTestFixture.MockTest2\"]/properties/property");
-			Assert.IsNotNull(properties);
-			Assert.AreEqual(1, properties.Count);
-			Assert.AreEqual("Severity",properties[0].Attributes["name"].Value);
-			Assert.AreEqual("Critical",properties[0].Attributes["value"].Value);
-		}
-
-		[Test]
-		public void HasMultipleCategories()
-		{
-			XmlNodeList categories = resultDoc.SelectNodes("//test-case[@name=\"NUnit.Tests.Assemblies.MockTestFixture.MockTest3\"]/categories/category");
-			Assert.IsNotNull(categories);
-			Assert.AreEqual(2, categories.Count);
-			ArrayList names = new ArrayList();
-			names.Add( categories[0].Attributes["name"].Value );
-			names.Add( categories [1].Attributes["name"].Value);
-			Assert.IsTrue( names.Contains( "AnotherCategory" ), "AnotherCategory" );
-			Assert.IsTrue( names.Contains( "MockCategory" ), "MockCategory" );
-		}
-
-		[Test]
-		public void HasMultipleProperties()
-		{
-			XmlNodeList properties = resultDoc.SelectNodes("//test-case[@name=\"NUnit.Tests.Assemblies.MockTestFixture.TestWithManyProperties\"]/properties/property");
-			Assert.IsNotNull(properties);
-			Assert.AreEqual(3, properties.Count);
-			Hashtable hash = new Hashtable();
-			foreach( XmlNode property in properties )
-				hash.Add( property.Attributes["name"].Value, property.Attributes["value"].Value );
-
-			Assert.AreEqual( "SomeClassName", hash["TargetMethod"] );
-			Assert.AreEqual( "5", hash["Size"] );
-			Assert.AreEqual( "System.Threading.Thread", hash["TargetType"] );
-		}
-
-		[Test]
-		public void TestHasEnvironmentInfo() 
-		{
-			XmlNode sysinfo = resultDoc.SelectSingleNode("//environment");
-			Assert.IsNotNull(sysinfo);
-			// In theory, we could do some validity checking on the values
-			// of the attributes, but that seems redundant.
-			Assert.IsNotNull(sysinfo.Attributes["nunit-version"]);
-			Assert.IsNotNull(sysinfo.Attributes["clr-version"]);
-			Assert.IsNotNull(sysinfo.Attributes["os-version"]);
-			Assert.IsNotNull(sysinfo.Attributes["platform"]);
-			Assert.IsNotNull(sysinfo.Attributes["cwd"]);
-			Assert.IsNotNull(sysinfo.Attributes["machine-name"]);
-			Assert.IsNotNull(sysinfo.Attributes["user"]);
-			Assert.IsNotNull(sysinfo.Attributes["user-domain"]);
-			
-		}
-
-		[Test]
-		public void TestHasCultureInfo() 
-		{
-			XmlNode cultureInfo = resultDoc.SelectSingleNode("//culture-info");
-			Assert.IsNotNull(cultureInfo);
-			Assert.IsNotNull(cultureInfo.Attributes["current-culture"]);
-			Assert.IsNotNull(cultureInfo.Attributes["current-uiculture"]);
-
-			String currentCulture = cultureInfo.Attributes["current-culture"].Value;
-			String currentUiCulture = cultureInfo.Attributes["current-uiculture"].Value;
-
-			String currentCultureOnMachine = CultureInfo.CurrentCulture.ToString();
-			String currentUiCultureOnMachine = CultureInfo.CurrentUICulture.ToString();
-			Assert.AreEqual(currentCultureOnMachine, currentCulture,
-				"Current Culture node did not contain the same culture name as the machine");
-			Assert.AreEqual(currentUiCultureOnMachine, currentUiCulture,
-				"Current UI Culture node did not contain the same Culture UI name as the machine");
-		}
-	}
-}
diff --git a/src/ClientUtilities/tests/XmlResultWriterTest.cs b/src/ClientUtilities/tests/XmlResultWriterTest.cs
new file mode 100644
index 0000000..b6f4d49
--- /dev/null
+++ b/src/ClientUtilities/tests/XmlResultWriterTest.cs
@@ -0,0 +1,200 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Framework;
+using NUnit.Core;
+using System.IO;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Xml;
+using System.Globalization;
+
+namespace NUnit.Util.Tests
+{
+	[TestFixture]
+	public class XmlResultWriterTest
+	{
+		private XmlDocument resultDoc;
+
+		[TestFixtureSetUp]
+		public void RunMockTests()
+		{
+			string testsDll = NUnit.Tests.Assemblies.MockAssembly.AssemblyPath;
+			TestSuiteBuilder suiteBuilder = new TestSuiteBuilder();
+			Test suite = suiteBuilder.Build( new TestPackage( testsDll ) );
+
+            TestResult result = suite.Run(NullListener.NULL, TestFilter.Empty);
+			StringBuilder builder = new StringBuilder();
+			new XmlResultWriter(new StringWriter(builder)).SaveTestResult(result);
+
+			string resultXml = builder.ToString();
+
+			resultDoc = new XmlDocument();
+			resultDoc.LoadXml(resultXml);
+		}
+
+        [Test, Explicit]
+        public void DemonstrateIllegalSequenceInMessage()
+        {
+            Assert.Fail("Deliberate failure to illustrate ]]> in message ");
+        }
+
+        [Test, Explicit]
+        public void DemonstrateIllegalSequenceAtEndOfMessage()
+        {
+            Assert.Fail("The CDATA was: <![CDATA[ My <xml> ]]>");
+        }
+
+        [Test]
+		public void SuiteResultHasCategories()
+		{
+			XmlNodeList categories = resultDoc.SelectNodes("//test-suite[@name=\"MockTestFixture\"]/categories/category");
+			Assert.IsNotNull(categories);
+			Assert.AreEqual(1, categories.Count);
+			Assert.AreEqual("FixtureCategory", categories[0].Attributes["name"].Value);
+		}
+
+		[Test]
+		public void HasSingleCategory()
+		{
+			XmlNodeList categories = resultDoc.SelectNodes("//test-case[@name=\"NUnit.Tests.Assemblies.MockTestFixture.MockTest2\"]/categories/category");
+			Assert.IsNotNull(categories);
+			Assert.AreEqual(1, categories.Count);
+			Assert.AreEqual("MockCategory", categories[0].Attributes["name"].Value);
+		}
+
+		[Test]
+		public void HasSingleProperty()
+		{
+			XmlNodeList properties = resultDoc.SelectNodes("//test-case[@name=\"NUnit.Tests.Assemblies.MockTestFixture.MockTest2\"]/properties/property[@name=\"Severity\"]");
+			Assert.IsNotNull(properties);
+			Assert.AreEqual(1, properties.Count);
+			Assert.AreEqual("Critical",properties[0].Attributes["value"].Value);
+		}
+
+		[Test]
+		public void HasMultipleCategories()
+		{
+			XmlNodeList categories = resultDoc.SelectNodes("//test-case[@name=\"NUnit.Tests.Assemblies.MockTestFixture.MockTest3\"]/categories/category[@name=\"MockCategory\"]");
+			Assert.IsNotNull(categories, "MockCategory not found");
+			categories = resultDoc.SelectNodes("//test-case[@name=\"NUnit.Tests.Assemblies.MockTestFixture.MockTest3\"]/categories/category[@name=\"AnotherCategory\"]");
+			Assert.IsNotNull(categories, "AnotherCategory not found");
+		}
+
+		[Test]
+		public void HasMultipleProperties()
+		{
+			XmlNodeList properties = resultDoc.SelectNodes("//test-case[@name=\"NUnit.Tests.Assemblies.MockTestFixture.TestWithManyProperties\"]/properties/property[@name=\"TargetMethod\"]");
+			Assert.AreEqual("SomeClassName", properties[0].Attributes["value"].Value);
+            //properties = resultDoc.SelectNodes("//test-case[@name=\"NUnit.Tests.Assemblies.MockTestFixture.TestWithManyProperties\"]/properties/property[@name=\"TargetType\"]");
+            //Assert.AreEqual("System.Threading.Thread", properties[0].Attributes["value"].Value);
+			properties = resultDoc.SelectNodes("//test-case[@name=\"NUnit.Tests.Assemblies.MockTestFixture.TestWithManyProperties\"]/properties/property[@name=\"Size\"]");
+			Assert.AreEqual("5", properties[0].Attributes["value"].Value);
+		}
+
+		[Test]
+		public void TestHasEnvironmentInfo() 
+		{
+            XmlNode sysinfo = resultDoc.SelectSingleNode("//environment");
+            Assert.IsNotNull(sysinfo);
+			// In theory, we could do some validity checking on the values
+			// of the attributes, but that seems redundant.
+			Assert.IsNotNull(sysinfo.Attributes["nunit-version"]);
+			Assert.IsNotNull(sysinfo.Attributes["clr-version"]);
+			Assert.IsNotNull(sysinfo.Attributes["os-version"]);
+			Assert.IsNotNull(sysinfo.Attributes["platform"]);
+			Assert.IsNotNull(sysinfo.Attributes["cwd"]);
+			Assert.IsNotNull(sysinfo.Attributes["machine-name"]);
+			Assert.IsNotNull(sysinfo.Attributes["user"]);
+			Assert.IsNotNull(sysinfo.Attributes["user-domain"]);
+			
+		}
+
+		[Test]
+		public void TestHasCultureInfo() 
+		{
+			XmlNode cultureInfo = resultDoc.SelectSingleNode("//culture-info");
+			Assert.IsNotNull(cultureInfo);
+			Assert.IsNotNull(cultureInfo.Attributes["current-culture"]);
+			Assert.IsNotNull(cultureInfo.Attributes["current-uiculture"]);
+
+			String currentCulture = cultureInfo.Attributes["current-culture"].Value;
+			String currentUiCulture = cultureInfo.Attributes["current-uiculture"].Value;
+
+			String currentCultureOnMachine = CultureInfo.CurrentCulture.ToString();
+			String currentUiCultureOnMachine = CultureInfo.CurrentUICulture.ToString();
+			Assert.AreEqual(currentCultureOnMachine, currentCulture,
+				"Current Culture node did not contain the same culture name as the machine");
+			Assert.AreEqual(currentUiCultureOnMachine, currentUiCulture,
+				"Current UI Culture node did not contain the same Culture UI name as the machine");
+		}
+
+        [Test]
+        public void FailingTestHasCorrectInformation()
+        {
+            XmlNode testNode = resultDoc.SelectSingleNode("//test-case[@name=\"NUnit.Tests.Assemblies.MockTestFixture.FailingTest\"]");
+            Assert.AreEqual("Failure", testNode.Attributes["result"].Value);
+            Assert.AreEqual("True", testNode.Attributes["executed"].Value);
+            Assert.AreEqual("False", testNode.Attributes["success"].Value);
+
+            XmlNode failureNode = testNode.SelectSingleNode("failure");
+            Assert.NotNull(failureNode, "No <failure> element");
+
+            XmlNode msgNode = failureNode.SelectSingleNode("message");
+            Assert.NotNull(msgNode, "No <message> element");
+            Assert.AreEqual("Intentional failure", msgNode.InnerText);
+
+            XmlNode stackNode = failureNode.SelectSingleNode("stack-trace");
+            Assert.NotNull(stackNode, "No <stack-trace> element");
+        }
+
+        [Test]
+        public void IgnoredTestHasCorrectInformation()
+        {
+            XmlNode testNode = resultDoc.SelectSingleNode("//test-case[@name=\"NUnit.Tests.Assemblies.MockTestFixture.MockTest4\"]");
+            Assert.AreEqual("Ignored", testNode.Attributes["result"].Value);
+            Assert.AreEqual("False", testNode.Attributes["executed"].Value);
+
+            XmlNode reasonNode = testNode.SelectSingleNode("reason");
+            Assert.NotNull(reasonNode, "No <reason> element");
+            XmlNode msgNode = reasonNode.SelectSingleNode("message");
+            Assert.NotNull(msgNode, "No <message> element");
+            Assert.AreEqual("ignoring this test method for now", msgNode.InnerText);
+        }
+
+        [Test]
+        public void PassingTestHasCorrectInformation()
+        {
+            XmlNode testNode = resultDoc.SelectSingleNode("//test-case[@name=\"NUnit.Tests.Assemblies.MockTestFixture.MockTest3\"]");
+            Assert.AreEqual("Success", testNode.Attributes["result"].Value);
+            Assert.AreEqual("True", testNode.Attributes["executed"].Value);
+            Assert.AreEqual("True", testNode.Attributes["success"].Value);
+
+            XmlNode reasonNode = testNode.SelectSingleNode("reason");
+            Assert.NotNull(reasonNode, "No <reason> element");
+            XmlNode msgNode = reasonNode.SelectSingleNode("message");
+            Assert.NotNull(msgNode, "No <message> element");
+            Assert.AreEqual("Succeeded!", msgNode.InnerText);
+        }
+
+        [Test]
+        public void InconclusiveTestHasCorrectInformation()
+        {
+            XmlNode testNode = resultDoc.SelectSingleNode("//test-case[@name=\"NUnit.Tests.Assemblies.MockTestFixture.InconclusiveTest\"]");
+            Assert.AreEqual("Inconclusive", testNode.Attributes["result"].Value);
+            Assert.AreEqual("True", testNode.Attributes["executed"].Value);
+            Assert.AreEqual("False", testNode.Attributes["success"].Value);
+
+            XmlNode reasonNode = testNode.SelectSingleNode("reason");
+            Assert.NotNull(reasonNode, "No <reason> element");
+            XmlNode msgNode = reasonNode.SelectSingleNode("message");
+            Assert.NotNull(msgNode, "No <message> element");
+            Assert.AreEqual("No valid data", msgNode.InnerText);
+        }
+	}
+}
diff --git a/src/ClientUtilities/tests/nunit.util.tests.build b/src/ClientUtilities/tests/nunit.util.tests.build
index 4023d1e..5412498 100644
--- a/src/ClientUtilities/tests/nunit.util.tests.build
+++ b/src/ClientUtilities/tests/nunit.util.tests.build
@@ -1,14 +1,11 @@
 <?xml version="1.0"?>
 <project name="NUnit.Util.Tests" default="build">
 
-  <target name="build">
-    <csc target="library" 
-       output="${current.build.dir}/nunit.util.tests.dll"
-       debug="${build.debug}" define="${build.defines}">
-      <sources>
+  <patternset id="source-files">
         <include name="AssemblyListTests.cs"/>
         <include name="CategoryParseTests.cs"/>
         <include name="CategoryManagerTest.cs"/>
+        <include name="DomainManagerTests.cs"/>
         <include name="EventDispatcherTests.cs"/>
         <include name="FileWatcherTest.cs"/>
         <include name="MemorySettingsStorageTests.cs"/>
@@ -20,12 +17,12 @@
         <include name="NUnitRegistryTests.cs"/>
         <include name="PathUtilTests.cs"/>
         <include name="ProcessRunnerTests.cs"/>
-        <include name="ProjectConfigCollectionTests.cs"/>
         <include name="ProjectConfigTests.cs"/>
         <include name="RecentFileEntryTests.cs"/>
         <include name="RecentFilesTests.cs"/>
         <include name="RegistrySettingsStorageTests.cs"/>
         <include name="RemoteTestResultTest.cs"/>
+        <include name="RuntimeFrameworkSelectorTests.cs"/>
         <include name="ServerUtilityTests.cs"/>
         <include name="ServiceManagerSetUpFixture.cs"/>
         <include name="SettingsGroupTests.cs"/>
@@ -35,35 +32,55 @@
         <include name="TestDomainFixture.cs"/>
         <include name="TestDomainTests_Multiple.cs"/>
         <include name="TestEventCatcher.cs"/>
+        <include name="TestLoaderWatcherTests.cs"/>
         <include name="TestLoaderAssemblyTests.cs"/>
+        <include name="TestRunnerFactoryTests.cs"/>
         <include name="TestServerTests.cs"/>
+        <include name="VisualStudioConverterTests.cs"/>
         <include name="VSProjectTests.cs"/>
-        <include name="XmlResultVisitorTest.cs"/>
-        <include name="../../CommonAssemblyInfo.cs"/>
+        <include name="XmlResultWriterTest.cs"/>
+  </patternset>
+
+  <patternset id="resource-files">
+    <include name="resources/*"/>
+  </patternset>
+
+  <target name="build">
+
+    <csc target="library" 
+       output="${current.test.dir}/nunit.util.tests.dll"
+       debug="${build.debug}" define="${build.defines}">
+      <sources>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
       </sources>
       <resources prefix="NUnit.Util.Tests.resources">
-        <include name="resources/*"/>
+        <patternset refid="resource-files"/>
       </resources>
-      <references basedir="${current.build.dir}">
+      <references>
         <include name="System.Runtime.Remoting.dll"/>
-        <include name="nunit.framework.dll"/>
-        <include name="nunit.core.interfaces.dll"/>
-        <include name="nunit.core.dll"/>
-        <include name="nunit.util.dll"/>
-        <include name="nunit.mocks.dll"/>
-        <include name="nunit-server.dll"/>
-        <include name="nunit.core.tests.dll"/>
-        <include name="test-utilities.dll"/>
-        <include name="mock-assembly.dll"/>
-        <include name="nonamespace-assembly.dll"/>
-        <include name="notestfixtures-assembly.dll"/>
+        <include name="${current.framework.dir}/nunit.framework.dll"/>
+        <include name="${current.framework.dir}/nunit.mocks.dll"/>
+        <include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
+        <include name="${current.lib.dir}/nunit.core.dll"/>
+        <include name="${current.lib.dir}/nunit.util.dll"/>
+        <include name="${current.lib.dir}/nunit-server.dll"/>
+        <include name="${current.test.dir}/nunit.core.tests.dll"/>
+        <include name="${current.test.dir}/test-utilities.dll"/>
+        <include name="${current.test.dir}/mock-assembly.dll"/>
+        <include name="${current.test.dir}/nonamespace-assembly.dll"/>
       </references>
     </csc>
   </target>
 
   <target name="package">
     <copy todir="${package.src.dir}/ClientUtilities/tests">
-      <fileset refid="source-files" />
+      <fileset>
+        <patternset refid="source-files"/>
+        <patternset refid="resource-files"/>
+        <include name="nunit.util.tests.csproj"/>
+        <include name="nunit.util.tests.build"/>
+      </fileset>
     </copy>
   </target>
 
diff --git a/src/ClientUtilities/tests/nunit.util.tests.csproj b/src/ClientUtilities/tests/nunit.util.tests.csproj
index 97561c8..ff2a0bd 100644
--- a/src/ClientUtilities/tests/nunit.util.tests.csproj
+++ b/src/ClientUtilities/tests/nunit.util.tests.csproj
@@ -1,400 +1,191 @@
-<VisualStudioProject>
-    <CSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{74EF7165-117E-48ED-98EA-068EAE438E53}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = ""
-                AssemblyKeyContainerName = ""
-                AssemblyName = "nunit.util.tests"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "Library"
-                PreBuildEvent = ""
-                PostBuildEvent = ""
-                RootNamespace = "NUnit.Util.Tests"
-                RunPostBuildEvent = "OnBuildSuccess"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "true"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-                <Config
-                    Name = "Release"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "false"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "System"
-                    AssemblyName = "System"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.dll"
-                />
-                <Reference
-                    Name = "System.Data"
-                    AssemblyName = "System.Data"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Data.dll"
-                />
-                <Reference
-                    Name = "System.XML"
-                    AssemblyName = "System.Xml"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.XML.dll"
-                />
-                <Reference
-                    Name = "nunit.framework.dll"
-                    Project = "{83DD7E12-A705-4DBA-9D71-09C8973D9382}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.util.dll"
-                    Project = "{61CE9CE5-943E-44D4-A381-814DC1406767}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "mock-assembly"
-                    Project = "{2E368281-3BA8-4050-B05E-0E0E43F8F446}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "test-utilities"
-                    Project = "{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "notestfixtures-assembly"
-                    Project = "{8D330DE4-B980-4A57-9F07-E9F7A7A33F4F}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nonamespace-assembly"
-                    Project = "{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.core.dll"
-                    Project = "{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.core.tests"
-                    Project = "{DD758D21-E5D5-4D40-9450-5F65A32F359C}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.core.interfaces.dll"
-                    Project = "{435428F8-5995-4CE4-8022-93D595A8CC0F}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "System.Drawing"
-                    AssemblyName = "System.Drawing"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Drawing.dll"
-                />
-                <Reference
-                    Name = "System.Runtime.Remoting"
-                    AssemblyName = "System.Runtime.Remoting"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Runtime.Remoting.dll"
-                />
-            </References>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "AssemblyListTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CategoryManagerTest.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CategoryParseTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CommonAssemblyInfo.cs"
-                    Link = "..\..\CommonAssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "EventDispatcherTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "FileWatcherTest.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "MemorySettingsStorageTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "MockAssemblyWatcher.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "NUnitProjectLoad.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "NUnitProjectSave.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "NUnitProjectTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "NUnitProjectXml.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "NUnitRegistryTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "PathUtilTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ProcessRunnerTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ProjectConfigCollectionTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ProjectConfigTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RecentFileEntryTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RecentFilesTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RegistrySettingsStorageTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RemoteTestResultTest.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ServerUtilityTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ServiceManagerSetUpFixture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SettingsGroupTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SummaryResultFixture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestAgencyTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestAgentTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestDomainFixture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestDomainTests_Multiple.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestEventCatcher.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestLoaderAssemblyTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestServerTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "VSProjectTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "XmlResultVisitorTest.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "resources\ClassLibrary1.csproj"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "resources\cpp-default-library_VS2005.vcproj"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "resources\CPPLibrary.vcproj"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "resources\cpp-sample.vcproj"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "resources\cpp-sample_VS2005.vcproj"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "resources\csharp-sample.csproj"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "resources\csharp-sample_VS2005.csproj"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "resources\csharp-sample_VS2005_noplatform.csproj"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "resources\HebrewFileProblem.csproj"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "resources\jsharp.vjsproj"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "resources\jsharp_VS2005.vjsproj"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "resources\MakeFileProject.vcproj"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "resources\MultiplePlatformProject.csproj"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "resources\samples.sln"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "resources\samples_VS2005.sln"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "resources\Solution1.sln"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "resources\Unmanaged.vcproj"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "resources\vb-sample.vbproj"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "resources\vb-sample_VS2005.vbproj"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "resources\WebApplication1.sln"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "resources\XNAWindowsProject.csproj"
-                    BuildAction = "EmbeddedResource"
-                />
-            </Include>
-        </Files>
-    </CSHARP>
-</VisualStudioProject>
-
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{74EF7165-117E-48ED-98EA-068EAE438E53}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit.util.tests</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.Util.Tests</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG;NET_2_0</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;NET_2_0</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Drawing">
+      <Name>System.Drawing</Name>
+    </Reference>
+    <Reference Include="System.Runtime.Remoting">
+      <Name>System.Runtime.Remoting</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
+      <Name>nunit.core.dll</Name>
+      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
+      <Name>nunit.core.interfaces.dll</Name>
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\tests\nunit.core.tests.csproj">
+      <Name>nunit.core.tests</Name>
+      <Project>{DD758D21-E5D5-4D40-9450-5F65A32F359C}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
+      <Name>nunit.framework.dll</Name>
+      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\..\tests\mock-assembly\mock-assembly.csproj">
+      <Name>mock-assembly</Name>
+      <Project>{2E368281-3BA8-4050-B05E-0E0E43F8F446}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\tests\nonamespace-assembly\nonamespace-assembly.csproj">
+      <Name>nonamespace-assembly</Name>
+      <Project>{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\tests\test-utilities\test-utilities.csproj">
+      <Name>test-utilities</Name>
+      <Project>{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\util\nunit.util.dll.csproj">
+      <Name>nunit.util.dll</Name>
+      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="resources\ClassLibrary1.csproj" />
+    <EmbeddedResource Include="resources\csharp-sample.csproj" />
+    <EmbeddedResource Include="resources\csharp-sample_VS2005.csproj" />
+    <EmbeddedResource Include="resources\csharp-sample_VS2005_noplatform.csproj" />
+    <EmbeddedResource Include="resources\HebrewFileProblem.csproj" />
+    <EmbeddedResource Include="resources\jsharp.vjsproj" />
+    <EmbeddedResource Include="resources\jsharp_VS2005.vjsproj" />
+    <EmbeddedResource Include="resources\MultiplePlatformProject.csproj" />
+    <EmbeddedResource Include="resources\samples.sln" />
+    <EmbeddedResource Include="resources\samples_VS2005.sln" />
+    <EmbeddedResource Include="resources\Solution1.sln" />
+    <EmbeddedResource Include="resources\vb-sample.vbproj" />
+    <EmbeddedResource Include="resources\vb-sample_VS2005.vbproj" />
+    <EmbeddedResource Include="resources\WebApplication1.sln" />
+    <EmbeddedResource Include="resources\XNAWindowsProject.csproj" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="resources\cpp-default-library_VS2005.vcproj" />
+    <EmbeddedResource Include="resources\cpp-sample.vcproj" />
+    <EmbeddedResource Include="resources\cpp-sample_VS2005.vcproj" />
+    <EmbeddedResource Include="resources\CPPLibrary.vcproj" />
+    <EmbeddedResource Include="resources\MakeFileProject.vcproj" />
+    <EmbeddedResource Include="resources\Unmanaged.vcproj" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="AssemblyListTests.cs" />
+    <Compile Include="CategoryManagerTest.cs" />
+    <Compile Include="CategoryParseTests.cs" />
+    <Compile Include="DomainManagerTests.cs" />
+    <Compile Include="EventDispatcherTests.cs" />
+    <Compile Include="FileWatcherTest.cs" />
+    <Compile Include="MemorySettingsStorageTests.cs" />
+    <Compile Include="MockAssemblyWatcher.cs" />
+    <Compile Include="NUnitProjectLoad.cs" />
+    <Compile Include="NUnitProjectSave.cs" />
+    <Compile Include="NUnitProjectTests.cs" />
+    <Compile Include="NUnitProjectXml.cs" />
+    <Compile Include="NUnitRegistryTests.cs" />
+    <Compile Include="PathUtilTests.cs" />
+    <Compile Include="ProcessRunnerTests.cs" />
+    <Compile Include="ProjectConfigTests.cs" />
+    <Compile Include="RecentFileEntryTests.cs" />
+    <Compile Include="RecentFilesTests.cs" />
+    <Compile Include="RegistrySettingsStorageTests.cs" />
+    <Compile Include="RemoteTestResultTest.cs" />
+    <Compile Include="RuntimeFrameworkSelectorTests.cs" />
+    <Compile Include="ServerUtilityTests.cs" />
+    <Compile Include="ServiceManagerSetUpFixture.cs" />
+    <Compile Include="SettingsGroupTests.cs" />
+    <Compile Include="SummaryResultFixture.cs" />
+    <Compile Include="TestAgencyTests.cs" />
+    <Compile Include="TestAgentTests.cs" />
+    <Compile Include="TestDomainFixture.cs" />
+    <Compile Include="TestDomainTests_Multiple.cs" />
+    <Compile Include="TestEventCatcher.cs" />
+    <Compile Include="TestLoaderAssemblyTests.cs" />
+    <Compile Include="TestLoaderWatcherTests.cs" />
+    <Compile Include="TestRunnerFactoryTests.cs" />
+    <Compile Include="TestServerTests.cs" />
+    <Compile Include="VisualStudioConverterTests.cs" />
+    <Compile Include="VSProjectTests.cs" />
+    <Compile Include="XmlResultWriterTest.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit.util.tests.build" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/ClientUtilities/tests/nunit.util.tests.dll.config b/src/ClientUtilities/tests/nunit.util.tests.dll.config
deleted file mode 100644
index 3238c85..0000000
--- a/src/ClientUtilities/tests/nunit.util.tests.dll.config
+++ /dev/null
@@ -1,88 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<configuration>
-
-	<!--
-	 This is the configuration file for the NUnitTests.nunit test project. You may
-	 need to create a similar configuration file for your own test project. 
-	 
-	 In your own configuration file, the include any appSettings that you require.
-	 The <NUnit> section is only needed if you want to use a non-default value
-	 for any of the settings.
-	-->
-  <configSections>
-	<sectionGroup name="NUnit">
-		<section name="TestRunner" type="System.Configuration.NameValueSectionHandler"/>
-	</sectionGroup>
-  </configSections>
-  
-  <appSettings>
-    <!--   User application and configured property settings go here.-->
-    <!--   Example: <add key="settingName" value="settingValue"/> -->
-    <add key="test.setting" value="54321" />
-  </appSettings>
-
-  <NUnit>
-	<TestRunner>
-		<!-- Valid values are STA,MTA. Others ignored. -->
-		<add key="ApartmentState" value="MTA" />
-		
-		<!-- See ThreadPriority enum for other valid values -->
-		<add key="ThreadPriority" value="Normal" />
-	</TestRunner>
-  </NUnit>
-
-   <!--
-    The following <runtime> section allows running nunit tests under 
-    .NET 1.0 by redirecting assemblies. The appliesTo attribute
-    causes the section to be ignored except under .NET 1.0.
-   --> 
- <runtime>
-   
-    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
-			appliesTo="v1.0.3705">
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Data" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Drawing" 
-                          publicKeyToken="b03f5f7f11d50a3a" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Windows.Forms" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Xml" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-    </assemblyBinding>
-  
-  </runtime>
-
-</configuration> 
diff --git a/src/ClientUtilities/tests/nunit.util.tests_VS2005.csproj b/src/ClientUtilities/tests/nunit.util.tests_VS2005.csproj
deleted file mode 100644
index 74efd7e..0000000
--- a/src/ClientUtilities/tests/nunit.util.tests_VS2005.csproj
+++ /dev/null
@@ -1,208 +0,0 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>8.0.50727</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{74EF7165-117E-48ED-98EA-068EAE438E53}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ApplicationIcon>
-    </ApplicationIcon>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit.util.tests</AssemblyName>
-    <AssemblyOriginatorKeyFile>
-    </AssemblyOriginatorKeyFile>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.Util.Tests</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <StartupObject>
-    </StartupObject>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release2005|AnyCPU' ">
-    <OutputPath>bin\Release2005\</OutputPath>
-    <DefineConstants>TRACE;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <Optimize>true</Optimize>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug2005|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\Debug2005\</OutputPath>
-    <DefineConstants>TRACE;DEBUG;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Runtime.Remoting" />
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll_VS2005.csproj">
-      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
-      <Name>nunit.core.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll_VS2005.csproj">
-      <Project>{DCC88998-255A-4247-B658-71DD932E9873}</Project>
-      <Name>nunit.core.interfaces.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\tests\nunit.core.tests_VS2005.csproj">
-      <Project>{DD758D21-E5D5-4D40-9450-5F65A32F359C}</Project>
-      <Name>nunit.core.tests_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll_VS2005.csproj">
-      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
-      <Name>nunit.framework.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitMocks\mocks\nunit.mocks_VS2005.csproj">
-      <Project>{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}</Project>
-      <Name>nunit.mocks_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\tests\mock-assembly\mock-assembly_VS2005.csproj">
-      <Project>{2E368281-3BA8-4050-B05E-0E0E43F8F446}</Project>
-      <Name>mock-assembly_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\tests\nonamespace-assembly\nonamespace-assembly_VS2005.csproj">
-      <Project>{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}</Project>
-      <Name>nonamespace-assembly_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\tests\notestfixtures-assembly\notestfixtures-assembly_VS2005.csproj">
-      <Project>{8D330DE4-B980-4A57-9F07-E9F7A7A33F4F}</Project>
-      <Name>notestfixtures-assembly_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\tests\test-utilities\test-utilities_VS2005.csproj">
-      <Project>{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}</Project>
-      <Name>test-utilities_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\util\nunit.util.dll_VS2005.csproj">
-      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
-      <Name>nunit.util.dll_VS2005</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="AssemblyListTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="CategoryManagerTest.cs" />
-    <Compile Include="CategoryParseTests.cs" />
-    <Compile Include="EventDispatcherTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="FileWatcherTest.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="MemorySettingsStorageTests.cs" />
-    <Compile Include="MockAssemblyWatcher.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="NUnitProjectLoad.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="NUnitProjectSave.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="NUnitProjectTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="NUnitProjectXml.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="NUnitRegistryTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="PathUtilTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="ProcessRunnerTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="ProjectConfigCollectionTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="ProjectConfigTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="RecentFileEntryTests.cs" />
-    <Compile Include="RecentFilesTests.cs" />
-    <Compile Include="RegistrySettingsStorageTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="RemoteTestResultTest.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="ServerUtilityTests.cs" />
-    <Compile Include="ServiceManagerSetUpFixture.cs" />
-    <Compile Include="SettingsGroupTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="SummaryResultFixture.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestAgencyTests.cs" />
-    <Compile Include="TestAgentTests.cs" />
-    <Compile Include="TestDomainFixture.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestDomainTests_Multiple.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestEventCatcher.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestLoaderAssemblyTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestServerTests.cs" />
-    <Compile Include="VSProjectTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="XmlResultVisitorTest.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <EmbeddedResource Include="resources\cpp-default-library_VS2005.vcproj" />
-    <EmbeddedResource Include="resources\ClassLibrary1.csproj" />
-    <EmbeddedResource Include="resources\CPPLibrary.vcproj" />
-    <EmbeddedResource Include="resources\cpp-sample.vcproj" />
-    <EmbeddedResource Include="resources\cpp-sample_VS2005.vcproj" />
-    <EmbeddedResource Include="resources\csharp-sample.csproj" />
-    <EmbeddedResource Include="resources\csharp-sample_VS2005.csproj" />
-    <EmbeddedResource Include="resources\HebrewFileProblem.csproj" />
-    <EmbeddedResource Include="resources\jsharp.vjsproj" />
-    <EmbeddedResource Include="resources\jsharp_VS2005.vjsproj" />
-    <EmbeddedResource Include="resources\MakeFileProject.vcproj" />
-    <EmbeddedResource Include="resources\samples.sln" />
-    <EmbeddedResource Include="resources\samples_VS2005.sln" />
-    <EmbeddedResource Include="resources\Solution1.sln" />
-    <EmbeddedResource Include="resources\Unmanaged.vcproj" />
-    <EmbeddedResource Include="resources\vb-sample.vbproj" />
-    <EmbeddedResource Include="resources\vb-sample_VS2005.vbproj" />
-    <EmbeddedResource Include="resources\WebApplication1.sln" />
-  </ItemGroup>
-  <ItemGroup>
-    <EmbeddedResource Include="resources\csharp-sample_VS2005_noplatform.csproj" />
-    <EmbeddedResource Include="resources\MultiplePlatformProject.csproj" />
-    <EmbeddedResource Include="resources\XNAWindowsProject.csproj" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
-</Project>
\ No newline at end of file
diff --git a/src/ClientUtilities/tests/resources/csharp-sample_VS2005_x86.csproj b/src/ClientUtilities/tests/resources/csharp-sample_VS2005_x86.csproj
deleted file mode 100644
index f273e2b..0000000
--- a/src/ClientUtilities/tests/resources/csharp-sample_VS2005_x86.csproj
+++ /dev/null
@@ -1,106 +0,0 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>8.0.40607</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{15D66EEE-A852-4A52-89C2-83E74ECF3770}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ApplicationIcon>
-    </ApplicationIcon>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>csharp-sample_VS2005_x86</AssemblyName>
-    <AssemblyOriginatorKeyFile>
-    </AssemblyOriginatorKeyFile>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>csharp_sample</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <StartupObject>
-    </StartupObject>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
-    <OutputPath>bin\Debug\</OutputPath>
-    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
-    <BaseAddress>285212672</BaseAddress>
-    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <DebugSymbols>true</DebugSymbols>
-    <FileAlignment>4096</FileAlignment>
-    <NoStdLib>false</NoStdLib>
-    <NoWarn>
-    </NoWarn>
-    <Optimize>false</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
-    <WarningLevel>4</WarningLevel>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
-    <OutputPath>bin\Release\</OutputPath>
-    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
-    <BaseAddress>285212672</BaseAddress>
-    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <DebugSymbols>false</DebugSymbols>
-    <FileAlignment>4096</FileAlignment>
-    <NoStdLib>false</NoStdLib>
-    <NoWarn>
-    </NoWarn>
-    <Optimize>true</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
-    <WarningLevel>4</WarningLevel>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="nunit.framework">
-      <Name>nunit.framework</Name>
-      <HintPath>E:\Program Files\NUnit 2.2\bin\nunit.framework.dll</HintPath>
-      <AssemblyFolderKey>hklm\dn\nunit.framework</AssemblyFolderKey>
-    </Reference>
-    <Reference Include="System">
-      <Name>System</Name>
-      <HintPath>..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll</HintPath>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-      <HintPath>..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll</HintPath>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-      <HintPath>..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll</HintPath>
-    </Reference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="AssemblyInfo.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="CSharpTest.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Content Include="ReadMe.txt" />
-    <AppDesigner Include="Properties\" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
-</Project>
\ No newline at end of file
diff --git a/src/ClientUtilities/util/AggregatingTestRunner.cs b/src/ClientUtilities/util/AggregatingTestRunner.cs
index 9c31805..48dca4e 100644
--- a/src/ClientUtilities/util/AggregatingTestRunner.cs
+++ b/src/ClientUtilities/util/AggregatingTestRunner.cs
@@ -1,11 +1,9 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
-//#define RUN_IN_PARALLEL
-
 namespace NUnit.Util
 {
 	using System;
@@ -13,12 +11,26 @@ namespace NUnit.Util
 	using System.IO;
 	using NUnit.Core;
 
-	/// <summary>
+    #region AggregatingTestRunner
+    /// <summary>
 	/// AggregatingTestRunner allows running multiple TestRunners
 	/// and combining the results.
 	/// </summary>
+    
 	public abstract class AggregatingTestRunner : MarshalByRefObject, TestRunner, EventListener
 	{
+        private Logger log;
+        private Logger Log
+        {
+            get
+            {
+                if (log == null)
+                    log = InternalTrace.GetLogger(this.GetType());
+
+                return log;
+            }
+        }
+
 		static int AggregateTestID = 1000;
 
 		#region Instance Variables
@@ -33,6 +45,11 @@ namespace NUnit.Util
 		/// </summary>
 		protected ArrayList runners;
 
+        /// <summary>
+        /// Indicates whether we should run test assemblies in parallel
+        /// </summary>
+        private bool runInParallel;
+
 		/// <summary>
 		/// The loaded test suite
 		/// </summary>
@@ -48,8 +65,6 @@ namespace NUnit.Util
 		/// </summary>
 		protected EventListener listener;
 
-		protected string projectName;
-
 		protected TestName testName;
 
 		#endregion
@@ -129,14 +144,89 @@ namespace NUnit.Util
 		}
 		#endregion
 
-		#region Load and Unload Methods       
-		public abstract bool Load(TestPackage package);
+		#region Load and Unload Methods
+        public bool Load(TestPackage package)
+        {
+            Log.Info("Loading " + package.Name);
+
+            this.testName.FullName = this.testName.Name = package.FullName;
+            runners = new ArrayList();
+
+            int nfound = 0;
+            int index = 0;
+
+            string targetAssemblyName = null;
+            if (package.TestName != null && package.Assemblies.Contains(package.TestName))
+            {
+                targetAssemblyName = package.TestName;
+                package.TestName = null;
+            }
+
+            // NOTE: This is experimental. A normally created test package
+            // will never have this setting.
+            if (package.Settings.Contains("RunInParallel"))
+            {
+                this.runInParallel = true;
+                package.Settings.Remove("RunInParallel");
+            }
+
+            //string basePath = package.BasePath;
+            //if (basePath == null)
+            //    basePath = Path.GetDirectoryName(package.FullName);
+
+            //string configFile = package.ConfigurationFile;
+            //if (configFile == null && package.Name != null && !package.IsSingleAssembly)
+            //    configFile = Path.ChangeExtension(package.Name, ".config");
+
+            foreach (string assembly in package.Assemblies)
+            {
+                if (targetAssemblyName == null || targetAssemblyName == assembly)
+                {
+                    TestRunner runner = CreateRunner(this.runnerID * 100 + index + 1);
+
+                    TestPackage p = new TestPackage(assembly);
+                    p.AutoBinPath = package.AutoBinPath;
+                    p.ConfigurationFile = package.ConfigurationFile;
+                    p.BasePath = package.BasePath;
+                    p.PrivateBinPath = package.PrivateBinPath;
+                    p.TestName = package.TestName;
+                    foreach (object key in package.Settings.Keys)
+                        p.Settings[key] = package.Settings[key];
+
+                    if (package.TestName == null)
+                    {
+                        runners.Add(runner);
+                        if (runner.Load(p))
+                            nfound++;
+                    }
+                    else if (runner.Load(p))
+                    {
+                        runners.Add(runner);
+                        nfound++;
+                    }
+                }
+            }
+
+            Log.Info("Load complete");
+
+            if (package.TestName == null && targetAssemblyName == null)
+                return nfound == package.Assemblies.Count;
+            else
+                return nfound > 0;
+        }
+
+        protected abstract TestRunner CreateRunner(int runnerID);
 
 		public virtual void Unload()
 		{
-			foreach( TestRunner runner in runners )
-				runner.Unload();
-			aggregateTest = null;
+            if (aggregateTest != null)
+            {
+                Log.Info("Unloading " + Path.GetFileName(aggregateTest.TestName.Name));
+                foreach (TestRunner runner in runners)
+                    runner.Unload();
+                aggregateTest = null;
+                Log.Info("Unload complete");
+            }
 		}
 		#endregion
 
@@ -156,8 +246,11 @@ namespace NUnit.Util
 			return Run( listener, TestFilter.Empty );
 		}
 
+        // All forms of Run and BeginRun eventually come here
 		public virtual TestResult Run(EventListener listener, ITestFilter filter )
 		{
+            Log.Info("Run - EventListener={0}", listener.GetType().Name);
+
 			// Save active listener for derived classes
 			this.listener = listener;
 
@@ -165,23 +258,34 @@ namespace NUnit.Util
 			for( int index = 0; index < runners.Count; index++ )
 				tests[index] = ((TestRunner)runners[index]).Test;
 
-			this.listener.RunStarted( this.Test.TestName.Name, this.CountTestCases( filter ) );
+            string name = this.testName.Name;
+            int count = this.CountTestCases(filter);
+            Log.Info("Signalling RunStarted({0},{1})", name, count);
+            this.listener.RunStarted(name, count);
 
-			this.listener.SuiteStarted( this.Test.TestName );
 			long startTime = DateTime.Now.Ticks;
 
-			TestSuiteResult result = new TestSuiteResult( new TestInfo( testName, tests ), projectName );
-			result.RunState = RunState.Executed;
-			foreach( TestRunner runner in runners )
-				if ( filter.Pass( runner.Test ) )
-					result.AddResult( runner.Run( this, filter ) );
+		    TestResult result = new TestResult(new TestInfo(testName, tests));
+
+            if (this.runInParallel)
+            {
+                foreach (TestRunner runner in runners)
+                    if (filter.Pass(runner.Test))
+                        runner.BeginRun(this, filter);
+
+                result = this.EndRun();
+            }
+            else
+            {
+                foreach (TestRunner runner in runners)
+                    if (filter.Pass(runner.Test))
+                        result.AddResult(runner.Run(this, filter));
+            }
 			
 			long stopTime = DateTime.Now.Ticks;
 			double time = ((double)(stopTime - startTime)) / (double)TimeSpan.TicksPerSecond;
 			result.Time = time;
 
-			this.listener.SuiteFinished( result );
-
 			this.listener.RunFinished( result );
 
 			this.testResult = result;
@@ -199,23 +303,17 @@ namespace NUnit.Util
 			// Save active listener for derived classes
 			this.listener = listener;
 
-#if RUN_IN_PARALLEL
-			this.listener.RunStarted( this.Test.Name, this.CountTestCases( filter ) );
+            Log.Info("BeginRun");
 
-			foreach( TestRunner runner in runners )
-				if ( runner.Test != null )
-					runner.BeginRun( this, filter );
-
-			//this.listener.RunFinished( this.Results );
-#else
-			ThreadedTestRunner threadedRunner = new ThreadedTestRunner( this );
-			threadedRunner.BeginRun( listener, filter );
-#endif
+            // ThreadedTestRunner will call our Run method on a separate thread
+            ThreadedTestRunner threadedRunner = new ThreadedTestRunner(this);
+            threadedRunner.BeginRun(listener, filter);
 		}
 
 		public virtual TestResult EndRun()
 		{
-			TestSuiteResult suiteResult = new TestSuiteResult( aggregateTest, Test.TestName.FullName );
+            Log.Info("EndRun");
+            TestResult suiteResult = new TestResult(Test as TestInfo);
 			foreach( TestRunner runner in runners )
 				suiteResult.Results.Add( runner.EndRun() );
 
@@ -254,15 +352,26 @@ namespace NUnit.Util
 
 		void NUnit.Core.EventListener.RunFinished(TestResult result)
 		{
-			// TODO: Issue combined RunFinished when all runs are done
+            if (this.runInParallel)
+            {
+                foreach (TestRunner runner in runners)
+                    if (runner.Running)
+                        return;
+
+                this.testResult = new TestResult(this.aggregateTest);
+                foreach (TestRunner runner in runners)
+                    this.testResult.AddResult(runner.TestResult);
+
+                listener.RunFinished(this.TestResult);
+            }
 		}
 
-		public void SuiteFinished(TestSuiteResult result)
+		public void SuiteFinished(TestResult result)
 		{
 			this.listener.SuiteFinished( result );
 		}
 
-		public void TestFinished(TestCaseResult result)
+		public void TestFinished(TestResult result)
 		{
 			this.listener.TestFinished( result );
 		}
@@ -289,5 +398,56 @@ namespace NUnit.Util
 			return null;
 		}
 		#endregion
-	}
+
+        #region IDisposable Members
+
+        public void Dispose()
+        {
+            foreach (TestRunner runner in runners)
+                if (runner != null)
+                    runner.Dispose();
+        }
+
+        #endregion
+    }
+    #endregion
+
+    #region MultipleTestDomainRunner
+    /// <summary>
+    /// Summary description for MultipleTestDomainRunner.
+    /// </summary>
+    public class MultipleTestDomainRunner : AggregatingTestRunner
+    {
+        #region Constructors
+        public MultipleTestDomainRunner() : base(0) { }
+
+        public MultipleTestDomainRunner(int runnerID) : base(runnerID) { }
+        #endregion
+
+        #region CreateRunner
+        protected override TestRunner CreateRunner(int runnerID)
+        {
+            return new TestDomain(runnerID);
+        }
+        #endregion
+    }
+    #endregion
+
+    #region MultipleTestProcessRunner
+    public class MultipleTestProcessRunner : AggregatingTestRunner
+    {
+        #region Constructors
+        public MultipleTestProcessRunner() : base(0) { }
+
+        public MultipleTestProcessRunner(int runnerID) : base(runnerID) { }
+        #endregion
+
+        #region CreateRunner
+        protected override TestRunner CreateRunner(int runnerID)
+        {
+            return new ProcessRunner(runnerID);
+        }
+        #endregion
+    }
+    #endregion
 }
diff --git a/src/ClientUtilities/util/AssemblyInfo.cs b/src/ClientUtilities/util/AssemblyInfo.cs
index c55a1ba..4835bf6 100644
--- a/src/ClientUtilities/util/AssemblyInfo.cs
+++ b/src/ClientUtilities/util/AssemblyInfo.cs
@@ -1,11 +1,11 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System.Reflection;
 
 [assembly: AssemblyDelaySign(false)]
-[assembly: AssemblyKeyFile("../../../../nunit.snk")]
+[assembly: AssemblyKeyFile("../../nunit.snk")]
 [assembly: AssemblyKeyName("")]
diff --git a/src/ClientUtilities/util/AssemblyItem.cs b/src/ClientUtilities/util/AssemblyItem.cs
deleted file mode 100644
index 55d97f1..0000000
--- a/src/ClientUtilities/util/AssemblyItem.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-using System;
-using System.Threading;
-using System.Xml.Serialization;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	/// Holds an assembly path and other information needed to
-	/// load an assembly. Currently there is no other info.
-	/// Used in serialization of NUnit projects.
-	/// </summary>
-	[Serializable]
-	public struct AssemblyItem
-	{
-		[XmlAttribute]
-		public string path;
-
-		public ApartmentState apartment;
-
-		public AssemblyItem( string path ) : this( path, ApartmentState.Unknown ) { }
-
-		public AssemblyItem( string path, ApartmentState apartment )
-		{
-			if ( !System.IO.Path.IsPathRooted( path ) )
-				throw new ArgumentException( "Assembly path must be absolute", "path" );
-			this.path = path;
-			this.apartment = apartment;
-		}
-	}
-}
diff --git a/src/ClientUtilities/util/AssemblyList.cs b/src/ClientUtilities/util/AssemblyList.cs
index 9ee5c46..ba9999e 100644
--- a/src/ClientUtilities/util/AssemblyList.cs
+++ b/src/ClientUtilities/util/AssemblyList.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
diff --git a/src/ClientUtilities/util/AssemblyWatcher.cs b/src/ClientUtilities/util/AssemblyWatcher.cs
index 557c7b1..230761f 100644
--- a/src/ClientUtilities/util/AssemblyWatcher.cs
+++ b/src/ClientUtilities/util/AssemblyWatcher.cs
@@ -1,14 +1,13 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
 using System.IO;
-using System.Text;
 using System.Timers;
-using System.Collections;
+using NUnit.Core;
 
 namespace NUnit.Util
 {
@@ -20,46 +19,56 @@ namespace NUnit.Util
 	/// an argument to the event handler so that one routine can
 	/// be used to handle events from multiple watchers.
 	/// </summary>
-	public class AssemblyWatcher
+	public class AssemblyWatcher : IAssemblyWatcher
 	{
-		FileSystemWatcher[] fileWatcher;
-		FileInfo[] fileInfo;
+        static Logger log = InternalTrace.GetLogger(typeof(AssemblyWatcher));
+
+        private FileSystemWatcher[] fileWatchers;
+		private FileInfo[] files;
+		private bool isWatching;
 
 		protected System.Timers.Timer timer;
-		protected string changedAssemblyPath; 
+		protected string changedAssemblyPath;
 
-		public delegate void AssemblyChangedHandler(String fullPath);
-		public event AssemblyChangedHandler AssemblyChangedEvent;
+		protected FileInfo GetFileInfo(int index)
+		{
+			return files[index];
+		}
 
-		public AssemblyWatcher( int delay, string assemblyFileName )
-			: this( delay, new string[]{ assemblyFileName } ) { }
+		public void Setup(int delay, string assemblyFileName)
+		{
+			Setup(delay, new string[] {assemblyFileName});
+		}
 
-		public AssemblyWatcher( int delay, IList assemblies )
+#if NET_2_0 || NET_4_0
+		public void Setup(int delay, System.Collections.Generic.IList<string> assemblies)
+#else
+        public void Setup(int delay, System.Collections.IList assemblies)
+#endif
 		{
-			fileInfo = new FileInfo[assemblies.Count];
-			fileWatcher = new FileSystemWatcher[assemblies.Count];
+            log.Info("Setting up watcher");
+
+			files = new FileInfo[assemblies.Count];
+			fileWatchers = new FileSystemWatcher[assemblies.Count];
 
-			for( int i = 0; i < assemblies.Count; i++ )
+			for (int i = 0; i < assemblies.Count; i++)
 			{
-				fileInfo[i] = new FileInfo( (string)assemblies[i] );
-
-				fileWatcher[i] = new FileSystemWatcher();
-				fileWatcher[i].Path = fileInfo[i].DirectoryName;
-				fileWatcher[i].Filter = fileInfo[i].Name;
-				fileWatcher[i].NotifyFilter = NotifyFilters.Size | NotifyFilters.LastWrite;
-				fileWatcher[i].Changed+=new FileSystemEventHandler(OnChanged);
-				fileWatcher[i].EnableRaisingEvents = false;
-			}
+                log.Debug("Setting up FileSystemWatcher for {0}", assemblies[i]);
+                
+				files[i] = new FileInfo((string)assemblies[i]);
 
-			timer = new System.Timers.Timer( delay );
-			timer.AutoReset=false;
-			timer.Enabled=false;
-			timer.Elapsed+=new ElapsedEventHandler(OnTimer);
-		}
+				fileWatchers[i] = new FileSystemWatcher();
+				fileWatchers[i].Path = files[i].DirectoryName;
+				fileWatchers[i].Filter = files[i].Name;
+				fileWatchers[i].NotifyFilter = NotifyFilters.Size | NotifyFilters.LastWrite;
+				fileWatchers[i].Changed += new FileSystemEventHandler(OnChanged);
+				fileWatchers[i].EnableRaisingEvents = false;
+			}
 
-		public FileInfo GetFileInfo( int index )
-		{
-			return fileInfo[index];
+			timer = new System.Timers.Timer(delay);
+			timer.AutoReset = false;
+			timer.Enabled = false;
+			timer.Elapsed += new ElapsedEventHandler(OnTimer);
 		}
 
 		public void Start()
@@ -74,14 +83,48 @@ namespace NUnit.Util
 
 		private void EnableWatchers( bool enable )
 		{
-			foreach( FileSystemWatcher watcher in fileWatcher )
-				watcher.EnableRaisingEvents = enable;
+            if (fileWatchers != null)
+    			foreach( FileSystemWatcher watcher in fileWatchers )
+	    			watcher.EnableRaisingEvents = enable;
+
+			isWatching = enable;
+		}
+
+		public void FreeResources()
+		{
+            log.Info("FreeResources");
+
+            Stop();
+
+			if (fileWatchers != null)
+			{
+				foreach (FileSystemWatcher watcher in fileWatchers)
+				{
+                    if (watcher != null)
+                    {
+                        watcher.Changed -= new FileSystemEventHandler(OnChanged);
+                        watcher.Dispose();
+                    }
+				}
+			}
+
+			if (timer != null)
+			{
+				timer.Stop();
+				timer.Close();
+			}
+
+			fileWatchers = null;
+			timer = null;
 		}
 
+		public event AssemblyChangedHandler AssemblyChanged;
+
 		protected void OnTimer(Object source, ElapsedEventArgs e)
 		{
 			lock(this)
 			{
+                log.Info("Timer expired");
 				PublishEvent();
 				timer.Enabled=false;
 			}
@@ -89,6 +132,8 @@ namespace NUnit.Util
 		
 		protected void OnChanged(object source, FileSystemEventArgs e)
 		{
+            log.Info("File {0} changed", e.Name);
+
 			changedAssemblyPath = e.FullPath;
 			if ( timer != null )
 			{
@@ -96,6 +141,7 @@ namespace NUnit.Util
 				{
 					if(!timer.Enabled)
 						timer.Enabled=true;
+                    log.Info("Setting timer");
 					timer.Start();
 				}
 			}
@@ -107,8 +153,11 @@ namespace NUnit.Util
 	
 		protected void PublishEvent()
 		{
-			if ( AssemblyChangedEvent != null )
-				AssemblyChangedEvent( changedAssemblyPath );
+            if (AssemblyChanged != null)
+            {
+                log.Debug("Publishing Event to {0} listeners", AssemblyChanged.GetInvocationList().Length);
+                AssemblyChanged(changedAssemblyPath);
+            }
 		}
 	}
 }
\ No newline at end of file
diff --git a/src/ClientUtilities/util/CategoryExpression.cs b/src/ClientUtilities/util/CategoryExpression.cs
index b35512a..642e282 100644
--- a/src/ClientUtilities/util/CategoryExpression.cs
+++ b/src/ClientUtilities/util/CategoryExpression.cs
@@ -1,3 +1,8 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using System.Collections;
 using NUnit.Core;
diff --git a/src/ClientUtilities/util/CategoryManager.cs b/src/ClientUtilities/util/CategoryManager.cs
index 0c64fbc..df75952 100644
--- a/src/ClientUtilities/util/CategoryManager.cs
+++ b/src/ClientUtilities/util/CategoryManager.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
diff --git a/src/ClientUtilities/util/ConsoleWriter.cs b/src/ClientUtilities/util/ConsoleWriter.cs
index 6f56c54..102bd07 100644
--- a/src/ClientUtilities/util/ConsoleWriter.cs
+++ b/src/ClientUtilities/util/ConsoleWriter.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 namespace NUnit.Util
diff --git a/src/ClientUtilities/util/DefaultTestRunnerFactory.cs b/src/ClientUtilities/util/DefaultTestRunnerFactory.cs
new file mode 100644
index 0000000..c462767
--- /dev/null
+++ b/src/ClientUtilities/util/DefaultTestRunnerFactory.cs
@@ -0,0 +1,82 @@
+// ****************************************************************
+// Copyright 2010, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Core;
+
+namespace NUnit.Util
+{
+    /// <summary>
+    /// DefaultTestRunnerFactory handles creation of a suitable test 
+    /// runner for a given package to be loaded and run either in a 
+    /// separate process or within the same process. 
+    /// </summary>
+    public class DefaultTestRunnerFactory : InProcessTestRunnerFactory, ITestRunnerFactory
+    {
+        private RuntimeFrameworkSelector selector = new RuntimeFrameworkSelector();        
+        
+        /// <summary>
+        /// Returns a test runner based on the settings in a TestPackage.
+        /// Any setting that is "consumed" by the factory is removed, so
+        /// that downstream runners using the factory will not repeatedly
+        /// create the same type of runner.
+        /// </summary>
+        /// <param name="package">The TestPackage to be loaded and run</param>
+        /// <returns>A TestRunner</returns>
+        public override TestRunner MakeTestRunner(TestPackage package)
+        {
+            ProcessModel processModel = GetTargetProcessModel(package);
+
+            switch (processModel)
+            {
+                case ProcessModel.Multiple:
+                    package.Settings.Remove("ProcessModel");
+                    return new MultipleTestProcessRunner();
+                case ProcessModel.Separate:
+                    package.Settings.Remove("ProcessModel");
+                    return new ProcessRunner();
+                default:
+                    return base.MakeTestRunner(package);
+            }
+        }
+
+        public override bool CanReuse(TestRunner runner, TestPackage package)
+        {
+            RuntimeFramework currentFramework = RuntimeFramework.CurrentFramework;
+            RuntimeFramework targetFramework = selector.SelectRuntimeFramework(package);
+
+            ProcessModel processModel = (ProcessModel)package.GetSetting("ProcessModel", ProcessModel.Default);
+            if (processModel == ProcessModel.Default)
+                if (!targetFramework.Matches(currentFramework))
+                    processModel = ProcessModel.Separate;
+
+            switch (processModel)
+            {
+                case ProcessModel.Multiple:
+                    return runner is MultipleTestProcessRunner;
+                case ProcessModel.Separate:
+                    ProcessRunner processRunner = runner as ProcessRunner;
+                    return processRunner != null && processRunner.RuntimeFramework == targetFramework;
+                default:
+                    return base.CanReuse(runner, package);
+            }
+        }
+
+        private ProcessModel GetTargetProcessModel(TestPackage package)
+        {
+            RuntimeFramework currentFramework = RuntimeFramework.CurrentFramework;
+            RuntimeFramework targetFramework = selector.SelectRuntimeFramework(package);
+
+            ProcessModel processModel = (ProcessModel)package.GetSetting("ProcessModel", ProcessModel.Default);
+            if (processModel == ProcessModel.Default)
+                if (!targetFramework.Matches(currentFramework))
+                    processModel = ProcessModel.Separate;
+            return processModel;
+        }
+    }
+
+
+}
diff --git a/src/ClientUtilities/util/Extensibility/IProjectConverter.cs b/src/ClientUtilities/util/Extensibility/IProjectConverter.cs
new file mode 100644
index 0000000..43f5955
--- /dev/null
+++ b/src/ClientUtilities/util/Extensibility/IProjectConverter.cs
@@ -0,0 +1,32 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+
+namespace NUnit.Util.Extensibility
+{
+	/// <summary>
+	/// The IProjectConverter interface is implemented by any class
+	/// that knows how to convert a foreign project format to an
+	/// NUnitProject.
+	/// </summary>
+	public interface IProjectConverter
+	{
+		/// <summary>
+		/// Returns true if the file indicated is one that this
+		/// converter knows how to convert.
+		/// </summary>
+		/// <param name="path"></param>
+		/// <returns></returns>
+		bool CanConvertFrom( string path );
+
+		/// <summary>
+		/// Converts an external project returning an NUnitProject
+		/// </summary>
+		/// <param name="path"></param>
+		/// <returns></returns>
+		NUnitProject ConvertFrom( string path );
+	}
+}
diff --git a/src/ClientUtilities/util/Extensibility/ProjectConverterCollection.cs b/src/ClientUtilities/util/Extensibility/ProjectConverterCollection.cs
new file mode 100644
index 0000000..0a93bef
--- /dev/null
+++ b/src/ClientUtilities/util/Extensibility/ProjectConverterCollection.cs
@@ -0,0 +1,84 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Collections;
+using NUnit.Core.Extensibility;
+
+namespace NUnit.Util.Extensibility
+{
+	/// <summary>
+	/// Summary description for ProjectConverterCollection.
+	/// </summary>
+	public class ProjectConverterCollection : IProjectConverter, IExtensionPoint
+	{
+		private ArrayList converters = new ArrayList();
+
+		public ProjectConverterCollection()
+		{
+			//
+			// TODO: Add constructor logic here
+			//
+		}
+
+		#region IProjectConverter Members
+
+		public bool CanConvertFrom(string path)
+		{
+			foreach( IProjectConverter converter in converters )
+				if ( converter.CanConvertFrom( path ) )
+					return true;
+
+			return false;
+		}
+
+		public NUnitProject ConvertFrom(string path)
+		{
+			foreach( IProjectConverter converter in converters )
+				if ( converter.CanConvertFrom( path ) )
+					return converter.ConvertFrom( path );
+			
+			return null;
+		}
+
+		#endregion
+
+		#region IExtensionPoint Members
+
+		public void Remove(object extension)
+		{
+			// TODO:  Add ProjectConverterCollection.Remove implementation
+		}
+
+        public void Install(object extension)
+        {
+            // TODO:  Add ProjectConverterCollection.Install implementation
+        }
+
+        public void Install(object extension, int priority)
+        {
+            // TODO:  Add ProjectConverterCollection.Install implementation
+        }
+
+		public IExtensionHost Host
+		{
+			get
+			{
+				// TODO:  Add ProjectConverterCollection.Host getter implementation
+				return null;
+			}
+		}
+
+		public string Name
+		{
+			get
+			{
+				return "Converters";
+			}
+		}
+
+		#endregion
+	}
+}
diff --git a/src/ClientUtilities/util/IAssemblyWatcher.cs b/src/ClientUtilities/util/IAssemblyWatcher.cs
new file mode 100644
index 0000000..07c3f58
--- /dev/null
+++ b/src/ClientUtilities/util/IAssemblyWatcher.cs
@@ -0,0 +1,57 @@
+using System;
+
+namespace NUnit.Util
+{
+	public delegate void AssemblyChangedHandler(string fullPath);
+
+	/// <summary>
+	/// AssemblyWatcher keeps track of one or more assemblies to 
+	/// see if they have changed. It incorporates a delayed notification
+	/// and uses a standard event to notify any interested parties
+	/// about the change. The path to the assembly is provided as
+	/// an argument to the event handler so that one routine can
+	/// be used to handle events from multiple watchers.
+	/// </summary>
+	public interface IAssemblyWatcher
+	{
+		/// <summary>
+		/// Stops watching for changes.
+		/// To release resources call FreeResources.
+		/// </summary>
+		void Stop();
+
+		/// <summary>
+		/// Starts watching for assembly changes.
+		/// You need to call Setup before start watching.
+		/// </summary>
+		void Start();
+
+		/// <summary>
+		/// Initializes the watcher with assemblies to observe for changes.
+		/// </summary>
+		/// <param name="delayInMs">The delay in ms.</param>
+		/// <param name="assemblies">The assemblies.</param>
+#if NET_2_0 || NET_4_0
+        void Setup(int delayInMs, System.Collections.Generic.IList<string> assemblies);
+#else
+        void Setup(int delayInMs, System.Collections.IList assemblies);
+#endif
+
+		/// <summary>
+		/// Initializes the watcher with assemblies to observe for changes.
+		/// </summary>
+		/// <param name="delayInMs">The delay in ms.</param>
+		/// <param name="assemblyFileName">Name of the assembly file.</param>
+		void Setup(int delayInMs, string assemblyFileName);
+
+		/// <summary>
+		/// Releases all resources held by the watcher.
+		/// </summary>
+		void FreeResources();
+
+		/// <summary>
+		/// Occurs when an assembly being watched has changed.
+		/// </summary>
+		event AssemblyChangedHandler AssemblyChanged;
+	}
+}
\ No newline at end of file
diff --git a/src/ClientUtilities/util/ISettings.cs b/src/ClientUtilities/util/ISettings.cs
deleted file mode 100644
index dcb2f98..0000000
--- a/src/ClientUtilities/util/ISettings.cs
+++ /dev/null
@@ -1,102 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Util
-{
-	public delegate void SettingsEventHandler( object sender, SettingsEventArgs args );
-
-	public class SettingsEventArgs : EventArgs
-	{
-		private string settingName;
-
-		public SettingsEventArgs( string settingName )
-		{
-			this.settingName = settingName;
-		}
-
-		public string SettingName
-		{
-			get { return settingName; }
-		}
-	}
-
-	/// <summary>
-	/// The ISettings interface is used to access all user
-	/// settings and options.
-	/// </summary>
-	public interface ISettings
-	{
-		event SettingsEventHandler Changed;
-
-		/// <summary>
-		/// Load a setting from the storage.
-		/// </summary>
-		/// <param name="settingName">Name of the setting to load</param>
-		/// <returns>Value of the setting or null</returns>
-		object GetSetting( string settingName );
-
-		/// <summary>
-		/// Load a setting from the storage or return a default value
-		/// </summary>
-		/// <param name="settingName">Name of the setting to load</param>
-		/// <param name="settingName">Value to return if the setting is missing</param>
-		/// <returns>Value of the setting or the default value</returns>
-		object GetSetting( string settingName, object defaultValue );
-
-		/// <summary>
-		/// Load an integer setting from the storage or return a default value
-		/// </summary>
-		/// <param name="settingName">Name of the setting to load</param>
-		/// <param name="defaultValue">Value to return if the setting is missing</param>
-		/// <returns>Value of the setting or the default value</returns>
-		int GetSetting( string settingName, int defaultValue );
-
-		/// <summary>
-		/// Load a boolean setting or return a default value
-		/// </summary>
-		/// <param name="settingName">Name of setting to load</param>
-		/// <param name="defaultValue">Value to return if the setting is missing</param>
-		/// <returns>Value of the setting or the default value</returns>
-		bool GetSetting( string settingName, bool defaultValue );
-
-		/// <summary>
-		/// Load a string setting from the storage or return a default value
-		/// </summary>
-		/// <param name="settingName">Name of the setting to load</param>
-		/// <param name="defaultValue">Value to return if the setting is missing</param>
-		/// <returns>Value of the setting or the default value</returns>
-		string GetSetting( string settingName, string defaultValue );
-
-		/// <summary>
-		/// Load an enum setting from the storage or return a default value
-		/// </summary>
-		/// <param name="settingName">Name of the setting to load</param>
-		/// <param name="defaultValue">Value to return if the setting is missing</param>
-		/// <returns>Value of the setting or the default value</returns>
-		System.Enum GetSetting( string settingName, System.Enum defaultValue );
-
-		/// <summary>
-		/// Remove a setting from the storage
-		/// </summary>
-		/// <param name="settingName">Name of the setting to remove</param>
-		void RemoveSetting( string settingName );
-
-		/// <summary>
-		/// Remove an entire group of settings from the storage
-		/// </summary>
-		/// <param name="groupName">Name of the group to remove</param>
-		void RemoveGroup( string groupName );
-
-		/// <summary>
-		/// Save a setting in the storage
-		/// </summary>
-		/// <param name="settingName">Name of the setting to save</param>
-		/// <param name="settingValue">Value to be saved</param>
-		void SaveSetting( string settingName, object settingValue );
-	}
-}
diff --git a/src/ClientUtilities/util/ITestEvents.cs b/src/ClientUtilities/util/ITestEvents.cs
deleted file mode 100644
index af9a39e..0000000
--- a/src/ClientUtilities/util/ITestEvents.cs
+++ /dev/null
@@ -1,67 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-using System;
-using NUnit.Core;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	/// ITestEvents interface defines events related to loading
-	/// and unloading of test projects and loading, unloading and
-	/// running tests.
-	/// </summary>
-	public interface ITestEvents
-	{
-		// Events related to the loading and unloading
-		// of projects - including wrapper projects
-		// created in order to load assemblies. This
-		// occurs separately from the loading of tests
-		// for the assemblies in the project.
-		event TestEventHandler ProjectLoading;
-		event TestEventHandler ProjectLoaded;
-		event TestEventHandler ProjectLoadFailed;
-		event TestEventHandler ProjectUnloading;
-		event TestEventHandler ProjectUnloaded;
-		event TestEventHandler ProjectUnloadFailed;
-
-		// Events related to loading and unloading tests.
-		event TestEventHandler TestLoading;
-		event TestEventHandler TestLoaded;
-		event TestEventHandler TestLoadFailed;
-		
-		event TestEventHandler TestReloading;
-		event TestEventHandler TestReloaded;
-		event TestEventHandler TestReloadFailed;
-		
-		event TestEventHandler TestUnloading;
-		event TestEventHandler TestUnloaded;
-		event TestEventHandler TestUnloadFailed;
-	
-		// Events related to a running a set of tests
-		event TestEventHandler RunStarting;	
-		event TestEventHandler RunFinished;
-
-		// Events that arise while a test is running
-		// These are translated from calls to the runner on the
-		// EventListener interface.
-		event TestEventHandler SuiteStarting;
-		event TestEventHandler SuiteFinished;
-		event TestEventHandler TestStarting;
-		event TestEventHandler TestFinished;
-
-		/// <summary>
-		/// An unhandled exception was thrown during a test run,
-		/// and it cannot be associated with a particular test failure.
-		/// </summary>
-		event TestEventHandler TestException;
-
-		/// <summary>
-		/// Console Out/Error
-		/// </summary>
-		event TestEventHandler TestOutput;
-	}
-}
diff --git a/src/ClientUtilities/util/ITestLoader.cs b/src/ClientUtilities/util/ITestLoader.cs
deleted file mode 100644
index 4e3c124..0000000
--- a/src/ClientUtilities/util/ITestLoader.cs
+++ /dev/null
@@ -1,83 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-using System;
-using System.Collections;
-using NUnit.Core;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	/// The ITestLoader interface supports the loading and running
-	/// of tests in a remote domain.
-	/// </summary>
-	public interface ITestLoader
-	{
-		#region Properties
-
-		// See if a project is loaded
-		bool IsProjectLoaded { get; }
-
-		// See if a test has been loaded from the project
-		bool IsTestLoaded { get; }
-
-		// See if a test is running
-		bool Running { get; }
-
-		// The loaded test project
-		NUnitProject TestProject { get; set; }
-
-		string TestFileName { get; }
-
-		// Our last test results
-		TestResult TestResult { get; }
-
-		#endregion
-
-		#region Methods
-
-		// Create a new empty project using a default name
-		void NewProject();
-
-		// Create a new project given a filename
-		void NewProject( string filename );
-
-		// Load a project given a filename
-		void LoadProject( string filename );
-
-		// Load a project given a filename and config
-		void LoadProject( string filename, string configname );
-
-		// Load a project given an array of assemblies
-		void LoadProject( string[] assemblies );
-
-		// Unload current project
-		void UnloadProject();
-
-		// Load tests for current project and config
-		void LoadTest();
-
-		// Load a specific test for current project and config
-		void LoadTest( string testName );
-
-		// Unload current test
-		void UnloadTest();
-		
-		// Reload current test
-		void ReloadTest();
-
-		// Run all tests
-		void RunTests();
-
-		// Run specific tests
-		void RunTests( ITestFilter filter );
-
-		// Cancel the running test
-		void CancelTestRun();
-
-		#endregion
-	}
-}
\ No newline at end of file
diff --git a/src/ClientUtilities/util/InProcessTestRunnerFactory.cs b/src/ClientUtilities/util/InProcessTestRunnerFactory.cs
new file mode 100644
index 0000000..daa154c
--- /dev/null
+++ b/src/ClientUtilities/util/InProcessTestRunnerFactory.cs
@@ -0,0 +1,54 @@
+// ****************************************************************
+// Copyright 2010, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Core;
+
+namespace NUnit.Util
+{
+    /// <summary>
+    /// InProcessTestRunnerFactory handles creation of a suitable test 
+    /// runner for a given package to be loaded and run within the
+    /// same process.
+    /// </summary>
+    public class InProcessTestRunnerFactory : ITestRunnerFactory
+    {
+        #region ITestRunnerFactory Members
+
+        /// <summary>
+        /// Returns a test runner based on the settings in a TestPackage.
+        /// Any setting that is "consumed" by the factory is removed, so
+        /// that downstream runners using the factory will not repeatedly
+        /// create the same type of runner.
+        /// </summary>
+        /// <param name="package">The TestPackage to be loaded and run</param>
+        /// <returns>A TestRunner</returns>
+        public virtual TestRunner MakeTestRunner(TestPackage package)
+        {
+            DomainUsage domainUsage = 
+                (DomainUsage)package.GetSetting("DomainUsage", DomainUsage.Default);
+
+            switch (domainUsage)
+            {
+                case DomainUsage.Multiple:
+                    package.Settings.Remove("DomainUsage");
+                    return new MultipleTestDomainRunner();
+                case DomainUsage.None:
+                    return new RemoteTestRunner();
+                case DomainUsage.Single:
+                default:
+                    return new TestDomain();
+            }
+        }
+
+        public virtual bool CanReuse(TestRunner runner, TestPackage package)
+        {
+            return false;
+        }
+
+        #endregion
+    }
+}
diff --git a/src/ClientUtilities/util/Interfaces/IRuntimeFrameworkSelector.cs b/src/ClientUtilities/util/Interfaces/IRuntimeFrameworkSelector.cs
new file mode 100644
index 0000000..8749437
--- /dev/null
+++ b/src/ClientUtilities/util/Interfaces/IRuntimeFrameworkSelector.cs
@@ -0,0 +1,23 @@
+// ****************************************************************
+// Copyright 2010, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using NUnit.Core;
+
+namespace NUnit.Util
+{
+    interface IRuntimeFrameworkSelector
+    {
+        /// <summary>
+        /// Selects a target runtime framework for a TestPackage based on
+        /// the settings in the package and the assemblies themselves.
+        /// The package RuntimeFramework setting may be updated as a 
+        /// result and the selected runtime is returned.
+        /// </summary>
+        /// <param name="package">A TestPackage</param>
+        /// <returns>The selected RuntimeFramework</returns>
+        RuntimeFramework SelectRuntimeFramework(TestPackage package);
+    }
+}
diff --git a/src/ClientUtilities/util/Interfaces/ISettings.cs b/src/ClientUtilities/util/Interfaces/ISettings.cs
new file mode 100644
index 0000000..dbc5a82
--- /dev/null
+++ b/src/ClientUtilities/util/Interfaces/ISettings.cs
@@ -0,0 +1,118 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Util
+{
+	public delegate void SettingsEventHandler( object sender, SettingsEventArgs args );
+
+	public class SettingsEventArgs : EventArgs
+	{
+		private string settingName;
+
+		public SettingsEventArgs( string settingName )
+		{
+			this.settingName = settingName;
+		}
+
+		public string SettingName
+		{
+			get { return settingName; }
+		}
+	}
+
+	/// <summary>
+	/// The ISettings interface is used to access all user
+	/// settings and options.
+	/// </summary>
+	public interface ISettings
+	{
+		event SettingsEventHandler Changed;
+
+		/// <summary>
+		/// Load a setting from the storage.
+		/// </summary>
+		/// <param name="settingName">Name of the setting to load</param>
+		/// <returns>Value of the setting or null</returns>
+		object GetSetting( string settingName );
+
+		/// <summary>
+		/// Load a setting from the storage or return a default value
+		/// </summary>
+		/// <param name="settingName">Name of the setting to load</param>
+		/// <param name="settingName">Value to return if the setting is missing</param>
+		/// <returns>Value of the setting or the default value</returns>
+		object GetSetting( string settingName, object defaultValue );
+
+        /// <summary>
+        /// Load an integer setting from the storage or return a default value
+        /// </summary>
+        /// <param name="settingName">Name of the setting to load</param>
+        /// <param name="defaultValue">Value to return if the setting is missing</param>
+        /// <returns>Value of the setting or the default value</returns>
+        int GetSetting(string settingName, int defaultValue);
+
+        /// <summary>
+        /// Load a float setting from the storage or return a default value
+        /// </summary>
+        /// <param name="settingName">Name of the setting to load</param>
+        /// <param name="defaultValue">Value to return if the setting is missing</param>
+        /// <returns>Value of the setting or the default value</returns>
+        float GetSetting(string settingName, float defaultValue);
+
+        /// <summary>
+		/// Load a boolean setting or return a default value
+		/// </summary>
+		/// <param name="settingName">Name of setting to load</param>
+		/// <param name="defaultValue">Value to return if the setting is missing</param>
+		/// <returns>Value of the setting or the default value</returns>
+		bool GetSetting( string settingName, bool defaultValue );
+
+		/// <summary>
+		/// Load a string setting from the storage or return a default value
+		/// </summary>
+		/// <param name="settingName">Name of the setting to load</param>
+		/// <param name="defaultValue">Value to return if the setting is missing</param>
+		/// <returns>Value of the setting or the default value</returns>
+		string GetSetting( string settingName, string defaultValue );
+
+        /// <summary>
+        /// Load an enum setting from the storage or return a default value
+        /// </summary>
+        /// <param name="settingName">Name of the setting to load</param>
+        /// <param name="defaultValue">Value to return if the setting is missing</param>
+        /// <returns>Value of the setting or the default value</returns>
+        System.Enum GetSetting(string settingName, System.Enum defaultValue);
+
+        /// <summary>
+        /// Load a Font setting from the storage or return a default value
+        /// </summary>
+        /// <param name="settingName">Name of the setting to load</param>
+        /// <param name="defaultFont">Value to return if the setting is missing</param>
+        /// <returns>Value of the setting or the default value</returns>
+        System.Drawing.Font GetSetting(string settingName, System.Drawing.Font defaultFont);
+
+        /// <summary>
+		/// Remove a setting from the storage
+		/// </summary>
+		/// <param name="settingName">Name of the setting to remove</param>
+		void RemoveSetting( string settingName );
+
+		/// <summary>
+		/// Remove an entire group of settings from the storage
+		/// </summary>
+		/// <param name="groupName">Name of the group to remove</param>
+		void RemoveGroup( string groupName );
+
+		/// <summary>
+		/// Save a setting in the storage
+		/// </summary>
+		/// <param name="settingName">Name of the setting to save</param>
+		/// <param name="settingValue">Value to be saved</param>
+		void SaveSetting( string settingName, object settingValue );
+	}
+}
diff --git a/src/ClientUtilities/util/Interfaces/ITestEvents.cs b/src/ClientUtilities/util/Interfaces/ITestEvents.cs
new file mode 100644
index 0000000..0ad3f6e
--- /dev/null
+++ b/src/ClientUtilities/util/Interfaces/ITestEvents.cs
@@ -0,0 +1,67 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using NUnit.Core;
+
+namespace NUnit.Util
+{
+	/// <summary>
+	/// ITestEvents interface defines events related to loading
+	/// and unloading of test projects and loading, unloading and
+	/// running tests.
+	/// </summary>
+	public interface ITestEvents
+	{
+		// Events related to the loading and unloading
+		// of projects - including wrapper projects
+		// created in order to load assemblies. This
+		// occurs separately from the loading of tests
+		// for the assemblies in the project.
+		event TestEventHandler ProjectLoading;
+		event TestEventHandler ProjectLoaded;
+		event TestEventHandler ProjectLoadFailed;
+		event TestEventHandler ProjectUnloading;
+		event TestEventHandler ProjectUnloaded;
+		event TestEventHandler ProjectUnloadFailed;
+
+		// Events related to loading and unloading tests.
+		event TestEventHandler TestLoading;
+		event TestEventHandler TestLoaded;
+		event TestEventHandler TestLoadFailed;
+		
+		event TestEventHandler TestReloading;
+		event TestEventHandler TestReloaded;
+		event TestEventHandler TestReloadFailed;
+		
+		event TestEventHandler TestUnloading;
+		event TestEventHandler TestUnloaded;
+		event TestEventHandler TestUnloadFailed;
+	
+		// Events related to a running a set of tests
+		event TestEventHandler RunStarting;	
+		event TestEventHandler RunFinished;
+
+		// Events that arise while a test is running
+		// These are translated from calls to the runner on the
+		// EventListener interface.
+		event TestEventHandler SuiteStarting;
+		event TestEventHandler SuiteFinished;
+		event TestEventHandler TestStarting;
+		event TestEventHandler TestFinished;
+
+		/// <summary>
+		/// An unhandled exception was thrown during a test run,
+		/// and it cannot be associated with a particular test failure.
+		/// </summary>
+		event TestEventHandler TestException;
+
+		/// <summary>
+		/// Console Out/Error
+		/// </summary>
+		event TestEventHandler TestOutput;
+	}
+}
diff --git a/src/ClientUtilities/util/Interfaces/ITestLoader.cs b/src/ClientUtilities/util/Interfaces/ITestLoader.cs
new file mode 100644
index 0000000..5689635
--- /dev/null
+++ b/src/ClientUtilities/util/Interfaces/ITestLoader.cs
@@ -0,0 +1,83 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Core;
+
+namespace NUnit.Util
+{
+	/// <summary>
+	/// The ITestLoader interface supports the loading and running
+	/// of tests in a remote domain.
+	/// </summary>
+	public interface ITestLoader
+	{
+		#region Properties
+
+		// See if a project is loaded
+		bool IsProjectLoaded { get; }
+
+		// See if a test has been loaded from the project
+		bool IsTestLoaded { get; }
+
+		// See if a test is running
+		bool Running { get; }
+
+		// The loaded test project
+		NUnitProject TestProject { get; }
+
+		string TestFileName { get; }
+
+		// Our last test results
+		TestResult TestResult { get; }
+
+		#endregion
+
+		#region Methods
+
+		// Create a new empty project using a default name
+		void NewProject();
+
+		// Create a new project given a filename
+		void NewProject( string filename );
+
+		// Load a project given a filename
+		void LoadProject( string filename );
+
+		// Load a project given a filename and config
+		void LoadProject( string filename, string configname );
+
+		// Load a project given an array of assemblies
+		void LoadProject( string[] assemblies );
+
+		// Unload current project
+		void UnloadProject();
+
+		// Load tests for current project and config
+		void LoadTest();
+
+		// Load a specific test for current project and config
+		void LoadTest( string testName );
+
+		// Unload current test
+		void UnloadTest();
+		
+		// Reload current test
+		void ReloadTest();
+
+		// Run all tests
+		void RunTests();
+
+		// Run specific tests
+		void RunTests( ITestFilter filter );
+
+		// Cancel the running test
+		void CancelTestRun();
+
+		#endregion
+	}
+}
\ No newline at end of file
diff --git a/src/ClientUtilities/util/Interfaces/ITestRunnerFactory.cs b/src/ClientUtilities/util/Interfaces/ITestRunnerFactory.cs
new file mode 100644
index 0000000..0e63029
--- /dev/null
+++ b/src/ClientUtilities/util/Interfaces/ITestRunnerFactory.cs
@@ -0,0 +1,33 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using NUnit.Core;
+
+namespace NUnit.Util
+{
+    /// <summary>
+    /// A Test Runner factory can supply a suitable test runner for a given package
+    /// </summary>
+    public interface ITestRunnerFactory
+    {
+        /// <summary>
+        /// Return a suitable runner for the package provided as an argument
+        /// </summary>
+        /// <param name="package">The test package to be loaded by the runner</param>
+        /// <returns>A TestRunner</returns>
+        TestRunner MakeTestRunner(TestPackage package);
+
+        /// <summary>
+        /// Return true if the provided runner is suitable for reuse in loading
+        /// the test package provided. Otherwise, return false.
+        /// </summary>
+        /// <param name="package"></param>
+        /// <param name="runner"></param>
+        /// <returns>True if the runner may be reused</returns>
+        bool CanReuse(TestRunner runner, TestPackage package);
+    }
+}
diff --git a/src/ClientUtilities/util/MemorySettingsStorage.cs b/src/ClientUtilities/util/MemorySettingsStorage.cs
index 47ca332..98aee02 100644
--- a/src/ClientUtilities/util/MemorySettingsStorage.cs
+++ b/src/ClientUtilities/util/MemorySettingsStorage.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/ClientUtilities/util/MultipleTestDomainRunner.cs b/src/ClientUtilities/util/MultipleTestDomainRunner.cs
deleted file mode 100644
index ddd9b0d..0000000
--- a/src/ClientUtilities/util/MultipleTestDomainRunner.cs
+++ /dev/null
@@ -1,87 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-using System.Collections;
-using NUnit.Core;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	/// Summary description for MultipleTestDomainRunner.
-	/// </summary>
-	public class MultipleTestDomainRunner : AggregatingTestRunner
-	{
-		#region Constructors
-		public MultipleTestDomainRunner() : base( 0 ) { }
-
-		public MultipleTestDomainRunner( int runnerID ) : base( runnerID ) { }
-		#endregion
-
-		#region Load Method Overrides
-		public override bool Load(TestPackage package)
-		{
-			this.projectName = package.FullName;
-			this.testName.FullName = this.testName.Name = projectName;
-			runners = new ArrayList();
-
-			int nfound = 0;
-			int index = 0;
-
-			string targetAssemblyName = null;
-			if( package.TestName != null && package.Assemblies.Contains( package.TestName ) )
-			{
-				targetAssemblyName = package.TestName;
-				package.TestName = null;
-			}
-			
-			foreach( string assembly in package.Assemblies )
-			{
-				if ( targetAssemblyName == null || targetAssemblyName == assembly )
-				{
-					TestDomain runner = new TestDomain( this.runnerID * 100 + index + 1 );
-
-					TestPackage p = new TestPackage( assembly );
-					p.AutoBinPath = package.AutoBinPath;
-					p.ConfigurationFile = package.ConfigurationFile;
-					p.BasePath = package.BasePath;
-					p.PrivateBinPath = package.PrivateBinPath;
-					p.TestName = package.TestName;
-					foreach( object key in package.Settings.Keys )
-						p.Settings[key] = package.Settings[key];
-
-					if ( package.TestName == null )
-					{
-						runners.Add( runner );
-						if ( runner.Load( p ) )
-							nfound++;
-					}
-					else if ( runner.Load( p ) )
-					{
-						runners.Add( runner );
-						nfound++;
-					}
-				}
-			}
-
-			if ( package.TestName == null && targetAssemblyName == null )
-				return nfound == package.Assemblies.Count;
-			else
-				return nfound > 0;
-		}
-
-		private void CreateRunners( int count )
-		{
-			runners = new ArrayList();
-			for( int index = 0; index < count; index++ )
-			{
-				TestDomain runner = new TestDomain( this.runnerID * 100 + index + 1 );
-				runners.Add( runner );
-			}
-		}
-		#endregion
-	}
-}
diff --git a/src/ClientUtilities/util/NUnitProject.cs b/src/ClientUtilities/util/NUnitProject.cs
index 6fa8d28..9f2704f 100644
--- a/src/ClientUtilities/util/NUnitProject.cs
+++ b/src/ClientUtilities/util/NUnitProject.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -15,55 +15,17 @@ using NUnit.Core;
 namespace NUnit.Util
 {
 	/// <summary>
-	/// Types of changes that may occur to a config
-	/// </summary>
-	public enum ProjectChangeType
-	{
-		ActiveConfig,
-		AddConfig,
-		RemoveConfig,
-		UpdateConfig,
-		Other
-	}
-
-	/// <summary>
-	///  Arguments for a project event
-	/// </summary>
-	public class ProjectEventArgs : EventArgs
-	{
-		public ProjectChangeType type;
-		public string configName;
-
-		public ProjectEventArgs( ProjectChangeType type, string configName )
-		{
-			this.type = type;
-			this.configName = configName;
-		}
-	}
-
-	/// <summary>
-	/// Delegate to be used to handle project events
-	/// </summary>
-	public delegate void ProjectEventHandler( object sender, ProjectEventArgs e );
-
-	/// <summary>
 	/// Class that represents an NUnit test project
 	/// </summary>
 	public class NUnitProject
-	{
-		#region Static and instance variables
+    {
+        #region Constants
+        public static readonly string Extension = ".nunit";
+        #endregion
 
-		/// <summary>
-		/// Used to generate default names for projects
-		/// </summary>
-		private static int projectSeed = 0;
+        #region Instance variables
 
-		/// <summary>
-		/// The extension used for test projects
-		/// </summary>
-		private static readonly string nunitExtension = ".nunit";
-
-		/// <summary>
+        /// <summary>
 		/// Path to the file storing this project
 		/// </summary>
 		private string projectPath;
@@ -79,12 +41,23 @@ namespace NUnit.Util
 		///  Whether the project is dirty
 		/// </summary>
 		private bool isDirty = false;
+
+        /// <summary>
+        /// Whether canges have been made requiring a reload
+        /// </summary>
+        private bool reloadRequired = false;
 		
 		/// <summary>
 		/// Collection of configs for the project
 		/// </summary>
 		private ProjectConfigCollection configs;
 
+        /// <summary>
+        /// True for NUnit-related projects that follow the config
+        /// of the NUnit build under which they are running.
+        /// </summary>
+        private bool autoConfig;
+
 		/// <summary>
 		/// The currently active configuration
 		/// </summary>
@@ -96,6 +69,16 @@ namespace NUnit.Util
 		/// </summary>
 		private bool isAssemblyWrapper = false;
 
+        /// <summary>
+        /// The ProcessModel to be used in loading this project
+        /// </summary>
+        private ProcessModel processModel;
+
+        /// <summary>
+        /// The DomainUsage setting to be used in loading this project
+        /// </summary>
+        private DomainUsage domainUsage;
+
 		#endregion
 
 		#region Constructor
@@ -108,187 +91,8 @@ namespace NUnit.Util
 
 		#endregion
 
-		#region Static Methods
-		// True if it's one of our project types
-		public static bool IsProjectFile( string path )
-		{
-			return Path.GetExtension( path ) == nunitExtension;
-		}
-
-		// True if it's ours or one we can load
-		public static bool CanLoadAsProject( string path )
-		{
-			return	IsProjectFile( path ) ||
-					VSProject.IsProjectFile( path ) ||
-					VSProject.IsSolutionFile( path );
-		}
-
-		public static string GenerateProjectName()
-		{
-			return string.Format( "Project{0}", ++projectSeed );
-		}
-
-		public static NUnitProject EmptyProject()
-		{
-			return new NUnitProject( GenerateProjectName() );
-		}
-
-		public static NUnitProject NewProject()
-		{
-			NUnitProject project = EmptyProject();
-
-			project.Configs.Add( "Debug" );
-			project.Configs.Add( "Release" );
-			project.IsDirty = false;
-
-			return project;
-		}
-
-		/// <summary>
-		/// Return a test project by either loading it from
-		/// the supplied path, creating one from a VS file
-		/// or wrapping an assembly.
-		/// </summary>
-		public static NUnitProject LoadProject( string path )
-		{
-			if ( NUnitProject.IsProjectFile( path ) )
-			{
-				NUnitProject project = new NUnitProject( path );
-				project.Load();
-				return project;
-			}
-			else if ( VSProject.IsProjectFile( path ) )
-				return NUnitProject.FromVSProject( path );
-			else if ( VSProject.IsSolutionFile( path ) )
-				return NUnitProject.FromVSSolution( path );
-			else
-				return NUnitProject.FromAssembly( path );
-			
-		}
-
-		/// <summary>
-		/// Creates a project to wrap a list of assemblies
-		/// </summary>
-		public static NUnitProject FromAssemblies( string[] assemblies )
-		{
-			// if only one assembly is passed in then the configuration file
-			// should follow the name of the assembly. This will only happen
-			// if the LoadAssembly method is called. Currently the console ui
-			// does not differentiate between having one or multiple assemblies
-			// passed in.
-			if ( assemblies.Length == 1)
-				return NUnitProject.FromAssembly(assemblies[0]);
-
-
-			NUnitProject project = NUnitProject.EmptyProject();
-			ProjectConfig config = new ProjectConfig( "Default" );
-			foreach( string assembly in assemblies )
-			{
-				string fullPath = Path.GetFullPath( assembly );
-
-				if ( !File.Exists( fullPath ) )
-					throw new FileNotFoundException( string.Format( "Assembly not found: {0}", fullPath ) );
-				
-				config.Assemblies.Add( fullPath );
-			}
-
-			project.Configs.Add( config );
-
-			// TODO: Deduce application base, and provide a
-			// better value for loadpath and project path
-			// analagous to how new projects are handled
-			string basePath = Path.GetDirectoryName( Path.GetFullPath( assemblies[0] ) );
-			project.projectPath = Path.Combine( basePath, project.Name + ".nunit" );
-
-			project.IsDirty = true;
-
-			return project;
-		}
-
-		/// <summary>
-		/// Creates a project to wrap an assembly
-		/// </summary>
-		public static NUnitProject FromAssembly( string assemblyPath )
-		{
-			if ( !File.Exists( assemblyPath ) )
-				throw new FileNotFoundException( string.Format( "Assembly not found: {0}", assemblyPath ) );
-
-			string fullPath = Path.GetFullPath( assemblyPath );
-
-			NUnitProject project = new NUnitProject( fullPath );
-			
-			ProjectConfig config = new ProjectConfig( "Default" );
-			config.Assemblies.Add( fullPath );
-			project.Configs.Add( config );
-
-			project.isAssemblyWrapper = true;
-			project.IsDirty = false;
-
-			return project;
-		}
-
-		public static NUnitProject FromVSProject( string vsProjectPath )
-		{
-			NUnitProject project = new NUnitProject( Path.GetFullPath( vsProjectPath ) );
-
-			VSProject vsProject = new VSProject( vsProjectPath );
-			project.Add( vsProject );
-
-			project.isDirty = false;
-
-			return project;
-		}
-
-		public static NUnitProject FromVSSolution( string solutionPath )
-		{
-			NUnitProject project = new NUnitProject( Path.GetFullPath( solutionPath ) );
-
-			string solutionDirectory = Path.GetDirectoryName( solutionPath );
-			using(StreamReader reader = new StreamReader( solutionPath ))
-			{
-				char[] delims = { '=', ',' };
-				char[] trimchars = { ' ', '"' };
-
-				string line = reader.ReadLine();
-				while ( line != null )
-				{
-					if ( line.StartsWith( "Project" ) )
-					{
-						string[] parts = line.Split( delims );
-						string vsProjectPath = parts[2].Trim(trimchars);
-						
-						if ( VSProject.IsProjectFile( vsProjectPath ) )
-							project.Add( new VSProject( Path.Combine( solutionDirectory, vsProjectPath ) ) );
-					}
-
-					line = reader.ReadLine();
-				}
-			}
-
-			project.isDirty = false;
-
-			return project;
-		}
-
-		/// <summary>
-		/// Figure out the proper name to be used when saving a file.
-		/// </summary>
-		public static string ProjectPathFromFile( string path )
-		{
-			string fileName = Path.GetFileNameWithoutExtension( path ) + nunitExtension;
-			return Path.Combine( Path.GetDirectoryName( path ), fileName );
-		}
-
-		#endregion
-
 		#region Properties and Events
 
-		public static int ProjectSeed
-		{
-			get { return projectSeed; }
-			set { projectSeed = value; }
-		}
-
 		/// <summary>
 		/// The path to which a project will be saved.
 		/// </summary>
@@ -330,21 +134,21 @@ namespace NUnit.Util
 					return DefaultBasePath; 
 				return basePath;
 			}
-			set	
-			{ 
-				basePath = value;
-				
-				if ( basePath != null && basePath != string.Empty 
-					&& !Path.IsPathRooted( basePath ) )
-				{
-					basePath = Path.Combine( 
-						DefaultBasePath, 
-						basePath );	
-				}
+            set
+            {
+                basePath = value;
 
-				basePath = PathUtils.Canonicalize( basePath );
-				OnProjectChange( ProjectChangeType.Other, null );
-			}
+                if (basePath != null && basePath != string.Empty
+                    && !Path.IsPathRooted(basePath))
+                {
+                    basePath = Path.Combine(
+                        DefaultBasePath,
+                        basePath);
+                }
+
+                basePath = PathUtils.Canonicalize(basePath);
+                HasChangesRequiringReload = IsDirty = true;
+            }
 		}
 
 		/// <summary>
@@ -355,6 +159,12 @@ namespace NUnit.Util
 			get { return Path.GetFileNameWithoutExtension( projectPath ); }
 		}
 
+        public bool AutoConfig
+        {
+            get { return autoConfig; }
+            set { autoConfig = value; }
+        }
+
 		public ProjectConfig ActiveConfig
 		{
 			get 
@@ -364,8 +174,8 @@ namespace NUnit.Util
 					activeConfig = null;
 				
 				// In case no active config is set or it was removed
-				if ( activeConfig == null && configs.Count > 0 )
-					activeConfig = configs[0];
+                if (activeConfig == null && configs.Count > 0)
+                    activeConfig = configs[0];
 				
 				return activeConfig; 
 			}
@@ -396,6 +206,7 @@ namespace NUnit.Util
 		public bool IsAssemblyWrapper
 		{
 			get { return isAssemblyWrapper; }
+			set { isAssemblyWrapper = value; }
 		}
 
 		public string ConfigurationFile
@@ -412,24 +223,70 @@ namespace NUnit.Util
 		public bool IsDirty
 		{
 			get { return isDirty; }
-			set { isDirty = value; }
-		}
+			set 
+            { 
+                isDirty = value;
+
+                if (isAssemblyWrapper && value == true)
+                {
+                    projectPath = Path.ChangeExtension(projectPath, ".nunit");
+                    isAssemblyWrapper = false;
+                    HasChangesRequiringReload = true;
+                }
+            }
+		}
+
+        public bool HasChangesRequiringReload
+        {
+            get { return reloadRequired; }
+            set { reloadRequired = value; }
+        }
+
+        public ProcessModel ProcessModel
+        {
+            get { return processModel; }
+            set
+            {
+                processModel = value;
+                HasChangesRequiringReload = IsDirty = true;
+            }
+        }
+
+        public DomainUsage DomainUsage
+        {
+            get { return domainUsage; }
+            set
+            {
+                domainUsage = value;
+                HasChangesRequiringReload = IsDirty = true;
+            }
+        }
 
 		public ProjectConfigCollection Configs
 		{
 			get { return configs; }
 		}
+		#endregion
 
-		public event ProjectEventHandler Changed;
+        #region Static Methods
+        public static bool IsNUnitProjectFile(string path)
+        {
+            return Path.GetExtension(path) == Extension;
+        }
 
-		#endregion
+        public static string ProjectPathFromFile(string path)
+        {
+            string fileName = Path.GetFileNameWithoutExtension(path) + NUnitProject.Extension;
+            return Path.Combine(Path.GetDirectoryName(path), fileName);
+        }
+        #endregion
 
-		#region Instance Methods
+        #region Instance Methods
 
-		public void SetActiveConfig( int index )
+        public void SetActiveConfig( int index )
 		{
 			activeConfig = configs[index];
-			OnProjectChange( ProjectChangeType.ActiveConfig, activeConfig.Name );
+            HasChangesRequiringReload = IsDirty = true;
 		}
 
 		public void SetActiveConfig( string name )
@@ -439,40 +296,8 @@ namespace NUnit.Util
 				if ( config.Name == name )
 				{
 					activeConfig = config;
-					OnProjectChange( ProjectChangeType.ActiveConfig, activeConfig.Name );
-					break;
-				}
-			}
-		}
-
-//		public int IndexOf( string name )
-//		{
-//			for( int index = 0; index < configs.Count; index++ )
-//				if( configs[index].Name == name )
-//					return index;
-//
-//			return -1;
-//		}
-
-		public void OnProjectChange( ProjectChangeType type, string configName )
-		{
-			isDirty = true;
-
-			if ( isAssemblyWrapper )
-			{
-				projectPath = Path.ChangeExtension( projectPath, ".nunit" );
-				isAssemblyWrapper = false;
-			}
-
-			if ( Changed != null )
-				Changed( this, new ProjectEventArgs( type, configName ) );
-
-			if ( type == ProjectChangeType.RemoveConfig )
-			{
-				if ( activeConfig == null || activeConfig.Name == configName )
-				{
-					if ( configs.Count > 0 )
-						SetActiveConfig( 0 );
+                    HasChangesRequiringReload = IsDirty = true;
+                    break;
 				}
 			}
 		}
@@ -516,12 +341,25 @@ namespace NUnit.Util
 								if ( reader.NodeType == XmlNodeType.Element )
 								{
 									activeConfigName = reader.GetAttribute( "activeconfig" );
-                                    if (activeConfigName == "NUnitAutoConfig")
-										activeConfigName = NUnitFramework.BuildConfiguration;
-									string appbase = reader.GetAttribute( "appbase" );
+
+                                    string autoConfig = reader.GetAttribute("autoconfig");
+                                    if (autoConfig != null)
+                                        this.AutoConfig = autoConfig.ToLower() == "true";
+                                    if (this.AutoConfig)
+										activeConfigName = NUnitConfiguration.BuildConfiguration;
+									
+                                    string appbase = reader.GetAttribute( "appbase" );
 									if ( appbase != null )
 										this.BasePath = appbase;
-								}
+
+                                    string processModel = reader.GetAttribute("processModel");
+                                    if (processModel != null)
+                                        this.ProcessModel = (ProcessModel)Enum.Parse(typeof(ProcessModel), processModel);
+
+                                    string domainUsage = reader.GetAttribute("domainUsage");
+                                    if (domainUsage != null)
+                                        this.DomainUsage = (DomainUsage)Enum.Parse(typeof(DomainUsage), domainUsage);
+                                }
 								break;
 
 							case "Config":
@@ -542,7 +380,12 @@ namespace NUnit.Util
 											currentConfig.BinPathType = BinPathType.Manual;
 									else
 										currentConfig.BinPathType = (BinPathType)Enum.Parse( typeof( BinPathType ), type, true );
-									Configs.Add( currentConfig );
+
+                                    string runtime = reader.GetAttribute("runtimeFramework");
+                                    if ( runtime != null )
+                                        currentConfig.RuntimeFramework = RuntimeFramework.Parse(runtime);
+
+                                    Configs.Add(currentConfig);
 									if ( configName == activeConfigName )
 										activeConfig = currentConfig;
 								}
@@ -564,6 +407,7 @@ namespace NUnit.Util
 						}
 
 				this.IsDirty = false;
+                this.reloadRequired = false;
 			}
 			catch( FileNotFoundException )
 			{
@@ -604,6 +448,12 @@ namespace NUnit.Util
 					writer.WriteAttributeString( "activeconfig", ActiveConfigName );
 				if ( this.BasePath != this.DefaultBasePath )
 					writer.WriteAttributeString( "appbase", this.BasePath );
+                if (this.AutoConfig)
+                    writer.WriteAttributeString("autoconfig", "true");
+                if (this.ProcessModel != ProcessModel.Default)
+                    writer.WriteAttributeString("processModel", this.ProcessModel.ToString());
+                if (this.DomainUsage != DomainUsage.Default)
+                    writer.WriteAttributeString("domainUsage", this.DomainUsage.ToString());
 				writer.WriteEndElement();
 			}
 			
@@ -626,6 +476,9 @@ namespace NUnit.Util
 				else
 					writer.WriteAttributeString( "binpathtype", config.BinPathType.ToString() );
 
+                if (config.RuntimeFramework != null)
+                    writer.WriteAttributeString("runtimeFramework", config.RuntimeFramework.ToString());
+
 				foreach( string assembly in config.Assemblies )
 				{
 					writer.WriteStartElement( "assembly" );
diff --git a/src/ClientUtilities/util/NUnitRegistry.cs b/src/ClientUtilities/util/NUnitRegistry.cs
index cd61361..1e0cefc 100644
--- a/src/ClientUtilities/util/NUnitRegistry.cs
+++ b/src/ClientUtilities/util/NUnitRegistry.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 namespace NUnit.Util
@@ -13,7 +13,7 @@ namespace NUnit.Util
 
 	/// <summary>
 	/// NUnitRegistry provides static properties for NUnit's
-	/// CurrentUser and LocalMachine subkeys.
+	/// subkey under CurrentUser.
 	/// </summary>
 	public class NUnitRegistry
 	{
@@ -73,14 +73,6 @@ namespace NUnit.Util
 			} 
 		}
 
-		/// <summary>
-		/// Registry subkey for the local machine
-		/// </summary>
-		public static RegistryKey LocalMachine
-		{
-			get { return Registry.LocalMachine.CreateSubKey( testMode ? TEST_KEY : KEY ); }
-		}
-
 		public static void ClearTestKeys()
 		{
 			ClearSubKey( Registry.CurrentUser, TEST_KEY );
diff --git a/src/ClientUtilities/util/PathUtils.cs b/src/ClientUtilities/util/PathUtils.cs
index b6e1383..3ea4319 100644
--- a/src/ClientUtilities/util/PathUtils.cs
+++ b/src/ClientUtilities/util/PathUtils.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2002-2003, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -44,24 +44,29 @@ namespace NUnit.Util
 				throw new ArgumentNullException (from);
 			if (to == null)
 				throw new ArgumentNullException (to);
-			if (!Path.IsPathRooted (to))
-				return to;
-			if (Path.GetPathRoot (from) != Path.GetPathRoot (to))
-				return null;
 
-			string[] _from = from.Split (PathUtils.DirectorySeparatorChar, 
-				PathUtils.AltDirectorySeparatorChar);
-			string[] _to   =   to.Split (PathUtils.DirectorySeparatorChar, 
-				PathUtils.AltDirectorySeparatorChar);
+            string toPathRoot = Path.GetPathRoot(to);
+            if (toPathRoot == null || toPathRoot == string.Empty)
+                return to;
+            string fromPathRoot = Path.GetPathRoot(from);
+
+            if (!PathsEqual(toPathRoot, fromPathRoot))
+                return null;
+
+            string fromNoRoot = from.Substring(fromPathRoot.Length);
+            string toNoRoot = to.Substring(toPathRoot.Length);
+
+            string[] _from = SplitPath(fromNoRoot);
+            string[] _to = SplitPath(toNoRoot);
 
 			StringBuilder sb = new StringBuilder (Math.Max (from.Length, to.Length));
 
 			int last_common, min = Math.Min (_from.Length, _to.Length);
 			for (last_common = 0; last_common < min;  ++last_common) 
 			{
-				if (!_from [last_common].Equals (_to [last_common]))
-					break;
-			}
+                if (!PathsEqual(_from[last_common], _to[last_common]))
+                    break;
+            }
 
 			if (last_common < _from.Length)
 				sb.Append ("..");
@@ -110,8 +115,12 @@ namespace NUnit.Util
 						break;
 				}
 			}
-	
-			return String.Join( DirectorySeparatorChar.ToString(), (string[])parts.ToArray( typeof( string ) ) );
+
+            // Trailing separator removal
+            if (parts.Count > 1 && path.Length > 1 && (string)parts[parts.Count - 1] == "")
+                parts.RemoveAt(parts.Count - 1);
+
+            return String.Join(DirectorySeparatorChar.ToString(), (string[])parts.ToArray(typeof(string)));
 		}
 
 		/// <summary>
@@ -145,11 +154,9 @@ namespace NUnit.Util
 
 			// if lengths are the same, check for equality
 			if ( length1 == length2 )
-				//return path1.ToLower() == path2.ToLower();
 				return string.Compare( path1, path2, IsWindows() ) == 0;
 
 			// path 2 is longer than path 1: see if initial parts match
-			//if ( path1.ToLower() != path2.Substring( 0, length1 ).ToLower() )
 			if ( string.Compare( path1, path2.Substring( 0, length1 ), IsWindows() ) != 0 )
 				return false;
 			
@@ -200,10 +207,54 @@ namespace NUnit.Util
 		#endregion
 
 		#region Helper Methods
+
 		private static bool IsWindows()
 		{
 			return PathUtils.DirectorySeparatorChar == '\\';
 		}
-		#endregion
+
+        private static string[] SplitPath(string path)
+        {
+            char[] separators = new char[] { PathUtils.DirectorySeparatorChar, PathUtils.AltDirectorySeparatorChar };
+
+#if NET_2_0
+            return path.Split(separators, StringSplitOptions.RemoveEmptyEntries);
+#else
+            string[] trialSplit = path.Split(separators);
+            
+            int emptyEntries = 0;
+            foreach(string piece in trialSplit)
+                if (piece == string.Empty)
+                    emptyEntries++;
+
+            if (emptyEntries == 0)
+                return trialSplit;
+
+            string[] finalSplit = new string[trialSplit.Length - emptyEntries];
+            int index = 0;
+            foreach(string piece in trialSplit)
+                if (piece != string.Empty)
+                    finalSplit[index++] = piece;
+
+            return finalSplit;
+#endif
+        }
+
+        private static bool PathsEqual(string path1, string path2)
+        {
+#if NET_2_0
+            if (PathUtils.IsWindows())
+                return path1.Equals(path2, StringComparison.InvariantCultureIgnoreCase);
+            else
+                return path1.Equals(path2, StringComparison.InvariantCulture);
+#else
+            if (PathUtils.IsWindows())
+                return path1.ToLower().Equals(path2.ToLower());
+            else
+                return path1.Equals(path2);
+#endif
+        }
+
+        #endregion
 	}
 }
diff --git a/src/ClientUtilities/util/ProcessRunner.cs b/src/ClientUtilities/util/ProcessRunner.cs
index ca74297..b885921 100644
--- a/src/ClientUtilities/util/ProcessRunner.cs
+++ b/src/ClientUtilities/util/ProcessRunner.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -20,39 +20,92 @@ namespace NUnit.Util
 	/// <summary>
 	/// Summary description for ProcessRunner.
 	/// </summary>
-	public class ProcessRunner : ProxyTestRunner, IDisposable
+	public class ProcessRunner : ProxyTestRunner
 	{
+        static Logger log = InternalTrace.GetLogger(typeof(ProcessRunner));
+
 		private TestAgent agent;
 
+        private RuntimeFramework runtimeFramework;
+
 		#region Constructors
 		public ProcessRunner() : base( 0 ) { }
 
 		public ProcessRunner( int runnerID ) : base( runnerID ) { }
 		#endregion
 
-		public override bool Load(TestPackage package)
+        #region Properties
+        public RuntimeFramework RuntimeFramework
+        {
+            get { return runtimeFramework; }
+        }
+        #endregion
+
+        public override bool Load(TestPackage package)
 		{
-			if ( this.agent == null )
-				this.agent = Services.TestAgency.GetAgent( AgentType.ProcessAgent, 5000 );		
+            log.Info("Loading " + package.Name);
+			Unload();
+
+            runtimeFramework = package.Settings["RuntimeFramework"] as RuntimeFramework;
+            if ( runtimeFramework == null )
+                 runtimeFramework = RuntimeFramework.CurrentFramework;
+
+            bool enableDebug = package.GetSetting("EnableDebug", false);
+
+            bool loaded = false;
+
+			try
+			{
+                if (this.agent == null)
+                {
+                    this.agent = Services.TestAgency.GetAgent(
+                        runtimeFramework,
+                        30000,
+                        enableDebug);
+
+                    if (this.agent == null)
+                        return false;
+                }
 	
-			if ( this.TestRunner == null )
-				this.TestRunner = agent.CreateRunner(this.runnerID);
+				if ( this.TestRunner == null )
+					this.TestRunner = agent.CreateRunner(this.runnerID);
+
+				loaded = base.Load (package);
+                return loaded;
+			}
+			finally
+			{
+                // Clean up if the load failed
+				if ( !loaded ) Unload();
+			}
+		}
 
-			return base.Load (package);
+        public override void Unload()
+        {
+            if (Test != null)
+            {
+                log.Info("Unloading " + Path.GetFileName(Test.TestName.Name));
+                this.TestRunner.Unload();
+                this.TestRunner = null;
+            }
 		}
 
 		#region IDisposable Members
-		public void Dispose()
+
+		public override void Dispose()
 		{
-			if ( TestRunner != null )
-				this.TestRunner.Unload();
+            // Do this first, because the next step will
+            // make the downstream runner inaccessible.
+            base.Dispose();
 
-			if ( this.agent != null )
-				Services.TestAgency.ReleaseAgent(this.agent);
+            if (this.agent != null)
+            {
+                log.Info("Stopping remote agent");
+                agent.Stop();
+                this.agent = null;
+            }
+        }
 
-			this.TestRunner = null;
-			this.agent = null;
-		}
 		#endregion
 	}
 }
diff --git a/src/ClientUtilities/util/ProjectConfig.cs b/src/ClientUtilities/util/ProjectConfig.cs
index ceaaa92..4fff812 100644
--- a/src/ClientUtilities/util/ProjectConfig.cs
+++ b/src/ClientUtilities/util/ProjectConfig.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -57,6 +57,11 @@ namespace NUnit.Util
 		/// True if assembly paths should be added to bin path
 		/// </summary>
 		private BinPathType binPathType = BinPathType.Auto;
+        
+        /// <summary>
+        /// The CLR under which tests are to be run
+        /// </summary>
+        private RuntimeFramework runtimeFramework;
 
 		#endregion
 
@@ -71,11 +76,8 @@ namespace NUnit.Util
 
 		#region Properties and Events
 
-		public event EventHandler Changed;
-
 		public NUnitProject Project
 		{
-//			get { return project; }
 			set { project = value; }
 		}
 
@@ -86,8 +88,8 @@ namespace NUnit.Util
 			{
 				if ( name != value )
 				{
-					name = value; 
-					FireChangedEvent();
+					name = value;
+					NotifyProjectOfChange();
 				}
 			}
 		}
@@ -121,7 +123,7 @@ namespace NUnit.Util
 				if ( BasePath != value )
 				{
 					basePath = value;
-					FireChangedEvent();
+					NotifyProjectOfChange();
 				}
 			}
 		}
@@ -158,7 +160,7 @@ namespace NUnit.Util
 				if ( ConfigurationFile != value )
 				{
 					configFile = value;
-					FireChangedEvent();
+					NotifyProjectOfChange();
 				}
 			}
 		}
@@ -191,7 +193,7 @@ namespace NUnit.Util
 				{
 					binPath = value;
 					binPathType = binPath == null ? BinPathType.Auto : BinPathType.Manual;
-					FireChangedEvent();
+					NotifyProjectOfChange();
 				}
 			}
 		}
@@ -207,7 +209,7 @@ namespace NUnit.Util
 				if ( binPathType != value )
 				{
 					binPathType = value;
-					FireChangedEvent();
+					NotifyProjectOfChange();
 				}
 			}
 		}
@@ -219,6 +221,19 @@ namespace NUnit.Util
 		{
 			get { return assemblies; }
 		}
+
+        public RuntimeFramework RuntimeFramework
+        {
+            get { return runtimeFramework; }
+            set 
+			{
+				if ( runtimeFramework != value )
+				{
+					runtimeFramework = value; 
+					NotifyProjectOfChange();
+				}
+			}
+        }
 		#endregion
 
 		public TestPackage MakeTestPackage()
@@ -237,19 +252,31 @@ namespace NUnit.Util
 			}
 
 			package.AutoBinPath = this.BinPathType == BinPathType.Auto;
+            if (this.RuntimeFramework != null)
+                package.Settings["RuntimeFramework"] = this.RuntimeFramework;
+
+            if (project.ProcessModel != ProcessModel.Default)
+                package.Settings["ProcessModel"] = project.ProcessModel;
+
+            if (project.DomainUsage != DomainUsage.Default)
+                package.Settings["DomainUsage"] = project.DomainUsage;
 
 			return package;
 		}
 
 		private void assemblies_Changed( object sender, EventArgs e )
 		{
-			FireChangedEvent();
+			NotifyProjectOfChange();
 		}
 
-		private void FireChangedEvent()
-		{
-			if ( Changed != null )
-				Changed( this, EventArgs.Empty );
-		}
+        private void NotifyProjectOfChange()
+        {
+            if (project != null)
+            {
+                project.IsDirty = true;
+                if (ReferenceEquals(this, project.ActiveConfig))
+                    project.HasChangesRequiringReload = true;
+            }
+        }
 	}
 }
diff --git a/src/ClientUtilities/util/ProjectConfigCollection.cs b/src/ClientUtilities/util/ProjectConfigCollection.cs
index 6566d83..e9663c0 100644
--- a/src/ClientUtilities/util/ProjectConfigCollection.cs
+++ b/src/ClientUtilities/util/ProjectConfigCollection.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -42,7 +42,6 @@ namespace NUnit.Util
 		{
 			List.Add( config );
 			config.Project = this.project;
-			config.Changed += new EventHandler(config_Changed);
 		}
 
 		public void Add( string name )
@@ -81,22 +80,25 @@ namespace NUnit.Util
 			return IndexOf( name ) >= 0;
 		}
 
-		protected override void OnRemoveComplete( int index, object obj )
-		{
-			ProjectConfig config = obj as ProjectConfig;
-			this.project.OnProjectChange( ProjectChangeType.RemoveConfig, config.Name );
-		}
+        protected override void OnRemove(int index, object value)
+        {
+            if (project != null)
+            {
+                ProjectConfig config = value as ProjectConfig;
+                project.IsDirty = true;
+                if ( config.Name == project.ActiveConfigName )
+                    project.HasChangesRequiringReload =  true;
+            }
+        }
 
 		protected override void OnInsertComplete( int index, object obj )
 		{
-			ProjectConfig config = obj as ProjectConfig;
-			project.OnProjectChange( ProjectChangeType.AddConfig, config.Name );
-		}
-
-		private void config_Changed(object sender, EventArgs e)
-		{
-			ProjectConfig config = sender as ProjectConfig;
-			project.OnProjectChange( ProjectChangeType.UpdateConfig, config.Name );
+            if (project != null)
+            {
+                project.IsDirty = true;
+                if (this.Count == 1)
+                    project.HasChangesRequiringReload = true;
+            }
 		}
 		#endregion
 	}
diff --git a/src/ClientUtilities/util/ProjectConverters/VisualStudioConverter.cs b/src/ClientUtilities/util/ProjectConverters/VisualStudioConverter.cs
new file mode 100644
index 0000000..912bf70
--- /dev/null
+++ b/src/ClientUtilities/util/ProjectConverters/VisualStudioConverter.cs
@@ -0,0 +1,67 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.IO;
+using NUnit.Core;
+using NUnit.Core.Extensibility;
+using NUnit.Util.Extensibility;
+
+namespace NUnit.Util.ProjectConverters
+{
+	/// <summary>
+	/// Summary description for VSProjectLoader.
+	/// </summary>
+	public class VisualStudioConverter : IProjectConverter
+	{
+		#region IProjectConverter Members
+
+		public bool CanConvertFrom(string path)
+		{
+			return VSProject.IsProjectFile(path)|| VSProject.IsSolutionFile(path);
+		}
+
+		public NUnitProject ConvertFrom(string path)
+		{
+			NUnitProject project = new NUnitProject( Path.GetFullPath( path ) );
+
+			if ( VSProject.IsProjectFile(path) )
+			{
+				VSProject vsProject = new VSProject( path );
+				project.Add( vsProject );
+			}
+			else if ( VSProject.IsSolutionFile(path) )
+			{
+				string solutionDirectory = Path.GetDirectoryName( path );
+				using(StreamReader reader = new StreamReader( path ))
+				{
+					char[] delims = { '=', ',' };
+					char[] trimchars = { ' ', '"' };
+
+					string line = reader.ReadLine();
+					while ( line != null )
+					{
+						if ( line.StartsWith( "Project" ) )
+						{
+							string[] parts = line.Split( delims );
+							string vsProjectPath = parts[2].Trim(trimchars);
+						
+							if ( VSProject.IsProjectFile( vsProjectPath ) )
+								project.Add( new VSProject( Path.Combine( solutionDirectory, vsProjectPath ) ) );
+						}
+
+						line = reader.ReadLine();
+					}
+				}
+			}
+
+			project.IsDirty = false;
+
+			return project;
+		}
+
+		#endregion
+	}
+}
diff --git a/src/ClientUtilities/util/ProjectFormatException.cs b/src/ClientUtilities/util/ProjectFormatException.cs
index 964f8ed..1455d69 100644
--- a/src/ClientUtilities/util/ProjectFormatException.cs
+++ b/src/ClientUtilities/util/ProjectFormatException.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
diff --git a/src/ClientUtilities/util/ProxyTestRunner.cs b/src/ClientUtilities/util/ProxyTestRunner.cs
deleted file mode 100644
index e41a733..0000000
--- a/src/ClientUtilities/util/ProxyTestRunner.cs
+++ /dev/null
@@ -1,179 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-namespace NUnit.Util
-{
-	using System;
-	using System.Collections;
-	using System.IO;
-	using NUnit.Core;
-
-	/// <summary>
-	/// ProxyTestRunner is the abstract base for all client-side
-	/// TestRunner implementations that delegate to a remote
-	/// TestRunner. All calls are simply passed on to the
-	/// TestRunner that is provided to the constructor.
-	/// 
-	/// This class is similar to DelegatingTestRunner in the
-	/// NUnit core, but is separate because of how it is used.
-	/// 
-	/// Although the class is abstract, it has no abstract 
-	/// methods specified because each implementation will
-	/// need to override different methods. All methods are
-	/// specified using interface syntax and the derived class
-	/// must explicitly implement TestRunner in order to 
-	/// redefine the selected methods.
-	/// </summary>
-	public abstract class ProxyTestRunner : TestRunner
-	{
-		#region Instance Variables
-
-		/// <summary>
-		/// Our runner ID
-		/// </summary>
-		protected int runnerID;
-
-		/// <summary>
-		/// The downstream TestRunner
-		/// </summary>
-		private TestRunner testRunner;
-
-		/// <summary>
-		/// The event listener for the currently running test
-		/// </summary>
-		protected EventListener listener;
-
-		#endregion
-
-		#region Construction
-		public ProxyTestRunner(TestRunner testRunner)
-		{
-			this.testRunner = testRunner;
-			this.runnerID = testRunner.ID;
-		}
-
-		/// <summary>
-		/// Protected constructor for runners that create their own
-		/// specialized downstream runner.
-		/// </summary>
-		protected ProxyTestRunner( int runnerID )
-		{
-			this.runnerID = runnerID;
-		}
-		#endregion
-
-		#region Properties
-		public virtual int ID
-		{
-			get { return runnerID; }
-		}
-
-		public virtual bool Running
-		{
-			get { return testRunner != null && testRunner.Running; }
-		}
-
-		public virtual IList AssemblyInfo
-		{
-			get { return testRunner == null ? null : testRunner.AssemblyInfo; }
-		}
-
-		public virtual ITest Test
-		{
-			get { return testRunner == null ? null : testRunner.Test; }
-		}
-
-		public virtual TestResult TestResult
-		{
-			get { return testRunner == null ? null : testRunner.TestResult; }
-		}
-
-		/// <summary>
-		/// Protected property copies any settings to the downstream test runner
-		/// when it is set. Derived runners overriding this should call the base
-		/// or copy the settings themselves.
-		/// </summary>
-		protected virtual TestRunner TestRunner
-		{
-			get { return testRunner; }
-			set { testRunner = value; }
-		}
-		#endregion
-
-		#region Load and Unload Methods
-		public virtual bool Load( TestPackage package )
-		{
-			return this.testRunner.Load( package );
-		}
-
-		public virtual void Unload()
-		{
-            if ( this.testRunner != null )
-			    this.testRunner.Unload();
-		}
-		#endregion
-
-		#region CountTestCases
-		public virtual int CountTestCases( ITestFilter filter )
-		{
-			return this.testRunner.CountTestCases( filter );
-		}
-		#endregion
-
-		#region Methods for Running Tests
-		public virtual TestResult Run(EventListener listener)
-		{
-			// Save active listener for derived classes
-			this.listener = listener;
-			return this.testRunner.Run(listener);
-		}
-
-		public virtual TestResult Run(EventListener listener, ITestFilter filter)
-		{
-			// Save active listener for derived classes
-			this.listener = listener;
-			return this.testRunner.Run(listener, filter);
-		}
-
-		public virtual void BeginRun( EventListener listener )
-		{
-			// Save active listener for derived classes
-			this.listener = listener;
-			this.testRunner.BeginRun( listener );
-		}
-
-		public virtual void BeginRun( EventListener listener, ITestFilter filter )
-		{
-			// Save active listener for derived classes
-			this.listener = listener;
-			this.testRunner.BeginRun( listener, filter );
-		}
-
-		public virtual TestResult EndRun()
-		{
-			return this.testRunner.EndRun();
-		}
-
-		public virtual void CancelRun()
-		{
-			this.testRunner.CancelRun();
-		}
-
-		public virtual void Wait()
-		{
-			this.testRunner.Wait();
-		}
-		#endregion
-
-		#region InitializeLifetimeService Override
-//		public override object InitializeLifetimeService()
-//		{
-//			return null;
-//		}
-		#endregion
-
-	}
-}
diff --git a/src/ClientUtilities/util/RecentFileEntry.cs b/src/ClientUtilities/util/RecentFileEntry.cs
index 0813fd7..c365ff3 100644
--- a/src/ClientUtilities/util/RecentFileEntry.cs
+++ b/src/ClientUtilities/util/RecentFileEntry.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/ClientUtilities/util/RecentFiles.cs b/src/ClientUtilities/util/RecentFiles.cs
index 62bc7ff..f93d6fd 100644
--- a/src/ClientUtilities/util/RecentFiles.cs
+++ b/src/ClientUtilities/util/RecentFiles.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/ClientUtilities/util/RecentFilesCollection.cs b/src/ClientUtilities/util/RecentFilesCollection.cs
index 3174067..9603168 100644
--- a/src/ClientUtilities/util/RecentFilesCollection.cs
+++ b/src/ClientUtilities/util/RecentFilesCollection.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/ClientUtilities/util/RegistrySettingsStorage.cs b/src/ClientUtilities/util/RegistrySettingsStorage.cs
index 07f0e88..d8d925d 100644
--- a/src/ClientUtilities/util/RegistrySettingsStorage.cs
+++ b/src/ClientUtilities/util/RegistrySettingsStorage.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2002-2003, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/ClientUtilities/util/RemoteTestAgent.cs b/src/ClientUtilities/util/RemoteTestAgent.cs
index 8c2589b..6086919 100644
--- a/src/ClientUtilities/util/RemoteTestAgent.cs
+++ b/src/ClientUtilities/util/RemoteTestAgent.cs
@@ -1,6 +1,14 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
 using System;
 using System.Threading;
 using System.Collections;
+using System.IO;
+using System.Reflection;
 using System.Runtime.Remoting;
 using System.Runtime.Remoting.Channels;
 using System.Runtime.Remoting.Channels.Tcp;
@@ -15,119 +23,105 @@ namespace NUnit.Util
 	/// to it. Rather, it reports back to the sponsoring TestAgency upon 
 	/// startup so that the agency may in turn provide it to clients for use.
 	/// </summary>
-	public class RemoteTestAgent : MarshalByRefObject, IDisposable
+	public class RemoteTestAgent : TestAgent
 	{
-		#region Fields
-		/// <summary>
-		/// Url of the agency that controls this agent
-		/// </summary>
-		string agencyUrl;
-
-		/// <summary>
-		/// Reference to the TestAgency that controls this agent
-		/// </summary>
-		TestAgency agency;
-
-		/// <summary>
-		/// Channel used for communications with the agency
-		/// and with clients
-		/// </summary>
-		private TcpChannel channel;
+		static Logger log = InternalTrace.GetLogger(typeof(RemoteTestAgent));
 
-		/// <summary>
-		/// Lock used to avoid thread contention
-		/// </summary>
-		private object theLock = new object();
+		#region Fields
 
+        private ManualResetEvent stopSignal = new ManualResetEvent(false);
+		
 		#endregion
 
 		#region Constructor
 		/// <summary>
-		/// Construct a RemoteTestAgent given the Url of its agency
+		/// Construct a RemoteTestAgent
 		/// </summary>
-		/// <param name="agencyUrl"></param>
-		public RemoteTestAgent( string agencyUrl )
-		{
-			this.agencyUrl = agencyUrl;
-		}
+		public RemoteTestAgent( Guid agentId, TestAgency agency )
+            : base(agentId, agency) { }
 		#endregion
 
 		#region Properties
-		public TestAgency Agency
-		{
-			get { return agency; }
-		}
-
 		public int ProcessId
 		{
 			get { return System.Diagnostics.Process.GetCurrentProcess().Id; }
 		}
 		#endregion
 
-		#region Public Methods - Called By local Agent
-		public TestRunner CreateRunner(int runnerID)
+		#region Public Methods
+		public override TestRunner CreateRunner(int runnerID)
 		{
-			return new TestDomain( runnerID );
+			return new AgentRunner(runnerID);
 		}
-		#endregion
 
-		#region Public Methods
-		public void Start()
+        public override bool Start()
 		{
-			NTrace.Info("Starting");
-			this.channel = ServerUtilities.GetTcpChannel();
-			NTrace.Debug("Acquired Tcp Channel");
+			log.Info("Agent starting");
 
 			try
 			{
-				this.agency = (TestAgency)Activator.GetObject( typeof( TestAgency ), agencyUrl );
-				NTrace.DebugFormat("Connected to TestAgency at {0}", agencyUrl);
+				this.Agency.Register( this );
+				log.Debug( "Registered with TestAgency" );
 			}
 			catch( Exception ex )
 			{
-				NTrace.ErrorFormat( "Unable to connect to test agency at {0}", agencyUrl );
-				NTrace.Error( ex.Message );
+				log.Error( "RemoteTestAgent: Failed to register with TestAgency", ex );
+                return false;
 			}
 
-			try
-			{
-				this.agency.Register( this, ProcessId );
-				NTrace.Debug( "Registered with TestAgency" );
-			}
-			catch( Exception ex )
-			{
-				NTrace.Error( "Failed to register with TestAgency", ex );
-			}
+            return true;
 		}
 
-		[System.Runtime.Remoting.Messaging.OneWay]
-		public void Stop()
+        public override void Stop()
 		{
-			NTrace.Info( "Stopping" );
-			lock( theLock )
-			{
-				if ( this.channel != null )
-					ChannelServices.UnregisterChannel( this.channel );
-				Monitor.PulseAll( theLock );
-			}
+			log.Info( "Stopping" );
+            // This causes an error in the client because the agent 
+            // database is not thread-safe.
+            //if ( agency != null )
+            //    agency.ReportStatus(this.ProcessId, AgentStatus.Stopping);
+
+
+            stopSignal.Set();
 		}
 
 		public void WaitForStop()
 		{
-			lock( theLock )
-			{
-				Monitor.Wait( theLock );
-			}
+            stopSignal.WaitOne();
 		}
 		#endregion
 
-		#region IDisposable Members
-
-		public void Dispose()
-		{
-			this.Stop();
-		}
-
-		#endregion
-	}
+        #region Nested AgentRunner class
+        class AgentRunner : ProxyTestRunner
+        {
+            private ITestRunnerFactory factory;
+
+            public AgentRunner(int runnerID)
+                : base(runnerID) 
+            {
+                this.factory = new InProcessTestRunnerFactory();
+            }
+
+            public override bool Load(TestPackage package)
+            {
+                this.TestRunner = factory.MakeTestRunner(package);
+                
+                return base.Load(package);
+            }
+			
+			public override IList AssemblyInfo 
+			{
+				get 
+				{
+					IList result = base.AssemblyInfo;
+					string name = Path.GetFileName(Assembly.GetEntryAssembly().Location);
+					
+					foreach( TestAssemblyInfo info in result )
+						info.ModuleName = name;
+					
+					return result;
+				}
+			}
+        }
+        #endregion
+    }
 }
diff --git a/src/ClientUtilities/util/ResultSummarizer.cs b/src/ClientUtilities/util/ResultSummarizer.cs
index e48c306..bd0baf9 100644
--- a/src/ClientUtilities/util/ResultSummarizer.cs
+++ b/src/ClientUtilities/util/ResultSummarizer.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 namespace NUnit.Util
@@ -14,67 +14,180 @@ namespace NUnit.Util
 	/// </summary>
 	public class ResultSummarizer
 	{
-		private SummaryVisitor visitor = new SummaryVisitor();
+	    private int resultCount = 0;
+		private int testsRun = 0;
+		private int failureCount = 0;
+	    private int errorCount = 0;
+	    private int successCount = 0;
+	    private int inconclusiveCount = 0;
+		private int skipCount = 0;
+		private int ignoreCount = 0;
+	    private int notRunnable = 0;
+		
+		private double time = 0.0d;
+		private string name;
+
+		public ResultSummarizer() { }
 
 		public ResultSummarizer(TestResult result)
 		{
-			result.Accept(visitor);
+			Summarize(result);
 		}
 
 		public ResultSummarizer(TestResult[] results)
 		{
 			foreach( TestResult result in results )
-				result.Accept( visitor );
+				Summarize(result);
+		}
+
+		public void Summarize( TestResult result )
+		{
+			if (this.name == null )
+			{
+				this.name = result.Name;
+				this.time = result.Time;
+			}
+
+			if (!result.Test.IsSuite)
+			{
+			    resultCount++;
+
+                switch (result.ResultState)
+                {
+                    case ResultState.Success:
+                        successCount++;
+                        testsRun++;
+                        break;
+                    case ResultState.Failure:
+                        failureCount++;
+                        testsRun++;
+                        break;
+                    case ResultState.Error:
+                    case ResultState.Cancelled:
+                        errorCount++;
+                        testsRun++;
+                        break;
+                    case ResultState.Inconclusive:
+                        inconclusiveCount++;
+                        testsRun++;
+                        break;
+                    case ResultState.NotRunnable:
+                        notRunnable++;
+                        //errorCount++;
+                        break;
+                    case ResultState.Ignored:
+                        ignoreCount++;
+                        break;
+                    case ResultState.Skipped:
+                    default:
+                        skipCount++;
+                        break;
+                }
+            }
+
+			if ( result.HasResults )
+				foreach (TestResult childResult in result.Results)
+					Summarize( childResult );
 		}
 
 		public string Name
 		{
-			get { return visitor.Name; }
+			get { return name; }
 		}
 
 		public bool Success
 		{
-			get { return visitor.Success; }
+			get { return failureCount == 0; }
 		}
 
-		public int ResultCount
+        /// <summary>
+        /// Returns the number of test cases for which results
+        /// have been summarized. Any tests excluded by use of
+        /// Category or Explicit attributes are not counted.
+        /// </summary>
+	    public int ResultCount
+	    {
+            get { return resultCount;  }    
+	    }
+
+        /// <summary>
+        /// Returns the number of test cases actually run, which
+        /// is the same as ResultCount, less any Skipped, Ignored
+        /// or NonRunnable tests.
+        /// </summary>
+		public int TestsRun
 		{
-			get { return visitor.ResultCount; }
+			get { return testsRun; }
 		}
 
-//		public int Errors
-//		{
-//			get { return visitor.Errors; }
-//		}
+	    /// <summary>
+	    /// Returns the number of tests that passed
+	    /// </summary>
+        public int Passed
+	    {
+            get { return successCount;  }
+	    }
+
+        /// <summary>
+        /// Returns the number of test cases that had an error.
+        /// </summary>
+        public int Errors
+        {
+            get { return errorCount; }
+        }
 
-		public int FailureCount 
+        /// <summary>
+        /// Returns the number of test cases that failed.
+        /// </summary>
+		public int Failures 
 		{
-			get { return visitor.FailureCount; }
+			get { return failureCount; }
 		}
 
-		public int SkipCount
+        /// <summary>
+        /// Returns the number of test cases that failed.
+        /// </summary>
+        public int Inconclusive
+        {
+            get { return inconclusiveCount; }
+        }
+
+        /// <summary>
+        /// Returns the number of test cases that were not runnable
+        /// due to errors in the signature of the class or method.
+        /// Such tests are also counted as Errors.
+        /// </summary>
+	    public int NotRunnable
+	    {
+	        get { return notRunnable; }   
+	    }
+
+        /// <summary>
+        /// Returns the number of test cases that were skipped.
+        /// </summary>
+		public int Skipped
 		{
-			get { return visitor.SkipCount; }
+			get { return skipCount; }
 		}
 
-		public int IgnoreCount
+		public int Ignored
 		{
-			get { return visitor.IgnoreCount; }
+			get { return ignoreCount; }
 		}
 
 		public double Time
 		{
-			get { return visitor.Time; }
+			get { return time; }
 		}
 
 		public int TestsNotRun
 		{
-			get { return visitor.TestsNotRun; }
+			get { return skipCount + ignoreCount + notRunnable; }
 		}
 
-		public int SuitesNotRun
-		{
-			get { return visitor.SuitesNotRun; }
-		}
+	    public int ErrorsAndFailures
+	    {
+            get { return errorCount + failureCount; }   
+	    }
 	}
 }
diff --git a/src/ClientUtilities/util/RuntimeFrameworkSelector.cs b/src/ClientUtilities/util/RuntimeFrameworkSelector.cs
new file mode 100644
index 0000000..f7c722f
--- /dev/null
+++ b/src/ClientUtilities/util/RuntimeFrameworkSelector.cs
@@ -0,0 +1,73 @@
+// ****************************************************************
+// Copyright 2010, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using NUnit.Core;
+
+namespace NUnit.Util
+{
+    public class RuntimeFrameworkSelector : IRuntimeFrameworkSelector
+    {
+        static Logger log = InternalTrace.GetLogger(typeof(RuntimeFrameworkSelector));
+
+        /// <summary>
+        /// Selects a target runtime framework for a TestPackage based on
+        /// the settings in the package and the assemblies themselves.
+        /// The package RuntimeFramework setting may be updated as a 
+        /// result and the selected runtime is returned.
+        /// </summary>
+        /// <param name="package">A TestPackage</param>
+        /// <returns>The selected RuntimeFramework</returns>
+        public RuntimeFramework SelectRuntimeFramework(TestPackage package)
+        {
+            RuntimeFramework currentFramework = RuntimeFramework.CurrentFramework;
+            RuntimeFramework requestedFramework = package.Settings["RuntimeFramework"] as RuntimeFramework;
+
+            log.Debug("Current framework is {0}", currentFramework);
+            if (requestedFramework == null)
+                log.Debug("No specific framework requested");
+            else
+                log.Debug("Requested framework is {0}", requestedFramework);
+
+            RuntimeType targetRuntime = requestedFramework == null
+                ? RuntimeType.Any 
+                : requestedFramework.Runtime;
+            Version targetVersion = requestedFramework == null
+                ? RuntimeFramework.DefaultVersion
+                : requestedFramework.FrameworkVersion;
+
+            if (targetRuntime == RuntimeType.Any)
+                targetRuntime = currentFramework.Runtime;
+
+            if (targetVersion == RuntimeFramework.DefaultVersion)
+            {
+                foreach (string assembly in package.Assemblies)
+                {
+                    using (AssemblyReader reader = new AssemblyReader(assembly))
+                    {
+                        Version v = new Version(reader.ImageRuntimeVersion.Substring(1));
+                        log.Debug("Assembly {0} uses version {1}", assembly, v);
+                        if (v > targetVersion) targetVersion = v;
+                    }
+                }
+
+                RuntimeFramework checkFramework = new RuntimeFramework(targetRuntime, targetVersion);
+                if (!checkFramework.IsAvailable || NUnitConfiguration.GetTestAgentExePath(targetVersion) == null)
+                {
+                    log.Debug("Preferred version {0} is not installed or this NUnit installation does not support it", targetVersion);
+                    if (targetVersion < currentFramework.FrameworkVersion)
+                        targetVersion = currentFramework.FrameworkVersion;
+                }
+            }
+
+            RuntimeFramework targetFramework = new RuntimeFramework(targetRuntime, targetVersion);
+            package.Settings["RuntimeFramework"] = targetFramework;
+
+            log.Debug("Test will use {0} framework", targetFramework);
+
+            return targetFramework;
+        }
+    }
+}
diff --git a/src/ClientUtilities/util/ServerBase.cs b/src/ClientUtilities/util/ServerBase.cs
index 19782be..058ce73 100644
--- a/src/ClientUtilities/util/ServerBase.cs
+++ b/src/ClientUtilities/util/ServerBase.cs
@@ -1,3 +1,9 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
 using System;
 using System.Threading;
 using System.Runtime.Remoting;
@@ -36,16 +42,33 @@ namespace NUnit.Util
 			this.port = port;
 		}
 
+        public string ServerUrl
+        {
+            get { return string.Format("tcp://127.0.0.1:{0}/{1}", port, uri); }
+        }
+
 		public virtual void Start()
 		{
-			if ( uri != null && uri != string.Empty )
-				lock( theLock )
-				{
-					this.channel = ServerUtilities.GetTcpChannel( uri + "Channel", port, 100 );
+            if (uri != null && uri != string.Empty)
+            {
+                lock (theLock)
+                {
+                    this.channel = ServerUtilities.GetTcpChannel(uri + "Channel", port, 100);
 
-					RemotingServices.Marshal( this, uri );
-					this.isMarshalled = true;
-				}
+                    RemotingServices.Marshal(this, uri);
+                    this.isMarshalled = true;
+                }
+
+                if (this.port == 0)
+                {
+                    ChannelDataStore store = this.channel.ChannelData as ChannelDataStore;
+                    if (store != null)
+                    {
+                        string channelUri = store.ChannelUris[0];
+                        this.port = int.Parse(channelUri.Substring(channelUri.LastIndexOf(':') + 1));
+                    }
+                }
+            }
 		}
 
 		[System.Runtime.Remoting.Messaging.OneWay]
@@ -85,5 +108,12 @@ namespace NUnit.Util
 		}
 
 		#endregion
+
+		#region InitializeLifetimeService
+		public override object InitializeLifetimeService()
+		{
+			return null;
+		}
+		#endregion
 	}
 }
diff --git a/src/ClientUtilities/util/ServerUtilities.cs b/src/ClientUtilities/util/ServerUtilities.cs
index 5f779a5..d0dbc60 100644
--- a/src/ClientUtilities/util/ServerUtilities.cs
+++ b/src/ClientUtilities/util/ServerUtilities.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 using System.IO;
@@ -12,6 +12,7 @@ using System.Runtime.Remoting.Channels;
 using System.Runtime.Remoting.Channels.Tcp;
 using System.Reflection;
 using System.Diagnostics;
+using NUnit.Core;
 
 namespace NUnit.Util
 {
@@ -20,6 +21,8 @@ namespace NUnit.Util
 	/// </summary>
 	public class ServerUtilities
 	{
+        static Logger log = InternalTrace.GetLogger(typeof(ServerUtilities));
+
 		/// <summary>
 		///  Create a TcpChannel with a given name, on a given port.
 		/// </summary>
@@ -44,7 +47,7 @@ namespace NUnit.Util
 				object typeFilterLevel = Enum.Parse(typeFilterLevelType, "Full");
 				typeFilterLevelProperty.SetValue(serverProvider, typeFilterLevel, null);
 
-                props.Add("clientConnectionLimit", limit);
+//                props.Add("clientConnectionLimit", limit);
             }
 
 			BinaryClientFormatterSinkProvider clientProvider =
@@ -93,12 +96,16 @@ namespace NUnit.Util
 					try
 					{
 						channel = CreateTcpChannel( name, port, limit );
+#if NET_2_0
+						ChannelServices.RegisterChannel( channel, false );
+#else
 						ChannelServices.RegisterChannel( channel );
-						break;
+#endif
+                        break;
 					}
 					catch( Exception e )
 					{
-                        Trace.WriteLine(e);
+                        log.Error("Failed to create/register channel", e);
 						System.Threading.Thread.Sleep(300);
 					}
 			}
@@ -118,11 +125,5 @@ namespace NUnit.Util
 					// Channel was not registered - ignore
 				}
 		}
-
-		public static string MakeUrl( string uri, int port )
-		{
-			return string.Format( "tcp://127.0.0.1:{0}/{1}", port, uri );
-		}
-
 	}
 }
diff --git a/src/ClientUtilities/util/Services.cs b/src/ClientUtilities/util/Services.cs
index 99dd144..b3267b9 100644
--- a/src/ClientUtilities/util/Services.cs
+++ b/src/ClientUtilities/util/Services.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -11,7 +11,9 @@ using NUnit.Core.Extensibility;
 namespace NUnit.Util
 {
 	/// <summary>
-	/// Summary description for Services
+	/// Services is a utility class, which is used to provide access
+	/// to services in a more simple way than is supported by te
+	/// ServiceManager class itself.
 	/// </summary>
 	public class Services
 	{
@@ -58,13 +60,13 @@ namespace NUnit.Util
 		#endregion
 
 		#region UserSettings
-		private static SettingsService userSettings;
-		public static SettingsService UserSettings
+		private static ISettings userSettings;
+		public static ISettings UserSettings
 		{
 			get 
 			{ 
 				if ( userSettings == null )
-					userSettings = (SettingsService)ServiceManager.Services.GetService( typeof( SettingsService ) );
+					userSettings = (ISettings)ServiceManager.Services.GetService( typeof( ISettings ) );
 
 				// Temporary fix needed to run TestDomain tests in test AppDomain
 				// TODO: Figure out how to set up the test domain correctly
@@ -126,5 +128,20 @@ namespace NUnit.Util
 			}
 		}
 		#endregion
+
+		#region ProjectLoader
+		private static ProjectService projectService;
+		public static ProjectService ProjectService
+		{
+			get
+			{
+				if ( projectService == null )
+					projectService = (ProjectService)
+						ServiceManager.Services.GetService( typeof( ProjectService ) );
+
+				return projectService;
+			}
+		}
+		#endregion
 	}
 }
diff --git a/src/ClientUtilities/util/Services/AddinManager.cs b/src/ClientUtilities/util/Services/AddinManager.cs
index d28b75c..55cfb02 100644
--- a/src/ClientUtilities/util/Services/AddinManager.cs
+++ b/src/ClientUtilities/util/Services/AddinManager.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -16,6 +16,8 @@ namespace NUnit.Util
 {
 	public class AddinManager : IService
 	{
+		static Logger log = InternalTrace.GetLogger(typeof(AddinManager));
+
 		#region Instance Fields
 		IAddinRegistry addinRegistry;
 		#endregion
@@ -29,19 +31,8 @@ namespace NUnit.Util
 		#region Addin Registration
 		public void RegisterAddins()
 		{
-			//Figure out the directory from which NUnit is executing
-			string moduleName = TestFixtureBuilder.GetAssemblyPath( GetType().Assembly );
-			//string moduleName = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
-			string nunitDirPath = Path.GetDirectoryName( moduleName );
-			string coreExtensions = Path.Combine( nunitDirPath, "nunit.core.extensions.dll" );
-			string addinsDirPath = Path.Combine( nunitDirPath, "addins" );
-
-			// Load nunit.core.extensions if available
-			if ( File.Exists( coreExtensions ) )
-				Register( coreExtensions );
-
 			// Load any extensions in the addins directory
-			DirectoryInfo dir = new DirectoryInfo( addinsDirPath );
+			DirectoryInfo dir = new DirectoryInfo( NUnitConfiguration.AddinDirectory );
 			if ( dir.Exists )
 				foreach( FileInfo file in dir.GetFiles( "*.dll" ) )
 					Register( file.FullName );
@@ -55,15 +46,20 @@ namespace NUnit.Util
 				assemblyName.Name = Path.GetFileNameWithoutExtension(path);
 				assemblyName.CodeBase = path;
 				Assembly assembly = Assembly.Load(assemblyName);
-				NTrace.Debug( "Loaded " + Path.GetFileName(path) );
+				log.Debug( "Loaded " + Path.GetFileName(path) );
 
 				foreach ( Type type in assembly.GetExportedTypes() )
 				{
 					if ( type.GetCustomAttributes(typeof(NUnitAddinAttribute), false).Length == 1 )
 					{
 						Addin addin = new Addin( type );
-						addinRegistry.Register( addin );
-						NTrace.Debug( "Registered addin: " + addin.Name );
+                        if ( addinRegistry.IsAddinRegistered(addin.Name) )
+                            log.Error( "Addin {0} was already registered", addin.Name );
+                        else
+                        {
+						    addinRegistry.Register( addin );
+						    log.Debug( "Registered addin: {0}", addin.Name );
+                        }
 					}
 				}
 			}
@@ -71,7 +67,7 @@ namespace NUnit.Util
 			{
 				// NOTE: Since the gui isn't loaded at this point, 
 				// the trace output will only show up in Visual Studio
-				NTrace.Error( "Failed to load" + path, ex  );
+				log.Error( "Failed to load" + path, ex  );
 			}
 		}
 		#endregion
diff --git a/src/ClientUtilities/util/Services/AddinRegistry.cs b/src/ClientUtilities/util/Services/AddinRegistry.cs
index ba2bf27..df6515f 100644
--- a/src/ClientUtilities/util/Services/AddinRegistry.cs
+++ b/src/ClientUtilities/util/Services/AddinRegistry.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -36,15 +36,29 @@ namespace NUnit.Util
 			}
 		}
 
+        public bool IsAddinRegistered(string name)
+        {
+            return FindAddinByName(name) != null;
+        }
+
 		public void SetStatus( string name, AddinStatus status, string message )
 		{
-			foreach( Addin addin in addins )
-				if ( addin.Name == name )
-				{
-					addin.Status = status;
-					addin.Message = message;
-				}
-		}
+            Addin addin = FindAddinByName(name);
+            if (addin != null)
+            {
+                addin.Status = status;
+                addin.Message = message;
+            }
+        }
+
+        private Addin FindAddinByName(string name)
+        {
+            foreach (Addin addin in addins)
+                if (addin.Name == name)
+                    return addin;
+
+            return null;
+        }
 		#endregion
 
 		#region IService Members
@@ -56,5 +70,12 @@ namespace NUnit.Util
 		{
 		}
 		#endregion
-	}
+
+        #region InitializeLifetimeService
+        public override object InitializeLifetimeService()
+        {
+            return null;
+        }
+        #endregion
+    }
 }
diff --git a/src/ClientUtilities/util/Services/DomainManager.cs b/src/ClientUtilities/util/Services/DomainManager.cs
index a3ad033..3c86207 100644
--- a/src/ClientUtilities/util/Services/DomainManager.cs
+++ b/src/ClientUtilities/util/Services/DomainManager.cs
@@ -1,15 +1,19 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
 using System.IO;
 using System.Collections;
 using System.Text;
+using System.Threading;
+using System.Reflection;
 using System.Configuration;
 using System.Diagnostics;
+using System.Security;
+using System.Security.Permissions;
 using System.Security.Policy;
 using NUnit.Core;
 
@@ -21,6 +25,8 @@ namespace NUnit.Util
 	/// </summary>
 	public class DomainManager : IService
 	{
+        static Logger log = InternalTrace.GetLogger(typeof(DomainManager));
+
 		#region Properties
 		private static string shadowCopyPath;
 		public static string ShadowCopyPath
@@ -29,9 +35,9 @@ namespace NUnit.Util
 			{
 				if ( shadowCopyPath == null )
 				{
-					shadowCopyPath = ConfigurationSettings.AppSettings["shadowfiles.path"];
-					if ( shadowCopyPath == "" || shadowCopyPath== null )
-						shadowCopyPath = Path.Combine( Path.GetTempPath(), @"nunit20\ShadowCopyCache" );
+                    shadowCopyPath = Services.UserSettings.GetSetting("Options.TestLoader.ShadowCopyPath", "");
+                    if (shadowCopyPath == "")
+                        shadowCopyPath = Path.Combine(Path.GetTempPath(), @"nunit20\ShadowCopyCache");
 					else
 						shadowCopyPath = Environment.ExpandEnvironmentVariables(shadowCopyPath);
 				}
@@ -48,98 +54,174 @@ namespace NUnit.Util
 		/// <param name="package">The TestPackage to be run</param>
 		public AppDomain CreateDomain( TestPackage package )
 		{
-			FileInfo testFile = new FileInfo( package.FullName );
-
 			AppDomainSetup setup = new AppDomainSetup();
+			 
+			//For paralell tests, we need to use distinct application name
+        	setup.ApplicationName = "Tests" + "_" + Environment.TickCount;
 
-			// We always use the same application name
-			setup.ApplicationName = "Tests";
+            FileInfo testFile = package.FullName != null && package.FullName != string.Empty
+                ? new FileInfo(package.FullName)
+                : null;
 
-			string appBase = package.BasePath;
-			if ( appBase == null || appBase == string.Empty )
-				appBase = testFile.DirectoryName;
-			setup.ApplicationBase = appBase;
+            string appBase = package.BasePath;
+            string configFile = package.ConfigurationFile;
+            string binPath = package.PrivateBinPath;
 
-			string configFile = package.ConfigurationFile;
-			if ( configFile == null || configFile == string.Empty )
-				configFile = NUnitProject.IsProjectFile(testFile.Name) 
-					? Path.GetFileNameWithoutExtension( testFile.Name ) + ".config"
-					: testFile.Name + ".config";
-			// Note: Mono needs full path to config file...
-			setup.ConfigurationFile =  Path.Combine( appBase, configFile );
+            if (testFile != null)
+            {
+                if (appBase == null || appBase == string.Empty)
+                    appBase = testFile.DirectoryName;
 
-			string binPath = package.PrivateBinPath;
-			if ( package.AutoBinPath )
-				binPath = GetPrivateBinPath( appBase, package.Assemblies );
-			setup.PrivateBinPath = binPath;
+                if (configFile == null || configFile == string.Empty)
+                    configFile = Services.ProjectService.CanLoadProject(testFile.Name)
+                        ? Path.GetFileNameWithoutExtension(testFile.Name) + ".config"
+                        : testFile.Name + ".config";
+            }
+            else if (appBase == null || appBase == string.Empty)
+                appBase = GetCommonAppBase(package.Assemblies);
 
-			if ( package.GetSetting( "ShadowCopyFiles", true ) )
-			{
-				setup.ShadowCopyFiles = "true";
-				setup.ShadowCopyDirectories = appBase;
-				setup.CachePath = GetCachePath();
-			}
+            setup.ApplicationBase = appBase;
+            // TODO: Check whether Mono still needs full path to config file...
+            setup.ConfigurationFile = appBase != null && configFile != null
+                ? Path.Combine(appBase, configFile)
+                : configFile;
+
+            if (package.AutoBinPath)
+				binPath = GetPrivateBinPath( appBase, package.Assemblies );
 
-			string domainName = "domain-" + package.Name;
-			Evidence baseEvidence = AppDomain.CurrentDomain.Evidence;
-			Evidence evidence = new Evidence(baseEvidence);
-			AppDomain runnerDomain = AppDomain.CreateDomain(domainName, evidence, setup);
+			setup.PrivateBinPath = binPath;
 
-			// Inject assembly resolver into remote domain to help locate our assemblies
-			AssemblyResolver assemblyResolver = (AssemblyResolver)runnerDomain.CreateInstanceFromAndUnwrap(
-				typeof(AssemblyResolver).Assembly.CodeBase,
-				typeof(AssemblyResolver).FullName);
+            if (package.GetSetting("ShadowCopyFiles", true))
+            {
+                setup.ShadowCopyFiles = "true";
+                setup.ShadowCopyDirectories = appBase;
+                setup.CachePath = GetCachePath();
+            }
+            else
+                setup.ShadowCopyFiles = "false";
 
-			// Tell resolver to use our core assemblies in the test domain
-			assemblyResolver.AddFile( typeof( NUnit.Core.RemoteTestRunner ).Assembly.Location );
-			assemblyResolver.AddFile( typeof( NUnit.Core.ITest ).Assembly.Location );
+			string domainName = "test-domain-" + package.Name;
+            // Setup the Evidence
+            Evidence evidence = new Evidence(AppDomain.CurrentDomain.Evidence);
+            if (evidence.Count == 0)
+            {
+                Zone zone = new Zone(SecurityZone.MyComputer);
+                evidence.AddHost(zone);
+                Assembly assembly = Assembly.GetExecutingAssembly();
+                Url url = new Url(assembly.CodeBase);
+                evidence.AddHost(url);
+                Hash hash = new Hash(assembly);
+                evidence.AddHost(hash);
+            }
 
-// No reference to extensions, so we do it a different way
-            string moduleName = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
-            string nunitDirPath = Path.GetDirectoryName(moduleName);
-//            string coreExtensions = Path.Combine(nunitDirPath, "nunit.core.extensions.dll");
-//			assemblyResolver.AddFile( coreExtensions );
-            //assemblyResolver.AddFiles( nunitDirPath, "*.dll" );
+            log.Info("Creating AppDomain " + domainName);
 
-            string addinsDirPath = Path.Combine(nunitDirPath, "addins");
-            assemblyResolver.AddDirectory( addinsDirPath );
+			AppDomain runnerDomain;
+			
+			// TODO: Try to eliminate this test. Currently, running on
+			// Linux with the permission set specified causes an
+			// unexplained crash when unloading the domain.
+#if NET_2_0
+			if (Environment.OSVersion.Platform == PlatformID.Win32NT)
+			{
+            	PermissionSet permissionSet = new PermissionSet( PermissionState.Unrestricted );	
+           		runnerDomain = AppDomain.CreateDomain(domainName, evidence, setup, permissionSet, null);
+			}
+			else
+#endif
+            	runnerDomain = AppDomain.CreateDomain(domainName, evidence, setup);
 
 			// HACK: Only pass down our AddinRegistry one level so that tests of NUnit
 			// itself start without any addins defined.
 			if ( !IsTestDomain( AppDomain.CurrentDomain ) )
 				runnerDomain.SetData("AddinRegistry", Services.AddinRegistry);
 
+            // Inject DomainInitializer into the remote domain - there are other
+            // approaches, but this works for all CLR versions.
+            DomainInitializer initializer = DomainInitializer.CreateInstance(runnerDomain);
+
+            // HACK: Under nunit-console, direct use of the enum fails
+            int traceLevel = IsTestDomain(AppDomain.CurrentDomain)
+                ? (int)InternalTraceLevel.Off : (int)InternalTrace.Level;
+
+            initializer.InitializeDomain(traceLevel);
+
 			return runnerDomain;
 		}
 
-		public void Unload( AppDomain domain )
-		{
-			bool shadowCopy = domain.ShadowCopyFiles;
-			string cachePath = domain.SetupInformation.CachePath;
-			string domainName = domain.FriendlyName;
+        public void Unload(AppDomain domain)
+        {
+            new DomainUnloader(domain).Unload();
+        }
 
-            try
+		#endregion
+
+        #region Nested DomainUnloader Class
+        class DomainUnloader
+        {
+            private Thread thread;
+            private AppDomain domain;
+
+            public DomainUnloader(AppDomain domain)
             {
-                AppDomain.Unload(domain);
+                this.domain = domain;
             }
-            catch (Exception ex)
+
+            public void Unload()
             {
-                // We assume that the tests did something bad and just leave
-                // the orphaned AppDomain "out there". 
-                // TODO: Something useful.
-                Trace.WriteLine("Unable to unload AppDomain {0}", domainName);
-                Trace.WriteLine(ex.ToString());
+                string domainName;
+                try
+                {
+                    domainName = domain.FriendlyName;
+                }
+                catch (AppDomainUnloadedException)
+                {
+                    return;
+                }
+
+                log.Info("Unloading AppDomain " + domainName);
+
+                thread = new Thread(new ThreadStart(UnloadOnThread));
+                thread.Start();
+                if (!thread.Join(30000))
+                {
+                    log.Error("Unable to unload AppDomain {0}, Unload thread timed out", domainName);
+                    thread.Abort();
+                }
             }
-            finally
+
+            private void UnloadOnThread()
             {
-                if (shadowCopy)
-                    DeleteCacheDir(new DirectoryInfo(cachePath));
+                bool shadowCopy = false;
+                string cachePath = null;
+                string domainName = "UNKNOWN";               
+
+                try
+                {
+                    shadowCopy = domain.ShadowCopyFiles;
+                    cachePath = domain.SetupInformation.CachePath;
+                    domainName = domain.FriendlyName;
+
+                    AppDomain.Unload(domain);
+                }
+                catch (Exception ex)
+                {
+                    // We assume that the tests did something bad and just leave
+                    // the orphaned AppDomain "out there". 
+                    // TODO: Something useful.
+                    log.Error("Unable to unload AppDomain " + domainName, ex);
+                }
+                finally
+                {
+                    if (shadowCopy && cachePath != null)
+                        DeleteCacheDir(new DirectoryInfo(cachePath));
+                }
             }
-		}
-		#endregion
+        }
+        #endregion
 
-		#region Helper Methods
-		/// <summary>
+        #region Helper Methods
+        /// <summary>
 		/// Get the location for caching and delete any old cache info
 		/// </summary>
 		private string GetCachePath()
@@ -172,7 +254,7 @@ namespace NUnit.Util
 		/// TODO: This entire method is problematic. Should we be doing it?
 		/// </summary>
 		/// <param name="cacheDir"></param>
-		private void DeleteCacheDir( DirectoryInfo cacheDir )
+		private static void DeleteCacheDir( DirectoryInfo cacheDir )
 		{
 			//			Debug.WriteLine( "Modules:");
 			//			foreach( ProcessModule module in Process.GetCurrentProcess().Modules )
@@ -214,9 +296,25 @@ namespace NUnit.Util
 
 		private bool IsTestDomain(AppDomain domain)
 		{
-			return domain.FriendlyName.StartsWith( "domain-" );
+			return domain.FriendlyName.StartsWith( "test-domain-" );
 		}
 
+        public static string GetCommonAppBase(IList assemblies)
+        {
+            string commonBase = null;
+
+            foreach (string assembly in assemblies)
+            {
+                string dir = Path.GetFullPath(Path.GetDirectoryName(assembly));
+                if (commonBase == null)
+                    commonBase = dir;
+                else while (!PathUtils.SamePathOrUnder(commonBase, dir) && commonBase != null)
+                        commonBase = Path.GetDirectoryName(commonBase);
+            }
+
+            return commonBase;
+        }
+
 		public static string GetPrivateBinPath( string basePath, IList assemblies )
 		{
 			StringBuilder sb = new StringBuilder(200);
@@ -224,7 +322,9 @@ namespace NUnit.Util
 
 			foreach( string assembly in assemblies )
 			{
-				string dir = PathUtils.RelativePath( basePath, Path.GetDirectoryName( assembly ) );
+				string dir = PathUtils.RelativePath(
+                    Path.GetFullPath(basePath), 
+                    Path.GetDirectoryName( Path.GetFullPath(assembly) ) );
 				if ( dir != null && dir != "." && !dirList.Contains( dir ) )
 				{
 					dirList.Add( dir );
@@ -248,8 +348,8 @@ namespace NUnit.Util
 
 		public void UnloadService()
 		{
-			// TODO:  Add DomainManager.UnloadService implementation
-		}
+            // TODO:  Add DomainManager.UnloadService implementation
+        }
 
 		public void InitializeService()
 		{
diff --git a/src/ClientUtilities/util/Services/ProjectService.cs b/src/ClientUtilities/util/Services/ProjectService.cs
new file mode 100644
index 0000000..975315f
--- /dev/null
+++ b/src/ClientUtilities/util/Services/ProjectService.cs
@@ -0,0 +1,177 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.IO;
+using NUnit.Core;
+using NUnit.Util.Extensibility;
+using NUnit.Util.ProjectConverters;
+
+namespace NUnit.Util
+{
+	/// <summary>
+	/// Summary description for ProjectService.
+	/// </summary>
+	public class ProjectService : IProjectConverter, IService
+	{
+		/// <summary>
+		/// Seed used to generate names for new projects
+		/// </summary>
+		private int projectSeed = 0;
+
+		/// <summary>
+		/// The extension used for test projects
+		/// </summary>
+        //private static readonly string nunitExtension = ".nunit";
+
+		/// <summary>
+		/// Array of all installed ProjectConverters
+		/// </summary>
+		IProjectConverter[] converters = new IProjectConverter[] 
+		{
+			new VisualStudioConverter()
+		};
+
+		#region Instance Methods
+		public bool CanLoadProject(string path)
+		{
+			return NUnitProject.IsNUnitProjectFile(path) || CanConvertFrom(path);
+		}
+
+		public NUnitProject LoadProject(string path)
+		{
+			if ( NUnitProject.IsNUnitProjectFile(path) )
+			{
+				NUnitProject project = new NUnitProject( path );
+				project.Load();
+				return project;
+			}
+
+			return ConvertFrom(path);
+		}
+
+		/// <summary>
+		/// Creates a project to wrap a list of assemblies
+		/// </summary>
+		public NUnitProject WrapAssemblies( string[] assemblies )
+		{
+			// if only one assembly is passed in then the configuration file
+			// should follow the name of the assembly. This will only happen
+			// if the LoadAssembly method is called. Currently the console ui
+			// does not differentiate between having one or multiple assemblies
+			// passed in.
+			if ( assemblies.Length == 1)
+				return WrapAssembly(assemblies[0]);
+
+
+			NUnitProject project = Services.ProjectService.EmptyProject();
+			ProjectConfig config = new ProjectConfig( "Default" );
+			foreach( string assembly in assemblies )
+			{
+				string fullPath = Path.GetFullPath( assembly );
+
+				if ( !File.Exists( fullPath ) )
+					throw new FileNotFoundException( string.Format( "Assembly not found: {0}", fullPath ) );
+				
+				config.Assemblies.Add( fullPath );
+			}
+
+			project.Configs.Add( config );
+
+			// TODO: Deduce application base, and provide a
+			// better value for loadpath and project path
+			// analagous to how new projects are handled
+			string basePath = Path.GetDirectoryName( Path.GetFullPath( assemblies[0] ) );
+			project.ProjectPath = Path.Combine( basePath, project.Name + ".nunit" );
+
+			project.IsDirty = true;
+
+			return project;
+		}
+
+		/// <summary>
+		/// Creates a project to wrap an assembly
+		/// </summary>
+		public NUnitProject WrapAssembly( string assemblyPath )
+		{
+			if ( !File.Exists( assemblyPath ) )
+				throw new FileNotFoundException( string.Format( "Assembly not found: {0}", assemblyPath ) );
+
+			string fullPath = Path.GetFullPath( assemblyPath );
+
+			NUnitProject project = new NUnitProject( fullPath );
+			
+			ProjectConfig config = new ProjectConfig( "Default" );
+			config.Assemblies.Add( fullPath );
+			project.Configs.Add( config );
+
+			project.IsAssemblyWrapper = true;
+			project.IsDirty = false;
+
+			return project;
+		}
+
+		public string GenerateProjectName()
+		{
+			return string.Format( "Project{0}", ++projectSeed );
+		}
+
+		public NUnitProject EmptyProject()
+		{
+			return new NUnitProject( GenerateProjectName() );
+		}
+
+		public NUnitProject NewProject()
+		{
+			NUnitProject project = EmptyProject();
+
+			project.Configs.Add( "Debug" );
+			project.Configs.Add( "Release" );
+			project.IsDirty = false;
+
+			return project;
+		}
+
+		public void SaveProject( NUnitProject project )
+		{
+			project.Save();
+		}
+		#endregion
+
+		#region IProjectConverter Members
+		public bool CanConvertFrom(string path)
+		{
+			foreach( IProjectConverter converter in converters )
+				if ( converter.CanConvertFrom(path) )
+					return true;
+
+			return false;
+		}
+
+		public NUnitProject ConvertFrom(string path)
+		{
+			foreach( IProjectConverter converter in converters )
+			{
+				if ( converter.CanConvertFrom( path ) )
+					return converter.ConvertFrom( path );
+			}
+
+			return WrapAssembly(path);
+		}
+		#endregion
+
+		#region IService Members
+		public void InitializeService()
+		{
+			// TODO:  Add ProjectLoader.InitializeService implementation
+		}
+
+		public void UnloadService()
+		{
+			// TODO:  Add ProjectLoader.UnloadService implementation
+		}
+		#endregion
+	}
+}
diff --git a/src/ClientUtilities/util/Services/RecentFilesService.cs b/src/ClientUtilities/util/Services/RecentFilesService.cs
index abb1980..94b0661 100644
--- a/src/ClientUtilities/util/Services/RecentFilesService.cs
+++ b/src/ClientUtilities/util/Services/RecentFilesService.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -17,7 +17,7 @@ namespace NUnit.Util
 
 		private ISettings settings;
 
-		public static readonly int MinSize = 1;
+		public static readonly int MinSize = 0;
 
 		public static readonly int MaxSize = 24;
 
@@ -43,7 +43,14 @@ namespace NUnit.Util
 		{
 			get 
 			{ 
-				int size = settings.GetSetting( "RecentProjects.MaxFiles", DefaultSize );
+				int size = settings.GetSetting("Gui.RecentProjects.MaxFiles", -1 );
+                if (size < 0)
+                {
+                    size = settings.GetSetting("RecentProjects.MaxFiles", DefaultSize);
+                    if (size != DefaultSize)
+                        settings.SaveSetting("Gui.RecentProjects.MaxFiles", size);
+                    settings.RemoveSetting("RecentProjects.MaxFiles");
+                }
 				
 				if ( size < MinSize ) size = MinSize;
 				if ( size > MaxSize ) size = MaxSize;
@@ -58,7 +65,7 @@ namespace NUnit.Util
 				if ( newSize < MinSize ) newSize = MinSize;
 				if ( newSize > MaxSize ) newSize = MaxSize;
 
-				settings.SaveSetting( "RecentProjects.MaxFiles", newSize );
+				settings.SaveSetting( "Gui.RecentProjects.MaxFiles", newSize );
 				if ( newSize < oldSize ) SaveEntriesToSettings( this. settings );
 			}
 		}
@@ -101,37 +108,34 @@ namespace NUnit.Util
 		{
 			fileEntries.Clear();
 
-			string prefix = Environment.Version.Major >= 2
-				? "RecentProjects.V2"
-				: "RecentProjects.V1";
+            AddEntriesForPrefix("Gui.RecentProjects");
 
-			for ( int index = 1; index <= MaxFiles; index++ )
-			{
-				string fileSpec = settings.GetSetting( GetRecentFileKey( prefix, index ) ) as string;
-				if ( fileSpec != null )	fileEntries.Add( new RecentFileEntry( fileSpec ) );
-			}
+            // Try legacy entries if nothing was found
+            if (fileEntries.Count == 0)
+            {
+                AddEntriesForPrefix("RecentProjects.V2");
+                AddEntriesForPrefix("RecentProjects.V1");
+            }
 
-			// Try legacy entries if nothing was found
-			if ( fileEntries.Count == 0 )
-			{
-				for ( int index = 1; index <= MaxFiles; index++ )
-				{
-					string fileSpec = settings.GetSetting( GetRecentFileKey( "RecentProjects", index ) ) as string;
-					if ( fileSpec != null )
-					{
-						RecentFileEntry entry = RecentFileEntry.Parse( fileSpec );
-						if ( entry.CLRVersion.Major <= Environment.Version.Major )
-							fileEntries.Add( entry );
-					}
-				}
-			};
+            // Try even older legacy format
+            if (fileEntries.Count == 0)
+                AddEntriesForPrefix("RecentProjects");
 		}
 
+        private void AddEntriesForPrefix(string prefix)
+        {
+            for (int index = 1; index < MaxFiles; index++)
+            {
+                if (fileEntries.Count >= MaxFiles) break;
+
+                string fileSpec = settings.GetSetting(GetRecentFileKey(prefix, index)) as string;
+                if (fileSpec != null) fileEntries.Add(RecentFileEntry.Parse(fileSpec));
+            }
+        }
+
 		private void SaveEntriesToSettings( ISettings settings )
 		{
-			string prefix = Environment.Version.Major >= 2
-				? "RecentProjects.V2"
-				: "RecentProjects.V1";
+			string prefix = "Gui.RecentProjects";
 
 			while( fileEntries.Count > MaxFiles )
 				fileEntries.RemoveAt( fileEntries.Count - 1 );
@@ -144,6 +148,9 @@ namespace NUnit.Util
 				else
 					settings.RemoveSetting( keyName );
 			}
+
+            // Remove legacy entries here
+            settings.RemoveGroup("RecentProjects");
 		}
 
 		private string GetRecentFileKey( string prefix, int index )
diff --git a/src/ClientUtilities/util/Services/ServiceManager.cs b/src/ClientUtilities/util/Services/ServiceManager.cs
index 949e2b7..8127788 100644
--- a/src/ClientUtilities/util/Services/ServiceManager.cs
+++ b/src/ClientUtilities/util/Services/ServiceManager.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -20,6 +20,8 @@ namespace NUnit.Util
 
 		private static ServiceManager defaultServiceManager = new ServiceManager();
 
+		static Logger log = InternalTrace.GetLogger(typeof(ServiceManager));
+
 		public static ServiceManager Services
 		{
 			get { return defaultServiceManager; }
@@ -28,7 +30,7 @@ namespace NUnit.Util
 		public void AddService( IService service )
 		{
 			services.Add( service );
-			NTrace.Debug( "Added " + service.GetType().Name );
+			log.Debug( "Added " + service.GetType().Name );
 		}
 
 		public IService GetService( Type serviceType )
@@ -47,9 +49,9 @@ namespace NUnit.Util
 				}
 
 			if ( theService == null )
-				NTrace.Error( string.Format( "Requested service {0} was not found", serviceType.FullName ) );
+				log.Error( string.Format( "Requested service {0} was not found", serviceType.FullName ) );
 			else
-				NTrace.Info( string.Format( "Request for service {0} satisfied by {1}", serviceType.Name, theService.GetType().Name ) );
+				log.Debug( string.Format( "Request for service {0} satisfied by {1}", serviceType.Name, theService.GetType().Name ) );
 			
 			return theService;
 		}
@@ -58,8 +60,15 @@ namespace NUnit.Util
 		{
 			foreach( IService service in services )
 			{
-				NTrace.Info( "Initializing " + service.GetType().Name );
-				service.InitializeService();
+				log.Info( "Initializing " + service.GetType().Name );
+                try
+                {
+                    service.InitializeService();
+                }
+                catch (Exception ex)
+                {
+                    log.Error("Failed to initialize service", ex);
+                }
 			}
 		}
 
@@ -68,12 +77,24 @@ namespace NUnit.Util
 			// Stop services in reverse of initialization order
 			// TODO: Deal with dependencies explicitly
 			int index = services.Count;
-			while( --index >= 0 )
-				((IService)services[index]).UnloadService();
+            while (--index >= 0)
+            {
+                IService service = services[index] as IService;
+                log.Info( "Stopping " + service.GetType().Name );
+                try
+                {
+                    service.UnloadService();
+                }
+                catch (Exception ex)
+                {
+                    log.Error("Failure stopping service", ex);
+                }
+            }
 		}
 
 		public void ClearServices()
 		{
+            log.Info("Clearing Service list");
 			services.Clear();
 		}
 
diff --git a/src/ClientUtilities/util/Services/SettingsService.cs b/src/ClientUtilities/util/Services/SettingsService.cs
index 8965d5a..c8f5d37 100644
--- a/src/ClientUtilities/util/Services/SettingsService.cs
+++ b/src/ClientUtilities/util/Services/SettingsService.cs
@@ -1,12 +1,13 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
 using System.IO;
 using Microsoft.Win32;
+using NUnit.Core;
 
 namespace NUnit.Util
 {
@@ -15,23 +16,28 @@ namespace NUnit.Util
 	/// </summary>
 	public class SettingsService : SettingsGroup, NUnit.Core.IService
 	{
-		static readonly string applicationDirectory = 
-			Environment.GetFolderPath( Environment.SpecialFolder.ApplicationData ) 
-			+ Path.DirectorySeparatorChar + "NUnit" + Path.DirectorySeparatorChar;
-
 		static readonly string settingsFileName = "NUnitSettings.xml";
 
-		public SettingsService()
+        private bool writeable;
+
+        public SettingsService() : this(true) { }
+
+		public SettingsService(bool writeable)
 		{
+            this.writeable = writeable;
+#if NET_2_0
+			string settingsFile = System.Configuration.ConfigurationManager.AppSettings["settingsFile"];
+#else
 			string settingsFile = System.Configuration.ConfigurationSettings.AppSettings["settingsFile"];
+#endif
 			if ( settingsFile == null )
-				settingsFile = applicationDirectory + settingsFileName;
+				settingsFile = Path.Combine( NUnitConfiguration.ApplicationDirectory, settingsFileName );
 
-			this.storage = new XmlSettingsStorage( settingsFile );
+			this.storage = new XmlSettingsStorage( settingsFile, writeable );
 
 			if ( File.Exists( settingsFile ) )
 				storage.LoadSettings();
-			else
+			else if (writeable)
 				ConvertLegacySettings();
 		}
 
@@ -42,7 +48,9 @@ namespace NUnit.Util
 
 		public void UnloadService()
 		{
-			storage.SaveSettings();
+            if ( writeable )
+			    storage.SaveSettings();
+
 			this.Dispose();
 		}
 		#endregion
@@ -68,13 +76,11 @@ namespace NUnit.Util
 		private class LegacySettingsConverter : SettingsGroup
 		{
 			private ISettingsStorage legacy;
-			private ISettingsStorage current;
 
 			public LegacySettingsConverter( ISettingsStorage legacy, ISettingsStorage current )
 				: base( current )
 			{
 				this.legacy = legacy;
-				this.current = current;
 			}
 
 			public void Convert()
@@ -104,11 +110,15 @@ namespace NUnit.Util
 				Convert( "Options.RerunOnChange", "Options.TestLoader.RerunOnChange", "False", "True" );
 				Convert( "Options.ReloadOnRun", "Options.TestLoader.ReloadOnRun", "False", "True" );
 				Convert( "Options.MergeAssemblies", "Options.TestLoader.MergeAssemblies", "False", "True" );
-				Convert( "Options.MultiDomain", "Options.TestLoader.MultiDomain", "False", "True" );
+				//Convert( "Options.MultiDomain", "Options.TestLoader.MultiDomain", "False", "True" );
 				Convert( "Options.AutoNamespaceSuites", "Options.TestLoader.AutoNamespaceSuites", "False", "True" );
 				Convert( "Options.VisualStudioSupport", "Options.TestLoader.VisualStudioSupport", "False", "True" );
 				Convert( "Recent-Projects.MaxFiles", "RecentProjects.MaxFiles" );
 
+                object val = legacy.GetSetting("Options.MultiDomain");
+                if (val != null && (bool)val)
+                    this.SaveSetting("Options.TestLoader.DomainUsage", NUnit.Core.DomainUsage.Multiple);
+
 				int maxFiles = this.GetSetting( "RecentProjects.MaxFiles", 5 );
 				for( int i = 1; i <= maxFiles; i++ )
 				{
diff --git a/src/ClientUtilities/util/Services/TestAgency.cs b/src/ClientUtilities/util/Services/TestAgency.cs
index 399bf3a..92f654d 100644
--- a/src/ClientUtilities/util/Services/TestAgency.cs
+++ b/src/ClientUtilities/util/Services/TestAgency.cs
@@ -1,3 +1,9 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
 using System;
 using System.IO;
 using System.Threading;
@@ -13,17 +19,6 @@ using NUnit.Core;
 namespace NUnit.Util
 {
 	/// <summary>
-	/// Enumeration of agent types used to request agents
-	/// </summary>
-	[Flags]
-	public enum AgentType
-	{
-		Default = 0,
-		DomainAgent = 1, // NYI
-		ProcessAgent = 2
-	}
-
-	/// <summary>
 	/// Enumeration used to report AgentStatus
 	/// </summary>
 	public enum AgentStatus
@@ -43,46 +38,20 @@ namespace NUnit.Util
 	/// but only one, ProcessAgent is implemented
 	/// at this time.
 	/// </summary>
-	public class TestAgency : ServerBase, IService
+	public class TestAgency : ServerBase, IAgency, IService
 	{
+		static Logger log = InternalTrace.GetLogger(typeof(TestAgency));
+
 		#region Private Fields
 		private AgentDataBase agentData = new AgentDataBase();
-
-		private AgentType supportedAgentTypes = AgentType.ProcessAgent;
-
-		private AgentType defaultAgentType = AgentType.ProcessAgent;
 		#endregion
 
 		#region Constructors
-		public TestAgency() : this( "TestAgency", 9100 ) { }
+		public TestAgency() : this( "TestAgency", 0 ) { }
 
 		public TestAgency( string uri, int port ) : base( uri, port ) { }
 		#endregion
 
-		#region Static Property - TestAgentExePath
-		public static string TestAgentExePath
-		{
-			get
-			{
-				string agentPath = "nunit-agent.exe";
-			
-				if ( !File.Exists(agentPath) )
-				{
-					DirectoryInfo dir = new DirectoryInfo( Environment.CurrentDirectory );
-					if ( dir.Parent.Name == "bin" )
-						dir = dir.Parent.Parent.Parent.Parent;
-				
-					string path = PathUtils.Combine( dir.FullName, "NUnitTestServer", "nunit-agent-exe", 
-						"bin", NUnitFramework.BuildConfiguration, "nunit-agent.exe" );
-					if( File.Exists( path ) )
-						agentPath = path;
-				}
-
-				return agentPath;
-			}
-		}
-		#endregion
-
 		#region ServerBase Overrides
 		public override void Stop()
 		{
@@ -91,9 +60,13 @@ namespace NUnit.Util
 				if ( !r.Process.HasExited )
 				{
 					if ( r.Agent != null )
+					{
 						r.Agent.Stop();
+						r.Process.WaitForExit(10000);
+					}
 
-					//r.Process.Kill();
+					if ( !r.Process.HasExited )
+						r.Process.Kill();
 				}
 			}
 
@@ -104,20 +77,24 @@ namespace NUnit.Util
 		#endregion
 
 		#region Public Methods - Called by Agents
-		public void Register( RemoteTestAgent agent, int pid )
+		public void Register( TestAgent agent )
 		{
-			AgentRecord r = agentData[pid];
+			AgentRecord r = agentData[agent.Id];
 			if ( r == null )
-				throw new ArgumentException( "Specified process is not in the agency database", "pid" );
-			r.Agent = agent;
+                throw new ArgumentException(
+                    string.Format("Agent {0} is not in the agency database", agent.Id),
+                    "agentId");
+            r.Agent = agent;
 		}
 
-		public void ReportStatus( int pid, AgentStatus status )
+		public void ReportStatus( Guid agentId, AgentStatus status )
 		{
-			AgentRecord r = agentData[pid];
+			AgentRecord r = agentData[agentId];
 
 			if ( r == null )
-				throw new ArgumentException( "Specified process is not in the agency database", "pid" );
+                throw new ArgumentException(
+                    string.Format("Agent {0} is not in the agency database", agentId),
+                    "agentId" );
 
 			r.Status = status;
 		}
@@ -126,84 +103,126 @@ namespace NUnit.Util
 		#region Public Methods - Called by Clients
 		public TestAgent GetAgent()
 		{
-			return GetAgent( AgentType.Default, 5000 );
+			return GetAgent( RuntimeFramework.CurrentFramework, Timeout.Infinite );
 		}
 
-		public TestAgent GetAgent( AgentType type )
-		{
-			return GetAgent( type, 5000 );
-		}
-
-		public TestAgent GetAgent(AgentType type, int waitTime)
-		{
-			if ( type == AgentType.Default )
-				type = defaultAgentType;
-
-			if ( (type & supportedAgentTypes) == 0 )
-				throw new ArgumentException( 
-					string.Format( "AgentType {0} is not supported by this agency", type ),
-					"type" );
-
-			AgentRecord r = FindAvailableRemoteAgent(type);
-			if ( r == null )
-				r = CreateRemoteAgent(type, waitTime);
-
-			return new TestAgent( this, r.Process.Id, r.Agent );
+        public TestAgent GetAgent(int waitTime)
+        {
+            return GetAgent(RuntimeFramework.CurrentFramework, waitTime);
+        }
+
+        public TestAgent GetAgent(RuntimeFramework framework, int waitTime)
+        {
+            return GetAgent(framework, waitTime, false);
+        }
+
+        public TestAgent GetAgent(RuntimeFramework framework, int waitTime, bool enableDebug)
+        {
+            log.Info("Getting agent for use under {0}", framework);
+ 
+            if (!framework.IsAvailable)
+                throw new ArgumentException(
+                    string.Format("The {0} framework is not available", framework),
+                    "framework");
+
+            // TODO: Decide if we should reuse agents
+            //AgentRecord r = FindAvailableRemoteAgent(type);
+            //if ( r == null )
+            //    r = CreateRemoteAgent(type, framework, waitTime);
+            return CreateRemoteAgent(framework, waitTime, enableDebug);
 		}
 
 		public void ReleaseAgent( TestAgent agent )
 		{
 			AgentRecord r = agentData[agent.Id];
 			if ( r == null )
-				NTrace.Error( string.Format( "Unable to release agent {0} - not in database", agent.Id ) );
+				log.Error( string.Format( "Unable to release agent {0} - not in database", agent.Id ) );
 			else
 			{
 				r.Status = AgentStatus.Ready;
-				NTrace.Debug( "Releasing agent " + agent.Id.ToString() );
+				log.Debug( "Releasing agent " + agent.Id.ToString() );
 			}
 		}
 
-		public void DestroyAgent( TestAgent agent )
-		{
-			AgentRecord r = agentData[agent.Id];
-			if ( r != null )
-			{
-				if( !r.Process.HasExited )
-					r.Agent.Stop();
-				agentData[r.Process.Id] = null;
-			}
-		}
+        //public void DestroyAgent( ITestAgent agent )
+        //{
+        //    AgentRecord r = agentData[agent.Id];
+        //    if ( r != null )
+        //    {
+        //        if( !r.Process.HasExited )
+        //            r.Agent.Stop();
+        //        agentData[r.Id] = null;
+        //    }
+        //}
 		#endregion
 
 		#region Helper Methods
-		private int LaunchAgentProcess()
+		private Guid LaunchAgentProcess(RuntimeFramework targetRuntime, bool enableDebug)
 		{
-			//ProcessStartInfo startInfo = new ProcessStartInfo( TestAgentExePath, ServerUtilities.MakeUrl( this.uri, this.port ) );
-			//startInfo.CreateNoWindow = true;
+            string agentExePath = NUnitConfiguration.GetTestAgentExePath(targetRuntime.ClrVersion);
+
+            if (agentExePath == null)
+                throw new ArgumentException(
+                    string.Format("NUnit components for version {0} of the CLR are not installed",
+                    targetRuntime.ClrVersion.ToString()), "targetRuntime");
+
+            log.Debug("Using nunit-agent at " + agentExePath);
+
 			Process p = new Process();
-			if ( Type.GetType( "Mono.Runtime", false ) != null )
-			{
-				p.StartInfo.FileName = @"C:\Program Files\mono-1.2.5\bin\mono.exe";
-				p.StartInfo.Arguments = TestAgentExePath + " " + ServerUtilities.MakeUrl( this.uri, this.port );
-			}
-			else
-			{
-				p.StartInfo.FileName = TestAgentExePath;
-				p.StartInfo.Arguments = ServerUtilities.MakeUrl( this.uri, this.port );
+			p.StartInfo.UseShellExecute = false;
+            Guid agentId = Guid.NewGuid();
+            string arglist = agentId.ToString() + " " + ServerUrl;
+            if (enableDebug)
+                arglist += " --pause";
+
+            switch( targetRuntime.Runtime )
+            {
+                case RuntimeType.Mono:
+                    p.StartInfo.FileName = NUnitConfiguration.MonoExePath;
+                    if (enableDebug)
+                        p.StartInfo.Arguments = string.Format("--debug \"{0}\" {1}", agentExePath, arglist);
+                    else
+                        p.StartInfo.Arguments = string.Format("\"{0}\" {1}", agentExePath, arglist);
+                    break;
+                case RuntimeType.Net:
+                    p.StartInfo.FileName = agentExePath;
+
+                    if (targetRuntime.ClrVersion.Build < 0)
+                        targetRuntime = RuntimeFramework.GetBestAvailableFramework(targetRuntime);
+
+                    string envVar = "v" + targetRuntime.ClrVersion.ToString(3);
+                    p.StartInfo.EnvironmentVariables["COMPLUS_Version"] = envVar;
+
+                    p.StartInfo.Arguments = arglist;
+                    break;
+                default:
+				    p.StartInfo.FileName = agentExePath;
+                    p.StartInfo.Arguments = arglist;
+                    break;
 			}
 			
-			//NTrace.Debug( "Launching {0}" p.StartInfo.FileName );
-			p.Start();
-			agentData.Add( new AgentRecord( p.Id, p, null, AgentStatus.Starting ) );
-			return p.Id;
+            //p.Exited += new EventHandler(OnProcessExit);
+            p.Start();
+            log.Info("Launched Agent process {0} - see nunit-agent_{0}.log", p.Id);
+            log.Info("Command line: \"{0}\" {1}", p.StartInfo.FileName, p.StartInfo.Arguments);
+
+			agentData.Add( new AgentRecord( agentId, p, null, AgentStatus.Starting ) );
+		    return agentId;
 		}
 
-		private AgentRecord FindAvailableRemoteAgent(AgentType type)
+        //private void OnProcessExit(object sender, EventArgs e)
+        //{
+        //    Process p = sender as Process;
+        //    if (p != null)
+        //        agentData.Remove(p.Id);
+        //}
+
+		private AgentRecord FindAvailableAgent()
 		{
 			foreach( AgentRecord r in agentData )
-				if ( r.Status == AgentStatus.Ready )
+				if ( r.Status == AgentStatus.Ready)
 				{
-					NTrace.DebugFormat( "Reusing agent {0}", r.Id );
+					log.Debug( "Reusing agent {0}", r.Id );
 					r.Status = AgentStatus.Busy;
 					return r;
 				}
@@ -211,20 +230,24 @@ namespace NUnit.Util
 			return null;
 		}
 
-		private AgentRecord CreateRemoteAgent(AgentType type, int waitTime)
+		private TestAgent CreateRemoteAgent(RuntimeFramework framework, int waitTime, bool enableDebug)
 		{
-			int pid = LaunchAgentProcess();
+            Guid agentId = LaunchAgentProcess(framework, enableDebug);
+
+			log.Debug( "Waiting for agent {0} to register", agentId.ToString("B") );
 
-			NTrace.DebugFormat( "Waiting for agent {0} to register", pid );
-			while( waitTime > 0 )
+            int pollTime = 200;
+            bool infinite = waitTime == Timeout.Infinite;
+
+			while( infinite || waitTime > 0 )
 			{
-				int pollTime = Math.Min( 200, waitTime );
 				Thread.Sleep( pollTime );
-				waitTime -= pollTime;
-				if ( agentData[pid].Agent != null )
+				if ( !infinite ) waitTime -= pollTime;
+                TestAgent agent = agentData[agentId].Agent;
+				if ( agent != null )
 				{
-					NTrace.DebugFormat( "Returning new agent record {0}", pid ); 
-					return agentData[pid];
+					log.Debug( "Returning new agent {0}", agentId.ToString("B") );
+                    return agent;
 				}
 			}
 
@@ -249,12 +272,12 @@ namespace NUnit.Util
 		#region Nested Class - AgentRecord
 		private class AgentRecord
 		{
-			public int Id;
+			public Guid Id;
 			public Process Process;
-			public RemoteTestAgent Agent;
+			public TestAgent Agent;
 			public AgentStatus Status;
 
-			public AgentRecord( int id, Process p, RemoteTestAgent a, AgentStatus s )
+			public AgentRecord( Guid id, Process p, TestAgent a, AgentStatus s )
 			{
 				this.Id = id;
 				this.Process = p;
@@ -274,7 +297,7 @@ namespace NUnit.Util
 		{
 			private ListDictionary agentData = new ListDictionary();
 
-			public AgentRecord this[int id]
+			public AgentRecord this[Guid id]
 			{
 				get { return (AgentRecord)agentData[id]; }
 				set
@@ -286,7 +309,7 @@ namespace NUnit.Util
 				}
 			}
 
-			public AgentRecord this[RemoteTestAgent agent]
+			public AgentRecord this[TestAgent agent]
 			{
 				get
 				{
@@ -306,6 +329,11 @@ namespace NUnit.Util
 				agentData[r.Id] = r;
 			}
 
+            public void Remove(Guid agentId)
+            {
+                agentData.Remove(agentId);
+            }
+
 			public void Clear()
 			{
 				agentData.Clear();
diff --git a/src/ClientUtilities/util/Services/TestAgentManager.cs b/src/ClientUtilities/util/Services/TestAgentManager.cs
deleted file mode 100644
index d137699..0000000
--- a/src/ClientUtilities/util/Services/TestAgentManager.cs
+++ /dev/null
@@ -1,45 +0,0 @@
-using System;
-using System.Threading;
-using System.Collections.Specialized;
-using System.Runtime.Remoting;
-using System.Runtime.Remoting.Services;
-using System.Runtime.Remoting.Channels;
-using System.Runtime.Remoting.Channels.Tcp;
-using NUnit.Core;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	/// Summary description for TestAgentManager.
-	/// </summary>
-	public class TestAgentManager : ServerBase, IService
-	{
-		private ListDictionary agents = new ListDictionary();
-
-		public TestAgentManager( string uri, int port ) : base( uri, port ) { }
-
-		public void Register( object obj, int id )
-		{
-			agents[id] = obj;
-		}
-
-		public object GetTestRunner( int id )
-		{
-			return agents[id];
-		}
-
-		#region IService Members
-
-		public void UnloadService()
-		{
-			// TODO:  Add TestAgentManager.UnloadService implementation
-		}
-
-		public void InitializeService()
-		{
-			this.Start();
-		}
-
-		#endregion
-	}
-}
diff --git a/src/ClientUtilities/util/SettingsGroup.cs b/src/ClientUtilities/util/SettingsGroup.cs
index 28d8f29..2a7e715 100644
--- a/src/ClientUtilities/util/SettingsGroup.cs
+++ b/src/ClientUtilities/util/SettingsGroup.cs
@@ -1,12 +1,15 @@
 // ****************************************************************
 // Copyright 2002-2003, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 namespace NUnit.Util
 {
 	using System;
+    using System.Drawing;
+    using System.Globalization;
+    using System.ComponentModel;
 
 	/// <summary>
 	/// SettingsGroup is the base class representing a group
@@ -81,34 +84,61 @@ namespace NUnit.Util
 			return result;
 		}
 
-		/// <summary>
-		/// Load the value of one of the group's integer settings
-		/// in a type-safe manner or return a default value
-		/// </summary>
-		/// <param name="settingName">Name of setting to load</param>
-		/// <param name="defaultValue">Value to return if the seeting is not present</param>
-		/// <returns>Value of the setting or the default</returns>
-		public int GetSetting( string settingName, int defaultValue )
-		{
-			object result = GetSetting(settingName );
-
-			if ( result == null )
-				return defaultValue;
-
-			if ( result is int )
-				return (int) result;
-
-			try
-			{
-				return Int32.Parse( result.ToString() );
-			}
-			catch
-			{
-				return defaultValue;
-			}
-		}
-
-		/// <summary>
+        /// <summary>
+        /// Load the value of one of the group's integer settings
+        /// in a type-safe manner or return a default value
+        /// </summary>
+        /// <param name="settingName">Name of setting to load</param>
+        /// <param name="defaultValue">Value to return if the seeting is not present</param>
+        /// <returns>Value of the setting or the default</returns>
+        public int GetSetting(string settingName, int defaultValue)
+        {
+            object result = GetSetting(settingName);
+
+            if (result == null)
+                return defaultValue;
+
+            if (result is int)
+                return (int)result;
+
+            try
+            {
+                return Int32.Parse(result.ToString());
+            }
+            catch
+            {
+                return defaultValue;
+            }
+        }
+
+        /// <summary>
+        /// Load the value of one of the group's float settings
+        /// in a type-safe manner or return a default value
+        /// </summary>
+        /// <param name="settingName">Name of setting to load</param>
+        /// <param name="defaultValue">Value to return if the setting is not present</param>
+        /// <returns>Value of the setting or the default</returns>
+        public float GetSetting(string settingName, float defaultValue)
+        {
+            object result = GetSetting(settingName);
+
+            if (result == null)
+                return defaultValue;
+
+            if (result is float)
+                return (float)result;
+
+            try
+            {
+                return float.Parse(result.ToString());
+            }
+            catch
+            {
+                return defaultValue;
+            }
+        }
+
+        /// <summary>
 		/// Load the value of one of the group's boolean settings
 		/// in a type-safe manner.
 		/// </summary>
@@ -165,34 +195,62 @@ namespace NUnit.Util
 				return result.ToString();
 		}
 
-		/// <summary>
-		/// Load the value of one of the group's enum settings
-		/// in a type-safe manner or return a default value
-		/// </summary>
-		/// <param name="settingName">Name of setting to load</param>
-		/// <param name="defaultValue">Value to return if the setting is not present</param>
-		/// <returns>Value of the setting or the default</returns>
-		public System.Enum GetSetting( string settingName, System.Enum defaultValue )
-		{
-			object result = GetSetting(settingName );
-
-			if ( result == null )
-				return defaultValue;
-
-			if ( result is System.Enum )
-				return (System.Enum) result;
-				
-			try
-			{
-				return (System.Enum)System.Enum.Parse( defaultValue.GetType(), result.ToString(), true );
-			}
-			catch
-			{
-				return defaultValue;
-			}
-		}
-
-		/// <summary>
+        /// <summary>
+        /// Load the value of one of the group's enum settings
+        /// in a type-safe manner or return a default value
+        /// </summary>
+        /// <param name="settingName">Name of setting to load</param>
+        /// <param name="defaultValue">Value to return if the setting is not present</param>
+        /// <returns>Value of the setting or the default</returns>
+        public System.Enum GetSetting(string settingName, System.Enum defaultValue)
+        {
+            object result = GetSetting(settingName);
+
+            if (result == null)
+                return defaultValue;
+
+            if (result is System.Enum)
+                return (System.Enum)result;
+
+            try
+            {
+                return (System.Enum)System.Enum.Parse(defaultValue.GetType(), result.ToString(), true);
+            }
+            catch
+            {
+                return defaultValue;
+            }
+        }
+
+        /// <summary>
+        /// Load the value of one of the group's Font settings
+        /// in a type-safe manner or return a default value
+        /// </summary>
+        /// <param name="settingName">Name of setting to load</param>
+        /// <param name="defaultFont">Value to return if the setting is not present</param>
+        /// <returns>Value of the setting or the default</returns>
+        public Font GetSetting(string settingName, Font defaultFont)
+        {
+            object result = GetSetting(settingName);
+
+            if (result == null)
+                return defaultFont;
+
+            if (result is Font)
+                return (Font)result;
+
+            try
+            {
+                TypeConverter converter = TypeDescriptor.GetConverter(typeof(Font));
+                return (Font)converter.ConvertFrom(null, CultureInfo.InvariantCulture, result.ToString());
+            }
+            catch
+            {
+                return defaultFont;
+            }
+        }
+
+        /// <summary>
 		/// Remove a setting from the group
 		/// </summary>
 		/// <param name="settingName">Name of the setting to remove</param>
diff --git a/src/ClientUtilities/util/SettingsStorage.cs b/src/ClientUtilities/util/SettingsStorage.cs
index 1aa4246..3aabec1 100644
--- a/src/ClientUtilities/util/SettingsStorage.cs
+++ b/src/ClientUtilities/util/SettingsStorage.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2002-2003, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 namespace NUnit.Util
diff --git a/src/ClientUtilities/util/StackTraceFilter.cs b/src/ClientUtilities/util/StackTraceFilter.cs
index 17d2122..01a2a54 100644
--- a/src/ClientUtilities/util/StackTraceFilter.cs
+++ b/src/ClientUtilities/util/StackTraceFilter.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 namespace NUnit.Util
@@ -46,7 +46,8 @@ namespace NUnit.Util
 				"NUnit.Core.TestResult",
 				"NUnit.Core.TestSuite",
 				"NUnit.Framework.Assertion", 
-				"NUnit.Framework.Assert" 
+				"NUnit.Framework.Assert",
+                "System.Reflection.MonoMethod"
 			};
 
 			for (int i = 0; i < patterns.Length; i++) 
diff --git a/src/ClientUtilities/util/SummaryVisitor.cs b/src/ClientUtilities/util/SummaryVisitor.cs
deleted file mode 100644
index 882705c..0000000
--- a/src/ClientUtilities/util/SummaryVisitor.cs
+++ /dev/null
@@ -1,133 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-namespace NUnit.Util
-{
-	using System;
-	using NUnit.Core;
-
-	/// <summary>
-	/// SummaryVisitor examines a set of results and calculates 
-	/// summary statistics for the run. Note that a test run
-	/// will only produce results for tests that were selected
-	/// to be run. Curently, tests excluded by the Explicit 
-	/// attribute produce a result, while those excluded by
-	/// the Platform attribute do not. This anomaly will be
-	/// corrected in a later version.
-	/// </summary>
-	public class SummaryVisitor : ResultVisitor
-	{
-		private int resultCount;
-		private int failureCount;
-		private int skipCount;
-		private int ignoreCount;
-		private int suitesNotRun;
-		
-		private double time;
-		private string name;
-		private bool initialized;
-
-		public SummaryVisitor()
-		{
-			resultCount = 0;
-			initialized = false;
-		}
-
-		public void Visit(TestCaseResult caseResult) 
-		{
-			SetNameandTime(caseResult.Name, caseResult.Time);
-
-			switch( caseResult.RunState )
-			{
-				case RunState.Executed:
-					resultCount++;
-					if(caseResult.IsFailure)
-						failureCount++;
-					break;
-				case RunState.Ignored:
-					ignoreCount++;
-					break;
-				case RunState.Explicit:
-				case RunState.NotRunnable:
-				case RunState.Runnable:
-				case RunState.Skipped:
-				default:
-					skipCount++;
-					break;
-			}
-		}
-
-		public void Visit(TestSuiteResult suiteResult) 
-		{
-			SetNameandTime(suiteResult.Name, suiteResult.Time);
-
-			
-			
-			foreach (TestResult result in suiteResult.Results)
-			{
-				result.Accept(this);
-			}
-			
-			if(!suiteResult.Executed)
-				suitesNotRun++;
-		}
-
-		public double Time
-		{
-			get { return time; }
-		}
-
-		private void SetNameandTime(string name, double time)
-		{
-			if(!initialized)
-			{
-				this.time = time;
-				this.name = name;
-				initialized = true;
-			}
-		}
-
-		public bool Success
-		{
-			get { return (failureCount == 0); }
-		}
-
-		public int ResultCount
-		{
-			get { return resultCount; }
-		}
-
-		public int FailureCount
-		{
-			get { return failureCount; }
-		}
-
-		public int SkipCount
-		{
-			get { return skipCount; }
-		}
-
-		public int IgnoreCount
-		{
-			get { return ignoreCount; }
-		}
-
-		public int TestsNotRun
-		{
-			get { return skipCount + ignoreCount; }
-		}
-
-		public int SuitesNotRun
-		{
-			get { return suitesNotRun; }
-		}
-
-		public string Name
-		{
-			get { return name; }
-		}
-	}
-}
diff --git a/src/ClientUtilities/util/TestAgent.cs b/src/ClientUtilities/util/TestAgent.cs
deleted file mode 100644
index 3a59c1f..0000000
--- a/src/ClientUtilities/util/TestAgent.cs
+++ /dev/null
@@ -1,58 +0,0 @@
-using System;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	/// TestAgent provides a local representation
-	/// for a RemoteTestAgent allowing the lifetime
-	/// of the remote object to be independent of
-	/// its own.
-	/// </summary>
-	public class TestAgent
-	{
-		#region Fields
-		/// <summary>
-		/// Reference to the TestAgency that controls this agent
-		/// </summary>
-		private TestAgency agency;
-
-		/// <summary>
-		/// This agent's assigned id
-		/// </summary>
-		private int agentId;
-
-		/// <summary>
-		/// Reference to the remote agent
-		/// </summary>
-		private RemoteTestAgent remoteAgent;
-		#endregion
-
-		#region Constructor
-		public TestAgent( TestAgency agency, int agentId, RemoteTestAgent remoteAgent )
-		{
-			this.agency = agency;
-			this.agentId = agentId;
-			this.remoteAgent = remoteAgent;
-		}
-		#endregion
-
-		#region Properties
-		public TestAgency Agency
-		{
-			get { return agency; }
-		}
-
-		public int Id
-		{
-			get { return agentId; }
-		}
-		#endregion
-
-		#region Public Methods
-		public NUnit.Core.TestRunner CreateRunner(int runnerId)
-		{
-			return remoteAgent.CreateRunner( runnerId );
-		}
-		#endregion
-	}
-}
diff --git a/src/ClientUtilities/util/TestDomain.cs b/src/ClientUtilities/util/TestDomain.cs
index 7010149..6cc4e17 100644
--- a/src/ClientUtilities/util/TestDomain.cs
+++ b/src/ClientUtilities/util/TestDomain.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -19,6 +19,8 @@ namespace NUnit.Util
 
 	public class TestDomain : ProxyTestRunner, TestRunner
 	{
+        static Logger log = InternalTrace.GetLogger(typeof(TestDomain));
+
 		#region Instance Variables
 
 		/// <summary>
@@ -26,6 +28,11 @@ namespace NUnit.Util
 		/// </summary>
 		private AppDomain domain; 
 
+		/// <summary>
+		/// The TestAgent in the domain
+		/// </summary>
+		private DomainAgent agent;
+
 		#endregion
 
 		#region Constructors
@@ -46,18 +53,27 @@ namespace NUnit.Util
 		{
 			Unload();
 
+            log.Info("Loading " + package.Name);
 			try
 			{
 				if ( this.domain == null )
 					this.domain = Services.DomainManager.CreateDomain( package );
+
+                if (this.agent == null)
+                {
+                    this.agent = DomainAgent.CreateInstance(domain);
+                    this.agent.Start();
+                }
             
 				if ( this.TestRunner == null )
-					this.TestRunner = MakeRemoteTestRunner( domain );
+					this.TestRunner = this.agent.CreateRunner( this.ID );
 
+                log.Info("Loading tests in AppDomain, see {0}.log", domain.FriendlyName);
 				return TestRunner.Load( package );
 			}
 			catch
 			{
+                log.Error("Load failure");
 				Unload();
 				throw;
 			}
@@ -65,29 +81,46 @@ namespace NUnit.Util
 
 		public override void Unload()
 		{
-			this.TestRunner = null;
+            if (this.TestRunner != null)
+            {
+                log.Info("Unloading");
+                this.TestRunner.Unload();
+                this.TestRunner = null;
+            }
+
+            if (this.agent != null)
+            {
+                log.Info("Stopping DomainAgent");
+                this.agent.Dispose();
+                this.agent = null;
+            }
 
 			if(domain != null) 
 			{
+                log.Info("Unloading AppDomain " + domain.FriendlyName);
 				Services.DomainManager.Unload(domain);
 				domain = null;
 			}
 		}
 		#endregion
 
-		#region MakeRemoteTestRunner Helper
-		private TestRunner MakeRemoteTestRunner( AppDomain runnerDomain )
-		{
-			Type runnerType = typeof( RemoteTestRunner );
-			object obj = runnerDomain.CreateInstanceAndUnwrap(
-				runnerType.Assembly.FullName, 
-				runnerType.FullName,
-				false, BindingFlags.Default,null,new object[] { this.ID },null,null,null);
-			
-			RemoteTestRunner runner = (RemoteTestRunner) obj;
-
-			return runner;
-		}
-		#endregion
-	}
+        #region Running Tests
+        public override void BeginRun(EventListener listener, ITestFilter filter)
+        {
+            log.Info("BeginRun in AppDomain {0}", domain.FriendlyName);
+            base.BeginRun(listener, filter);
+        }
+        #endregion
+
+        #region IDisposable Members
+
+        public override void Dispose()
+        {
+            base.Dispose();
+
+            Unload();
+        }
+
+        #endregion
+    }
 }
diff --git a/src/ClientUtilities/util/TestEventArgs.cs b/src/ClientUtilities/util/TestEventArgs.cs
index e2926f0..c867912 100644
--- a/src/ClientUtilities/util/TestEventArgs.cs
+++ b/src/ClientUtilities/util/TestEventArgs.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/ClientUtilities/util/TestEventDispatcher.cs b/src/ClientUtilities/util/TestEventDispatcher.cs
index d1a5edb..92b6cbb 100644
--- a/src/ClientUtilities/util/TestEventDispatcher.cs
+++ b/src/ClientUtilities/util/TestEventDispatcher.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2002-2003, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/ClientUtilities/util/TestExceptionHandler.cs b/src/ClientUtilities/util/TestExceptionHandler.cs
index 789af07..3c731a6 100644
--- a/src/ClientUtilities/util/TestExceptionHandler.cs
+++ b/src/ClientUtilities/util/TestExceptionHandler.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/ClientUtilities/util/TestLoader.cs b/src/ClientUtilities/util/TestLoader.cs
index f3a32da..56066de 100644
--- a/src/ClientUtilities/util/TestLoader.cs
+++ b/src/ClientUtilities/util/TestLoader.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
-// Copyright 2002-2003, Charlie Poole
+// Copyright 2002-2008, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 namespace NUnit.Util
@@ -9,12 +9,12 @@ namespace NUnit.Util
 	using System;
 	using System.IO;
 	using System.Collections;
+	using System.Diagnostics;
 	using System.Threading;
 	using System.Configuration;
 	using NUnit.Core;
 	using NUnit.Core.Filters;
 
-
 	/// <summary>
 	/// TestLoader handles interactions between a test runner and a 
 	/// client program - typically the user interface - for the 
@@ -31,6 +31,8 @@ namespace NUnit.Util
 	/// </summary>
 	public class TestLoader : MarshalByRefObject, NUnit.Core.EventListener, ITestLoader, IService
 	{
+        static Logger log = InternalTrace.GetLogger(typeof(TestLoader));
+
 		#region Instance Variables
 
 		/// <summary>
@@ -38,22 +40,10 @@ namespace NUnit.Util
 		/// </summary>
 		private TestEventDispatcher events;
 
-		/// <summary>
-		/// Use MuiltipleTestDomainRunner if true
-		/// </summary>
-		private bool multiDomain;
-
-		/// <summary>
-		/// Merge namespaces across multiple assemblies
-		/// </summary>
-		private bool mergeAssemblies;
-
-		/// <summary>
-		/// Generate suites for each level of namespace containing tests
-		/// </summary>
-		private bool autoNamespaceSuites;
-
-		private bool shadowCopyFiles;
+        /// <summary>
+        /// Our TestRunnerFactory
+        /// </summary>
+        private ITestRunnerFactory factory;
 
 		/// <summary>
 		/// Loads and executes tests. Non-null when
@@ -81,6 +71,11 @@ namespace NUnit.Util
 		/// </summary>
 		private string currentTestName;
 
+        /// <summary>
+        /// The currently set runtime framework
+        /// </summary>
+        private RuntimeFramework currentRuntime;
+
 		/// <summary>
 		/// Result of the last test run
 		/// </summary>
@@ -94,7 +89,7 @@ namespace NUnit.Util
 		/// <summary>
 		/// Watcher fires when the assembly changes
 		/// </summary>
-		private AssemblyWatcher watcher;
+		private IAssemblyWatcher watcher;
 
 		/// <summary>
 		/// Assembly changed during a test and
@@ -103,28 +98,17 @@ namespace NUnit.Util
 		private bool reloadPending = false;
 
 		/// <summary>
-		/// Indicates whether to watch for changes
-		/// and reload the tests when a change occurs.
-		/// </summary>
-		private bool reloadOnChange = false;
-
-		/// <summary>
-		/// Indicates whether to automatically rerun
-		/// the tests when a change occurs.
-		/// </summary>
-		private bool rerunOnChange = false;
-
-		/// <summary>
 		/// The last filter used for a run - used to 
 		/// rerun tests when a change occurs
 		/// </summary>
 		private ITestFilter lastFilter;
 
-		/// <summary>
-		/// Indicates whether to reload the tests
-		/// before each run.
-		/// </summary>
-		private bool reloadOnRun = false;
+        /// <summary>
+        /// The runtime framework being used for the currently
+        /// loaded tests, or the current framework if no tests
+        /// are loaded.
+        /// </summary>
+        private RuntimeFramework currentFramework = RuntimeFramework.CurrentFramework;
 
 		#endregion
 
@@ -133,20 +117,18 @@ namespace NUnit.Util
 		public TestLoader()
 			: this( new TestEventDispatcher() ) { }
 
-		public TestLoader(TestEventDispatcher eventDispatcher )
-		{
-			this.events = eventDispatcher;
+		public TestLoader(TestEventDispatcher eventDispatcher)
+			: this(eventDispatcher, new AssemblyWatcher()) { }
 
-			ISettings settings = Services.UserSettings;
-			this.ReloadOnRun = settings.GetSetting( "Options.TestLoader.ReloadOnRun", true );
-			this.ReloadOnChange = settings.GetSetting( "Options.TestLoader.ReloadOnChange", true );
-			this.RerunOnChange = settings.GetSetting( "Options.TestLoader.RerunOnChange", false );
-			this.MultiDomain = settings.GetSetting( "Options.TestLoader.MultiDomain", false );
-			this.MergeAssemblies = settings.GetSetting( "Options.TestLoader.MergeAssemblies", false );
-			this.AutoNamespaceSuites = settings.GetSetting( "Options.TestLoader.AutoNamespaceSuites", true );
-			this.ShadowCopyFiles = settings.GetSetting( "Options.TestLoader.ShadowCopyFiles", true );
+		public TestLoader(IAssemblyWatcher assemblyWatcher)
+			: this(new TestEventDispatcher(), assemblyWatcher) { }
 
-			AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler( OnUnhandledException );
+		public TestLoader(TestEventDispatcher eventDispatcher, IAssemblyWatcher assemblyWatcher)
+		{
+			this.events = eventDispatcher;
+			this.watcher = assemblyWatcher;
+			this.factory = new DefaultTestRunnerFactory();
+			AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(OnUnhandledException);
 		}
 
 		#endregion
@@ -170,7 +152,6 @@ namespace NUnit.Util
 		public NUnitProject TestProject
 		{
 			get { return testProject; }
-			set	{ OnProjectLoad( value ); }
 		}
 
 		public ITestEvents Events
@@ -193,48 +174,6 @@ namespace NUnit.Util
 			get { return lastException; }
 		}
 
-		public bool ReloadOnChange
-		{
-			get { return reloadOnChange; }
-			set { reloadOnChange = value; }
-		}
-
-		public bool RerunOnChange
-		{
-			get { return rerunOnChange; }
-			set { rerunOnChange = value; }
-		}
-
-		public bool ReloadOnRun
-		{
-			get { return reloadOnRun; }
-			set { reloadOnRun = value; }
-		}
-
-		public bool MultiDomain
-		{
-			get { return multiDomain; }
-			set { multiDomain = value; }
-		}
-
-		public bool MergeAssemblies
-		{
-			get { return mergeAssemblies; }
-			set { mergeAssemblies = value; }
-		}
-
-		public bool AutoNamespaceSuites
-		{
-			get { return autoNamespaceSuites; }
-			set { autoNamespaceSuites = value; }
-		}
-
-		public bool ShadowCopyFiles
-		{
-			get { return shadowCopyFiles; }
-			set { shadowCopyFiles = value; }
-		}
-
 		public IList AssemblyInfo
 		{
 			get { return testRunner == null ? null : testRunner.AssemblyInfo; }
@@ -244,16 +183,22 @@ namespace NUnit.Util
 		{
 			get { return loadedTest == null ? 0 : loadedTest.TestCount; }
 		}
+
+        public RuntimeFramework CurrentFramework
+        {
+            get { return currentFramework; }
+        }
 		#endregion
 
 		#region EventListener Handlers
 
-		void EventListener.RunStarted(string name, int testCount)
+		public void RunStarted(string name, int testCount)
 		{
+            log.Debug("Got RunStarted Event");
 			events.FireRunStarting( name, testCount );
 		}
 
-		void EventListener.RunFinished(NUnit.Core.TestResult testResult)
+		public void RunFinished(NUnit.Core.TestResult testResult)
 		{
 			this.testResult = testResult;
 
@@ -270,7 +215,7 @@ namespace NUnit.Util
 			}
 		}
 
-		void EventListener.RunFinished(Exception exception)
+		public void RunFinished(Exception exception)
 		{
 			this.lastException = exception;
 			events.FireRunFinished( exception );
@@ -279,8 +224,8 @@ namespace NUnit.Util
 		/// <summary>
 		/// Trigger event when each test starts
 		/// </summary>
-		/// <param name="testCase">TestCase that is starting</param>
-		void EventListener.TestStarted(TestName testName)
+		/// <param name="testName">TestName of the Test that is starting</param>
+		public void TestStarted(TestName testName)
 		{
 			this.currentTestName = testName.FullName;
 			events.FireTestStarting( testName );
@@ -290,7 +235,7 @@ namespace NUnit.Util
 		/// Trigger event when each test finishes
 		/// </summary>
 		/// <param name="result">Result of the case that finished</param>
-		void EventListener.TestFinished(TestCaseResult result)
+		public void TestFinished(TestResult result)
 		{
 			events.FireTestFinished( result );
 		}
@@ -299,7 +244,7 @@ namespace NUnit.Util
 		/// Trigger event when each suite starts
 		/// </summary>
 		/// <param name="suite">Suite that is starting</param>
-		void EventListener.SuiteStarted(TestName suiteName)
+		public void SuiteStarted(TestName suiteName)
 		{
 			events.FireSuiteStarting( suiteName );
 		}
@@ -308,7 +253,7 @@ namespace NUnit.Util
 		/// Trigger event when each suite finishes
 		/// </summary>
 		/// <param name="result">Result of the suite that finished</param>
-		void EventListener.SuiteFinished(TestSuiteResult result)
+		public void SuiteFinished(TestResult result)
 		{
 			events.FireSuiteFinished( result );
 		}
@@ -317,7 +262,7 @@ namespace NUnit.Util
 		/// Trigger event when an unhandled exception (other than ThreadAbordException) occurs during a test
 		/// </summary>
 		/// <param name="exception">The unhandled exception</param>
-		void EventListener.UnhandledException(Exception exception)
+		public void UnhandledException(Exception exception)
 		{
 			events.FireTestException( this.currentTestName, exception );
 		}
@@ -330,7 +275,8 @@ namespace NUnit.Util
 					break;
 				case "NUnit.Framework.AssertionException":
 				default:
-					events.FireTestException( this.currentTestName, (Exception)args.ExceptionObject );
+                    Exception ex = args.ExceptionObject as Exception;
+					events.FireTestException( this.currentTestName, ex);
 					break;
 			}
 		}
@@ -339,7 +285,7 @@ namespace NUnit.Util
 		/// Trigger event when output occurs during a test
 		/// </summary>
 		/// <param name="testOutput">The test output</param>
-		void EventListener.TestOutput(TestOutput testOutput)
+		public void TestOutput(TestOutput testOutput)
 		{
 			events.FireTestOutput( testOutput );
 		}
@@ -353,15 +299,17 @@ namespace NUnit.Util
 		/// </summary>
 		public void NewProject()
 		{
-			try
+            log.Info("Creating empty project");
+            try
 			{
 				events.FireProjectLoading( "New Project" );
 
-				OnProjectLoad( NUnitProject.NewProject() );
+				OnProjectLoad( Services.ProjectService.NewProject() );
 			}
 			catch( Exception exception )
 			{
-				lastException = exception;
+                log.Error("Project creation failed", exception);
+                lastException = exception;
 				events.FireProjectLoadFailed( "New Project", exception );
 			}
 		}
@@ -371,7 +319,8 @@ namespace NUnit.Util
 		/// </summary>
 		public void NewProject( string filePath )
 		{
-			try
+            log.Info("Creating project " + filePath);
+            try
 			{
 				events.FireProjectLoading( filePath );
 
@@ -385,7 +334,8 @@ namespace NUnit.Util
 			}
 			catch( Exception exception )
 			{
-				lastException = exception;
+                log.Error("Project creation failed", exception);
+                lastException = exception;
 				events.FireProjectLoadFailed( filePath, exception );
 			}
 		}
@@ -397,9 +347,10 @@ namespace NUnit.Util
 		{
 			try
 			{
-				events.FireProjectLoading( filePath );
+                log.Info("Loading project {0}, {1} config", filePath, configName == null ? "default" : configName);
+                events.FireProjectLoading(filePath);
 
-				NUnitProject newProject = NUnitProject.LoadProject( filePath );
+				NUnitProject newProject = Services.ProjectService.LoadProject( filePath );
 				if ( configName != null ) 
 				{
 					newProject.SetActiveConfig( configName );
@@ -410,7 +361,8 @@ namespace NUnit.Util
 			}
 			catch( Exception exception )
 			{
-				lastException = exception;
+                log.Error("Project load failed", exception);
+                lastException = exception;
 				events.FireProjectLoadFailed( filePath, exception );
 			}
 		}
@@ -430,15 +382,17 @@ namespace NUnit.Util
 		{
 			try
 			{
+                log.Info("Loading multiple assemblies as new project");
 				events.FireProjectLoading( "New Project" );
 
-				NUnitProject newProject = NUnitProject.FromAssemblies( assemblies );
+				NUnitProject newProject = Services.ProjectService.WrapAssemblies( assemblies );
 
 				OnProjectLoad( newProject );
 			}
 			catch( Exception exception )
 			{
-				lastException = exception;
+                log.Error("Project load failed", exception);
+                lastException = exception;
 				events.FireProjectLoadFailed( "New Project", exception );
 			}
 		}
@@ -450,6 +404,7 @@ namespace NUnit.Util
 		{
 			string testFileName = TestFileName;
 
+            log.Info("Unloading project " + testFileName);
 			try
 			{
 				events.FireProjectUnloading( testFileName );
@@ -457,14 +412,14 @@ namespace NUnit.Util
 				if ( IsTestLoaded )
 					UnloadTest();
 
-				testProject.Changed -= new ProjectEventHandler( OnProjectChanged );
 				testProject = null;
 
 				events.FireProjectUnloaded( testFileName );
 			}
 			catch (Exception exception )
 			{
-				lastException = exception;
+                log.Error("Project unload failed", exception);
+                lastException = exception;
 				events.FireProjectUnloadFailed( testFileName, exception );
 			}
 
@@ -480,45 +435,10 @@ namespace NUnit.Util
 				UnloadProject();
 
 			this.testProject = testProject;
-			testProject.Changed += new ProjectEventHandler( OnProjectChanged );
 
 			events.FireProjectLoaded( TestFileName );
 		}
 
-		private void OnProjectChanged( object sender, ProjectEventArgs e )
-		{
-			switch ( e.type )
-			{
-				case ProjectChangeType.ActiveConfig:
-				case ProjectChangeType.Other:
-					if( TestProject.IsLoadable )
-						TryToLoadOrReloadTest();
-					break;
-
-				case ProjectChangeType.AddConfig:
-				case ProjectChangeType.UpdateConfig:
-					if ( e.configName == TestProject.ActiveConfigName && TestProject.IsLoadable )
-						TryToLoadOrReloadTest();
-					break;
-
-				case ProjectChangeType.RemoveConfig:
-					if ( IsTestLoaded && TestProject.Configs.Count == 0 )
-						UnloadTest();
-					break;
-
-				default:
-					break;
-			}
-		}
-
-		private void TryToLoadOrReloadTest()
-		{
-			if ( IsTestLoaded ) 
-				ReloadTest();
-			else 
-				LoadTest();
-		}
-
 		#endregion
 
 		#region Methods for Loading and Unloading Tests
@@ -530,34 +450,47 @@ namespace NUnit.Util
 		
 		public void LoadTest( string testName )
 		{
+            log.Info("Loading tests for " + Path.GetFileName(TestFileName));
+
             long startTime = DateTime.Now.Ticks;
 
 			try
 			{
 				events.FireTestLoading( TestFileName );
 
-				testRunner = CreateRunner();
+                TestPackage package = MakeTestPackage(testName);
+                if (testRunner != null)
+                    testRunner.Dispose();
+				testRunner = factory.MakeTestRunner(package);
 
-				bool loaded = testRunner.Load( MakeTestPackage( testName ) );
+                bool loaded = testRunner.Load(package);
 
 				loadedTest = testRunner.Test;
 				loadedTestName = testName;
 				testResult = null;
 				reloadPending = false;
 			
-				if ( ReloadOnChange )
+				if ( Services.UserSettings.GetSetting( "Options.TestLoader.ReloadOnChange", true ) )
 					InstallWatcher( );
 
-				if ( loaded )
-					events.FireTestLoaded( TestFileName, loadedTest );
-				else
-				{
-					lastException = new ApplicationException( string.Format ( "Unable to find test {0} in assembly", testName ) );
-					events.FireTestLoadFailed( TestFileName, lastException );
-				}
+                if (loaded)
+                {
+                    this.currentFramework = package.Settings.Contains("RuntimeFramework")
+                        ? package.Settings["RuntimeFramework"] as RuntimeFramework
+                        : RuntimeFramework.CurrentFramework;
+
+                    testProject.HasChangesRequiringReload = false;
+                    events.FireTestLoaded(TestFileName, loadedTest);
+                }
+                else
+                {
+                    lastException = new ApplicationException(string.Format("Unable to find test {0} in assembly", testName));
+                    events.FireTestLoadFailed(TestFileName, lastException);
+                }
 			}
 			catch( FileNotFoundException exception )
 			{
+                log.Error("File not found", exception);
 				lastException = exception;
 
 				foreach( string assembly in TestProject.ActiveConfig.Assemblies )
@@ -571,15 +504,17 @@ namespace NUnit.Util
 				}
 
 				events.FireTestLoadFailed( TestFileName, lastException );
-			}
+
+                double loadTime = (double)(DateTime.Now.Ticks - startTime) / (double)TimeSpan.TicksPerSecond;
+                log.Info("Load completed in {0} seconds", loadTime);
+            }
 			catch( Exception exception )
 			{
+                log.Error("Failed to load test", exception);
+
 				lastException = exception;
 				events.FireTestLoadFailed( TestFileName, exception );
 			}
-
-            double loadTime = (double)(DateTime.Now.Ticks - startTime) / (double)TimeSpan.TicksPerSecond;
-            System.Diagnostics.Trace.WriteLine(string.Format("TestLoader: Loaded in {0} seconds", loadTime)); 
 		}
 
 		/// <summary>
@@ -589,6 +524,8 @@ namespace NUnit.Util
 		{
 			if( IsTestLoaded )
 			{
+                log.Info("Unloading tests for " + Path.GetFileName(TestFileName));
+
 				// Hold the name for notifications after unload
 				string fileName = TestFileName;
 
@@ -599,7 +536,7 @@ namespace NUnit.Util
 					RemoveWatcher();
 
 					testRunner.Unload();
-
+                    testRunner.Dispose();
 					testRunner = null;
 
 					loadedTest = null;
@@ -608,10 +545,12 @@ namespace NUnit.Util
 					reloadPending = false;
 
 					events.FireTestUnloaded( fileName );
+                    log.Info("Unload complete");
 				}
 				catch( Exception exception )
 				{
-					lastException = exception;
+                    log.Error("Failed to unload tests", exception);
+                    lastException = exception;
 					events.FireTestUnloadFailed( fileName, exception );
 				}
 			}
@@ -620,26 +559,56 @@ namespace NUnit.Util
 		/// <summary>
 		/// Reload the current test on command
 		/// </summary>
-		public void ReloadTest()
+		public void ReloadTest(RuntimeFramework framework)
 		{
+            log.Info("Reloading tests for " + Path.GetFileName(TestFileName));
 			try
 			{
 				events.FireTestReloading( TestFileName );
 
-				testRunner.Load( MakeTestPackage( loadedTestName ) );
+                TestPackage package = MakeTestPackage(loadedTestName);
+                if (framework != null)
+                    package.Settings["RuntimeFramework"] = framework;
 
-				loadedTest = testRunner.Test;
+                RemoveWatcher();
+
+                testRunner.Unload();
+                if (!factory.CanReuse(testRunner, package))
+                {
+                    testRunner.Dispose();
+                    testRunner = factory.MakeTestRunner(package);
+                }
+
+                if (testRunner.Load(package))
+                    this.currentFramework = package.Settings.Contains("RuntimeFramework")
+                        ? package.Settings["RuntimeFramework"] as RuntimeFramework
+                        : RuntimeFramework.CurrentFramework;
+
+                loadedTest = testRunner.Test;
+                currentRuntime = framework;
 				reloadPending = false;
 
-				events.FireTestReloaded( TestFileName, loadedTest );				
+                if (Services.UserSettings.GetSetting("Options.TestLoader.ReloadOnChange", true))
+                    InstallWatcher();
+
+                testProject.HasChangesRequiringReload = false;
+                events.FireTestReloaded(TestFileName, loadedTest);
+
+                log.Info("Reload complete");
 			}
 			catch( Exception exception )
 			{
-				lastException = exception;
+                log.Error("Reload failed", exception);
+                lastException = exception;
 				events.FireTestReloadFailed( TestFileName, exception );
 			}
 		}
 
+        public void ReloadTest()
+        {
+            ReloadTest(currentRuntime);
+        }
+
 		/// <summary>
 		/// Handle watcher event that signals when the loaded assembly
 		/// file has changed. Make sure it's a real change before
@@ -649,13 +618,15 @@ namespace NUnit.Util
 		/// </summary>
 		public void OnTestChanged( string testFileName )
 		{
+            log.Info("Assembly changed: {0}", testFileName);
+
 			if ( Running )
 				reloadPending = true;
 			else
 			{
 				ReloadTest();
 
-				if ( rerunOnChange && lastFilter != null )
+                if (lastFilter != null && Services.UserSettings.GetSetting("Options.TestLoader.RerunOnChange", false))
 					testRunner.BeginRun( this, lastFilter );
 			}
 		}
@@ -678,7 +649,7 @@ namespace NUnit.Util
 		{
 			if ( !Running )
 			{
-				if ( reloadPending || ReloadOnRun )
+                if (reloadPending || Services.UserSettings.GetSetting("Options.TestLoader.ReloadOnRun", false))
 					ReloadTest();
 
 				this.lastFilter = filter;
@@ -705,29 +676,30 @@ namespace NUnit.Util
 			list.Sort();
 			return list;
 		}
-		#endregion
 
 		public void SaveLastResult( string fileName )
 		{
-			XmlResultVisitor resultVisitor 
-				= new XmlResultVisitor( fileName, this.testResult );
-			this.testResult.Accept(resultVisitor);
-			resultVisitor.Write();
-		}
+			new XmlResultWriter( fileName ).SaveTestResult(this.testResult);
+        }
+        #endregion
 
-		#region Helper Methods
+        #region Helper Methods
 
-		/// <summary>
+        /// <summary>
 		/// Install our watcher object so as to get notifications
 		/// about changes to a test.
 		/// </summary>
 		private void InstallWatcher()
 		{
-			if(watcher!=null) watcher.Stop();
+            if (watcher != null)
+            {
+                watcher.Stop();
+                watcher.FreeResources();
 
-			watcher = new AssemblyWatcher( 1000, TestProject.ActiveConfig.Assemblies.ToArray() );
-			watcher.AssemblyChangedEvent += new AssemblyWatcher.AssemblyChangedHandler( OnTestChanged );
-			watcher.Start();
+                watcher.Setup(1000, TestProject.ActiveConfig.Assemblies.ToArray());
+                watcher.AssemblyChanged += new AssemblyChangedHandler(OnTestChanged);
+                watcher.Start();
+            }
 		}
 
 		/// <summary>
@@ -735,30 +707,35 @@ namespace NUnit.Util
 		/// </summary>
 		private void RemoveWatcher()
 		{
-			if ( watcher != null )
-			{
-				watcher.Stop();
-				watcher = null;
-			}
-		}
-
-		private TestRunner CreateRunner()
-		{
-			TestRunner runner = multiDomain
-				? (TestRunner)new MultipleTestDomainRunner()
-				: (TestRunner)new TestDomain();
-				
-			return runner;
+            if (watcher != null)
+            {
+                watcher.Stop();
+                watcher.FreeResources();
+                watcher.AssemblyChanged -= new AssemblyChangedHandler(OnTestChanged);
+            }
 		}
 
 		private TestPackage MakeTestPackage( string testName )
 		{
 			TestPackage package = TestProject.ActiveConfig.MakeTestPackage();
 			package.TestName = testName;
-			package.Settings["MergeAssemblies"] = mergeAssemblies;
-			package.Settings["AutoNamespaceSuites"] = autoNamespaceSuites;
-			package.Settings["ShadowCopyFiles"] = shadowCopyFiles;
-			return package;
+
+            ISettings settings = Services.UserSettings;
+            package.Settings["MergeAssemblies"] = settings.GetSetting("Options.TestLoader.MergeAssemblies", false);
+            package.Settings["AutoNamespaceSuites"] = settings.GetSetting("Options.TestLoader.AutoNamespaceSuites", true);
+            package.Settings["ShadowCopyFiles"] = settings.GetSetting("Options.TestLoader.ShadowCopyFiles", true);
+
+            ProcessModel processModel = (ProcessModel)settings.GetSetting("Options.TestLoader.ProcessModel", ProcessModel.Default);
+            DomainUsage domainUsage = (DomainUsage)settings.GetSetting("Options.TestLoader.DomainUsage", DomainUsage.Default);
+
+            if (processModel != ProcessModel.Default && !package.Settings.Contains("ProcessModel"))
+                package.Settings["ProcessModel"] = processModel;
+
+            if (processModel != ProcessModel.Multiple && domainUsage == DomainUsage.Multiple
+                    && !package.Settings.Contains("DomainUsage"))
+                package.Settings["DomainUsage"] = domainUsage;
+			
+            return package;
 		}
 		#endregion
 
diff --git a/src/ClientUtilities/util/TestObserver.cs b/src/ClientUtilities/util/TestObserver.cs
index dc56daf..9b8117b 100644
--- a/src/ClientUtilities/util/TestObserver.cs
+++ b/src/ClientUtilities/util/TestObserver.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/ClientUtilities/util/TestResultItem.cs b/src/ClientUtilities/util/TestResultItem.cs
index 36a97ce..ce4e91b 100644
--- a/src/ClientUtilities/util/TestResultItem.cs
+++ b/src/ClientUtilities/util/TestResultItem.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -65,11 +65,13 @@ namespace NUnit.Util
 		{
 			get 
 			{
-				string trace = "No stack trace is available";
-				if(stackTrace != null)
-					trace = StackTraceFilter.Filter(stackTrace);
+                return stackTrace == null ? null : StackTraceFilter.Filter(stackTrace);
 
-				return trace;
+                //string trace = "No stack trace is available";
+                //if(stackTrace != null)
+                //    trace = StackTraceFilter.Filter(stackTrace);
+
+                //return trace;
 			}
 		}
 	}
diff --git a/src/ClientUtilities/util/TestServer.cs b/src/ClientUtilities/util/TestServer.cs
index 0df5d46..0f5c115 100644
--- a/src/ClientUtilities/util/TestServer.cs
+++ b/src/ClientUtilities/util/TestServer.cs
@@ -1,3 +1,8 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using System.Threading;
 using System.Runtime.Remoting;
diff --git a/src/ClientUtilities/util/Transform.resx b/src/ClientUtilities/util/Transform.resx
index 479cdac..b3c9757 100644
--- a/src/ClientUtilities/util/Transform.resx
+++ b/src/ClientUtilities/util/Transform.resx
@@ -1,103 +1,124 @@
-<?xml version="1.0" encoding="utf-8" ?>
+<?xml version="1.0" encoding="utf-8"?>
 <root>
-	<!-- 
-            Microsoft ResX Schema 
-        
-            Version 1.3
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
                 
-            The primary goals of this format is to allow a simple XML format 
-            that is mostly human readable. The generation and parsing of the 
-            various data types are done through the TypeConverter classes 
-            associated with the data types.
-        
-            Example:
-        
-                ... ado.net/XML headers & schema ...
-                <resheader name="resmimetype">text/microsoft-resx</resheader>
-                <resheader name="version">1.3</resheader>
-                <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-                <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-                <data name="Name1">this is my long string</data>
-                <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-                <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-                    [base64 mime encoded serialized .NET Framework object]
-                </data>
-                <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-                    [base64 mime encoded string representing a byte array form of the .NET Framework object]
-                </data>
-        
-            There are any number of "resheader" rows that contain simple 
-            name/value pairs.
-            
-            Each data row contains a name, and value. The row also contains a 
-            type or mimetype. Type corresponds to a .NET class that support 
-            text/value conversion through the TypeConverter architecture. 
-            Classes that don't support this are serialized and stored with the 
-            mimetype set.
-                     
-            The mimetype is used for serialized objects, and tells the 
-            ResXResourceReader how to depersist the object. This is currently not 
-            extensible. For a given mimetype the value must be set accordingly:
-        
-            Note - application/x-microsoft.net.object.binary.base64 is the format 
-                   that the ResXResourceWriter will generate, however the reader can 
-                   read any of the formats listed below.
-        
-            mimetype: application/x-microsoft.net.object.binary.base64
-            value   : The object must be serialized with 
-                    : System.Serialization.Formatters.Binary.BinaryFormatter
-                    : and then encoded with base64 encoding.
-        
-            mimetype: application/x-microsoft.net.object.soap.base64
-            value   : The object must be serialized with 
-                    : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-                    : and then encoded with base64 encoding.
-            mimetype: application/x-microsoft.net.object.bytearray.base64
-            value   : The object must be serialized into a byte array 
-                    : using a System.ComponentModel.TypeConverter
-                    : and then encoded with base64 encoding.
-        -->
-	<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-		<xsd:element name="root" msdata:IsDataSet="true">
-			<xsd:complexType>
-				<xsd:choice maxOccurs="unbounded">
-					<xsd:element name="data">
-						<xsd:complexType>
-							<xsd:sequence>
-								<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-								<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-							</xsd:sequence>
-							<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
-							<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-							<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-						</xsd:complexType>
-					</xsd:element>
-					<xsd:element name="resheader">
-						<xsd:complexType>
-							<xsd:sequence>
-								<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-							</xsd:sequence>
-							<xsd:attribute name="name" type="xsd:string" use="required" />
-						</xsd:complexType>
-					</xsd:element>
-				</xsd:choice>
-			</xsd:complexType>
-		</xsd:element>
-	</xsd:schema>
-	<resheader name="resmimetype">
-		<value>text/microsoft-resx</value>
-	</resheader>
-	<resheader name="version">
-		<value>1.3</value>
-	</resheader>
-	<resheader name="reader">
-		<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-	</resheader>
-	<resheader name="writer">
-		<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-	</resheader>
-	<data name="Summary.xslt">
-		<value><?xml version="1.0" encoding="UTF-8" ?>
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="Summary.xslt" xml:space="preserve">
+    <value><?xml version="1.0" encoding="UTF-8" ?>
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method='text'/>
 
@@ -108,15 +129,24 @@
 <xsl:template match="test-results">
 <xsl:text>Tests run: </xsl:text>
 <xsl:value-of select="@total"/>
+<xsl:text>, Errors: </xsl:text>
+<xsl:value-of select="@errors"/>
 <xsl:text>, Failures: </xsl:text>
 <xsl:value-of select="@failures"/>
-<xsl:text>, Not run: </xsl:text>
-<xsl:value-of select="@not-run"/>
 <xsl:text>, Time: </xsl:text>
 <xsl:value-of select="test-suite/@time"/>
 <xsl:text> seconds
 </xsl:text>
+<xsl:text>  Not run: </xsl:text>
+<xsl:value-of select="@not-run"/>
+<xsl:text>, Invalid: </xsl:text>
+<xsl:value-of select="@invalid"/>
+<xsl:text>, Ignored: </xsl:text>
+<xsl:value-of select="@ignored"/>
+<xsl:text>, Skipped: </xsl:text>
+<xsl:value-of select="@skipped"/>
 <xsl:text>
+
 </xsl:text>
 
 <xsl:if test="//test-suite[failure]"><xsl:text>Test Fixture SetUp Failures:
@@ -147,5 +177,5 @@
 </xsl:stylesheet>
 
   </value>
-	</data>
+  </data>
 </root>
\ No newline at end of file
diff --git a/src/ClientUtilities/util/VSProject.cs b/src/ClientUtilities/util/VSProject.cs
index 3d2fe3e..2a8241d 100644
--- a/src/ClientUtilities/util/VSProject.cs
+++ b/src/ClientUtilities/util/VSProject.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2002-2003, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -90,8 +90,12 @@ namespace NUnit.Util
 
 		public static bool IsProjectFile( string path )
 		{
+#if NET_2_0
+            if (path.IndexOfAny(Path.GetInvalidPathChars()) >= 0)
+#else
 			if ( path.IndexOfAny( Path.InvalidPathChars ) >= 0 )
-				return false;
+#endif
+                return false;
 
 			if ( path.ToLower().IndexOf( "http:" ) >= 0 )
 				return false;
@@ -134,7 +138,6 @@ namespace NUnit.Util
 				switch ( extension )
 				{
 					case ".vcproj":
-						XmlNode topNode = doc.SelectSingleNode( "/VisualStudioProject" );
 
 						// TODO: This is all very hacked up... replace it.
 						foreach ( XmlNode configNode in doc.SelectNodes( "/VisualStudioProject/Configurations/Configuration" ) )
diff --git a/src/ClientUtilities/util/VSProjectConfig.cs b/src/ClientUtilities/util/VSProjectConfig.cs
index 7577015..800c22e 100644
--- a/src/ClientUtilities/util/VSProjectConfig.cs
+++ b/src/ClientUtilities/util/VSProjectConfig.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2002-2003, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/ClientUtilities/util/VSProjectConfigCollection.cs b/src/ClientUtilities/util/VSProjectConfigCollection.cs
index 46a1baf..f422bba 100644
--- a/src/ClientUtilities/util/VSProjectConfigCollection.cs
+++ b/src/ClientUtilities/util/VSProjectConfigCollection.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2002-2003, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/ClientUtilities/util/XmlResultTransform.cs b/src/ClientUtilities/util/XmlResultTransform.cs
index 5344e74..80def0e 100644
--- a/src/ClientUtilities/util/XmlResultTransform.cs
+++ b/src/ClientUtilities/util/XmlResultTransform.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -17,9 +17,13 @@ namespace NUnit.Util
 	/// </summary>
 	public class XmlResultTransform
 	{
-		private XslTransform xslTransform = new XslTransform();
+#if NET_2_0
+		private XslCompiledTransform xslTransform = new XslCompiledTransform();
+#else
+        private XslTransform xslTransform = new XslTransform();
+#endif
 
-		public XmlResultTransform() { }
+        public XmlResultTransform() { }
 
 		public XmlResultTransform( string stylesheet )
 		{
diff --git a/src/ClientUtilities/util/XmlResultVisitor.cs b/src/ClientUtilities/util/XmlResultVisitor.cs
deleted file mode 100644
index 4714a36..0000000
--- a/src/ClientUtilities/util/XmlResultVisitor.cs
+++ /dev/null
@@ -1,277 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-namespace NUnit.Util
-{
-	using System;
-	using System.Globalization;
-	using System.IO;
-	using System.Xml;
-	using System.Reflection;
-	using NUnit.Core;
-
-	/// <summary>
-	/// Summary description for XmlResultVisitor.
-	/// </summary>
-	public class XmlResultVisitor : ResultVisitor
-	{
-		private XmlTextWriter xmlWriter;
-		private TextWriter writer;
-		private MemoryStream memoryStream;
-
-		public XmlResultVisitor(string fileName, TestResult result)
-		{
-			xmlWriter = new XmlTextWriter( new StreamWriter(fileName, false, System.Text.Encoding.UTF8) );
-			Initialize(result);
-		}
-
-        public XmlResultVisitor( TextWriter writer, TestResult result )
-		{
-			this.memoryStream = new MemoryStream();
-			this.writer = writer;
-			this.xmlWriter = new XmlTextWriter( new StreamWriter( memoryStream, System.Text.Encoding.UTF8 ) );
-			Initialize( result );
-		}
-
-		private void Initialize(TestResult result) 
-		{
-			ResultSummarizer summaryResults = new ResultSummarizer(result);
-
-			xmlWriter.Formatting = Formatting.Indented;
-			xmlWriter.WriteStartDocument(false);
-			xmlWriter.WriteComment("This file represents the results of running a test suite");
-
-			xmlWriter.WriteStartElement("test-results");
-
-			xmlWriter.WriteAttributeString("name", summaryResults.Name);
-			xmlWriter.WriteAttributeString("total", summaryResults.ResultCount.ToString());
-			xmlWriter.WriteAttributeString("failures", summaryResults.FailureCount.ToString());
-			xmlWriter.WriteAttributeString("not-run", summaryResults.TestsNotRun.ToString());
-
-			DateTime now = DateTime.Now;
-			xmlWriter.WriteAttributeString("date", XmlConvert.ToString( now, "yyyy-MM-dd" ) );
-			xmlWriter.WriteAttributeString("time", XmlConvert.ToString( now, "HH:mm:ss" ));
-			WriteEnvironment();
-			WriteCultureInfo();
-		}
-
-		private void WriteCultureInfo() {
-			xmlWriter.WriteStartElement("culture-info");
-			xmlWriter.WriteAttributeString("current-culture",
-			                               CultureInfo.CurrentCulture.ToString());
-			xmlWriter.WriteAttributeString("current-uiculture",
-			                               CultureInfo.CurrentUICulture.ToString());
-			xmlWriter.WriteEndElement();
-		}
-
-		private void WriteEnvironment() {
-			xmlWriter.WriteStartElement("environment");
-			xmlWriter.WriteAttributeString("nunit-version", 
-										   Assembly.GetExecutingAssembly().GetName().Version.ToString());
-			xmlWriter.WriteAttributeString("clr-version", 
-			                               Environment.Version.ToString());
-			xmlWriter.WriteAttributeString("os-version",
-			                               Environment.OSVersion.ToString());
-			xmlWriter.WriteAttributeString("platform",
-				Environment.OSVersion.Platform.ToString());
-			xmlWriter.WriteAttributeString("cwd",
-			                               Environment.CurrentDirectory);
-			xmlWriter.WriteAttributeString("machine-name",
-			                               Environment.MachineName);
-			xmlWriter.WriteAttributeString("user",
-			                               Environment.UserName);
-			xmlWriter.WriteAttributeString("user-domain",
-			                               Environment.UserDomainName);
-			xmlWriter.WriteEndElement();
-		}
-
-		public void Visit(TestCaseResult caseResult) 
-		{
-			xmlWriter.WriteStartElement("test-case");
-			xmlWriter.WriteAttributeString("name",caseResult.Name);
-
-			if(caseResult.Description != null)
-				xmlWriter.WriteAttributeString("description", caseResult.Description);
-
-			xmlWriter.WriteAttributeString("executed", caseResult.Executed.ToString());
-			if(caseResult.Executed)
-			{
-				xmlWriter.WriteAttributeString("success", caseResult.IsSuccess.ToString() );
-
-				xmlWriter.WriteAttributeString("time", caseResult.Time.ToString("#####0.000", NumberFormatInfo.InvariantInfo));
-
-				xmlWriter.WriteAttributeString("asserts", caseResult.AssertCount.ToString() );
-				WriteCategories(caseResult);
-				WriteProperties(caseResult);
-				if(caseResult.IsFailure)
-				{
-					if(caseResult.IsFailure)
-						xmlWriter.WriteStartElement("failure");
-					else
-						xmlWriter.WriteStartElement("error");
-				
-					xmlWriter.WriteStartElement("message");
-					xmlWriter.WriteCData( EncodeCData( caseResult.Message ) );
-					xmlWriter.WriteEndElement();
-				
-					xmlWriter.WriteStartElement("stack-trace");
-					if(caseResult.StackTrace != null)
-						xmlWriter.WriteCData( EncodeCData( StackTraceFilter.Filter( caseResult.StackTrace ) ) );
-					xmlWriter.WriteEndElement();
-				
-					xmlWriter.WriteEndElement();
-				}
-				
-			}
-			else
-			{
-				WriteCategories(caseResult);
-				WriteProperties(caseResult);
-				xmlWriter.WriteStartElement("reason");
-				xmlWriter.WriteStartElement("message");
-				xmlWriter.WriteCData(caseResult.Message);
-				xmlWriter.WriteEndElement();
-				xmlWriter.WriteEndElement();
-			}
-            
-			xmlWriter.WriteEndElement();
-		}
-
-		/// <summary>
-		/// Makes string safe for xml parsing, replacing control chars with '?'
-		/// </summary>
-		/// <param name="encodedString">string to make safe</param>
-		/// <returns>xml safe string</returns>
-		private static string CharacterSafeString(string encodedString)
-		{
-			/*The default code page for the system will be used.
-			Since all code pages use the same lower 128 bytes, this should be sufficient
-			for finding uprintable control characters that make the xslt processor error.
-			We use characters encoded by the default code page to avoid mistaking bytes as
-			individual characters on non-latin code pages.*/
-			char[] encodedChars = System.Text.Encoding.Default.GetChars(System.Text.Encoding.Default.GetBytes(encodedString));
-			
-			System.Collections.ArrayList pos = new System.Collections.ArrayList();
-			for(int x = 0 ; x < encodedChars.Length ; x++)
-			{
-				char currentChar = encodedChars[x];
-				//unprintable characters are below 0x20 in Unicode tables
-				//some control characters are acceptable. (carriage return 0x0D, line feed 0x0A, horizontal tab 0x09)
-				if(currentChar < 32 && (currentChar != 9 && currentChar != 10 && currentChar != 13))
-				{
-					//save the array index for later replacement.
-					pos.Add(x);
-				}
-			}
-			foreach(int index in pos)
-			{
-				encodedChars[index] = '?';//replace unprintable control characters with ?(3F)
-			}
-			return System.Text.Encoding.Default.GetString(System.Text.Encoding.Default.GetBytes(encodedChars));
-		}
-
-		private string EncodeCData( string text )
-		{
-			return CharacterSafeString( text ).Replace( "]]>", "]]>" );
-		}
-
-		public void WriteCategories(TestResult result)
-		{
-			if (result.Test.Categories != null && result.Test.Categories.Count > 0)
-			{
-				xmlWriter.WriteStartElement("categories");
-				foreach (string category in result.Test.Categories)
-				{
-					xmlWriter.WriteStartElement("category");
-					xmlWriter.WriteAttributeString("name", category);
-					xmlWriter.WriteEndElement();
-				}
-				xmlWriter.WriteEndElement();
-			}
-		}
-
-		public void WriteProperties(TestResult result)
-		{
-			if (result.Test.Properties != null && result.Test.Properties.Count > 0)
-			{
-				xmlWriter.WriteStartElement("properties");
-				foreach (string key in result.Test.Properties.Keys)
-				{
-					xmlWriter.WriteStartElement("property");
-					xmlWriter.WriteAttributeString("name", key);
-					xmlWriter.WriteAttributeString("value", result.Test.Properties[key].ToString() );
-					xmlWriter.WriteEndElement();
-				}
-				xmlWriter.WriteEndElement();
-			}
-		}
-
-		public void Visit(TestSuiteResult suiteResult) 
-		{
-			xmlWriter.WriteStartElement("test-suite");
-			xmlWriter.WriteAttributeString("name",suiteResult.Name);
-			if(suiteResult.Description != null)
-				xmlWriter.WriteAttributeString("description", suiteResult.Description);
-
-			xmlWriter.WriteAttributeString("success", suiteResult.IsSuccess.ToString());
-			xmlWriter.WriteAttributeString("time", suiteResult.Time.ToString("#####0.000", NumberFormatInfo.InvariantInfo));
-			xmlWriter.WriteAttributeString("asserts", suiteResult.AssertCount.ToString() );
-         
-			WriteCategories(suiteResult);
-			WriteProperties(suiteResult);
-
-			if ( suiteResult.IsFailure && suiteResult.FailureSite == FailureSite.SetUp )
-			{
-				xmlWriter.WriteStartElement("failure");
-
-				xmlWriter.WriteStartElement("message");
-				xmlWriter.WriteCData( EncodeCData( suiteResult.Message ) );
-				xmlWriter.WriteEndElement();
-
-				xmlWriter.WriteStartElement("stack-trace");
-				if(suiteResult.StackTrace != null)
-					xmlWriter.WriteCData( EncodeCData( StackTraceFilter.Filter( suiteResult.StackTrace ) ) );
-				xmlWriter.WriteEndElement();
-
-				xmlWriter.WriteEndElement();
-			}
-
-			xmlWriter.WriteStartElement("results");                  
-			foreach (TestResult result in suiteResult.Results)
-			{
-				result.Accept(this);
-			}
-			xmlWriter.WriteEndElement();
-
-			xmlWriter.WriteEndElement();
-		}
-
-		public void Write()
-		{
-			try 
-			{
-				xmlWriter.WriteEndElement();
-				xmlWriter.WriteEndDocument();
-				xmlWriter.Flush();
-
-				if ( memoryStream != null && writer != null )
-				{
-					memoryStream.Position = 0;
-					using ( StreamReader rdr = new StreamReader( memoryStream ) )
-					{
-						writer.Write( rdr.ReadToEnd() );
-					}
-				}
-
-				xmlWriter.Close();
-			} 
-			finally 
-			{
-				//writer.Close();
-			}
-		}
-	}
-}
diff --git a/src/ClientUtilities/util/XmlResultWriter.cs b/src/ClientUtilities/util/XmlResultWriter.cs
new file mode 100644
index 0000000..c8cb599
--- /dev/null
+++ b/src/ClientUtilities/util/XmlResultWriter.cs
@@ -0,0 +1,335 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Util
+{
+	using System;
+	using System.Globalization;
+	using System.IO;
+	using System.Xml;
+    using System.Collections;
+	using System.Reflection;
+	using NUnit.Core;
+
+	/// <summary>
+	/// Summary description for XmlResultWriter.
+	/// </summary>
+	public class XmlResultWriter
+	{
+		private XmlTextWriter xmlWriter;
+		private TextWriter writer;
+		private MemoryStream memoryStream;
+
+		#region Constructors
+		public XmlResultWriter(string fileName)
+		{
+			xmlWriter = new XmlTextWriter( new StreamWriter(fileName, false, System.Text.Encoding.UTF8) );
+		}
+
+        public XmlResultWriter( TextWriter writer )
+		{
+			this.memoryStream = new MemoryStream();
+			this.writer = writer;
+			this.xmlWriter = new XmlTextWriter( new StreamWriter( memoryStream, System.Text.Encoding.UTF8 ) );
+		}
+		#endregion
+
+		private void InitializeXmlFile(TestResult result) 
+		{
+			ResultSummarizer summaryResults = new ResultSummarizer(result);
+
+			xmlWriter.Formatting = Formatting.Indented;
+			xmlWriter.WriteStartDocument(false);
+			xmlWriter.WriteComment("This file represents the results of running a test suite");
+
+			xmlWriter.WriteStartElement("test-results");
+
+			xmlWriter.WriteAttributeString("name", summaryResults.Name);
+			xmlWriter.WriteAttributeString("total", summaryResults.TestsRun.ToString());
+            xmlWriter.WriteAttributeString("errors", summaryResults.Errors.ToString());
+            xmlWriter.WriteAttributeString("failures", summaryResults.Failures.ToString());
+            xmlWriter.WriteAttributeString("not-run", summaryResults.TestsNotRun.ToString());
+            xmlWriter.WriteAttributeString("inconclusive", summaryResults.Inconclusive.ToString());
+            xmlWriter.WriteAttributeString("ignored", summaryResults.Ignored.ToString());
+            xmlWriter.WriteAttributeString("skipped", summaryResults.Skipped.ToString());
+            xmlWriter.WriteAttributeString("invalid", summaryResults.NotRunnable.ToString());
+
+			DateTime now = DateTime.Now;
+			xmlWriter.WriteAttributeString("date", XmlConvert.ToString( now, "yyyy-MM-dd" ) );
+			xmlWriter.WriteAttributeString("time", XmlConvert.ToString( now, "HH:mm:ss" ));
+			WriteEnvironment();
+			WriteCultureInfo();
+		}
+
+		private void WriteCultureInfo() {
+			xmlWriter.WriteStartElement("culture-info");
+			xmlWriter.WriteAttributeString("current-culture",
+			                               CultureInfo.CurrentCulture.ToString());
+			xmlWriter.WriteAttributeString("current-uiculture",
+			                               CultureInfo.CurrentUICulture.ToString());
+			xmlWriter.WriteEndElement();
+		}
+
+		private void WriteEnvironment() {
+			xmlWriter.WriteStartElement("environment");
+			xmlWriter.WriteAttributeString("nunit-version", 
+										   Assembly.GetExecutingAssembly().GetName().Version.ToString());
+			xmlWriter.WriteAttributeString("clr-version", 
+			                               Environment.Version.ToString());
+			xmlWriter.WriteAttributeString("os-version",
+			                               Environment.OSVersion.ToString());
+			xmlWriter.WriteAttributeString("platform",
+				Environment.OSVersion.Platform.ToString());
+			xmlWriter.WriteAttributeString("cwd",
+			                               Environment.CurrentDirectory);
+			xmlWriter.WriteAttributeString("machine-name",
+			                               Environment.MachineName);
+			xmlWriter.WriteAttributeString("user",
+			                               Environment.UserName);
+			xmlWriter.WriteAttributeString("user-domain",
+			                               Environment.UserDomainName);
+			xmlWriter.WriteEndElement();
+		}
+
+		#region Public Methods
+		public void SaveTestResult( TestResult result )
+		{
+			InitializeXmlFile( result );
+			WriteResultElement( result );
+			TerminateXmlFile();
+		}
+
+        private void WriteResultElement( TestResult result )
+        {
+			StartTestElement( result );
+
+			WriteCategoriesElement(result);
+			WritePropertiesElement(result);
+
+            switch (result.ResultState)
+            {
+                case ResultState.Ignored:
+                case ResultState.NotRunnable:
+                case ResultState.Skipped:
+                    WriteReasonElement(result);
+                    break;
+
+                case ResultState.Failure:
+                case ResultState.Error:
+                case ResultState.Cancelled:
+                    if (!result.Test.IsSuite || result.FailureSite == FailureSite.SetUp)
+                        WriteFailureElement(result);
+                    break;
+                case ResultState.Success:
+                case ResultState.Inconclusive:
+                    if (result.Message != null)
+                        WriteReasonElement(result);
+                    break;
+            }
+
+			if ( result.HasResults )
+				WriteChildResults( result );
+
+			xmlWriter.WriteEndElement(); // test element
+		}
+
+		private void TerminateXmlFile()
+		{
+			try 
+			{
+				xmlWriter.WriteEndElement(); // test-results
+				xmlWriter.WriteEndDocument();
+				xmlWriter.Flush();
+
+				if ( memoryStream != null && writer != null )
+				{
+					memoryStream.Position = 0;
+					using ( StreamReader rdr = new StreamReader( memoryStream ) )
+					{
+						writer.Write( rdr.ReadToEnd() );
+					}
+				}
+
+				xmlWriter.Close();
+			} 
+			finally 
+			{
+				//writer.Close();
+			}
+		}
+		#endregion
+
+		#region Element Creation Helpers
+		private void StartTestElement(TestResult result)
+		{
+            if (result.Test.IsSuite)
+            {
+                xmlWriter.WriteStartElement("test-suite");
+                xmlWriter.WriteAttributeString("type", result.Test.TestType);
+                xmlWriter.WriteAttributeString("name", result.Name);
+            }
+            else
+            {
+                xmlWriter.WriteStartElement("test-case");
+                xmlWriter.WriteAttributeString("name", result.FullName);
+            }
+
+			if (result.Description != null)
+				xmlWriter.WriteAttributeString("description", result.Description);
+
+			xmlWriter.WriteAttributeString("executed", result.Executed.ToString());
+            xmlWriter.WriteAttributeString("result", result.ResultState.ToString());
+			
+			if ( result.Executed )
+			{
+				xmlWriter.WriteAttributeString("success", result.IsSuccess.ToString());
+				xmlWriter.WriteAttributeString("time", result.Time.ToString("#####0.000", NumberFormatInfo.InvariantInfo));
+				xmlWriter.WriteAttributeString("asserts", result.AssertCount.ToString());
+			}
+		}
+
+		private void WriteCategoriesElement(TestResult result)
+		{
+			if (result.Test.Categories != null && result.Test.Categories.Count > 0)
+			{
+				xmlWriter.WriteStartElement("categories");
+				foreach (string category in result.Test.Categories)
+				{
+					xmlWriter.WriteStartElement("category");
+					xmlWriter.WriteAttributeString("name", category);
+					xmlWriter.WriteEndElement();
+				}
+				xmlWriter.WriteEndElement();
+			}
+		}
+
+		private void WritePropertiesElement(TestResult result)
+		{
+            IDictionary props = result.Test.Properties;
+
+			if (result.Test.Properties != null && props.Count > 0)
+			{
+                int nprops = 0;
+
+				foreach (string key in result.Test.Properties.Keys)
+				{
+                    if ( !key.StartsWith("_") )
+                    {
+                        object val = result.Test.Properties[key];
+                        if (val != null)
+                        {
+                            if ( nprops == 0 )
+                                xmlWriter.WriteStartElement("properties");
+
+                            xmlWriter.WriteStartElement("property");
+                            xmlWriter.WriteAttributeString("name", key);
+                            xmlWriter.WriteAttributeString("value", val.ToString());
+                            xmlWriter.WriteEndElement();
+
+                            ++nprops;
+                        }
+                    }
+				}
+
+                if ( nprops > 0 )
+				    xmlWriter.WriteEndElement();
+			}
+		}
+
+		private void WriteReasonElement(TestResult result)
+		{
+			xmlWriter.WriteStartElement("reason");
+			xmlWriter.WriteStartElement("message");
+			xmlWriter.WriteCData(result.Message);
+			xmlWriter.WriteEndElement();
+			xmlWriter.WriteEndElement();
+		}
+
+		private void WriteFailureElement(TestResult result)
+		{
+			xmlWriter.WriteStartElement("failure");
+
+			xmlWriter.WriteStartElement("message");
+            WriteCData(result.Message);
+			xmlWriter.WriteEndElement();
+
+			xmlWriter.WriteStartElement("stack-trace");
+            if (result.StackTrace != null)
+                WriteCData(StackTraceFilter.Filter(result.StackTrace));
+			xmlWriter.WriteEndElement();
+
+			xmlWriter.WriteEndElement();
+		}
+
+		private void WriteChildResults(TestResult result)
+		{
+			xmlWriter.WriteStartElement("results");
+
+			if ( result.HasResults )
+				foreach (TestResult childResult in result.Results)
+					WriteResultElement( childResult );
+
+			xmlWriter.WriteEndElement();
+		}
+		#endregion
+
+		#region Output Helpers
+		/// <summary>
+		/// Makes string safe for xml parsing, replacing control chars with '?'
+		/// </summary>
+		/// <param name="encodedString">string to make safe</param>
+		/// <returns>xml safe string</returns>
+		private static string CharacterSafeString(string encodedString)
+		{
+			/*The default code page for the system will be used.
+			Since all code pages use the same lower 128 bytes, this should be sufficient
+			for finding uprintable control characters that make the xslt processor error.
+			We use characters encoded by the default code page to avoid mistaking bytes as
+			individual characters on non-latin code pages.*/
+			char[] encodedChars = System.Text.Encoding.Default.GetChars(System.Text.Encoding.Default.GetBytes(encodedString));
+			
+			System.Collections.ArrayList pos = new System.Collections.ArrayList();
+			for(int x = 0 ; x < encodedChars.Length ; x++)
+			{
+				char currentChar = encodedChars[x];
+				//unprintable characters are below 0x20 in Unicode tables
+				//some control characters are acceptable. (carriage return 0x0D, line feed 0x0A, horizontal tab 0x09)
+				if(currentChar < 32 && (currentChar != 9 && currentChar != 10 && currentChar != 13))
+				{
+					//save the array index for later replacement.
+					pos.Add(x);
+				}
+			}
+			foreach(int index in pos)
+			{
+				encodedChars[index] = '?';//replace unprintable control characters with ?(3F)
+			}
+			return System.Text.Encoding.Default.GetString(System.Text.Encoding.Default.GetBytes(encodedChars));
+		}
+
+        private void WriteCData(string text)
+        {
+            int start = 0;
+            while (true)
+            {
+                int illegal = text.IndexOf("]]>", start);
+                if (illegal < 0)
+                    break;
+                xmlWriter.WriteCData(text.Substring(start, illegal - start + 2));
+                start = illegal + 2;
+                if (start >= text.Length)
+                    return;
+            }
+
+            if (start > 0)
+                xmlWriter.WriteCData(text.Substring(start));
+            else
+                xmlWriter.WriteCData(text);
+        }
+
+		#endregion
+	}
+}
diff --git a/src/ClientUtilities/util/XmlSettingsStorage.cs b/src/ClientUtilities/util/XmlSettingsStorage.cs
index 2c2c421..89f6f25 100644
--- a/src/ClientUtilities/util/XmlSettingsStorage.cs
+++ b/src/ClientUtilities/util/XmlSettingsStorage.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -18,15 +18,20 @@ namespace NUnit.Util
 	public class XmlSettingsStorage : MemorySettingsStorage
 	{
 		private string filePath;
+        private bool writeable;
 
-		public XmlSettingsStorage( string filePath )
+        public XmlSettingsStorage(string filePath) : this(filePath, true) { }
+
+		public XmlSettingsStorage( string filePath, bool writeable )
 		{
-			this.filePath = filePath;
+            this.filePath = filePath;
+            this.writeable = writeable;
 		}
 
 		public override void LoadSettings()
 		{
-			if ( !File.Exists( filePath ) )
+			FileInfo info = new FileInfo(filePath);
+			if ( !info.Exists || info.Length == 0 )
 				return;
 
 			try
@@ -56,6 +61,9 @@ namespace NUnit.Util
 
 		public override void SaveSettings()
 		{
+            if (!this.writeable)
+                throw new InvalidOperationException("Attempted to write to a non-writeable Settings Storage");
+
 			string dirPath = Path.GetDirectoryName( filePath );
 			if ( !Directory.Exists( dirPath ) )
 				Directory.CreateDirectory( dirPath );
diff --git a/src/ClientUtilities/util/nunit.util.build b/src/ClientUtilities/util/nunit.util.build
index 03536b5..abbeb79 100644
--- a/src/ClientUtilities/util/nunit.util.build
+++ b/src/ClientUtilities/util/nunit.util.build
@@ -1,11 +1,7 @@
 <?xml version="1.0"?>
 <project name="NUnitUtil" default="build" basedir=".">
 
-  <target name="build">
-    <csc target="library" 
-        output="${current.build.dir}/nunit.util.dll"
-        debug="${build.debug}" define="${build.defines}">
-      <sources>
+  <patternset id="source-files">
         <include name="AggregatingTestRunner.cs"/>
         <include name="AssemblyInfo.cs"/>
         <include name="AssemblyList.cs"/>
@@ -14,11 +10,10 @@
         <include name="CategoryManager.cs"/>
         <include name="CommandLineOptions.cs"/>
         <include name="ConsoleWriter.cs"/>
-        <include name="ISettings.cs"/>
-        <include name="ITestEvents.cs"/>
-        <include name="ITestLoader.cs"/>
+        <include name="DefaultTestRunnerFactory.cs"/>
+        <include name="IAssemblyWatcher.cs"/>
+        <include name="InProcessTestRunnerFactory.cs"/>
         <include name="MemorySettingsStorage.cs"/>
-        <include name="MultipleTestDomainRunner.cs"/>
         <include name="NUnitProject.cs"/>
         <include name="NUnitRegistry.cs"/>
         <include name="PathUtils.cs"/>
@@ -32,14 +27,13 @@
         <include name="RegistrySettingsStorage.cs"/>
         <include name="RemoteTestAgent.cs"/>
         <include name="ResultSummarizer.cs"/>
+        <include name="RuntimeFrameworkSelector.cs"/>
         <include name="ServerBase.cs"/>
         <include name="ServerUtilities.cs"/>
         <include name="Services.cs"/>
         <include name="SettingsGroup.cs"/>
         <include name="SettingsStorage.cs"/>
         <include name="StackTraceFilter.cs"/>
-        <include name="SummaryVisitor.cs"/>
-        <include name="TestAgent.cs"/>
         <include name="TestDomain.cs"/>
         <include name="TestEventArgs.cs"/>
         <include name="TestEventDispatcher.cs"/>
@@ -52,36 +46,63 @@
         <include name="VSProjectConfig.cs"/>
         <include name="VSProjectConfigCollection.cs"/>
         <include name="XmlResultTransform.cs"/>
-        <include name="XmlResultVisitor.cs"/>
+        <include name="XmlResultWriter.cs"/>
         <include name="XmlSettingsStorage.cs"/>
+        <include name="Extensibility/IProjectConverter.cs"/>
+        <include name="Extensibility/ProjectConverterCollection.cs"/>
+        <include name="Interfaces/IRuntimeFrameworkSelector.cs"/>
+        <include name="Interfaces/ISettings.cs"/>
+        <include name="Interfaces/ITestEvents.cs"/>
+        <include name="Interfaces/ITestLoader.cs"/>
+        <include name="Interfaces/ITestRunnerFactory.cs"/>
+        <include name="ProjectConverters/VisualStudioConverter.cs"/>
         <include name="Services/AddinManager.cs"/>
         <include name="Services/AddinRegistry.cs"/>
         <include name="Services/DomainManager.cs"/>
+        <include name="Services/ProjectService.cs"/>
         <include name="Services/RecentFilesService.cs"/>
         <include name="Services/ServiceManager.cs"/>
         <include name="Services/SettingsService.cs"/>
         <include name="Services/TestAgency.cs"/>
-        <include name="../../CommonAssemblyInfo.cs"/>
+  </patternset>
+
+  <patternset id="resource-files">
+    <include name="Transform.resx"/>
+  </patternset>
+
+  <target name="build">
+    <csc target="library" 
+        output="${current.lib.dir}/nunit.util.dll"
+        debug="${build.debug}" define="${build.defines}">
+      <sources>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
       </sources>
       <nowarn>
         <warning number="618"/>
-        <warning number="1699" if="${runtime.version=='2.0'}"/>
+        <warning number="1699" if="${runtime.version>='2.0'}"/>
       </nowarn>
       <resources prefix="NUnit.Util">
-        <include name="Transform.resx"/>
+        <patternset refid="resource-files"/>
       </resources>
-      <references basedir="${current.build.dir}">
+      <references>
         <include name="System.Runtime.Remoting.dll"/>
-        <include name="nunit.core.interfaces.dll"/>
-        <include name="nunit.core.dll"/>
-        <include name="nunit.framework.dll"/>
+        <include name="System.Configuration.dll"/>
+        <include name="System.Drawing.dll"/>
+	<include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
+        <include name="${current.lib.dir}/nunit.core.dll"/>
       </references>
     </csc>
   </target>
   
   <target name="package">
     <copy todir="${package.src.dir}/ClientUtilities/util">
-      <fileset refid="source-files" />
+      <fileset>
+        <patternset refid="source-files"/>
+        <patternset refid="resource-files"/>
+        <include name="nunit.util.dll.csproj"/>
+        <include name="nunit.util.build"/>
+      </fileset>
     </copy>
   </target>
 
diff --git a/src/ClientUtilities/util/nunit.util.dll.csproj b/src/ClientUtilities/util/nunit.util.dll.csproj
index 6eedbd1..4242c3a 100644
--- a/src/ClientUtilities/util/nunit.util.dll.csproj
+++ b/src/ClientUtilities/util/nunit.util.dll.csproj
@@ -1,395 +1,172 @@
-<VisualStudioProject>
-    <CSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{61CE9CE5-943E-44D4-A381-814DC1406767}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = ""
-                AssemblyKeyContainerName = ""
-                AssemblyName = "nunit.util"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "Library"
-                PreBuildEvent = ""
-                PostBuildEvent = ""
-                RootNamespace = "NUnit.Util"
-                RunPostBuildEvent = "OnBuildSuccess"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "true"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "true"
-                    NoStdLib = "false"
-                    NoWarn = "618"
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-                <Config
-                    Name = "Release"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "false"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = "618"
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "System"
-                    AssemblyName = "System"
-                    HintPath = "..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll"
-                />
-                <Reference
-                    Name = "System.Data"
-                    AssemblyName = "System.Data"
-                    HintPath = "..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll"
-                />
-                <Reference
-                    Name = "System.XML"
-                    AssemblyName = "System.Xml"
-                    HintPath = "..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll"
-                />
-                <Reference
-                    Name = "System.Runtime.Remoting"
-                    AssemblyName = "System.Runtime.Remoting"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Runtime.Remoting.dll"
-                />
-                <Reference
-                    Name = "nunit.core.dll"
-                    Project = "{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.core.interfaces.dll"
-                    Project = "{435428F8-5995-4CE4-8022-93D595A8CC0F}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "System.Drawing"
-                    AssemblyName = "System.Drawing"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Drawing.dll"
-                />
-            </References>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "AggregatingTestRunner.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "AssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "AssemblyList.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "AssemblyWatcher.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CategoryExpression.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CategoryManager.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CommandLineOptions.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CommonAssemblyInfo.cs"
-                    Link = "..\..\CommonAssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ConsoleWriter.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ISettings.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ITestEvents.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ITestLoader.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "MemorySettingsStorage.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "MultipleTestDomainRunner.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "NUnitProject.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "NUnitRegistry.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "PathUtils.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ProcessRunner.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ProjectConfig.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ProjectConfigCollection.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ProjectFormatException.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RecentFileEntry.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RecentFiles.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RecentFilesCollection.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RegistrySettingsStorage.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RemoteTestAgent.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ResultSummarizer.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ServerBase.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ServerUtilities.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Services.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SettingsGroup.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SettingsStorage.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "StackTraceFilter.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SummaryVisitor.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestAgent.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestDomain.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestEventArgs.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestEventDispatcher.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestExceptionHandler.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestLoader.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestObserver.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestResultItem.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestServer.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Transform.resx"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "VSProject.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "VSProjectConfig.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "VSProjectConfigCollection.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "XmlResultTransform.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "XmlResultVisitor.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "XmlSettingsStorage.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Services\AddinManager.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Services\AddinRegistry.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Services\DomainManager.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Services\RecentFilesService.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Services\ServiceManager.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Services\SettingsService.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Services\TestAgency.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-            </Include>
-        </Files>
-    </CSHARP>
-</VisualStudioProject>
-
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{61CE9CE5-943E-44D4-A381-814DC1406767}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit.util</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.Util</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\lib\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG;NET_2_0</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>1699</NoWarn>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\lib\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;NET_2_0</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>1699</NoWarn>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Drawing">
+      <Name>System.Drawing</Name>
+    </Reference>
+    <Reference Include="System.Runtime.Remoting">
+      <Name>System.Runtime.Remoting</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
+      <Name>nunit.core.dll</Name>
+      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
+      <Name>nunit.core.interfaces.dll</Name>
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <Reference Include="System.Configuration" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="AggregatingTestRunner.cs" />
+    <Compile Include="AssemblyInfo.cs" />
+    <Compile Include="AssemblyList.cs" />
+    <Compile Include="AssemblyWatcher.cs" />
+    <Compile Include="CategoryExpression.cs" />
+    <Compile Include="CategoryManager.cs" />
+    <Compile Include="CommandLineOptions.cs" />
+    <Compile Include="ConsoleWriter.cs" />
+    <Compile Include="DefaultTestRunnerFactory.cs" />
+    <Compile Include="Extensibility\IProjectConverter.cs" />
+    <Compile Include="Extensibility\ProjectConverterCollection.cs" />
+    <Compile Include="IAssemblyWatcher.cs" />
+    <Compile Include="InProcessTestRunnerFactory.cs" />
+    <Compile Include="Interfaces\IRuntimeFrameworkSelector.cs" />
+    <Compile Include="Interfaces\ISettings.cs" />
+    <Compile Include="Interfaces\ITestEvents.cs" />
+    <Compile Include="Interfaces\ITestLoader.cs" />
+    <Compile Include="Interfaces\ITestRunnerFactory.cs" />
+    <Compile Include="MemorySettingsStorage.cs" />
+    <Compile Include="NUnitProject.cs" />
+    <Compile Include="NUnitRegistry.cs" />
+    <Compile Include="PathUtils.cs" />
+    <Compile Include="ProcessRunner.cs" />
+    <Compile Include="ProjectConfig.cs" />
+    <Compile Include="ProjectConfigCollection.cs" />
+    <Compile Include="ProjectConverters\VisualStudioConverter.cs" />
+    <Compile Include="ProjectFormatException.cs" />
+    <Compile Include="RecentFileEntry.cs" />
+    <Compile Include="RecentFiles.cs" />
+    <Compile Include="RecentFilesCollection.cs" />
+    <Compile Include="RegistrySettingsStorage.cs" />
+    <Compile Include="RemoteTestAgent.cs" />
+    <Compile Include="ResultSummarizer.cs" />
+    <Compile Include="RuntimeFrameworkSelector.cs" />
+    <Compile Include="ServerBase.cs" />
+    <Compile Include="ServerUtilities.cs" />
+    <Compile Include="Services.cs" />
+    <Compile Include="Services\AddinManager.cs" />
+    <Compile Include="Services\AddinRegistry.cs" />
+    <Compile Include="Services\DomainManager.cs" />
+    <Compile Include="Services\ProjectService.cs" />
+    <Compile Include="Services\RecentFilesService.cs" />
+    <Compile Include="Services\ServiceManager.cs" />
+    <Compile Include="Services\SettingsService.cs" />
+    <Compile Include="Services\TestAgency.cs" />
+    <Compile Include="SettingsGroup.cs" />
+    <Compile Include="SettingsStorage.cs" />
+    <Compile Include="StackTraceFilter.cs" />
+    <Compile Include="TestDomain.cs" />
+    <Compile Include="TestEventArgs.cs" />
+    <Compile Include="TestEventDispatcher.cs" />
+    <Compile Include="TestExceptionHandler.cs" />
+    <Compile Include="TestLoader.cs" />
+    <Compile Include="TestObserver.cs" />
+    <Compile Include="TestResultItem.cs" />
+    <Compile Include="TestServer.cs" />
+    <Compile Include="VSProject.cs" />
+    <Compile Include="VSProjectConfig.cs" />
+    <Compile Include="VSProjectConfigCollection.cs" />
+    <Compile Include="XmlResultTransform.cs" />
+    <Compile Include="XmlResultWriter.cs" />
+    <Compile Include="XmlSettingsStorage.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Transform.resx">
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit.util.build" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/ClientUtilities/util/nunit.util.dll_VS2005.csproj b/src/ClientUtilities/util/nunit.util.dll_VS2005.csproj
deleted file mode 100644
index 0a152f6..0000000
--- a/src/ClientUtilities/util/nunit.util.dll_VS2005.csproj
+++ /dev/null
@@ -1,208 +0,0 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>8.0.50727</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{61CE9CE5-943E-44D4-A381-814DC1406767}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ApplicationIcon>
-    </ApplicationIcon>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit.util</AssemblyName>
-    <AssemblyOriginatorKeyFile>
-    </AssemblyOriginatorKeyFile>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.Util</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <StartupObject>
-    </StartupObject>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-    <SignAssembly>false</SignAssembly>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release2005|AnyCPU' ">
-    <OutputPath>bin\Release2005\</OutputPath>
-    <DefineConstants>TRACE;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <Optimize>true</Optimize>
-    <NoWarn>618,1699</NoWarn>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug2005|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\Debug2005\</OutputPath>
-    <DefineConstants>TRACE;DEBUG;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <NoWarn>618,1699</NoWarn>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Runtime.Remoting">
-      <Name>System.Runtime.Remoting</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="AggregatingTestRunner.cs" />
-    <Compile Include="AssemblyInfo.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="AssemblyList.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="AssemblyWatcher.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="CategoryExpression.cs" />
-    <Compile Include="CategoryManager.cs" />
-    <Compile Include="CommandLineOptions.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="ConsoleWriter.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="ISettings.cs" />
-    <Compile Include="ITestEvents.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="ITestLoader.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="MemorySettingsStorage.cs" />
-    <Compile Include="MultipleTestDomainRunner.cs" />
-    <Compile Include="NUnitProject.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="NUnitRegistry.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="PathUtils.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="ProcessRunner.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="ProjectConfig.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="ProjectConfigCollection.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="ProjectFormatException.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="RecentFileEntry.cs" />
-    <Compile Include="RecentFiles.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="RecentFilesCollection.cs" />
-    <Compile Include="RegistrySettingsStorage.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="RemoteTestAgent.cs" />
-    <Compile Include="ResultSummarizer.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="ServerBase.cs" />
-    <Compile Include="ServerUtilities.cs" />
-    <Compile Include="Services.cs" />
-    <Compile Include="Services\AddinManager.cs" />
-    <Compile Include="Services\AddinRegistry.cs" />
-    <Compile Include="Services\DomainManager.cs" />
-    <Compile Include="Services\RecentFilesService.cs" />
-    <Compile Include="Services\ServiceManager.cs" />
-    <Compile Include="Services\SettingsService.cs" />
-    <Compile Include="Services\TestAgency.cs" />
-    <Compile Include="SettingsGroup.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="SettingsStorage.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="StackTraceFilter.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="SummaryVisitor.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestAgent.cs" />
-    <Compile Include="TestDomain.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestEventArgs.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestEventDispatcher.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestExceptionHandler.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestLoader.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestObserver.cs" />
-    <Compile Include="TestResultItem.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestServer.cs" />
-    <Compile Include="VSProject.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="VSProjectConfig.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="VSProjectConfigCollection.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="XmlResultTransform.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="XmlResultVisitor.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="XmlSettingsStorage.cs" />
-    <EmbeddedResource Include="Transform.resx">
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll_VS2005.csproj">
-      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
-      <Name>nunit.core.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll_VS2005.csproj">
-      <Project>{DCC88998-255A-4247-B658-71DD932E9873}</Project>
-      <Name>nunit.core.interfaces.dll_VS2005</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="Services\CVS\Entries" />
-    <None Include="Services\CVS\Repository" />
-    <None Include="Services\CVS\Root" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
-</Project>
\ No newline at end of file
diff --git a/src/CommonAssemblyInfo.cs b/src/CommonAssemblyInfo.cs
index bc5c0f9..1a4d62d 100644
--- a/src/CommonAssemblyInfo.cs
+++ b/src/CommonAssemblyInfo.cs
@@ -1,24 +1,23 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System.Reflection;
 
 //
 // Common Information about all NUnit assemblies is controlled through the following 
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
+// set of attributes. Change these source values to modify the information
+// associated with an assembly. 
+//
+// NOTE: This file is only used in the Visual Studio builds. For the NAnt builds,
+// an alternate file is generated and used.
 //
-//[assembly: AssemblyTitle("")]
-//[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
 [assembly: AssemblyCompany("NUnit.org")]
 [assembly: AssemblyProduct("NUnit")]
-[assembly: AssemblyCopyright("Copyright (C) 2002-2007 Charlie Poole.\r\nCopyright (C) 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov.\r\nCopyright (C) 2000-2002 Philip Craig.\r\nAll Rights Reserved.")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]		
+[assembly: AssemblyCopyright("Copyright (C) 2002-2010 Charlie Poole.\r\nCopyright (C) 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov.\r\nCopyright (C) 2000-2002 Philip Craig.\r\nAll Rights Reserved.")]
+[assembly: AssemblyTrademark("NUnit is a trademark of NUnit.org")]
 
 //
 // Version information for an assembly consists of the following four values:
@@ -31,4 +30,5 @@ using System.Reflection;
 // You can specify all the values or you can default the Revision and Build Numbers 
 // by using the '*' as shown below:
 
-[assembly: AssemblyVersion("2.4.7")]
+[assembly: AssemblyVersion("2.5.10")]
+[assembly: AssemblyInformationalVersion("2.5.10")]
diff --git a/src/ConsoleRunner/nunit-console-exe/App.config b/src/ConsoleRunner/nunit-console-exe/App.config
index dbae728..ce92b5b 100644
--- a/src/ConsoleRunner/nunit-console-exe/App.config
+++ b/src/ConsoleRunner/nunit-console-exe/App.config
@@ -1,72 +1,24 @@
-<?xml version="1.0" encoding="Windows-1252"?>
+<?xml version="1.0" encoding="utf-8"?>
 <configuration>
 
-	<!-- Do not remove. Sets up configsectionhandler section for log4net -->
-    <configSections>
-        <section name="log4net" type="System.Configuration.IgnoreSectionHandler" />
-    </configSections>
+  <runtime>
+    <!-- We need this so test exceptions don't crash NUnit -->
+    <legacyUnhandledExceptionPolicy enabled="1" />
 
-	<!--
-     Application settings for NUnit-console.exe. Do NOT put settings
-	 for use by your tests here.
-	-->
-	<appSettings>
-
-	<!--
-	 Specify the location to be used by .NET for the cache
-	-->
-    <add key="shadowfiles.path" value="%temp%\nunit20\ShadowCopyCache" />
-  
-	</appSettings>
-  
-    <system.diagnostics>
-	  <switches>
-		<add name="NTrace" value="4" />
-	  </switches>
-	  <trace autoflush="true" indentsize="4">
-		<listeners>
-			<add name="NUnitInternalTrace" type="System.Diagnostics.TextWriterTraceListener" 
-				initializeData="C:\NUnitPrimaryTrace.txt"/>
-		</listeners>
-	  </trace>
-	</system.diagnostics>
-	
-	<!-- 
-     The startup section may be used to specify the runtime versions 
-     supported in the order that they will be used if more than one
-     is present. As supplied, this section is commented out, which
-     causes nunit-console to use the version of the framework with
-     which it was built.
-  	 
-	 Since .NET 1.0 does not recognize the <supportedRuntime> elements,
-	 a <requiredRuntime> element is used in case it is the only version
-	 of the framework that is installed.
-    -->
-    <!--
-	<startup>
-	  <supportedRuntime version="v2.0.50727" />
-	  <supportedRuntime version="v2.0.50215" />
-	  <supportedRuntime version="v2.0.40607" />
-	  <supportedRuntime version="v1.1.4322" />
-	  <supportedRuntime version="v1.0.3705" />
-	
-	  <requiredRuntime version="v1.0.3705" />
-	</startup>
-	-->
+    <!-- Look for addins in the addins directory for now -->
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+      <probing privatePath="lib;addins"/>
+   </assemblyBinding>
 
    <!--
-    The following <runtime> section allows running nunit under 
+    The following <assemblyBinding> section allows running nunit under 
     .NET 1.0 by redirecting assemblies. The appliesTo attribute
-    causes the section to be ignored except under .NET 1.0version 1
+    causes the section to be ignored except under .NET 1.0
     on a machine with only the .NET version 1.0 runtime installed.
     If application and its tests were built for .NET 1.1 you will
-    also need to redirect system assemblies in the test config file.
+    also need to redirect system assemblies in the test config file,
+    which controls loading of the tests.
    -->
-  
- <runtime>
-
-   <legacyUnhandledExceptionPolicy enabled="1" />
-
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
 			appliesTo="v1.0.3705">
 
diff --git a/src/ConsoleRunner/nunit-console-exe/AssemblyInfo.cs b/src/ConsoleRunner/nunit-console-exe/AssemblyInfo.cs
new file mode 100644
index 0000000..5f1ae5e
--- /dev/null
+++ b/src/ConsoleRunner/nunit-console-exe/AssemblyInfo.cs
@@ -0,0 +1,11 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Reflection;
+
+[assembly: AssemblyTitle("NUnit-Console")]
+[assembly: AssemblyDescription("")]
\ No newline at end of file
diff --git a/src/ConsoleRunner/nunit-console-exe/Class1.cs b/src/ConsoleRunner/nunit-console-exe/Class1.cs
index 4c55206..556a696 100644
--- a/src/ConsoleRunner/nunit-console-exe/Class1.cs
+++ b/src/ConsoleRunner/nunit-console-exe/Class1.cs
@@ -1,10 +1,11 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
+using NUnit.Core;
 
 namespace NUnit.ConsoleRunner
 {
@@ -19,7 +20,7 @@ namespace NUnit.ConsoleRunner
 		[STAThread]
 		public static int Main(string[] args)
 		{
-			return Runner.Main( args );
-		}
+            return Runner.Main(args);
+        }
 	}
 }
diff --git a/src/ConsoleRunner/nunit-console-exe/Ship.config b/src/ConsoleRunner/nunit-console-exe/Ship.config
new file mode 100644
index 0000000..ce92b5b
--- /dev/null
+++ b/src/ConsoleRunner/nunit-console-exe/Ship.config
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+
+  <runtime>
+    <!-- We need this so test exceptions don't crash NUnit -->
+    <legacyUnhandledExceptionPolicy enabled="1" />
+
+    <!-- Look for addins in the addins directory for now -->
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+      <probing privatePath="lib;addins"/>
+   </assemblyBinding>
+
+   <!--
+    The following <assemblyBinding> section allows running nunit under 
+    .NET 1.0 by redirecting assemblies. The appliesTo attribute
+    causes the section to be ignored except under .NET 1.0
+    on a machine with only the .NET version 1.0 runtime installed.
+    If application and its tests were built for .NET 1.1 you will
+    also need to redirect system assemblies in the test config file,
+    which controls loading of the tests.
+   -->
+   <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
+			appliesTo="v1.0.3705">
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Data" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Drawing" 
+                          publicKeyToken="b03f5f7f11d50a3a" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Windows.Forms" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Xml" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+    </assemblyBinding>
+
+  </runtime>
+  
+</configuration>
\ No newline at end of file
diff --git a/src/ConsoleRunner/nunit-console-exe/assemblyinfo.cs b/src/ConsoleRunner/nunit-console-exe/assemblyinfo.cs
deleted file mode 100644
index 1df6de2..0000000
--- a/src/ConsoleRunner/nunit-console-exe/assemblyinfo.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-using System;
-using System.Reflection;
-
-[assembly: AssemblyTitle("NUnit-Console")]
-[assembly: AssemblyDescription("")]
\ No newline at end of file
diff --git a/src/ConsoleRunner/nunit-console-exe/nunit-console.exe.build b/src/ConsoleRunner/nunit-console-exe/nunit-console.exe.build
index 102dd2f..846f320 100644
--- a/src/ConsoleRunner/nunit-console-exe/nunit-console.exe.build
+++ b/src/ConsoleRunner/nunit-console-exe/nunit-console.exe.build
@@ -1,48 +1,58 @@
 <?xml version="1.0"?>
 <project name="NUnit-Console" default="build">
 
+  <patternset id="source-files">
+        <include name="AssemblyInfo.cs"/>
+        <include name="Class1.cs"/>
+  </patternset>
+
   <target name="build">
     <csc target="exe" 
-        output="${current.build.dir}/${nunit.console.name}"
+        output="${current.build.dir}/nunit-console.exe"
         debug="${build.debug}" define="${build.defines}">
       <sources>
-        <include name="AssemblyInfo.cs"/>
-        <include name="Class1.cs"/>
-	<include name="../../CommonAssemblyInfo.cs"/>
+        <patternset refid="source-files"/>
+	  <include name="../../GeneratedAssemblyInfo.cs"/>
       </sources>
-      <references basedir="${current.build.dir}">
+      <references basedir="${current.lib.dir}">
         <include name="nunit.core.dll"/>
         <include name="nunit.util.dll"/>
         <include name="nunit-console-runner.dll"/>
       </references>
     </csc>
 
-    <copy file="App.config"
-      tofile="${current.build.dir}/${nunit.console.name}.config"/>
+    <copy file="Ship.config"
+      tofile="${current.build.dir}/nunit-console.exe.config"/>
 
     <csc target="exe" 
-        output="${current.build.dir}/${nunit.console.name.x86}"
+        output="${current.build.dir}/nunit-console-x86.exe"
         debug="${build.debug}" define="${build.defines}"
         platform="x86" if="${build.x86}">
       <sources>
-        <include name="AssemblyInfo.cs"/>
-        <include name="Class1.cs"/>
-	<include name="../../CommonAssemblyInfo.cs"/>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
       </sources>
-      <references basedir="${current.build.dir}">
+      <references basedir="${current.lib.dir}">
         <include name="nunit.core.dll"/>
         <include name="nunit.util.dll"/>
         <include name="nunit-console-runner.dll"/>
       </references>
     </csc>
 
-    <copy file="App.config" if="${build.x86}"
-      tofile="${current.build.dir}/${nunit.console.name.x86}.config"/>
+    <copy file="Ship.config" if="${build.x86}"
+      tofile="${current.build.dir}/nunit-console-x86.exe.config"/>
   </target>
 
   <target name="package">
     <copy todir="${package.src.dir}/ConsoleRunner/nunit-console-exe">
-      <fileset refid="source-files" />
+      <fileset>
+        <patternset refid="source-files"/>
+        <include name="App.config"/>
+        <include name="Ship.config"/>
+        <include name="App.ico"/>
+        <include name="nunit-console.exe.csproj"/>
+        <include name="nunit-console.exe.build"/>
+      </fileset>
     </copy>
   </target>
 
diff --git a/src/ConsoleRunner/nunit-console-exe/nunit-console.exe.csproj b/src/ConsoleRunner/nunit-console-exe/nunit-console.exe.csproj
index 5da2eca..5b65d17 100644
--- a/src/ConsoleRunner/nunit-console-exe/nunit-console.exe.csproj
+++ b/src/ConsoleRunner/nunit-console-exe/nunit-console.exe.csproj
@@ -1,124 +1,107 @@
-<VisualStudioProject>
-    <CSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{53BF8787-CB9C-4BB8-AFB4-605DD3A5CA0E}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = "App.ico"
-                AssemblyKeyContainerName = ""
-                AssemblyName = "nunit-console"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "Exe"
-                PreBuildEvent = ""
-                PostBuildEvent = ""
-                RootNamespace = "NUnit.ConsoleRunner"
-                RunPostBuildEvent = "OnBuildSuccess"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "true"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-                <Config
-                    Name = "Release"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "false"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "System"
-                    AssemblyName = "System"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.dll"
-                />
-                <Reference
-                    Name = "System.Data"
-                    AssemblyName = "System.Data"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Data.dll"
-                />
-                <Reference
-                    Name = "System.XML"
-                    AssemblyName = "System.Xml"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.XML.dll"
-                />
-                <Reference
-                    Name = "nunit-console"
-                    Project = "{9367EC89-6A38-42BA-9607-0DC288E4BC3A}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.core.extensions.dll"
-                    Project = "{98B10E98-003C-45A0-9587-119142E39986}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-            </References>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "app.config"
-                    BuildAction = "None"
-                />
-                <File
-                    RelPath = "App.ico"
-                    BuildAction = "Content"
-                />
-                <File
-                    RelPath = "assemblyinfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Class1.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CommonAssemblyInfo.cs"
-                    Link = "..\..\CommonAssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-            </Include>
-        </Files>
-    </CSHARP>
-</VisualStudioProject>
-
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{53BF8787-CB9C-4BB8-AFB4-605DD3A5CA0E}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit-console</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Exe</OutputType>
+    <RootNamespace>NUnit.ConsoleRunner</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <NoWin32Manifest>true</NoWin32Manifest>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <Externalconsole>true</Externalconsole>
+    <Commandlineparameters>../../NUnitTests.nunit</Commandlineparameters>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
+      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
+      <Name>nunit.core.dll</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\nunit-console\nunit-console.csproj">
+      <Name>nunit-console</Name>
+      <Project>{9367EC89-6A38-42BA-9607-0DC288E4BC3A}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
+    <None Include="nunit-console.exe.build" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="AssemblyInfo.cs" />
+    <Compile Include="Class1.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="App.ico" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/ConsoleRunner/nunit-console-exe/nunit-console.exe_VS2005.csproj b/src/ConsoleRunner/nunit-console-exe/nunit-console.exe_VS2005.csproj
deleted file mode 100644
index 1646b44..0000000
--- a/src/ConsoleRunner/nunit-console-exe/nunit-console.exe_VS2005.csproj
+++ /dev/null
@@ -1,79 +0,0 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>8.0.50727</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{53BF8787-CB9C-4BB8-AFB4-605DD3A5CA0E}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ApplicationIcon>App.ico</ApplicationIcon>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit-console</AssemblyName>
-    <AssemblyOriginatorKeyFile>
-    </AssemblyOriginatorKeyFile>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Exe</OutputType>
-    <RootNamespace>NUnit.ConsoleRunner</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <StartupObject>
-    </StartupObject>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release2005|AnyCPU' ">
-    <OutputPath>bin\Release2005\</OutputPath>
-    <DefineConstants>TRACE;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <Optimize>true</Optimize>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug2005|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\Debug2005\</OutputPath>
-    <DefineConstants>TRACE;DEBUG;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="app.config" />
-    <Content Include="App.ico" />
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="Class1.cs">
-      <SubType>Code</SubType>
-    </Compile>
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\NUnitExtensions\core\nunit.core.extensions.dll_VS2005.csproj">
-      <Project>{98B10E98-003C-45A0-9587-119142E39986}</Project>
-      <Name>nunit.core.extensions.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\nunit-console\nunit-console_VS2005.csproj">
-      <Project>{9367EC89-6A38-42BA-9607-0DC288E4BC3A}</Project>
-      <Name>nunit-console_VS2005</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
-</Project>
\ No newline at end of file
diff --git a/src/ConsoleRunner/nunit-console/AssemblyInfo.cs b/src/ConsoleRunner/nunit-console/AssemblyInfo.cs
index c55a1ba..4835bf6 100644
--- a/src/ConsoleRunner/nunit-console/AssemblyInfo.cs
+++ b/src/ConsoleRunner/nunit-console/AssemblyInfo.cs
@@ -1,11 +1,11 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System.Reflection;
 
 [assembly: AssemblyDelaySign(false)]
-[assembly: AssemblyKeyFile("../../../../nunit.snk")]
+[assembly: AssemblyKeyFile("../../nunit.snk")]
 [assembly: AssemblyKeyName("")]
diff --git a/src/ConsoleRunner/nunit-console/ConsoleOptions.cs b/src/ConsoleRunner/nunit-console/ConsoleOptions.cs
index 1df69aa..e4a16b8 100644
--- a/src/ConsoleRunner/nunit-console/ConsoleOptions.cs
+++ b/src/ConsoleRunner/nunit-console/ConsoleOptions.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 namespace NUnit.ConsoleRunner
@@ -9,33 +9,23 @@ namespace NUnit.ConsoleRunner
 	using System;
 	using Codeblast;
 	using NUnit.Util;
+    using NUnit.Core;
 
 	public class ConsoleOptions : CommandLineOptions
 	{
-		public enum DomainUsage
-		{
-			Default,
-			None,
-			Single,
-			Multiple
-		}
-
-		[Option(Short="load", Description = "Test fixture to be loaded")]
+		[Option(Short="load", Description = "Test fixture or namespace to be loaded (Deprecated)")]
 		public string fixture;
 
-		[Option(Description = "Name of the test to run")]
+		[Option(Description = "Name of the test case(s), fixture(s) or namespace(s) to run")]
 		public string run;
 
-		[Option(Description = "Project configuration to load")]
+		[Option(Description = "Project configuration (e.g.: Debug) to load")]
 		public string config;
 
-		[Option(Description = "Name of XML output file")]
+		[Option(Description = "Name of XML output file (Default: TestResult.xml)")]
 		public string xml;
 
-		[Option(Description = "Name of transform file")]
-		public string transform;
-
-		[Option(Description = "Display XML to the console")]
+		[Option(Description = "Display XML to the console (Deprecated)")]
 		public bool xmlConsole;
 
 		[Option(Short="out", Description = "File to receive test output")]
@@ -47,24 +37,33 @@ namespace NUnit.ConsoleRunner
 		[Option(Description = "Label each test in stdOut")]
 		public bool labels = false;
 
+        [Option(Description = "Set internal trace level: Off, Error, Warning, Info, Verbose")]
+        public InternalTraceLevel trace;
+
 		[Option(Description = "List of categories to include")]
 		public string include;
 
 		[Option(Description = "List of categories to exclude")]
 		public string exclude;
 
-//		[Option(Description = "Run in a separate process")]
-//		public bool process;
+		[Option(Description = "Process model for tests: Single, Separate, Multiple")]
+		public ProcessModel process;
 
-		[Option(Description = "AppDomain Usage for Tests")]
+		[Option(Description = "AppDomain Usage for tests: None, Single, Multiple")]
 		public DomainUsage domain;
 
+        [Option(Description = "Framework version to be used for tests")]
+        public string framework;
+
 		[Option(Description = "Disable shadow copy when running in separate domain")]
 		public bool noshadow;
 
 		[Option (Description = "Disable use of a separate thread for tests")]
 		public bool nothread;
 
+        [Option(Description = "Set timeout for each test case in milliseconds")]
+        public int timeout;
+
 		[Option(Description = "Wait for input before closing console window")]
 		public bool wait = false;
 
@@ -92,17 +91,17 @@ namespace NUnit.ConsoleRunner
 			return false;
 		}
 
-		protected override bool IsValidParameter(string parm)
-		{
-			return NUnitProject.CanLoadAsProject( parm ) || PathUtils.IsAssemblyFileType( parm );
-		}
+//		protected override bool IsValidParameter(string parm)
+//		{
+//			return Services.ProjectLoadService.CanLoadProject( parm ) || PathUtils.IsAssemblyFileType( parm );
+//		}
 
 
         public bool IsTestProject
         {
             get
             {
-                return ParameterCount == 1 && NUnitProject.CanLoadAsProject((string)Parameters[0]);
+                return ParameterCount == 1 && Services.ProjectService.CanLoadProject((string)Parameters[0]);
             }
         }
 
diff --git a/src/ConsoleRunner/nunit-console/ConsoleUi.cs b/src/ConsoleRunner/nunit-console/ConsoleUi.cs
index 7cfc1e3..8dd1c92 100644
--- a/src/ConsoleRunner/nunit-console/ConsoleUi.cs
+++ b/src/ConsoleRunner/nunit-console/ConsoleUi.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 namespace NUnit.ConsoleRunner
@@ -25,7 +25,6 @@ namespace NUnit.ConsoleRunner
 		public static readonly int INVALID_ARG = -1;
 		public static readonly int FILE_NOT_FOUND = -2;
 		public static readonly int FIXTURE_NOT_FOUND = -3;
-		public static readonly int TRANSFORM_ERROR = -4;
 		public static readonly int UNEXPECTED_ERROR = -100;
 
 		public ConsoleUi()
@@ -34,9 +33,6 @@ namespace NUnit.ConsoleRunner
 
 		public int Execute( ConsoleOptions options )
 		{
-			XmlTextReader transformReader = GetTransformReader(options);
-			if(transformReader == null) return FILE_NOT_FOUND;
-
 			TextWriter outWriter = Console.Out;
 			bool redirectOutput = options.output != null && options.output != string.Empty;
 			if ( redirectOutput )
@@ -55,11 +51,26 @@ namespace NUnit.ConsoleRunner
 				errorWriter = errorStreamWriter;
 			}
 
-			TestRunner testRunner = MakeRunnerFromCommandLine( options );
+            TestPackage package = MakeTestPackage(options);
+
+            Console.WriteLine("ProcessModel: {0}    DomainUsage: {1}", 
+                package.Settings.Contains("ProcessModel")
+                    ? package.Settings["ProcessModel"]
+                    : "Default", 
+                package.Settings.Contains("DomainUsage")
+                    ? package.Settings["DomainUsage"]
+                    : "Default");
+
+            Console.WriteLine("Execution Runtime: {0}", 
+                package.Settings.Contains("RuntimeFramework")
+                    ? package.Settings["RuntimeFramework"]
+                    : "Default");
 
-			try
+            using (TestRunner testRunner = new DefaultTestRunnerFactory().MakeTestRunner(package))
 			{
-				if (testRunner.Test == null)
+                testRunner.Load(package);
+
+                if (testRunner.Test == null)
 				{
 					testRunner.Unload();
 					Console.Error.WriteLine("Unable to locate fixture {0}", options.fixture);
@@ -71,8 +82,8 @@ namespace NUnit.ConsoleRunner
 				TestFilter testFilter = TestFilter.Empty;
 				if ( options.run != null && options.run != string.Empty )
 				{
-					Console.WriteLine( "Selected test: " + options.run );
-					testFilter = new SimpleNameFilter( options.run );
+					Console.WriteLine( "Selected test(s): " + options.run );
+					testFilter = new SimpleNameFilter( TestNameParser.Parse(options.run) );
 				}
 
 				if ( options.include != null && options.include != string.Empty )
@@ -97,6 +108,9 @@ namespace NUnit.ConsoleRunner
 						testFilter = new AndFilter( testFilter, excludeFilter );
 				}
 
+                if (testFilter is NotFilter)
+                    ((NotFilter)testFilter).TopLevel = true;
+
 				TestResult result = null;
 				string savedDirectory = Environment.CurrentDirectory;
 				TextWriter savedOut = Console.Out;
@@ -123,153 +137,201 @@ namespace NUnit.ConsoleRunner
 
 				Console.WriteLine();
 
-				string xmlOutput = CreateXmlOutput( result );
-			
-				if (options.xmlConsole)
-				{
-					Console.WriteLine(xmlOutput);
-				}
-				else
-				{
-					try
-					{
-						//CreateSummaryDocument(xmlOutput, transformReader );
-						XmlResultTransform xform = new XmlResultTransform( transformReader );
-						xform.Transform( new StringReader( xmlOutput ), Console.Out );
-					}
-					catch( Exception ex )
-					{
-						Console.WriteLine( "Error: {0}", ex.Message );
-						return TRANSFORM_ERROR;
-					}
-				}
-
-				// Write xml output here
-				string xmlResultFile = options.xml == null || options.xml == string.Empty
-					? "TestResult.xml" : options.xml;
-
-				using ( StreamWriter writer = new StreamWriter( xmlResultFile ) ) 
-				{
-					writer.Write(xmlOutput);
-				}
-
-				//if ( testRunner != null )
-				//    testRunner.Unload();
+                int returnCode = UNEXPECTED_ERROR;
+
+                if (result != null)
+                {
+                    string xmlOutput = CreateXmlOutput(result);
+                    ResultSummarizer summary = new ResultSummarizer(result);
+
+                    if (options.xmlConsole)
+                    {
+                        Console.WriteLine(xmlOutput);
+                    }
+                    else
+                    {
+                        WriteSummaryReport(summary);
+                        if (summary.ErrorsAndFailures > 0 || result.IsError || result.IsFailure)
+                            WriteErrorsAndFailuresReport(result);
+                        if (summary.TestsNotRun > 0)
+                            WriteNotRunReport(result);
+                    }
+
+                    // Write xml output here
+                    string xmlResultFile = options.xml == null || options.xml == string.Empty
+                        ? "TestResult.xml" : options.xml;
+
+                    using (StreamWriter writer = new StreamWriter(xmlResultFile))
+                    {
+                        writer.Write(xmlOutput);
+                    }
+
+                    returnCode = summary.ErrorsAndFailures;
+                }
 
 				if ( collector.HasExceptions )
 				{
 					collector.WriteExceptions();
-					return UNEXPECTED_ERROR;
+					returnCode = UNEXPECTED_ERROR;
 				}
             
-				if ( !result.IsFailure ) return OK;
-
-				ResultSummarizer summ = new ResultSummarizer( result );
-				return summ.FailureCount;
-			}
-			finally
-			{
-				testRunner.Unload();
+				return returnCode;
 			}
 		}
 
 		#region Helper Methods
-		private static XmlTextReader GetTransformReader(ConsoleOptions parser)
-		{
-			XmlTextReader reader = null;
-			if(parser.transform == null || parser.transform == string.Empty)
-			{
-				Assembly assembly = Assembly.GetAssembly(typeof(XmlResultVisitor));
-				ResourceManager resourceManager = new ResourceManager("NUnit.Util.Transform",assembly);
-				string xmlData = (string)resourceManager.GetObject("Summary.xslt");
-
-				reader = new XmlTextReader(new StringReader(xmlData));
-			}
-			else
-			{
-				FileInfo xsltInfo = new FileInfo(parser.transform);
-				if(!xsltInfo.Exists)
-				{
-					Console.Error.WriteLine("Transform file: {0} does not exist", xsltInfo.FullName);
-					reader = null;
-				}
-				else
-				{
-					reader = new XmlTextReader(xsltInfo.FullName);
-				}
-			}
-
-			return reader;
-		}
-
-		private static TestRunner MakeRunnerFromCommandLine( ConsoleOptions options )
-		{
+        // TODO: See if this can be unified with the Gui's MakeTestPackage
+        private static TestPackage MakeTestPackage( ConsoleOptions options )
+        {
 			TestPackage package;
-			ConsoleOptions.DomainUsage domainUsage = ConsoleOptions.DomainUsage.Default;
+			DomainUsage domainUsage = DomainUsage.Default;
+            ProcessModel processModel = ProcessModel.Default;
+            RuntimeFramework framework = null;
+
+            string[] parameters = new string[options.ParameterCount];
+            for (int i = 0; i < options.ParameterCount; i++)
+                parameters[i] = Path.GetFullPath((string)options.Parameters[i]);
 
 			if (options.IsTestProject)
 			{
-				NUnitProject project = NUnitProject.LoadProject((string)options.Parameters[0]);
+				NUnitProject project = 
+					Services.ProjectService.LoadProject(parameters[0]);
+
 				string configName = options.config;
 				if (configName != null)
 					project.SetActiveConfig(configName);
 
 				package = project.ActiveConfig.MakeTestPackage();
-				package.TestName = options.fixture;
-
-				domainUsage = ConsoleOptions.DomainUsage.Single;
+                processModel = project.ProcessModel;
+                domainUsage = project.DomainUsage;
+                framework = project.ActiveConfig.RuntimeFramework;
 			}
-			else if (options.Parameters.Count == 1)
+			else if (parameters.Length == 1)
 			{
-				package = new TestPackage((string)options.Parameters[0]);
-				domainUsage = ConsoleOptions.DomainUsage.Single;
+                package = new TestPackage(parameters[0]);
+				domainUsage = DomainUsage.Single;
 			}
 			else
 			{
-				package = new TestPackage("UNNAMED", options.Parameters);
-				domainUsage = ConsoleOptions.DomainUsage.Multiple;
+                // TODO: Figure out a better way to handle "anonymous" packages
+				package = new TestPackage(null, parameters);
+                package.AutoBinPath = true;
+				domainUsage = DomainUsage.Multiple;
 			}
 
-			if (options.domain != ConsoleOptions.DomainUsage.Default)
+            if (options.process != ProcessModel.Default)
+                processModel = options.process;
+
+			if (options.domain != DomainUsage.Default)
 				domainUsage = options.domain;
-                    
-			TestRunner testRunner = null;
-				
-			switch( domainUsage )
-			{
-				case ConsoleOptions.DomainUsage.None:
-					testRunner = new NUnit.Core.RemoteTestRunner();
-					// Make sure that addins are available
-					CoreExtensions.Host.AddinRegistry = Services.AddinRegistry;
-					break;
-
-				case ConsoleOptions.DomainUsage.Single:
-					testRunner = new TestDomain();
-					break;
-
-				case ConsoleOptions.DomainUsage.Multiple:
-					testRunner = new MultipleTestDomainRunner();
-					break;
-			}
+
+            if (options.framework != null)
+                framework = RuntimeFramework.Parse(options.framework);
 
 			package.TestName = options.fixture;
-			package.Settings["ShadowCopyFiles"] = !options.noshadow;
+            
+            package.Settings["ProcessModel"] = processModel;
+            package.Settings["DomainUsage"] = domainUsage;
+            if (framework != null)
+                package.Settings["RuntimeFramework"] = framework;
+
+            
+
+            if (domainUsage == DomainUsage.None)
+            {
+                // Make sure that addins are available
+                CoreExtensions.Host.AddinRegistry = Services.AddinRegistry;
+            }
+
+            package.Settings["ShadowCopyFiles"] = !options.noshadow;
 			package.Settings["UseThreadedRunner"] = !options.nothread;
-			testRunner.Load( package );
+            package.Settings["DefaultTimeout"] = options.timeout;
 
-			return testRunner;
+            return package;
 		}
 
 		private static string CreateXmlOutput( TestResult result )
 		{
 			StringBuilder builder = new StringBuilder();
-			XmlResultVisitor resultVisitor = new XmlResultVisitor(new StringWriter( builder ), result);
-			result.Accept(resultVisitor);
-			resultVisitor.Write();
+			new XmlResultWriter(new StringWriter( builder )).SaveTestResult(result);
 
 			return builder.ToString();
 		}
-		#endregion
+
+		private static void WriteSummaryReport( ResultSummarizer summary )
+		{
+            Console.WriteLine(
+                "Tests run: {0}, Errors: {1}, Failures: {2}, Inconclusive: {3}, Time: {4} seconds",
+                summary.TestsRun, summary.Errors, summary.Failures, summary.Inconclusive, summary.Time);
+            Console.WriteLine(
+                "  Not run: {0}, Invalid: {1}, Ignored: {2}, Skipped: {3}",
+                summary.TestsNotRun, summary.NotRunnable, summary.Ignored, summary.Skipped);
+            Console.WriteLine();
+        }
+
+        private void WriteErrorsAndFailuresReport(TestResult result)
+        {
+            reportIndex = 0;
+            Console.WriteLine("Errors and Failures:");
+            WriteErrorsAndFailures(result);
+            Console.WriteLine();
+        }
+
+        private void WriteErrorsAndFailures(TestResult result)
+        {
+            if (result.Executed)
+            {
+                if (result.HasResults)
+                {
+                    if (result.IsFailure || result.IsError)
+                        if (result.FailureSite == FailureSite.SetUp || result.FailureSite == FailureSite.TearDown)
+                            WriteSingleResult(result);
+
+                    foreach (TestResult childResult in result.Results)
+                        WriteErrorsAndFailures(childResult);
+                }
+                else if (result.IsFailure || result.IsError)
+                {
+                    WriteSingleResult(result);
+                }
+            }
+        }
+
+        private void WriteNotRunReport(TestResult result)
+        {
+	        reportIndex = 0;
+            Console.WriteLine("Tests Not Run:");
+	        WriteNotRunResults(result);
+            Console.WriteLine();
+        }
+
+	    private int reportIndex = 0;
+        private void WriteNotRunResults(TestResult result)
+        {
+            if (result.HasResults)
+                foreach (TestResult childResult in result.Results)
+                    WriteNotRunResults(childResult);
+            else if (!result.Executed)
+                WriteSingleResult( result );
+        }
+
+        private void WriteSingleResult( TestResult result )
+        {
+            string status = result.IsFailure || result.IsError
+                ? string.Format("{0} {1}", result.FailureSite, result.ResultState)
+                : result.ResultState.ToString();
+
+            Console.WriteLine("{0}) {1} : {2}", ++reportIndex, status, result.FullName);
+
+            if ( result.Message != null && result.Message != string.Empty )
+                 Console.WriteLine("   {0}", result.Message);
+
+            if (result.StackTrace != null && result.StackTrace != string.Empty)
+                Console.WriteLine( result.IsFailure
+                    ? StackTraceFilter.Filter(result.StackTrace)
+                    : result.StackTrace + Environment.NewLine );
+        }
+	    #endregion
 	}
 }
 
diff --git a/src/ConsoleRunner/nunit-console/EventCollector.cs b/src/ConsoleRunner/nunit-console/EventCollector.cs
index 7e3d582..2bfff55 100644
--- a/src/ConsoleRunner/nunit-console/EventCollector.cs
+++ b/src/ConsoleRunner/nunit-console/EventCollector.cs
@@ -1,3 +1,8 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using System.IO;
 using System.Diagnostics;
@@ -69,43 +74,50 @@ namespace NUnit.ConsoleRunner
 		{
 		}
 
-		public void TestFinished(TestCaseResult testResult)
+		public void TestFinished(TestResult testResult)
 		{
-			if(testResult.Executed)
-			{
-				testRunCount++;
-
-				if(testResult.IsFailure)
-				{	
-					failureCount++;
-						
-					if ( progress )
-						Console.Write("F");
-						
-					messages.Add( string.Format( "{0}) {1} :", failureCount, testResult.Test.TestName.FullName ) );
-					messages.Add( testResult.Message.Trim( Environment.NewLine.ToCharArray() ) );
-
-					string stackTrace = StackTraceFilter.Filter( testResult.StackTrace );
-					if ( stackTrace != null && stackTrace != string.Empty )
-					{
-						string[] trace = stackTrace.Split( System.Environment.NewLine.ToCharArray() );
-						foreach( string s in trace )
-						{
-							if ( s != string.Empty )
-							{
-								string link = Regex.Replace( s.Trim(), @".* in (.*):line (.*)", "$1($2)");
-								messages.Add( string.Format( "at\n{0}", link ) );
-							}
-						}
-					}
-				}
-			}
-			else
-			{
-				testIgnoreCount++;
+            switch( testResult.ResultState )
+            {
+                case ResultState.Error:
+                case ResultState.Failure:
+                case ResultState.Cancelled:
+                    testRunCount++;
+			        failureCount++;
+    					
+			        if ( progress )
+				        Console.Write("F");
+    					
+			        messages.Add( string.Format( "{0}) {1} :", failureCount, testResult.Test.TestName.FullName ) );
+			        messages.Add( testResult.Message.Trim( Environment.NewLine.ToCharArray() ) );
+
+			        string stackTrace = StackTraceFilter.Filter( testResult.StackTrace );
+			        if ( stackTrace != null && stackTrace != string.Empty )
+			        {
+				        string[] trace = stackTrace.Split( System.Environment.NewLine.ToCharArray() );
+				        foreach( string s in trace )
+				        {
+					        if ( s != string.Empty )
+					        {
+						        string link = Regex.Replace( s.Trim(), @".* in (.*):line (.*)", "$1($2)");
+						        messages.Add( string.Format( "at\n{0}", link ) );
+					        }
+				        }
+			        }
+                    break;
+
+                case ResultState.Inconclusive:
+                case ResultState.Success:
+                    testRunCount++;
+                    break;
+
+                case ResultState.Ignored:
+                case ResultState.Skipped:
+                case ResultState.NotRunnable:
+    				testIgnoreCount++;
 					
-				if ( progress )
-					Console.Write("N");
+	    			if ( progress )
+		    			Console.Write("N");
+                    break;
 			}
 
 			currentTestName = string.Empty;
@@ -135,7 +147,7 @@ namespace NUnit.ConsoleRunner
 			}
 		}
 
-		public void SuiteFinished(TestSuiteResult suiteResult) 
+		public void SuiteFinished(TestResult suiteResult) 
 		{
 			if ( --level == 0) 
 			{
diff --git a/src/ConsoleRunner/nunit-console/Runner.cs b/src/ConsoleRunner/nunit-console/Runner.cs
index c603c53..29c3d7e 100644
--- a/src/ConsoleRunner/nunit-console/Runner.cs
+++ b/src/ConsoleRunner/nunit-console/Runner.cs
@@ -1,3 +1,8 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using System.IO;
 using System.Reflection;
@@ -12,13 +17,23 @@ namespace NUnit.ConsoleRunner
 	/// </summary>
 	public class Runner
 	{
+		static Logger log = InternalTrace.GetLogger(typeof(Runner));
+
 		[STAThread]
 		public static int Main(string[] args)
 		{
-			NTrace.Info( "NUnit-console.exe starting" );
-
 			ConsoleOptions options = new ConsoleOptions(args);
-			
+
+            // Create SettingsService early so we know the trace level right at the start
+            SettingsService settingsService = new SettingsService();
+            InternalTraceLevel level = (InternalTraceLevel)settingsService.GetSetting("Options.InternalTraceLevel", InternalTraceLevel.Default);
+            if (options.trace != InternalTraceLevel.Default)
+                level = options.trace;
+
+            InternalTrace.Initialize("nunit-console_%p.log", level);
+            
+            log.Info("NUnit-console.exe starting");
+
 			if(!options.nologo)
 				WriteCopyright();
 
@@ -44,19 +59,27 @@ namespace NUnit.ConsoleRunner
 			}
 
 			// Add Standard Services to ServiceManager
-			ServiceManager.Services.AddService( new SettingsService() );
+			ServiceManager.Services.AddService( settingsService );
 			ServiceManager.Services.AddService( new DomainManager() );
 			//ServiceManager.Services.AddService( new RecentFilesService() );
+			ServiceManager.Services.AddService( new ProjectService() );
 			//ServiceManager.Services.AddService( new TestLoader() );
 			ServiceManager.Services.AddService( new AddinRegistry() );
 			ServiceManager.Services.AddService( new AddinManager() );
-			// TODO: Resolve conflict with gui testagency when running
-			// console tests under the gui.
-			//ServiceManager.Services.AddService( new TestAgency() );
+            ServiceManager.Services.AddService( new TestAgency() );
 
 			// Initialize Services
 			ServiceManager.Services.InitializeServices();
 
+            foreach (string parm in options.Parameters)
+            {
+                if (!Services.ProjectService.CanLoadProject(parm) && !PathUtils.IsAssemblyFileType(parm))
+                {
+                    Console.WriteLine("File type not known: {0}", parm);
+                    return ConsoleUi.INVALID_ARG;
+                }
+            }
+
 			try
 			{
 				ConsoleUi consoleUi = new ConsoleUi();
@@ -80,7 +103,7 @@ namespace NUnit.ConsoleRunner
 					Console.ReadLine();
 				}
 
-				NTrace.Info( "NUnit-console.exe terminating" );
+				log.Info( "NUnit-console.exe terminating" );
 			}
 
 		}
@@ -88,10 +111,10 @@ namespace NUnit.ConsoleRunner
 		private static void WriteCopyright()
 		{
 			Assembly executingAssembly = Assembly.GetExecutingAssembly();
-			System.Version version = executingAssembly.GetName().Version;
+			string versionText = executingAssembly.GetName().Version.ToString();
 
 			string productName = "NUnit";
-			string copyrightText = "Copyright (C) 2002-2007 Charlie Poole.\r\nCopyright (C) 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov.\r\nCopyright (C) 2000-2002 Philip Craig.\r\nAll Rights Reserved.";
+			string copyrightText = "Copyright (C) 2002-2009 Charlie Poole.\r\nCopyright (C) 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov.\r\nCopyright (C) 2000-2002 Philip Craig.\r\nAll Rights Reserved.";
 
 			object[] objectAttrs = executingAssembly.GetCustomAttributes(typeof(AssemblyProductAttribute), false);
 			if ( objectAttrs.Length > 0 )
@@ -101,7 +124,15 @@ namespace NUnit.ConsoleRunner
 			if ( objectAttrs.Length > 0 )
 				copyrightText = ((AssemblyCopyrightAttribute)objectAttrs[0]).Copyright;
 
-			Console.WriteLine(String.Format("{0} version {1}", productName, version.ToString(3)));
+			objectAttrs = executingAssembly.GetCustomAttributes(typeof(AssemblyConfigurationAttribute), false);
+            if (objectAttrs.Length > 0)
+            {
+                string configText = ((AssemblyConfigurationAttribute)objectAttrs[0]).Configuration;
+                if (configText != "")
+                    versionText += string.Format(" ({0})", configText);
+            }
+
+			Console.WriteLine(String.Format("{0} version {1}", productName, versionText));
 			Console.WriteLine(copyrightText);
 			Console.WriteLine();
 
@@ -109,7 +140,7 @@ namespace NUnit.ConsoleRunner
 			RuntimeFramework framework = RuntimeFramework.CurrentFramework;
 			Console.WriteLine( string.Format("   OS Version: {0}", Environment.OSVersion ) );
 			Console.WriteLine( string.Format("  CLR Version: {0} ( {1} )",
-				Environment.Version,  framework.GetDisplayName() ) );
+				Environment.Version,  framework.DisplayName ) );
 
 			Console.WriteLine();
 		}
diff --git a/src/ConsoleRunner/nunit-console/TestNameParser.cs b/src/ConsoleRunner/nunit-console/TestNameParser.cs
new file mode 100644
index 0000000..2df3ead
--- /dev/null
+++ b/src/ConsoleRunner/nunit-console/TestNameParser.cs
@@ -0,0 +1,92 @@
+// ****************************************************************
+// Copyright 2011, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+
+namespace NUnit.ConsoleRunner
+{
+    /// <summary>
+    /// TestNameParser is used to parse the arguments to the 
+    /// -run option, separating testnames at the correct point.
+    /// </summary>
+    public class TestNameParser
+    {
+        /// <summary>
+        /// Parse the -run argument and return an array of argument
+        /// </summary>
+        /// <param name="argument">argument</param>
+        /// <returns></returns>
+        public static string[] Parse(string argument)
+        {
+            ArrayList list = new ArrayList();
+
+            int index = 0;
+            while (index < argument.Length)
+            {
+                string name = GetTestName(argument, ref index);
+                if (name != null && name != string.Empty)
+                    list.Add(name);
+            }
+
+            return (string[])list.ToArray(typeof(string));
+        }
+
+        private static string GetTestName(string argument, ref int index)
+        {
+            int separator = GetSeparator(argument, index);
+            string result;
+
+            if (separator >= 0)
+            {
+                result = argument.Substring(index, separator - index).Trim();
+                index = separator + 1;
+            }
+            else
+            {
+                result = argument.Substring(index).Trim();
+                index = argument.Length;
+            }
+
+            return result;
+        }
+
+        private static int GetSeparator(string argument, int index)
+        {
+            int nest = 0;
+
+            while (index < argument.Length)
+            {
+                switch (argument[index])
+                {
+                    case ',':
+                        if (nest == 0)
+                            return index;
+                        break;
+
+                    case '"':
+                        while (++index < argument.Length && argument[index] != '"')
+                            ;
+                        break;
+
+                    case '(':
+                    case '<':
+                        nest++;
+                        break;
+
+                    case ')':
+                    case '>':
+                        nest--;
+                        break;
+                }
+
+                index++;
+            }
+
+            return -1;
+        }
+    }
+}
diff --git a/src/ConsoleRunner/nunit-console/nunit-console.build b/src/ConsoleRunner/nunit-console/nunit-console.build
index 4a5af18..367dd0c 100644
--- a/src/ConsoleRunner/nunit-console/nunit-console.build
+++ b/src/ConsoleRunner/nunit-console/nunit-console.build
@@ -1,22 +1,27 @@
 <?xml version="1.0"?>
 <project name="NUnit-Console" default="build">
 
+  <patternset id="source-files">
+    <include name="AssemblyInfo.cs"/>
+    <include name="ConsoleOptions.cs"/>
+    <include name="ConsoleUi.cs"/>
+    <include name="EventCollector.cs"/>
+    <include name="Runner.cs"/>
+    <include name="TestNameParser.cs"/>
+  </patternset>
+
   <target name="build">
     <csc target="library" 
-        output="${current.build.dir}/nunit-console-runner.dll"
+        output="${current.lib.dir}/nunit-console-runner.dll"
         debug="${build.debug}" define="${build.defines}">
       <sources>
-        <include name="AssemblyInfo.cs"/>
-        <include name="ConsoleOptions.cs"/>
-        <include name="ConsoleUi.cs"/>
-        <include name="EventCollector.cs"/>
-        <include name="Runner.cs"/>
-        <include name="../../CommonAssemblyInfo.cs"/>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
       </sources>
       <nowarn>
-        <warning number="1699" if="${runtime.version=='2.0'}"/>
+        <warning number="1699" if="${runtime.version>='2.0'}"/>
       </nowarn>
-      <references basedir="${current.build.dir}">
+      <references basedir="${current.lib.dir}">
         <include name="nunit.core.interfaces.dll"/>
         <include name="nunit.core.dll"/>
         <include name="nunit.util.dll"/>
@@ -26,7 +31,12 @@
 
   <target name="package">
     <copy todir="${package.src.dir}/ConsoleRunner/nunit-console">
-      <fileset refid="source-files" />
+      <fileset>
+        <patternset refid="source-files"/>
+        <include name="nunit-console.csproj"/>
+        <include name="nunit-console.build"/>
+        <include name="App.ico"/>
+      </fileset>
     </copy>
   </target>
 
diff --git a/src/ConsoleRunner/nunit-console/nunit-console.csproj b/src/ConsoleRunner/nunit-console/nunit-console.csproj
index 9e1ef9e..6528791 100644
--- a/src/ConsoleRunner/nunit-console/nunit-console.csproj
+++ b/src/ConsoleRunner/nunit-console/nunit-console.csproj
@@ -1,140 +1,113 @@
-<VisualStudioProject>
-    <CSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{9367EC89-6A38-42BA-9607-0DC288E4BC3A}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = ""
-                AssemblyKeyContainerName = ""
-                AssemblyName = "nunit-console-runner"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "Library"
-                PreBuildEvent = ""
-                PostBuildEvent = ""
-                RootNamespace = "NUnit.ConsoleRunner"
-                RunPostBuildEvent = "OnBuildSuccess"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "true"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "true"
-                    NoStdLib = "false"
-                    NoWarn = "618"
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-                <Config
-                    Name = "Release"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "false"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = "618"
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "System"
-                    AssemblyName = "System"
-                    HintPath = "..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll"
-                />
-                <Reference
-                    Name = "System.Data"
-                    AssemblyName = "System.Data"
-                    HintPath = "..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll"
-                />
-                <Reference
-                    Name = "System.XML"
-                    AssemblyName = "System.Xml"
-                    HintPath = "..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll"
-                />
-                <Reference
-                    Name = "nunit.util.dll"
-                    Project = "{61CE9CE5-943E-44D4-A381-814DC1406767}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.core.interfaces.dll"
-                    Project = "{435428F8-5995-4CE4-8022-93D595A8CC0F}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.core.dll"
-                    Project = "{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-            </References>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "App.ico"
-                    BuildAction = "Content"
-                />
-                <File
-                    RelPath = "AssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CommonAssemblyInfo.cs"
-                    Link = "..\..\CommonAssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ConsoleOptions.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ConsoleUi.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "EventCollector.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Runner.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-            </Include>
-        </Files>
-    </CSHARP>
-</VisualStudioProject>
-
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{9367EC89-6A38-42BA-9607-0DC288E4BC3A}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit-console-runner</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.ConsoleRunner</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\lib\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG;NET_2_0</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>618,1699</NoWarn>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\lib\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;NET_2_0</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>618,1699</NoWarn>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
+      <Name>nunit.util.dll</Name>
+      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
+      <Name>nunit.core.dll</Name>
+      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
+      <Name>nunit.core.interfaces.dll</Name>
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="App.ico" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="AssemblyInfo.cs" />
+    <Compile Include="ConsoleOptions.cs" />
+    <Compile Include="ConsoleUi.cs" />
+    <Compile Include="EventCollector.cs" />
+    <Compile Include="Runner.cs" />
+    <Compile Include="TestNameParser.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit-console.build" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/ConsoleRunner/nunit-console/nunit-console_VS2005.csproj b/src/ConsoleRunner/nunit-console/nunit-console_VS2005.csproj
deleted file mode 100644
index e27886a..0000000
--- a/src/ConsoleRunner/nunit-console/nunit-console_VS2005.csproj
+++ /dev/null
@@ -1,94 +0,0 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>8.0.50727</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{9367EC89-6A38-42BA-9607-0DC288E4BC3A}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ApplicationIcon>
-    </ApplicationIcon>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit-console-runner</AssemblyName>
-    <AssemblyOriginatorKeyFile>
-    </AssemblyOriginatorKeyFile>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.ConsoleRunner</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <StartupObject>
-    </StartupObject>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-    <SignAssembly>false</SignAssembly>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release2005|AnyCPU' ">
-    <OutputPath>bin\Release2005\</OutputPath>
-    <DefineConstants>TRACE;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <Optimize>true</Optimize>
-    <NoWarn>618;1701;1702;1699</NoWarn>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug2005|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\Debug2005\</OutputPath>
-    <DefineConstants>TRACE;DEBUG;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <NoWarn>618;1701;1702;1699</NoWarn>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-  </ItemGroup>
-  <ItemGroup>
-    <Content Include="App.ico" />
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="AssemblyInfo.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="ConsoleOptions.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="ConsoleUi.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="EventCollector.cs" />
-    <Compile Include="Runner.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll_VS2005.csproj">
-      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
-      <Name>nunit.util.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll_VS2005.csproj">
-      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
-      <Name>nunit.core.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll_VS2005.csproj">
-      <Project>{DCC88998-255A-4247-B658-71DD932E9873}</Project>
-      <Name>nunit.core.interfaces.dll_VS2005</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
-</Project>
\ No newline at end of file
diff --git a/src/ConsoleRunner/tests/CommandLineTests.cs b/src/ConsoleRunner/tests/CommandLineTests.cs
index 6f2d97f..1b0c4e7 100644
--- a/src/ConsoleRunner/tests/CommandLineTests.cs
+++ b/src/ConsoleRunner/tests/CommandLineTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 namespace NUnit.ConsoleRunner.Tests
@@ -91,14 +91,14 @@ namespace NUnit.ConsoleRunner.Tests
 			TestStringOption( "fixture" );
 			TestStringOption( "config" );
 			TestStringOption( "xml" );
-			TestStringOption( "transform" );
 			TestStringOption( "output" );
 			TestStringOption( "output", "out" );
 			TestStringOption( "err" );
-			TestStringOption( "include" );
+            TestStringOption("include");
 			TestStringOption( "exclude" );
 			TestEnumOption( "domain" );
-		}
+            TestEnumOption("trace");
+        }
 
 		[Test]
 		public void AssemblyName()
@@ -173,20 +173,11 @@ namespace NUnit.ConsoleRunner.Tests
 		}
 
 		[Test]
-		public void TransformParameter()
-		{
-			ConsoleOptions options = new ConsoleOptions( "tests.dll", "-transform:Summary.xslt" );
-			Assert.IsTrue(options.ParameterCount == 1, "assembly should be set");
-			Assert.AreEqual("tests.dll", options.Parameters[0]);
-			Assert.AreEqual("Summary.xslt", options.transform);
-		}
-
-
-		[Test]
-		public void FileNameWithoutXmlParameterIsInvalid()
+		public void FileNameWithoutXmlParameterLooksLikeParameter()
 		{
-			ConsoleOptions options = new ConsoleOptions( "tests.dll", ":result.xml" );
-			Assert.IsFalse(options.Validate());
+			ConsoleOptions options = new ConsoleOptions( "tests.dll", "result.xml" );
+			Assert.IsTrue(options.Validate());
+			Assert.AreEqual(2, options.Parameters.Count);
 		}
 
 		[Test]
diff --git a/src/ConsoleRunner/tests/CommandLineTests_MultipleAssemblies.cs b/src/ConsoleRunner/tests/CommandLineTests_MultipleAssemblies.cs
index 861cbdd..7d18b63 100644
--- a/src/ConsoleRunner/tests/CommandLineTests_MultipleAssemblies.cs
+++ b/src/ConsoleRunner/tests/CommandLineTests_MultipleAssemblies.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 namespace NUnit.ConsoleRunner.Tests
diff --git a/src/ConsoleRunner/tests/ConsoleRunnerTest.cs b/src/ConsoleRunner/tests/ConsoleRunnerTest.cs
index ea0a1a9..18c8f90 100644
--- a/src/ConsoleRunner/tests/ConsoleRunnerTest.cs
+++ b/src/ConsoleRunner/tests/ConsoleRunnerTest.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -10,13 +10,19 @@ using System.Text;
 using System.Collections;
 
 using NUnit.Framework;
+using NUnit.Core;
 using NUnit.TestData.ConsoleRunnerTest;
+using NUnit.Tests.Assemblies;
 
 namespace NUnit.ConsoleRunner.Tests
 {
 	[TestFixture]
 	public class ConsoleRunnerTest
 	{
+        private static readonly string failureMsg = 
+            string.Format( "Errors: {0}, Failures: {1}", 
+                MockAssembly.Errors, MockAssembly.Failures );
+
 		private static readonly string xmlFile = "console-test.xml";
 		private StringBuilder output;
 		TextWriter saveOut;
@@ -82,17 +88,23 @@ namespace NUnit.ConsoleRunner.Tests
 		[Test]
 		public void InvalidFixture()
 		{
-			int resultCode = executeConsole( new string[] 
-				{ GetType().Module.Name, "-fixture:NUnit.Tests.BogusTest" } );
+			int resultCode = executeConsole( new string[] { MockAssembly.AssemblyPath, "-fixture:NUnit.Tests.BogusTest", "-trace:Off" });
 			Assert.AreEqual(ConsoleUi.FIXTURE_NOT_FOUND, resultCode);
 		}
 
 		[Test]
-		public void InvalidAssembly()
+		public void AssemblyNotFound()
 		{
-			int resultCode = executeConsole( new string[] { "badassembly.dll" } );
-			Assert.AreEqual(ConsoleUi.FILE_NOT_FOUND, resultCode);
-		}
+            int resultCode = executeConsole(new string[] { "badassembly.dll", "-trace:Off" });
+            Assert.AreEqual(ConsoleUi.FILE_NOT_FOUND, resultCode);
+        }
+
+        [Test]
+        public void OneOfTwoAssembliesNotFound()
+        {
+            int resultCode = executeConsole(new string[] { GetType().Module.Name, "badassembly.dll", "-trace:Off" });
+            Assert.AreEqual(ConsoleUi.FILE_NOT_FOUND, resultCode);
+        }
 
 		[Test]
 		public void XmlToConsole() 
@@ -124,56 +136,57 @@ namespace NUnit.ConsoleRunner.Tests
 		[Test]
 		public void CanRunWithoutTestDomain()
 		{
-			Assert.AreEqual( 0, executeConsole( "mock-assembly.dll", "-domain:None" ) );
-			StringAssert.Contains( "Failures: 0", output.ToString() );
+            Assert.AreEqual(MockAssembly.ErrorsAndFailures, executeConsole(MockAssembly.AssemblyPath, "-domain:None", "-process:single", "-trace:Off"));
+			StringAssert.Contains( failureMsg, output.ToString() );
 		}
 
 		[Test]
 		public void CanRunWithSingleTestDomain()
 		{
-			Assert.AreEqual( 0, executeConsole( "mock-assembly.dll", "-domain:Single" ) );
-			StringAssert.Contains( "Failures: 0", output.ToString() );
+            Assert.AreEqual(MockAssembly.ErrorsAndFailures, executeConsole(MockAssembly.AssemblyPath, "-domain:Single", "-process:single", "-trace:Off"));
+			StringAssert.Contains( failureMsg, output.ToString() );
 		}
 
 		[Test]
 		public void CanRunWithMultipleTestDomains()
 		{
-			Assert.AreEqual( 0, executeConsole( "mock-assembly.dll", "nonamespace-assembly.dll", "-domain:Multiple" ) );
-			StringAssert.Contains( "Failures: 0", output.ToString() );
+            Assert.AreEqual(MockAssembly.ErrorsAndFailures, executeConsole(MockAssembly.AssemblyPath, NoNamespaceTestFixture.AssemblyPath, "-domain:Multiple", "-process:single", "-trace:Off"));
+			StringAssert.Contains( failureMsg, output.ToString() );
 		}
 
-		[Test,Platform(Exclude="Mono")]
+		[Test]
 		public void CanRunWithoutTestDomain_NoThread()
 		{
-			Assert.AreEqual( 0, executeConsole( "mock-assembly.dll", "-domain:None", "-nothread" ) );
-			StringAssert.Contains( "Failures: 0", output.ToString() );
+            Assert.AreEqual(MockAssembly.ErrorsAndFailures, executeConsole(MockAssembly.AssemblyPath, "-domain:None", "-nothread", "-process:single", "-trace:Off"));
+			StringAssert.Contains( failureMsg, output.ToString() );
 		}
 
-		[Test,Platform(Exclude="Mono")]
+		[Test]
 		public void CanRunWithSingleTestDomain_NoThread()
 		{
-			Assert.AreEqual( 0, executeConsole( "mock-assembly.dll", "-domain:Single", "-nothread" ) );
-			StringAssert.Contains( "Failures: 0", output.ToString() );
+            Assert.AreEqual(MockAssembly.ErrorsAndFailures, executeConsole(MockAssembly.AssemblyPath, "-domain:Single", "-nothread", "-process:single", "-trace:Off"));
+			StringAssert.Contains( failureMsg, output.ToString() );
 		}
 
-		[Test,Platform(Exclude="Mono")]
+		[Test]
 		public void CanRunWithMultipleTestDomains_NoThread()
 		{
-			Assert.AreEqual( 0, executeConsole( "mock-assembly.dll", "nonamespace-assembly.dll", "-domain:Multiple", "-nothread" ) );
-			StringAssert.Contains( "Failures: 0", output.ToString() );
+            Assert.AreEqual(MockAssembly.ErrorsAndFailures, executeConsole(MockAssembly.AssemblyPath, NoNamespaceTestFixture.AssemblyPath, "-domain:Multiple", "-nothread", "-process:single", "-trace:Off"));
+			StringAssert.Contains( failureMsg, output.ToString() );
 		}
 
 		private int runFixture( Type type )
 		{
-			return executeConsole( new string[] 
-				{ type.Module.Name, "-fixture:" + type.FullName } );
+			return executeConsole( new string[] { AssemblyHelper.GetAssemblyPath(type), "-trace:Off", "-process:single", "-fixture:" + type.FullName });
 		}
 
 		private int runFixture( Type type, params string[] arguments )
 		{
-			string[] args = new string[arguments.Length+2];
+			string[] args = new string[arguments.Length+4];
 			int n = 0;
-			args[n++] = type.Module.Name;
+			args[n++] = AssemblyHelper.GetAssemblyPath(type);
+            args[n++] = "-trace:Off";
+            args[n++] = "-process:single";
 			args[n++] = "-fixture:" + type.FullName;
 			foreach( string arg in arguments )
 				args[n++] = arg;
diff --git a/src/ConsoleRunner/tests/TestNameParserTests.cs b/src/ConsoleRunner/tests/TestNameParserTests.cs
new file mode 100644
index 0000000..2ea2ed4
--- /dev/null
+++ b/src/ConsoleRunner/tests/TestNameParserTests.cs
@@ -0,0 +1,43 @@
+// ****************************************************************
+// Copyright 2011, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+
+namespace NUnit.ConsoleRunner.Tests
+{
+    public class TestNameParserTests
+    {
+        [TestCase("Test.Namespace.Fixture.Method")]
+        [TestCase("Test.Namespace.Fixture.Method,")]
+        [TestCase("  Test.Namespace.Fixture.Method  ")]
+        [TestCase("  Test.Namespace.Fixture.Method  ,")]
+        [TestCase("Test.Namespace.Fixture.Method()")]
+        [TestCase("Test.Namespace.Fixture.Method(\"string,argument\")")]
+        [TestCase("Test.Namespace.Fixture.Method(1,2,3)")]
+        [TestCase("Test.Namespace.Fixture.Method<int,int>()")]
+        [TestCase("Test.Namespace.Fixture.Method(\")\")")]
+        public void SingleName(string name)
+        {
+            string[] names = TestNameParser.Parse(name);
+            Assert.AreEqual(1, names.Length);
+            Assert.AreEqual(name.Trim(new char[] { ' ', ',' }), names[0]);
+        }
+
+        [TestCase("Test.Namespace.Fixture.Method1", "Test.Namespace.Fixture.Method2")]
+        [TestCase("Test.Namespace.Fixture.Method1", "Test.Namespace.Fixture.Method2,")]
+        [TestCase("Test.Namespace.Fixture.Method1(1,2)", "Test.Namespace.Fixture.Method2(3,4)")]
+        [TestCase("Test.Namespace.Fixture.Method1(\"(\")", "Test.Namespace.Fixture.Method2(\"<\")")]
+        public void TwoNames(string name1, string name2)
+        {
+            char[] delims = new char[] { ' ', ',' };
+            string[] names = TestNameParser.Parse(name1 + "," + name2);
+            Assert.AreEqual(2, names.Length);
+            Assert.AreEqual(name1.Trim(delims), names[0]);
+            Assert.AreEqual(name2.Trim(delims), names[1]);
+        }
+    }
+}
diff --git a/src/ConsoleRunner/tests/nunit-console.tests.build b/src/ConsoleRunner/tests/nunit-console.tests.build
index ecc094a..d7ae33b 100644
--- a/src/ConsoleRunner/tests/nunit-console.tests.build
+++ b/src/ConsoleRunner/tests/nunit-console.tests.build
@@ -1,30 +1,42 @@
 <?xml version="1.0"?>
 <project name="NUnit.Console.Tests" default="build">
 
+  <patternset id="source-files">
+    <include name="CommandLineTests.cs"/>
+    <include name="CommandLineTests_MultipleAssemblies.cs"/>
+    <include name="ConsoleRunnerTest.cs"/>
+    <include name="TestNameParserTests.cs"/>
+  </patternset>
+
   <target name="build">
     <csc target="library" 
-      output="${current.build.dir}/nunit-console.tests.dll"
+      output="${current.test.dir}/nunit-console.tests.dll"
       debug="${build.debug}" define="${build.defines}">
       <sources>
-        <include name="CommandLineTests.cs"/>
-        <include name="CommandLineTests_MultipleAssemblies.cs"/>
-        <include name="ConsoleRunnerTest.cs"/>
-        <include name="../../CommonAssemblyInfo.cs"/>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
       </sources>
-      <references basedir="${current.build.dir}">
-        <include name="nunit.framework.dll"/>
-        <include name="nunit.core.dll"/>
-        <include name="nunit.framework.tests.dll"/>
-        <include name="nunit.util.dll"/>
-        <include name="nunit-console-runner.dll"/>
-        <include name="test-assembly.dll"/>
+      <references>
+        <include name="${current.framework.dir}/nunit.framework.dll"/>
+        <include name="${current.lib.dir}/nunit.core.dll"/>
+        <include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
+        <include name="${current.lib.dir}/nunit.util.dll"/>
+        <include name="${current.lib.dir}/nunit-console-runner.dll"/>
+        <include name="${current.test.dir}/nunit.framework.tests.dll"/>
+        <include name="${current.test.dir}/test-assembly.dll"/>
+        <include name="${current.test.dir}/mock-assembly.dll"/>
+		<include name="${current.test.dir}/nonamespace-assembly.dll"/>
       </references>
     </csc>
   </target>
 
   <target name="package">
     <copy todir="${package.src.dir}/ConsoleRunner/tests">
-      <fileset refid="source-files" />
+      <fileset>
+        <patternset refid="source-files" />
+        <include name="nunit-console.tests.csproj" />
+        <include name="nunit-console.tests.build" />
+      </fileset>
     </copy>
   </target>
 
diff --git a/src/ConsoleRunner/tests/nunit-console.tests.csproj b/src/ConsoleRunner/tests/nunit-console.tests.csproj
index 222ff2a..14c1247 100644
--- a/src/ConsoleRunner/tests/nunit-console.tests.csproj
+++ b/src/ConsoleRunner/tests/nunit-console.tests.csproj
@@ -1,136 +1,130 @@
-<VisualStudioProject>
-    <CSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{8597D2C6-804D-48CB-BFC7-ED2404D389B0}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = ""
-                AssemblyKeyContainerName = ""
-                AssemblyName = "nunit-console.tests"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "Library"
-                PreBuildEvent = ""
-                PostBuildEvent = ""
-                RootNamespace = "ConsoleRunner.Tests"
-                RunPostBuildEvent = "OnBuildSuccess"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "true"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-                <Config
-                    Name = "Release"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "false"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "System"
-                    AssemblyName = "System"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.dll"
-                />
-                <Reference
-                    Name = "System.Data"
-                    AssemblyName = "System.Data"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Data.dll"
-                />
-                <Reference
-                    Name = "System.XML"
-                    AssemblyName = "System.Xml"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.XML.dll"
-                />
-                <Reference
-                    Name = "nunit.framework.dll"
-                    Project = "{83DD7E12-A705-4DBA-9D71-09C8973D9382}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit-console"
-                    Project = "{9367EC89-6A38-42BA-9607-0DC288E4BC3A}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.util.dll"
-                    Project = "{61CE9CE5-943E-44D4-A381-814DC1406767}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.core.tests"
-                    Project = "{DD758D21-E5D5-4D40-9450-5F65A32F359C}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "test-assembly"
-                    Project = "{1960CAC4-9A82-47C5-A9B3-55BC37572C3C}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-            </References>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "CommandLineTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CommandLineTests_MultipleAssemblies.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CommonAssemblyInfo.cs"
-                    Link = "..\..\CommonAssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ConsoleRunnerTest.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-            </Include>
-        </Files>
-    </CSHARP>
-</VisualStudioProject>
-
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{8597D2C6-804D-48CB-BFC7-ED2404D389B0}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit-console.tests</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>ConsoleRunner.Tests</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
+      <Name>nunit.util.dll</Name>
+      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
+      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
+      <Name>nunit.core.dll</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Name>nunit.core.interfaces.dll</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\tests\nunit.core.tests.csproj">
+      <Name>nunit.core.tests</Name>
+      <Project>{DD758D21-E5D5-4D40-9450-5F65A32F359C}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
+      <Name>nunit.framework.dll</Name>
+      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\..\tests\mock-assembly\mock-assembly.csproj">
+      <Project>{2E368281-3BA8-4050-B05E-0E0E43F8F446}</Project>
+      <Name>mock-assembly</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\tests\nonamespace-assembly\nonamespace-assembly.csproj">
+      <Project>{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}</Project>
+      <Name>nonamespace-assembly</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\tests\test-assembly\test-assembly.csproj">
+      <Name>test-assembly</Name>
+      <Project>{1960CAC4-9A82-47C5-A9B3-55BC37572C3C}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\nunit-console\nunit-console.csproj">
+      <Name>nunit-console</Name>
+      <Project>{9367EC89-6A38-42BA-9607-0DC288E4BC3A}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="CommandLineTests.cs" />
+    <Compile Include="CommandLineTests_MultipleAssemblies.cs" />
+    <Compile Include="ConsoleRunnerTest.cs" />
+    <Compile Include="TestNameParserTests.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit-console.tests.build" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/ConsoleRunner/tests/nunit-console.tests.dll.config b/src/ConsoleRunner/tests/nunit-console.tests.dll.config
deleted file mode 100644
index 3238c85..0000000
--- a/src/ConsoleRunner/tests/nunit-console.tests.dll.config
+++ /dev/null
@@ -1,88 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<configuration>
-
-	<!--
-	 This is the configuration file for the NUnitTests.nunit test project. You may
-	 need to create a similar configuration file for your own test project. 
-	 
-	 In your own configuration file, the include any appSettings that you require.
-	 The <NUnit> section is only needed if you want to use a non-default value
-	 for any of the settings.
-	-->
-  <configSections>
-	<sectionGroup name="NUnit">
-		<section name="TestRunner" type="System.Configuration.NameValueSectionHandler"/>
-	</sectionGroup>
-  </configSections>
-  
-  <appSettings>
-    <!--   User application and configured property settings go here.-->
-    <!--   Example: <add key="settingName" value="settingValue"/> -->
-    <add key="test.setting" value="54321" />
-  </appSettings>
-
-  <NUnit>
-	<TestRunner>
-		<!-- Valid values are STA,MTA. Others ignored. -->
-		<add key="ApartmentState" value="MTA" />
-		
-		<!-- See ThreadPriority enum for other valid values -->
-		<add key="ThreadPriority" value="Normal" />
-	</TestRunner>
-  </NUnit>
-
-   <!--
-    The following <runtime> section allows running nunit tests under 
-    .NET 1.0 by redirecting assemblies. The appliesTo attribute
-    causes the section to be ignored except under .NET 1.0.
-   --> 
- <runtime>
-   
-    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
-			appliesTo="v1.0.3705">
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Data" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Drawing" 
-                          publicKeyToken="b03f5f7f11d50a3a" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Windows.Forms" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Xml" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-    </assemblyBinding>
-  
-  </runtime>
-
-</configuration> 
diff --git a/src/ConsoleRunner/tests/nunit-console.tests_VS2005.csproj b/src/ConsoleRunner/tests/nunit-console.tests_VS2005.csproj
deleted file mode 100644
index d645a25..0000000
--- a/src/ConsoleRunner/tests/nunit-console.tests_VS2005.csproj
+++ /dev/null
@@ -1,96 +0,0 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>8.0.50727</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{8597D2C6-804D-48CB-BFC7-ED2404D389B0}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ApplicationIcon>
-    </ApplicationIcon>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit-console.tests</AssemblyName>
-    <AssemblyOriginatorKeyFile>
-    </AssemblyOriginatorKeyFile>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>ConsoleRunner.Tests</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <StartupObject>
-    </StartupObject>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release2005|AnyCPU' ">
-    <OutputPath>bin\Release2005\</OutputPath>
-    <DefineConstants>TRACE;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <Optimize>true</Optimize>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug2005|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\Debug2005\</OutputPath>
-    <DefineConstants>TRACE;DEBUG;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="CommandLineTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="CommandLineTests_MultipleAssemblies.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="ConsoleRunnerTest.cs">
-      <SubType>Code</SubType>
-    </Compile>
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll_VS2005.csproj">
-      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
-      <Name>nunit.util.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\tests\nunit.core.tests_VS2005.csproj">
-      <Project>{DD758D21-E5D5-4D40-9450-5F65A32F359C}</Project>
-      <Name>nunit.core.tests_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll_VS2005.csproj">
-      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
-      <Name>nunit.framework.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\tests\test-assembly\test-assembly_VS2005.csproj">
-      <Project>{1960CAC4-9A82-47C5-A9B3-55BC37572C3C}</Project>
-      <Name>test-assembly_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\nunit-console\nunit-console_VS2005.csproj">
-      <Project>{9367EC89-6A38-42BA-9607-0DC288E4BC3A}</Project>
-      <Name>nunit-console_VS2005</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
-</Project>
\ No newline at end of file
diff --git a/src/GuiComponents/UiKit/AddConfigurationDialog.cs b/src/GuiComponents/UiKit/AddConfigurationDialog.cs
index 3433e52..039d0f3 100644
--- a/src/GuiComponents/UiKit/AddConfigurationDialog.cs
+++ b/src/GuiComponents/UiKit/AddConfigurationDialog.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -14,8 +14,14 @@ using NUnit.Util;
 namespace NUnit.UiKit
 {
 	/// <summary>
-	/// Summary description for AssemblyNameDialog.
-	/// </summary>
+    /// Displays a dialog for creation of a new configuration.
+    /// The dialog collects and validates the name and the
+    /// name of a configuration to be copied and then adds the
+    /// new configuration to the project.
+    /// 
+    /// A DialogResult of DialogResult.OK indicates that the
+    /// configuration was added successfully.
+    /// </summary>
 	public class AddConfigurationDialog : System.Windows.Forms.Form
 	{
 		#region Instance variables
@@ -136,7 +142,6 @@ namespace NUnit.UiKit
 			// AddConfigurationDialog
 			// 
 			this.AcceptButton = this.okButton;
-			this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);
 			this.CancelButton = this.cancelButton;
 			this.ClientSize = new System.Drawing.Size(280, 149);
 			this.Controls.Add(this.label2);
diff --git a/src/GuiComponents/UiKit/AddTabPageDialog.cs b/src/GuiComponents/UiKit/AddTabPageDialog.cs
index 3085dd3..af1c582 100644
--- a/src/GuiComponents/UiKit/AddTabPageDialog.cs
+++ b/src/GuiComponents/UiKit/AddTabPageDialog.cs
@@ -1,3 +1,8 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using System.Drawing;
 using System.Collections;
@@ -99,7 +104,6 @@ namespace NUnit.UiKit
 			// AddTabPageDialog
 			// 
 			this.AcceptButton = this.okButton;
-			this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);
 			this.CancelButton = this.cancelButton;
 			this.ClientSize = new System.Drawing.Size(344, 104);
 			this.ControlBox = false;
diff --git a/src/GuiComponents/UiKit/AppContainer.cs b/src/GuiComponents/UiKit/AppContainer.cs
index da5bcdf..15383ae 100644
--- a/src/GuiComponents/UiKit/AppContainer.cs
+++ b/src/GuiComponents/UiKit/AppContainer.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/GuiComponents/UiKit/AssemblyInfo.cs b/src/GuiComponents/UiKit/AssemblyInfo.cs
index c55a1ba..4835bf6 100644
--- a/src/GuiComponents/UiKit/AssemblyInfo.cs
+++ b/src/GuiComponents/UiKit/AssemblyInfo.cs
@@ -1,11 +1,11 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System.Reflection;
 
 [assembly: AssemblyDelaySign(false)]
-[assembly: AssemblyKeyFile("../../../../nunit.snk")]
+[assembly: AssemblyKeyFile("../../nunit.snk")]
 [assembly: AssemblyKeyName("")]
diff --git a/src/GuiComponents/UiKit/ConfigurationEditor.cs b/src/GuiComponents/UiKit/ConfigurationEditor.cs
index 764a817..29a7045 100644
--- a/src/GuiComponents/UiKit/ConfigurationEditor.cs
+++ b/src/GuiComponents/UiKit/ConfigurationEditor.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -152,7 +152,6 @@ namespace NUnit.UiKit
 			// ConfigurationEditor
 			// 
 			this.AcceptButton = this.closeButton;
-			this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);
 			this.CancelButton = this.closeButton;
 			this.ClientSize = new System.Drawing.Size(297, 267);
 			this.ControlBox = false;
@@ -178,9 +177,9 @@ namespace NUnit.UiKit
 		}
 		#endregion
 
-		#region UI Event Handlers
+        #region UI Event Handlers
 
-		private void ConfigurationEditor_Load(object sender, System.EventArgs e)
+        private void ConfigurationEditor_Load(object sender, System.EventArgs e)
 		{
 			FillListBox();
 			if ( configListBox.Items.Count > 0 )
@@ -219,7 +218,6 @@ namespace NUnit.UiKit
 		private void activeButton_Click(object sender, System.EventArgs e)
 		{
 			project.SetActiveConfig( selectedIndex );
-			//AppUI.TestLoader.LoadConfig( project.Configs[selectedIndex].Name );
 			FillListBox();
 		}
 
diff --git a/src/GuiComponents/UiKit/EditTabPagesDialog.cs b/src/GuiComponents/UiKit/EditTabPagesDialog.cs
index 2f15700..b4c8d0f 100644
--- a/src/GuiComponents/UiKit/EditTabPagesDialog.cs
+++ b/src/GuiComponents/UiKit/EditTabPagesDialog.cs
@@ -1,3 +1,8 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using System.Drawing;
 using System.Collections;
@@ -125,7 +130,6 @@ namespace NUnit.UiKit
 			// EditTabPagesDialog
 			// 
 			this.AcceptButton = this.closeButton;
-			this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);
 			this.CancelButton = this.closeButton;
 			this.ClientSize = new System.Drawing.Size(292, 260);
 			this.ControlBox = false;
diff --git a/src/GuiComponents/UiKit/ErrorDisplay.cs b/src/GuiComponents/UiKit/ErrorDisplay.cs
index cc00c13..22cb1eb 100644
--- a/src/GuiComponents/UiKit/ErrorDisplay.cs
+++ b/src/GuiComponents/UiKit/ErrorDisplay.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -21,15 +21,19 @@ namespace NUnit.UiKit
 	/// </summary>
 	public class ErrorDisplay : System.Windows.Forms.UserControl, TestObserver
 	{
-		private ISettings settings = null;
+        static readonly Font DefaultFixedFont = new Font(FontFamily.GenericMonospace, 8.0F);
+
+        private ISettings settings = null;
 		int hoverIndex = -1;
 		private System.Windows.Forms.Timer hoverTimer;
 		TipWindow tipWindow;
 		private bool wordWrap = false;
 
 		private System.Windows.Forms.ListBox detailList;
-		public CP.Windows.Forms.ExpandingTextBox stackTrace;
-		public System.Windows.Forms.Splitter tabSplitter;
+        public UiException.Controls.StackTraceDisplay stackTraceDisplay;
+        public UiException.Controls.ErrorBrowser errorBrowser;
+        private UiException.Controls.SourceCodeDisplay sourceCode;
+        public System.Windows.Forms.Splitter tabSplitter;
 		private System.Windows.Forms.ContextMenu detailListContextMenu;
 		private System.Windows.Forms.MenuItem copyDetailMenuItem;
 		/// <summary> 
@@ -67,7 +71,6 @@ namespace NUnit.UiKit
 				if ( value != this.wordWrap )
 				{
 					this.wordWrap = value; 
-					this.stackTrace.WordWrap = value;
 					RefillDetailList();
 				}
 			}
@@ -83,7 +86,10 @@ namespace NUnit.UiKit
 		{
 			this.detailList = new System.Windows.Forms.ListBox();
 			this.tabSplitter = new System.Windows.Forms.Splitter();
-			this.stackTrace = new CP.Windows.Forms.ExpandingTextBox();
+
+            this.errorBrowser = new NUnit.UiException.Controls.ErrorBrowser();
+            this.sourceCode = new UiException.Controls.SourceCodeDisplay();
+            this.stackTraceDisplay = new UiException.Controls.StackTraceDisplay();
 			this.detailListContextMenu = new System.Windows.Forms.ContextMenu();
 			this.copyDetailMenuItem = new System.Windows.Forms.MenuItem();
 			this.SuspendLayout();
@@ -92,7 +98,7 @@ namespace NUnit.UiKit
 			// 
 			this.detailList.Dock = System.Windows.Forms.DockStyle.Top;
 			this.detailList.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable;
-			this.detailList.Font = new System.Drawing.Font("Courier New", 8.25F);
+			this.detailList.Font = DefaultFixedFont;
 			this.detailList.HorizontalExtent = 2000;
 			this.detailList.HorizontalScrollbar = true;
 			this.detailList.ItemHeight = 16;
@@ -119,23 +125,27 @@ namespace NUnit.UiKit
 			this.tabSplitter.TabIndex = 3;
 			this.tabSplitter.TabStop = false;
 			this.tabSplitter.SplitterMoved += new System.Windows.Forms.SplitterEventHandler(this.tabSplitter_SplitterMoved);
-			// 
-			// stackTrace
-			// 
-			this.stackTrace.Dock = System.Windows.Forms.DockStyle.Fill;
-			this.stackTrace.Font = new System.Drawing.Font("Courier New", 9.75F);
-			this.stackTrace.Location = new System.Drawing.Point(0, 137);
-			this.stackTrace.Multiline = true;
-			this.stackTrace.Name = "stackTrace";
-			this.stackTrace.ReadOnly = true;
-			this.stackTrace.ScrollBars = System.Windows.Forms.ScrollBars.Both;
-			this.stackTrace.Size = new System.Drawing.Size(496, 151);
-			this.stackTrace.TabIndex = 2;
-			this.stackTrace.Text = "";
-			this.stackTrace.WordWrap = false;
-			this.stackTrace.KeyUp += new System.Windows.Forms.KeyEventHandler(this.stackTrace_KeyUp);
-			// 
-			// detailListContextMenu
+            // 
+            // errorBrowser
+            // 
+            this.errorBrowser.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.errorBrowser.Location = new System.Drawing.Point(0, 137);
+            this.errorBrowser.Name = "errorBrowser";
+            this.errorBrowser.Size = new System.Drawing.Size(496, 151);
+            this.errorBrowser.StackTraceSource = null;
+            this.errorBrowser.TabIndex = 4;
+            //
+            // configure and register SourceCodeDisplay
+            //
+            this.sourceCode.AutoSelectFirstItem = true;
+            this.sourceCode.ListOrderPolicy = UiException.Controls.ErrorListOrderPolicy.ReverseOrder;
+            this.sourceCode.SplitOrientation = Orientation.Vertical;
+            this.sourceCode.SplitterDistance = 0.3f;
+            this.stackTraceDisplay.Font = DefaultFixedFont;
+            this.errorBrowser.RegisterDisplay(sourceCode);
+            this.errorBrowser.RegisterDisplay(stackTraceDisplay);
+			//
+            // detailListContextMenu
 			// 
 			this.detailListContextMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
 																								  this.copyDetailMenuItem});
@@ -148,7 +158,7 @@ namespace NUnit.UiKit
 			// 
 			// ErrorDisplay
 			// 
-			this.Controls.Add(this.stackTrace);
+            this.Controls.Add(this.errorBrowser);
 			this.Controls.Add(this.tabSplitter);
 			this.Controls.Add(this.detailList);
 			this.Name = "ErrorDisplay";
@@ -177,12 +187,55 @@ namespace NUnit.UiKit
 				if ( splitPosition >= tabSplitter.MinSize && splitPosition < this.ClientSize.Height )
 					this.tabSplitter.SplitPosition = splitPosition;
 
-				stackTrace.AutoExpand = settings.GetSetting( "Gui.ResultTabs.ErrorsTab.ToolTipsEnabled", true );
 				this.WordWrap = settings.GetSetting( "Gui.ResultTabs.ErrorsTab.WordWrapEnabled", true );
+
+                this.detailList.Font = this.stackTraceDisplay.Font =
+                    settings.GetSetting( "Gui.FixedFont", DefaultFixedFont );
+
+                Orientation splitOrientation = (Orientation)settings.GetSetting(
+                    "Gui.ResultTabs.ErrorBrowser.SplitterOrientation", Orientation.Vertical);
+                float splitterDistance = splitOrientation == Orientation.Vertical
+                    ? settings.GetSetting( "Gui.ResultTabs.ErrorBrowser.VerticalPosition", 0.3f )
+                    : settings.GetSetting( "Gui.ResultTabs.ErrorBrowser.HorizontalPosition", 0.3f );
+
+                sourceCode.SplitOrientation = splitOrientation;
+                sourceCode.SplitterDistance = splitterDistance;
+
+                sourceCode.SplitOrientationChanged += new EventHandler(sourceCode_SplitOrientationChanged);
+                sourceCode.SplitterDistanceChanged += new EventHandler(sourceCode_SplitterDistanceChanged);
+
+                if ( settings.GetSetting("Gui.ResultTabs.ErrorBrowser.SourceCodeDisplay", false) )
+                    errorBrowser.SelectedDisplay = sourceCode;
+                else
+                    errorBrowser.SelectedDisplay = stackTraceDisplay;
+
+                errorBrowser.StackTraceDisplayChanged += new EventHandler(errorBrowser_StackTraceDisplayChanged);
 			}
 
 			base.OnLoad (e);
 		}
+
+        void errorBrowser_StackTraceDisplayChanged(object sender, EventArgs e)
+        {
+            settings.SaveSetting("Gui.ResultTabs.ErrorBrowser.SourceCodeDisplay",
+                errorBrowser.SelectedDisplay == sourceCode);
+        }
+
+        void sourceCode_SplitterDistanceChanged(object sender, EventArgs e)
+        {
+            string distanceSetting = sourceCode.SplitOrientation == Orientation.Vertical
+                ? "Gui.ResultTabs.ErrorBrowser.VerticalPosition" : "Gui.ResultTabs.ErrorBrowser.HorizontalPosition";
+            settings.SaveSetting(distanceSetting, sourceCode.SplitterDistance);
+        }
+
+        void sourceCode_SplitOrientationChanged(object sender, EventArgs e)
+        {
+            settings.SaveSetting("Gui.ResultTabs.ErrorBrowser.SplitterOrientation", sourceCode.SplitOrientation);
+
+            string distanceSetting = sourceCode.SplitOrientation == Orientation.Vertical
+                ? "Gui.ResultTabs.ErrorBrowser.VerticalPosition" : "Gui.ResultTabs.ErrorBrowser.HorizontalPosition";
+            sourceCode.SplitterDistance = settings.GetSetting(distanceSetting, 0.3f);
+        }
 		#endregion
 
 		#region Public Methods
@@ -190,16 +243,22 @@ namespace NUnit.UiKit
 		{
 			detailList.Items.Clear();
 			detailList.ContextMenu = null;
-			stackTrace.Text = "";
+            errorBrowser.StackTraceSource = "";
 		}
 		#endregion
 
 		#region UserSettings Events
 		private void UserSettings_Changed( object sender, SettingsEventArgs args )
 		{
-			this.stackTrace.AutoExpand = settings.GetSetting( "Gui.ResultTabs.ErrorsTab.ToolTipsEnabled ", false );
 			this.WordWrap = settings.GetSetting( "Gui.ResultTabs.ErrorsTab.WordWrapEnabled", true );
-		}
+            Font newFont = this.stackTraceDisplay.Font = this.sourceCode.CodeDisplayFont
+                = settings.GetSetting("Gui.FixedFont", DefaultFixedFont);
+            if (newFont != this.detailList.Font)
+            {
+                this.detailList.Font = newFont;
+                RefillDetailList();
+            }
+        }
 		#endregion
 
 		#region DetailList Events
@@ -210,10 +269,7 @@ namespace NUnit.UiKit
 		private void detailList_SelectedIndexChanged(object sender, System.EventArgs e)
 		{
 			TestResultItem resultItem = (TestResultItem)detailList.SelectedItem;
-			//string stackTrace = resultItem.StackTrace;
-			stackTrace.Text = resultItem.StackTrace;
-
-			//			toolTip.SetToolTip(detailList,resultItem.GetToolTipMessage());
+            errorBrowser.StackTraceSource = resultItem.StackTrace;
 			detailList.ContextMenu = detailListContextMenu;
 		}
 
@@ -343,14 +399,6 @@ namespace NUnit.UiKit
 			}
 		}
 
-		private void stackTrace_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
-		{
-			if ( e.KeyCode == Keys.A && e.Modifiers == Keys.Control )
-			{
-				stackTrace.SelectAll();
-			}
-		}
-
 		private void tabSplitter_SplitterMoved( object sender, SplitterEventArgs e )
 		{
 			settings.SaveSetting( "Gui.ResultTabs.ErrorsTabSplitterPosition", tabSplitter.SplitPosition );
@@ -370,17 +418,33 @@ namespace NUnit.UiKit
 		#region Test Event Handlers
 		private void OnTestFinished(object sender, TestEventArgs args)
 		{
-			TestResult result = args.Result;
-			if( result.Executed && result.IsFailure && result.FailureSite != FailureSite.Parent )
-				InsertTestResultItem( result );
+            TestResult result = args.Result;
+            switch (result.ResultState)
+            {
+                case ResultState.Failure:
+                case ResultState.Error:
+                case ResultState.Cancelled:
+                    if (result.FailureSite != FailureSite.Parent)
+                        InsertTestResultItem(result);
+                    break;
+                case ResultState.NotRunnable:
+                    InsertTestResultItem(result);
+                    break;
+            }
 		}
 		
 		private void OnSuiteFinished(object sender, TestEventArgs args)
 		{
 			TestResult result = args.Result;
-			if( result.Executed && result.IsFailure && 
-				result.FailureSite != FailureSite.Child )
-				InsertTestResultItem( result );
+			if(	result.FailureSite != FailureSite.Child )
+                switch (result.ResultState)
+                {
+                    case ResultState.Failure:
+                    case ResultState.Error:
+                    case ResultState.Cancelled:
+                        InsertTestResultItem(result);
+                        break;
+                }
 		}
 		
 		private void OnTestException(object sender, TestEventArgs args)
diff --git a/src/GuiComponents/UiKit/ErrorDisplay.resx b/src/GuiComponents/UiKit/ErrorDisplay.resx
index 2396002..1ec516b 100644
--- a/src/GuiComponents/UiKit/ErrorDisplay.resx
+++ b/src/GuiComponents/UiKit/ErrorDisplay.resx
@@ -3,7 +3,7 @@
   <!-- 
     Microsoft ResX Schema 
     
-    Version 1.3
+    Version 2.0
     
     The primary goals of this format is to allow a simple XML format 
     that is mostly human readable. The generation and parsing of the 
@@ -14,16 +14,17 @@
     
     ... ado.net/XML headers & schema ...
     <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">1.3</resheader>
+    <resheader name="version">2.0</resheader>
     <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
     <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1">this is my long string</data>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
     <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
     <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        [base64 mime encoded serialized .NET Framework object]
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
     </data>
     <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
     </data>
                 
     There are any number of "resheader" rows that contain simple 
@@ -35,7 +36,7 @@
     Classes that don't support this are serialized and stored with the 
     mimetype set.
     
-    The mimetype is used forserialized objects, and tells the 
+    The mimetype is used for serialized objects, and tells the 
     ResXResourceReader how to depersist the object. This is currently not 
     extensible. For a given mimetype the value must be set accordingly:
     
@@ -45,7 +46,7 @@
     
     mimetype: application/x-microsoft.net.object.binary.base64
     value   : The object must be serialized with 
-            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
             : and then encoded with base64 encoding.
     
     mimetype: application/x-microsoft.net.object.soap.base64
@@ -59,18 +60,37 @@
             : and then encoded with base64 encoding.
     -->
   <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
     <xsd:element name="root" msdata:IsDataSet="true">
       <xsd:complexType>
         <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
           <xsd:element name="data">
             <xsd:complexType>
               <xsd:sequence>
                 <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                 <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
               </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
               <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
               <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
             </xsd:complexType>
           </xsd:element>
           <xsd:element name="resheader">
@@ -89,84 +109,15 @@
     <value>text/microsoft-resx</value>
   </resheader>
   <resheader name="version">
-    <value>1.3</value>
+    <value>2.0</value>
   </resheader>
   <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
   <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
-  <data name="detailList.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="detailList.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="detailList.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="tabSplitter.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="tabSplitter.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="tabSplitter.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Public</value>
-  </data>
-  <data name="stackTrace.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="stackTrace.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="stackTrace.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Public</value>
-  </data>
-  <data name="detailListContextMenu.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="detailListContextMenu.Location" type="System.Drawing.Point, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+  <metadata name="detailListContextMenu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>17, 17</value>
-  </data>
-  <data name="detailListContextMenu.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="copyDetailMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="copyDetailMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>80</value>
-  </data>
-  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>(Default)</value>
-  </data>
-  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.Name">
-    <value>ErrorDisplay</value>
-  </data>
-  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
+  </metadata>
 </root>
\ No newline at end of file
diff --git a/src/GuiComponents/UiKit/ExpandingLabel.cs b/src/GuiComponents/UiKit/ExpandingLabel.cs
index ef4a2c2..a13a91a 100644
--- a/src/GuiComponents/UiKit/ExpandingLabel.cs
+++ b/src/GuiComponents/UiKit/ExpandingLabel.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2002-2003, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/GuiComponents/UiKit/ExpandingTextBox.cs b/src/GuiComponents/UiKit/ExpandingTextBox.cs
index dc2ea30..fdf5d2d 100644
--- a/src/GuiComponents/UiKit/ExpandingTextBox.cs
+++ b/src/GuiComponents/UiKit/ExpandingTextBox.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2002-2003, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/GuiComponents/UiKit/Failure.jpg b/src/GuiComponents/UiKit/Failure.jpg
deleted file mode 100644
index 658905f..0000000
Binary files a/src/GuiComponents/UiKit/Failure.jpg and /dev/null differ
diff --git a/src/GuiComponents/UiKit/Failure.png b/src/GuiComponents/UiKit/Failure.png
new file mode 100644
index 0000000..2e400b2
Binary files /dev/null and b/src/GuiComponents/UiKit/Failure.png differ
diff --git a/src/GuiComponents/UiKit/FolderBrowser.cs b/src/GuiComponents/UiKit/FolderBrowser.cs
deleted file mode 100644
index c72ba03..0000000
--- a/src/GuiComponents/UiKit/FolderBrowser.cs
+++ /dev/null
@@ -1,260 +0,0 @@
-// ****************************************************************
-// Copyright 2002-2003, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-using System.Text;
-using System.Windows.Forms;
-using System.Runtime.InteropServices;
-
-namespace CP.Windows.Shell
-{
-	/// <summary>
-	/// Class to wrap the Shell32 function SHBrowseForFolder
-	/// allowing the user to select a folder. 
-	/// </summary>
-	public class FolderBrowser
-	{
-		private Form owner;
-
-		private string caption = null;
-
-		private string title = null;
-
-		private string selection = null;
-
-		private IntPtr pidlRoot = (IntPtr) null;
-
-		/// <summary>
-		/// Default constructor browses from My Computer
-		/// </summary>
-		public FolderBrowser( Form owner ) : this( owner, CSIDL_DRIVES ) { }
-
-		/// <summary>
-		/// Constructor to browse from a special folder location
-		/// </summary>
-		public FolderBrowser( Form owner, int nFolder )
-		{
-			this.owner = owner;
-
-			SHGetSpecialFolderLocation( owner.Handle, nFolder, out pidlRoot );
-		}
-
-		/// <summary>
-		/// Constructor to browse from a given FS path
-		/// </summary>
-		public FolderBrowser( Form owner, string rootPath )
-		{
-			this.owner = owner;
-
-			IShellFolder pDesktop;
-			SHGetDesktopFolder( out pDesktop );
-			
-			int chEaten = 0;
-			int attrs = 0;
-			pDesktop.ParseDisplayName( owner.Handle, (IntPtr)null, rootPath, out chEaten, ref pidlRoot, ref attrs );
-		}
-
-		/// <summary>
-		/// Set/Get the caption text
-		/// </summary>
-		public string Caption
-		{
-			get { return caption; }
-			set { caption = value; }
-		}
-
-		/// <summary>
-		/// Although called a title in the SHBrowseForFolder
-		/// documentation, this refers to the text displayed
-		/// in the dialog below the caption bar.
-		/// </summary>
-		public string Title
-		{
-			get { return title; }
-			set { title = value; }
-		}
-
-		public string InitialSelection
-		{
-			set { selection = value; }
-		}
-
-		/// <summary>
-		/// It all comes down to this worker method which
-		/// browses based on a pidl.
-		/// </summary>
-		public string BrowseForFolder()
-		{
-			BROWSEINFO bi = new BROWSEINFO();
-
-			bi.hwndOwner = owner.Handle;
-			bi.lpszTitle = title;
-			bi.ulFlags = 
-				BIF_NEWDIALOGSTYLE | 
-				BIF_RETURNONLYFSDIRS | 
-				BIF_DONTGOBELOWDOMAIN |
-				BIF_STATUSTEXT;
-			bi.pidlRoot = pidlRoot;
-			bi.lpfn = new BrowseCallbackHandler( BrowseCallback );
-		
-			IntPtr pidl = SHBrowseForFolder( ref bi );
-			if ( pidl == (IntPtr)0 ) return null;
-
-			StringBuilder sb = new StringBuilder( MAX_PATH );
-			SHGetPathFromIDList( pidl, sb );
-			return sb.ToString();
-		}
-
-		private int BrowseCallback(
-			IntPtr hwnd,
-			uint msg,
-			uint lParam,
-			uint dwData )
-		{
-			switch ( msg )
-			{
-				case BFFM_INITIALIZED:
-					if ( selection != null )
-						SendMessage( hwnd, BFFM_SETSELECTION, 1, selection );
-					if ( caption != null )
-						SetWindowText( hwnd, caption );
-					break;
-
-				default:
-					//MessageBox.Show( string.Format( "Got message {0}", msg ) );
-					break;
-			}
-
-			return 0;
-		}
-		
-		#region P/Invoke Stuff
-
-		private const int CSIDL_DRIVES = 0x0011;
-		private const int MAX_PATH = 256;
-
-		private const uint BIF_RETURNONLYFSDIRS   =	0x0001;
-		private const uint BIF_DONTGOBELOWDOMAIN  =	0x0002;
-		private const uint BIF_STATUSTEXT         =	0x0004;
-		private const uint BIF_RETURNFSANCESTORS  =	0x0008;
-		private const uint BIF_EDITBOX            =	0x0010;
-		private const uint BIF_VALIDATE           =	0x0020;
-		private const uint BIF_NEWDIALOGSTYLE     =	0x0040;
-		private const uint BIF_USENEWUI           =	(BIF_NEWDIALOGSTYLE | BIF_EDITBOX);
-		private const uint BIF_BROWSEINCLUDEURLS  =	0x0080;
-		private const uint BIF_BROWSEFORCOMPUTER  =	0x1000;
-		private const uint BIF_BROWSEFORPRINTER   =	0x2000;
-		private const uint BIF_BROWSEINCLUDEFILES =	0x4000;
-		private const uint BIF_SHAREABLE          =	0x8000;
-
-		private const uint BFFM_INITIALIZED		  = 1;
-		private const uint BFFM_SELCHANGED		  = 2;
-		private const uint BFFM_VALIDATEFAILEDA	  = 3;
-		private const uint BFFM_VALIDATEFAILEDW	  = 4;
-		private const uint BFFM_IUNKNOWN		  = 5;
-
-		private const uint WM_USER				  = 0x0400;
-		private const uint BFFM_SETSELECTION	  = WM_USER + 103;
-
-		[StructLayout(LayoutKind.Sequential)]
-		private struct BROWSEINFO 
-		{ 
-			public IntPtr		hwndOwner; 
-			public IntPtr		pidlRoot; 
-			public IntPtr 		pszDisplayName;
-			[MarshalAs(UnmanagedType.LPStr)] 
-			public string 		lpszTitle; 
-			public uint 		ulFlags; 
-			public BrowseCallbackHandler lpfn; 
-			public int			lParam; 
-			public IntPtr 		iImage; 
-		} 
-
-		[DllImport("Shell32.dll")]
-		private static extern IntPtr SHBrowseForFolder(
-			ref BROWSEINFO lpbi );
-
-		[DllImport("Shell32.dll")]
-		private static extern uint SHGetPathFromIDList(
-			IntPtr pidl,
-			StringBuilder path );
-
-		[DllImport("Shell32.Dll")]
-		private static extern uint SHGetSpecialFolderLocation(
-			IntPtr hwndOwner,
-			int nFolder,
-			out IntPtr pidl );
-
-		[DllImport("Shell32.dll")]
-		private static extern uint SHGetDesktopFolder(
-			out IShellFolder pShellFolder );
-
-		[DllImport("User32.dll")]
-		private static extern uint SetWindowText( 
-			IntPtr hwnd, 
-			string text );
-
-		[DllImport("User32.dll")]
-		private static extern uint SendMessage(
-			IntPtr hwnd,
-			uint msg,
-			int wParam,
-			[MarshalAs( UnmanagedType.LPWStr )]
-			string lParam );
-
-		// NOTE: This definition is only used to access ParseDisplayName,
-		// so the other definitions have been simplified to eliminate
-		// unnecessary dependencies. They'll work, but it would be
-		// better to use more specific types in many cases where int
-		// or IntPtr arguments are used.
-		[ComImport, Guid("000214E6-0000-0000-c000-000000000046")]
-		[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
-		public interface IShellFolder
-		{
-			[PreserveSig]
-			int ParseDisplayName(IntPtr hWnd, IntPtr bindingContext, 
-				string displayName, out int chEaten, ref IntPtr idList, ref int attributes);
-		
-			[PreserveSig]
-			int EnumObjects(IntPtr hWnd, int flags,  ref IntPtr enumList);
-
-			[PreserveSig]
-			int BindToObject(IntPtr idList, IntPtr bindingContext, ref Guid refiid, ref IShellFolder folder);
-        
-			[PreserveSig]
-			int BindToStorage(ref IntPtr idList, IntPtr bindingContext, ref Guid riid, IntPtr pVoid);
-
-			[PreserveSig]
-			int CompareIDs(int lparam, IntPtr idList1, IntPtr idList2);
-        
-			[PreserveSig]
-			int CreateViewObject(IntPtr hWnd, Guid riid, IntPtr pVoid);
-        
-			[PreserveSig]
-			int GetAttributesOf(int count, ref IntPtr idList, out int attributes);
-
-			[PreserveSig]
-			int GetUIObjectOf(IntPtr hWnd, int count, ref IntPtr idList, 
-				ref Guid riid, out int arrayInOut, ref IntPtr iUnknown);
-
-			[PreserveSig]
-			int GetDisplayNameOf(IntPtr idList, int flags, ref StringBuilder strRet);
-
-			[PreserveSig]
-			int SetNameOf(IntPtr hWnd, ref IntPtr idList,
-				IntPtr pOLEString, int flags, ref IntPtr pItemIDList);
-        
-		}
-
-		private delegate int BrowseCallbackHandler( 
-			IntPtr hwnd,
-			uint msg,
-			uint lParam,
-			uint dwData );
-
-		#endregion
-	}
-}
diff --git a/src/GuiComponents/UiKit/Gray.jpg b/src/GuiComponents/UiKit/Gray.jpg
deleted file mode 100644
index 3d84255..0000000
Binary files a/src/GuiComponents/UiKit/Gray.jpg and /dev/null differ
diff --git a/src/GuiComponents/UiKit/Green.jpg b/src/GuiComponents/UiKit/Green.jpg
deleted file mode 100644
index 15ec1b7..0000000
Binary files a/src/GuiComponents/UiKit/Green.jpg and /dev/null differ
diff --git a/src/GuiComponents/UiKit/GuiAttachedConsole.cs b/src/GuiComponents/UiKit/GuiAttachedConsole.cs
index 7ede52b..32d2ef8 100644
--- a/src/GuiComponents/UiKit/GuiAttachedConsole.cs
+++ b/src/GuiComponents/UiKit/GuiAttachedConsole.cs
@@ -1,3 +1,8 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using System.Runtime.InteropServices;
 
diff --git a/src/GuiComponents/UiKit/GuiTestEventDispatcher.cs b/src/GuiComponents/UiKit/GuiTestEventDispatcher.cs
index 43bf006..8120dcd 100644
--- a/src/GuiComponents/UiKit/GuiTestEventDispatcher.cs
+++ b/src/GuiComponents/UiKit/GuiTestEventDispatcher.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/GuiComponents/UiKit/Ignored.jpg b/src/GuiComponents/UiKit/Ignored.jpg
deleted file mode 100644
index 95b7fdb..0000000
Binary files a/src/GuiComponents/UiKit/Ignored.jpg and /dev/null differ
diff --git a/src/GuiComponents/UiKit/Ignored.png b/src/GuiComponents/UiKit/Ignored.png
new file mode 100644
index 0000000..478efbf
Binary files /dev/null and b/src/GuiComponents/UiKit/Ignored.png differ
diff --git a/src/GuiComponents/UiKit/Inconclusive.png b/src/GuiComponents/UiKit/Inconclusive.png
new file mode 100644
index 0000000..4807b7c
Binary files /dev/null and b/src/GuiComponents/UiKit/Inconclusive.png differ
diff --git a/src/GuiComponents/UiKit/LongRunningOperationDisplay.cs b/src/GuiComponents/UiKit/LongRunningOperationDisplay.cs
index 04f7876..4371332 100644
--- a/src/GuiComponents/UiKit/LongRunningOperationDisplay.cs
+++ b/src/GuiComponents/UiKit/LongRunningOperationDisplay.cs
@@ -1,3 +1,8 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using System.Drawing;
 using System.Collections;
@@ -71,7 +76,7 @@ namespace NUnit.UiKit
 			// 
 			this.operation.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
 			this.operation.Dock = System.Windows.Forms.DockStyle.Fill;
-			this.operation.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.2F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
+			this.operation.Font = new System.Drawing.Font(FontFamily.GenericSansSerif, 10.2F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
 			this.operation.Location = new System.Drawing.Point(0, 0);
 			this.operation.Name = "operation";
 			this.operation.Size = new System.Drawing.Size(320, 40);
@@ -80,7 +85,6 @@ namespace NUnit.UiKit
 			// 
 			// LongRunningOperationDisplay
 			// 
-			this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);
 			this.BackColor = System.Drawing.Color.LightYellow;
 			this.ClientSize = new System.Drawing.Size(320, 40);
 			this.ControlBox = false;
diff --git a/src/GuiComponents/UiKit/NotRunTree.cs b/src/GuiComponents/UiKit/NotRunTree.cs
index 40054fe..d647a84 100644
--- a/src/GuiComponents/UiKit/NotRunTree.cs
+++ b/src/GuiComponents/UiKit/NotRunTree.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -16,13 +16,6 @@ namespace NUnit.UiKit
 	/// </summary>
 	public class NotRunTree : TreeView, TestObserver
 	{
-//		public void Add( TestResult result )
-//		{
-//			Invoke( new AddNodeHandler( AddNode ), new object[] { result } );
-//		}
-
-//		private delegate void AddNodeHandler( TestResult result );
-
 		#region TestObserver Members and TestEventHandlers
 
 		public void Subscribe(ITestEvents events)
@@ -38,7 +31,7 @@ namespace NUnit.UiKit
 		private void OnTestFinished( object sender, TestEventArgs args )
 		{
 			TestResult result = args.Result;
-			if ( !result.Executed )
+			if ( result.ResultState == ResultState.Skipped || result.ResultState == ResultState.Ignored)
 				this.AddNode( args.Result );
 		}
 
diff --git a/src/GuiComponents/UiKit/OptionsDialogBase.cs b/src/GuiComponents/UiKit/OptionsDialogBase.cs
deleted file mode 100644
index 03d4fed..0000000
--- a/src/GuiComponents/UiKit/OptionsDialogBase.cs
+++ /dev/null
@@ -1,92 +0,0 @@
-using System;
-using System.Drawing;
-using System.Collections;
-using System.ComponentModel;
-using System.Windows.Forms;
-
-namespace NUnit.UiKit
-{
-	/// <summary>
-	/// Summary description for OptionsDialogBase.
-	/// </summary>
-	public class OptionsDialogBase : System.Windows.Forms.Form
-	{
-		private System.Windows.Forms.Button cancelButton;
-		private System.Windows.Forms.Button okButton;
-		/// <summary>
-		/// Required designer variable.
-		/// </summary>
-		private System.ComponentModel.Container components = null;
-
-		public OptionsDialogBase()
-		{
-			//
-			// Required for Windows Form Designer support
-			//
-			InitializeComponent();
-
-			//
-			// TODO: Add any constructor code after InitializeComponent call
-			//
-		}
-
-		/// <summary>
-		/// Clean up any resources being used.
-		/// </summary>
-		protected override void Dispose( bool disposing )
-		{
-			if( disposing )
-			{
-				if(components != null)
-				{
-					components.Dispose();
-				}
-			}
-			base.Dispose( disposing );
-		}
-
-		#region Windows Form Designer generated code
-		/// <summary>
-		/// Required method for Designer support - do not modify
-		/// the contents of this method with the code editor.
-		/// </summary>
-		private void InitializeComponent()
-		{
-			this.cancelButton = new System.Windows.Forms.Button();
-			this.okButton = new System.Windows.Forms.Button();
-			this.SuspendLayout();
-			// 
-			// cancelButton
-			// 
-			this.cancelButton.Anchor = System.Windows.Forms.AnchorStyles.Bottom;
-			this.cancelButton.CausesValidation = false;
-			this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
-			this.cancelButton.Location = new System.Drawing.Point(174, 432);
-			this.cancelButton.Name = "cancelButton";
-			this.cancelButton.Size = new System.Drawing.Size(68, 23);
-			this.cancelButton.TabIndex = 18;
-			this.cancelButton.Text = "Cancel";
-			// 
-			// okButton
-			// 
-			this.okButton.Anchor = System.Windows.Forms.AnchorStyles.Bottom;
-			this.okButton.Location = new System.Drawing.Point(78, 432);
-			this.okButton.Name = "okButton";
-			this.okButton.Size = new System.Drawing.Size(76, 23);
-			this.okButton.TabIndex = 17;
-			this.okButton.Text = "OK";
-			// 
-			// OptionsDialogBase
-			// 
-			this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);
-			this.ClientSize = new System.Drawing.Size(320, 456);
-			this.Controls.Add(this.cancelButton);
-			this.Controls.Add(this.okButton);
-			this.Name = "OptionsDialogBase";
-			this.Text = "OptionsDialogBase";
-			this.ResumeLayout(false);
-
-		}
-		#endregion
-	}
-}
diff --git a/src/GuiComponents/UiKit/OptionsDialogBase.resx b/src/GuiComponents/UiKit/OptionsDialogBase.resx
deleted file mode 100644
index 5e87370..0000000
--- a/src/GuiComponents/UiKit/OptionsDialogBase.resx
+++ /dev/null
@@ -1,148 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 1.3
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">1.3</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1">this is my long string</data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        [base64 mime encoded serialized .NET Framework object]
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        [base64 mime encoded string representing a byte array form of the .NET Framework object]
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used forserialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>1.3</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <data name="cancelButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="cancelButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="cancelButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="okButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="okButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="okButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>(Default)</value>
-  </data>
-  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>80</value>
-  </data>
-  <data name="$this.Name">
-    <value>OptionsDialogBase</value>
-  </data>
-  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-</root>
\ No newline at end of file
diff --git a/src/GuiComponents/UiKit/ProgressBar.cs b/src/GuiComponents/UiKit/ProgressBar.cs
index 9576d93..bb89fa6 100644
--- a/src/GuiComponents/UiKit/ProgressBar.cs
+++ b/src/GuiComponents/UiKit/ProgressBar.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -112,7 +112,7 @@ namespace NUnit.UiKit
 					if (this.min != value) 
 					{
 						this.min = value;
-						this.PaintBar();
+						this.Invalidate();
 					}
 				}
 				else
@@ -134,7 +134,7 @@ namespace NUnit.UiKit
 					if (this.max != value) 
 					{
 						this.max = value;
-						this.PaintBar();
+						this.Invalidate();
 					}
 				}
 				else
@@ -186,7 +186,7 @@ namespace NUnit.UiKit
 				else if(value <= Maximum && value >= Minimum)
 				{
 					this.val = value;
-					this.PaintBar();
+					this.Invalidate();
 				}
 				else
 				{
@@ -265,14 +265,6 @@ namespace NUnit.UiKit
 			}
 		}
 
-		private void PaintBar()
-		{
-			using(Graphics g = this.CreateGraphics())
-			{
-				this.PaintBar(g);
-			}
-		}
-		
 		private void PaintBar(Graphics g)
 		{
 			Rectangle theBar = Rectangle.Inflate(ClientRectangle, -2, -2);
@@ -339,9 +331,9 @@ namespace NUnit.UiKit
 
 	public class TestProgressBar : ColorProgressBar, TestObserver
 	{
-		private static Color SuccessColor = Color.Lime;
-		private static Color FailureColor = Color.Red;
-		private static Color IgnoredColor = Color.Yellow;
+		private readonly static Color SuccessColor = Color.Lime;
+		private readonly static Color FailureColor = Color.Red;
+		private readonly static Color IgnoredColor = Color.Yellow;
 
 		public TestProgressBar()
 		{
@@ -350,22 +342,30 @@ namespace NUnit.UiKit
 
 		private void Initialize( int testCount )
 		{
-			ForeColor = SuccessColor;
 			Value = 0;
 			Maximum = testCount;
-		}
+            ForeColor = SuccessColor;
+        }
 
 		private void OnRunStarting( object Sender, TestEventArgs e )
 		{
 			Initialize( e.TestCount );
 		}
 
-		private void OnLoadComplete( object sender, TestEventArgs e )
-		{
-			Initialize( e.TestCount );
-		}
+        private void OnTestLoaded(object sender, TestEventArgs e)
+        {
+            Initialize(e.TestCount);
+        }
+
+        private void OnTestReloaded(object sender, TestEventArgs e)
+        {
+            if (Services.UserSettings.GetSetting("Options.TestLoader.ClearResultsOnReload", false))
+                Initialize(e.TestCount);
+            else
+                Value = Maximum = e.TestCount;
+        }
 
-		private void OnUnloadComplete( object sender, TestEventArgs e )
+        private void OnTestUnloaded(object sender, TestEventArgs e)
 		{
 			Initialize( 100 );
 		}
@@ -374,26 +374,35 @@ namespace NUnit.UiKit
 		{
 			PerformStep();
 
-			switch (e.Result.RunState)
-			{
-				case RunState.Executed:
-					if (e.Result.IsFailure)
-						ForeColor = FailureColor;
-					break;
-				case RunState.Ignored:
-					if (ForeColor == SuccessColor)
-						ForeColor = IgnoredColor;
-					break;
-				default:
-					break;
-			}
-		}
+            switch (e.Result.ResultState)
+            {
+                case ResultState.NotRunnable:
+                case ResultState.Failure:
+                case ResultState.Error:
+                case ResultState.Cancelled:
+                    ForeColor = FailureColor;
+                    break;
+                case ResultState.Ignored:
+                    if (ForeColor == SuccessColor)
+                        ForeColor = IgnoredColor;
+                    break;
+                default:
+                    break;
+            }
+        }
 
 		private void OnSuiteFinished( object sender, TestEventArgs e )
 		{
 			TestResult result = e.Result;
-			if ( result.RunState == RunState.Executed && result.IsFailure && result.FailureSite == FailureSite.TearDown )
-				ForeColor = FailureColor;
+            if ( result.FailureSite == FailureSite.TearDown )
+                switch (result.ResultState)
+                {
+                    case ResultState.Error:
+                    case ResultState.Failure:
+                    case ResultState.Cancelled:
+                        ForeColor = FailureColor;
+                        break;
+                }
 		}
 
 		private void OnTestException(object sender, TestEventArgs e)
@@ -405,9 +414,9 @@ namespace NUnit.UiKit
 
 		public void Subscribe(ITestEvents events)
 		{
-			events.TestLoaded	+= new TestEventHandler( OnLoadComplete );
-			events.TestReloaded	+= new TestEventHandler( OnLoadComplete );
-			events.TestUnloaded	+= new TestEventHandler( OnUnloadComplete );
+			events.TestLoaded	+= new TestEventHandler( OnTestLoaded );
+            events.TestReloaded += new TestEventHandler(OnTestReloaded);
+			events.TestUnloaded	+= new TestEventHandler( OnTestUnloaded );
 			events.RunStarting	+= new TestEventHandler( OnRunStarting );
 			events.TestFinished	+= new TestEventHandler( OnTestFinished );
 			events.SuiteFinished += new TestEventHandler( OnSuiteFinished );
diff --git a/src/GuiComponents/UiKit/ProgressDisplay.cs.txt b/src/GuiComponents/UiKit/ProgressDisplay.cs.txt
deleted file mode 100644
index b15025a..0000000
--- a/src/GuiComponents/UiKit/ProgressDisplay.cs.txt
+++ /dev/null
@@ -1,359 +0,0 @@
-using System;
-using System.Collections;
-using System.ComponentModel;
-using System.Drawing;
-using System.Data;
-using System.Windows.Forms;
-using NUnit.Core;
-using NUnit.Util;
-
-#if XXXX
-namespace NUnit.UiKit
-{
-	/// <summary>
-	/// Summary description for ProgressBar2.
-	/// </summary>
-	public class ProgressDisplay : System.Windows.Forms.UserControl, TestObserver
-	{
-		private System.Windows.Forms.ProgressBar progressBar;
-		#region Instance Variables
-		/// <summary> 
-		/// Required designer variable.
-		/// </summary>
-		private System.ComponentModel.Container components = null;
-
-		private int fValue = 0;
-		private int fmin = 0;
-		private int fmax = 100;
-		private int fStep = 1;
-		private Color fBarColor = SystemColors.ControlText;
-		
-		private float FMaxSegmentCount=0;
-		private int fSegmentWidth=0;
-		private int fLastSegmentCount=0;
-
-		private Brush BarBrush = null;
-		private Brush NotBarBrush = null;
-
-		#endregion
-
-		#region Construction and Disposal
-		public ProgressDisplay()
-		{
-			// This call is required by the Windows.Forms Form Designer.
-			InitializeComponent();
-
-			// TODO: Add any initialization after the InitializeComponent call
-
-		}
-
-		/// <summary> 
-		/// Clean up any resources being used.
-		/// </summary>
-		protected override void Dispose( bool disposing )
-		{
-			if( disposing )
-			{
-				if(components != null)
-				{
-					components.Dispose();
-				}
-			}
-			base.Dispose( disposing );
-		}
-		#endregion
-
-		#region Properties
-		
-		[Category("Behavior")]
-		public int Minimum
-		{
-			get { return this.fmin; }
-			set
-			{
-				if (value <= Maximum) 
-				{
-					if (this.fmin != value) 
-					{
-						this.fmin = value;
-						this.PaintBar();
-					}
-				}
-				else
-				{
-					throw new ArgumentOutOfRangeException("Minimum", value
-						,"Minimum must be <= Maximum.");
-				}
-			}
-		}
-
-		[Category("Behavior")]
-		public int Maximum 
-		{
-			get	{ return this.fmax; }
-			set
-			{
-				if (value >= Minimum) 
-				{
-					if (this.fmax != value) 
-					{
-						this.fmax = value;
-						this.PaintBar();
-					}
-				}
-				else
-				{
-					throw new ArgumentOutOfRangeException("Maximum", value
-						,"Maximum must be >= Minimum.");
-				}
-			}
-		}
-
-		[Category("Behavior")]
-		public int Step
-		{
-			get	{ return this.fStep; }
-			set
-			{
-				if (value <= Maximum && value >= Minimum) 
-				{
-					this.fStep = value;
-				}
-				else
-				{
-					throw new ArgumentOutOfRangeException("Step", value
-						,"Must fall between Minimum and Maximum inclusive.");
-				}
-			}
-		}
-		
-		[Browsable(false)]
-		private float PercentValue
-		{
-			get
-			{
-				if (0 != Maximum - Minimum) // NRG 05/28/03: Prevent divide by zero
-					return((float)this.fValue / ((float)Maximum - (float)Minimum));
-				else
-					return(0);
-			}
-		}	
-
-		[Category("Behavior")]
-		public int Value 
-		{
-			get { return this.fValue; }
-			set 
-			{
-				if(value == this.fValue)
-					return;
-				else if(value <= Maximum && value >= Minimum)
-				{
-					this.fValue = value;
-					this.PaintBar();
-				}
-				else
-				{
-					throw new ArgumentOutOfRangeException("Value", value
-						,"Must fall between Minimum and Maximum inclusive.");
-				}
-			}
-		}
-
-		#endregion
-
-		#region Methods
-
-		private void Initialize( int testCount )
-		{
-			progressBar.ForeColor = Color.Lime;
-			Value = 0;
-			Maximum = testCount;
-		}
-
-		protected override void OnCreateControl()
-		{
-		}
-
-		public void PerformStep()
-		{
-			int newValue = Value + Step;
-
-			if( newValue > Maximum )
-				newValue = Maximum;
-
-			Value = newValue;
-		}
-
-		private void OnRunStarting( object Sender, TestEventArgs e )
-		{
-			Initialize( e.TestCount );
-		}
-
-		private void OnLoadComplete( object sender, TestEventArgs e )
-		{
-			Initialize( e.TestCount );
-		}
-
-		private void OnUnloadComplete( object sender, TestEventArgs e )
-		{
-			Initialize( 100 );
-		}
-
-		private void OnTestFinished( object sender, TestEventArgs e )
-		{
-			PerformStep();
-
-			switch (e.Result.RunState)
-			{
-				case RunState.Executed:
-					if (e.Result.IsFailure)
-						progressBar.ForeColor = Color.Red;
-					break;
-				case RunState.Ignored:
-					if (progressBar.ForeColor == Color.Lime)
-						progressBar.ForeColor = Color.Yellow;
-					break;
-				default:
-					break;
-			}
-		}
-
-		private void OnTestException(object senderk, TestEventArgs e)
-		{
-			progressBar.ForeColor = Color.Red;
-		}
-
-		protected override void OnResize(System.EventArgs e)
-		{
-			base.OnResize(e);
-			this.fSegmentWidth = (int)((float)ClientRectangle.Height*.66f);
-			this.FMaxSegmentCount = ((float)(ClientRectangle.Width - 5))
-				/((float)fSegmentWidth);
-		}
-
-		protected override void OnBackColorChanged(System.EventArgs e)
-		{
-			base.OnBackColorChanged(e);
-			this.Refresh();
-		}
-		protected override void OnForeColorChanged(System.EventArgs e)
-		{
-			base.OnForeColorChanged(e);
-			this.Refresh();
-		}
-		
-		protected override void OnPaint(PaintEventArgs e)
-		{
-			base.OnPaint(e);
-			this.fLastSegmentCount=0;
-			this.ReleaseDrawers();
-			PaintBar(e.Graphics);
-			ControlPaint.DrawBorder3D(
-				e.Graphics
-				,this.ClientRectangle
-				,Border3DStyle.SunkenOuter);
-			//e.Graphics.Flush();
-		}
-
-		private void ReleaseDrawers()
-		{
-			if(BarBrush != null)
-			{
-				BarBrush.Dispose();
-				NotBarBrush.Dispose();
-				BarBrush=null;
-				NotBarBrush=null;
-			}
-		}
-
-		private void AcquireDrawers()
-		{
-			if(BarBrush == null)
-			{
-				BarBrush = new SolidBrush(this.ForeColor);
-				NotBarBrush = new SolidBrush(this.BackColor);
-			}
-		}
-
-		private void PaintBar()
-		{
-			using(Graphics g = this.CreateGraphics())
-			{
-				this.PaintBar(g);
-			}
-		}
-		
-		private void PaintBar(Graphics g)
-		{
-			Rectangle Bar = Rectangle.Inflate(ClientRectangle, -2, -2);
-			int maxRight = Bar.Right-1;
-			//int maxRight = Bar.Right;
-			int newSegmentCount = (int)System.Math.Ceiling(PercentValue*FMaxSegmentCount);
-			this.AcquireDrawers();
-			if(newSegmentCount > fLastSegmentCount)
-			{
-				Bar.X += fLastSegmentCount*fSegmentWidth;
-				while (fLastSegmentCount < newSegmentCount )
-				{
-					Bar.Width = System.Math.Min(maxRight-Bar.X,fSegmentWidth-2);
-					g.FillRectangle(BarBrush, Bar);
-					Bar.X+=fSegmentWidth;
-					fLastSegmentCount++;
-				}
-			}
-			else if(newSegmentCount < fLastSegmentCount)
-			{
-				Bar.X += newSegmentCount*fSegmentWidth;
-				Bar.Width = maxRight-Bar.X;
-				g.FillRectangle(NotBarBrush, Bar);
-				fLastSegmentCount = newSegmentCount;
-			}
-			if(Value == Minimum || Value == Maximum)
-				this.ReleaseDrawers();
-		}
-
-		#endregion
-
-		#region Component Designer generated code
-		/// <summary> 
-		/// Required method for Designer support - do not modify 
-		/// the contents of this method with the code editor.
-		/// </summary>
-		private void InitializeComponent()
-		{
-			this.progressBar = new System.Windows.Forms.ProgressBar();
-			this.SuspendLayout();
-			// 
-			// progressBar
-			// 
-			this.progressBar.Dock = System.Windows.Forms.DockStyle.Fill;
-			this.progressBar.Location = new System.Drawing.Point(0, 0);
-			this.progressBar.Name = "progressBar";
-			this.progressBar.Size = new System.Drawing.Size(368, 40);
-			this.progressBar.TabIndex = 0;
-			// 
-			// ProgressBar2
-			// 
-			this.Controls.Add(this.progressBar);
-			this.Name = "ProgressBar2";
-			this.Size = new System.Drawing.Size(368, 40);
-			this.ResumeLayout(false);
-
-		}
-		#endregion
-
-		#region TestObserver Members
-		public void Subscribe(ITestEvents events)
-		{
-			events.TestLoaded	+= new TestEventHandler( OnLoadComplete );
-			events.TestReloaded	+= new TestEventHandler( OnLoadComplete );
-			events.TestUnloaded	+= new TestEventHandler( OnUnloadComplete );
-			events.RunStarting	+= new TestEventHandler( OnRunStarting );
-			events.TestFinished	+= new TestEventHandler( OnTestFinished );
-			events.TestException += new TestEventHandler(OnTestException);
-		}
-		#endregion
-	}
-}
-#endif
diff --git a/src/GuiComponents/UiKit/ProgressDisplay.resx.txt b/src/GuiComponents/UiKit/ProgressDisplay.resx.txt
deleted file mode 100644
index c847acd..0000000
--- a/src/GuiComponents/UiKit/ProgressDisplay.resx.txt
+++ /dev/null
@@ -1,139 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 1.3
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">1.3</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1">this is my long string</data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        [base64 mime encoded serialized .NET Framework object]
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        [base64 mime encoded string representing a byte array form of the .NET Framework object]
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used forserialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>1.3</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <data name="progressBar.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="progressBar.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="progressBar.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>80</value>
-  </data>
-  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>(Default)</value>
-  </data>
-  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.Name">
-    <value>ProgressBar2</value>
-  </data>
-  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-</root>
\ No newline at end of file
diff --git a/src/GuiComponents/UiKit/RecentFileMenuHandler.cs b/src/GuiComponents/UiKit/RecentFileMenuHandler.cs
index 3f50416..02228af 100644
--- a/src/GuiComponents/UiKit/RecentFileMenuHandler.cs
+++ b/src/GuiComponents/UiKit/RecentFileMenuHandler.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -15,7 +15,7 @@ namespace NUnit.UiKit
 	{
 		private MenuItem menu;
 		private RecentFiles recentFiles;
-        private bool showMissingFiles = false;
+        private bool checkFilesExist = true;
 		private bool showNonRunnableFiles = false;
 
 		public RecentFileMenuHandler( MenuItem menu, RecentFiles recentFiles )
@@ -24,10 +24,10 @@ namespace NUnit.UiKit
 			this.recentFiles = recentFiles;
 		}
 
-		public bool ShowMissingFiles
+		public bool CheckFilesExist
 		{
-			get { return showMissingFiles; }
-			set { showMissingFiles = value; }
+			get { return checkFilesExist; }
+			set { checkFilesExist = value; }
 		}
 
 		public bool ShowNonRunnableFiles
@@ -61,7 +61,7 @@ namespace NUnit.UiKit
                     // new recent files are opened, they will be pushed down and
                     // eventually fall off the list unless the file is re-created
 					// and subsequently opened.
-                    if ( showMissingFiles || entry.Exists )
+                    if ( !checkFilesExist || entry.Exists )
                     {
 						// NOTE: In the current version, all the files listed should
 						// have a compatible version, since we are using separate
diff --git a/src/GuiComponents/UiKit/Red.jpg b/src/GuiComponents/UiKit/Red.jpg
deleted file mode 100644
index ecb022f..0000000
Binary files a/src/GuiComponents/UiKit/Red.jpg and /dev/null differ
diff --git a/src/GuiComponents/UiKit/RenameConfigurationDialog.cs b/src/GuiComponents/UiKit/RenameConfigurationDialog.cs
index 2e3a67b..8018c5e 100644
--- a/src/GuiComponents/UiKit/RenameConfigurationDialog.cs
+++ b/src/GuiComponents/UiKit/RenameConfigurationDialog.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -14,8 +14,11 @@ using NUnit.Util;
 namespace NUnit.UiKit
 {
 	/// <summary>
-	/// Summary description for AssemblyNameDialog.
-	/// </summary>
+    /// Displays a dialog for entry of a new name for an
+    /// existing configuration. This dialog collects and
+    /// validates the name. The caller is responsible for
+    /// actually renaming the cofiguration.
+    /// </summary>
 	public class RenameConfigurationDialog : System.Windows.Forms.Form
 	{
 		#region Instance Variables
@@ -115,7 +118,6 @@ namespace NUnit.UiKit
 			// RenameConfigurationDialog
 			// 
 			this.AcceptButton = this.okButton;
-			this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);
 			this.CancelButton = this.cancelButton;
 			this.ClientSize = new System.Drawing.Size(291, 79);
 			this.Controls.Add(this.cancelButton);
diff --git a/src/GuiComponents/UiKit/ResultTabs.cs b/src/GuiComponents/UiKit/ResultTabs.cs
index 958d8f3..c61c8dd 100644
--- a/src/GuiComponents/UiKit/ResultTabs.cs
+++ b/src/GuiComponents/UiKit/ResultTabs.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -22,6 +22,8 @@ namespace NUnit.UiKit
 	/// </summary>
 	public class ResultTabs : System.Windows.Forms.UserControl, TestObserver
 	{
+		static Logger log = InternalTrace.GetLogger(typeof(ResultTabs));
+
 		private ISettings settings;
 		private bool updating = false;
 		private TextDisplayController displayController;
@@ -125,8 +127,6 @@ namespace NUnit.UiKit
 			this.tabControl.Controls.Add(this.errorTab);
 			this.tabControl.Controls.Add(this.notRunTab);
 			this.tabControl.Dock = System.Windows.Forms.DockStyle.Fill;
-			this.tabControl.ForeColor = System.Drawing.Color.Red;
-			this.tabControl.ItemSize = new System.Drawing.Size(99, 18);
 			this.tabControl.Location = new System.Drawing.Point(0, 0);
 			this.tabControl.Name = "tabControl";
 			this.tabControl.SelectedIndex = 0;
@@ -168,7 +168,6 @@ namespace NUnit.UiKit
 			this.notRunTree.Dock = System.Windows.Forms.DockStyle.Fill;
 			this.notRunTree.ImageIndex = -1;
 			this.notRunTree.Indent = 19;
-			this.notRunTree.ItemHeight = 16;
 			this.notRunTree.Location = new System.Drawing.Point(0, 0);
 			this.notRunTree.Name = "notRunTree";
 			this.notRunTree.SelectedImageIndex = -1;
@@ -215,7 +214,6 @@ namespace NUnit.UiKit
 
 				UpdateTabPages();
 
-				UpdateFixedFont();
 				Subscribe( Services.TestLoader.Events );
 				Services.UserSettings.Changed += new SettingsEventHandler(UserSettings_Changed);
 
@@ -234,7 +232,7 @@ namespace NUnit.UiKit
 			errorsTabMenuItem.Checked = settings.GetSetting( "Gui.ResultTabs.DisplayErrorsTab", true );
 			notRunTabMenuItem.Checked = settings.GetSetting( "Gui.ResultTabs.DisplayNotRunTab", true );
 
-			NTrace.Debug( "Updating tab pages" );
+			log.Debug( "Updating tab pages" );
 			updating = true;
 			
 			tabControl.TabPages.Clear();
@@ -251,29 +249,12 @@ namespace NUnit.UiKit
 			updating = false;
 		}
 
-		private void UpdateFixedFont()
-		{
-			Font fixedFont = null;
-			string fontDescription = settings.GetSetting( "Gui.FixedFont", "" );
-			if ( fontDescription == "" )
-			{
-				fixedFont = new Font( "Courier New", 8.0f );
-			}
-			else
-			{
-				TypeConverter converter = TypeDescriptor.GetConverter(typeof(Font));
-				fixedFont = (Font)converter.ConvertFrom(fontDescription);
-			}
-		}
-
 		private void UserSettings_Changed( object sender, SettingsEventArgs e )
 		{
 			if( e.SettingName.StartsWith( "Gui.ResultTabs.Display" ) ||
 				e.SettingName == "Gui.TextOutput.TabList" || 
 				e.SettingName.StartsWith( "Gui.TextOut" ) && e.SettingName.EndsWith( "Enabled" ) )
 					UpdateTabPages();
-			else if ( e.SettingName == "Gui.FixedFont" )
-				UpdateFixedFont();
 		}
 
 		private void errorsTabMenuItem_Click(object sender, System.EventArgs e)
@@ -352,6 +333,13 @@ namespace NUnit.UiKit
 				font.Dispose();
 		}
 
+        protected override void OnFontChanged(EventArgs e)
+        {
+            base.OnFontChanged(e);
+
+            tabControl.ItemSize = new Size(tabControl.ItemSize.Width, this.Font.Height + 7);
+        }
+
 		private class TextDisplayController : TestObserver
 		{
 			private TabControl tabControl;
@@ -375,6 +363,7 @@ namespace NUnit.UiKit
 				tabSettings.LoadSettings();
 				ArrayList oldPages = tabPages;
 				tabPages = new ArrayList();
+				Font displayFont = GetFixedFont();
 
 				foreach( TextDisplayTabSettings.TabInfo tabInfo in tabSettings.Tabs )
 				{
@@ -391,6 +380,8 @@ namespace NUnit.UiKit
 						if ( thePage == null )
 							thePage = new TextDisplayTabPage( tabInfo );
 
+						thePage.DisplayFont = displayFont;
+
 						tabPages.Add( thePage );
 						tabControl.TabPages.Add( thePage );
 					}
@@ -402,6 +393,13 @@ namespace NUnit.UiKit
 				string settingName = args.SettingName; 
 				string prefix = "Gui.TextOutput.";
 
+				if ( settingName == "Gui.FixedFont" )
+				{
+					Font displayFont = GetFixedFont();
+					foreach( TextDisplayTabPage page in tabPages )
+						page.DisplayFont = displayFont;
+				}
+				else
 				if ( settingName.StartsWith( prefix ) )
 				{
 					string fieldName = settingName.Substring( prefix.Length );
@@ -428,6 +426,15 @@ namespace NUnit.UiKit
 				}
 			}
 
+			private static Font GetFixedFont()
+			{
+				ISettings settings = Services.UserSettings;
+
+				return settings == null 
+                    ? new Font(FontFamily.GenericMonospace, 8.0f) 
+                    : settings.GetSetting("Gui.FixedFont", new Font(FontFamily.GenericMonospace, 8.0f));
+			}
+
 			#region TestObserver Members
 			public void Subscribe(ITestEvents events)
 			{
diff --git a/src/GuiComponents/UiKit/RichEditTabPage.cs b/src/GuiComponents/UiKit/RichEditTabPage.cs
deleted file mode 100644
index 686ac6c..0000000
--- a/src/GuiComponents/UiKit/RichEditTabPage.cs
+++ /dev/null
@@ -1,42 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-using System.IO;
-using System.Windows.Forms;
-
-namespace NUnit.UiKit
-{
-	/// <summary>
-	/// Summary description for RichEditTabPage.
-	/// </summary>
-	public class RichEditTabPage : TabPage
-	{
-		private RichTextBox textBox;
-		private TextBoxWriter writer;
-
-		public RichEditTabPage()
-		{
-			this.textBox = new RichTextBox();
-			this.textBox.Multiline = true;
-			this.textBox.Dock = DockStyle.Fill;
-
-			this.Controls.Add( textBox );
-
-			this.writer = new TextBoxWriter( textBox );
-		}
-
-		public TextWriter Writer
-		{
-			get { return writer; }
-		}
-
-		public void Clear()
-		{
-			this.textBox.Clear();
-		}
-	}
-}
diff --git a/src/GuiComponents/UiKit/RichEditTabPage.resx b/src/GuiComponents/UiKit/RichEditTabPage.resx
deleted file mode 100644
index 6af1353..0000000
--- a/src/GuiComponents/UiKit/RichEditTabPage.resx
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<root>
-	<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-		<xsd:element name="root" msdata:IsDataSet="true">
-			<xsd:complexType>
-				<xsd:choice maxOccurs="unbounded">
-					<xsd:element name="data">
-						<xsd:complexType>
-							<xsd:sequence>
-								<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-								<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-							</xsd:sequence>
-							<xsd:attribute name="name" type="xsd:string" />
-							<xsd:attribute name="type" type="xsd:string" />
-							<xsd:attribute name="mimetype" type="xsd:string" />
-						</xsd:complexType>
-					</xsd:element>
-					<xsd:element name="resheader">
-						<xsd:complexType>
-							<xsd:sequence>
-								<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-							</xsd:sequence>
-							<xsd:attribute name="name" type="xsd:string" use="required" />
-						</xsd:complexType>
-					</xsd:element>
-				</xsd:choice>
-			</xsd:complexType>
-		</xsd:element>
-	</xsd:schema>
-	<resheader name="ResMimeType">
-		<value>text/microsoft-resx</value>
-	</resheader>
-	<resheader name="Version">
-		<value>1.0.0.0</value>
-	</resheader>
-	<resheader name="Reader">
-		<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-	</resheader>
-	<resheader name="Writer">
-		<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-	</resheader>
-</root>
diff --git a/src/GuiComponents/UiKit/SavedResultTabs.cs b/src/GuiComponents/UiKit/SavedResultTabs.cs
deleted file mode 100644
index b0d757e..0000000
--- a/src/GuiComponents/UiKit/SavedResultTabs.cs
+++ /dev/null
@@ -1,523 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.ComponentModel;
-using System.Drawing;
-using System.Data;
-using System.Windows.Forms;
-using NUnit.Util;
-using NUnit.Core;
-using CP.Windows.Forms;
-using System.Diagnostics;
-
-namespace NUnit.UiKit
-{
-	/// <summary>
-	/// Summary description for ResultTabs.
-	/// </summary>
-	public class ResultTabs : System.Windows.Forms.UserControl, TestObserver
-	{
-		private ISettings settings;
-		private TraceListener traceListener;
-		private bool updating = false;
-
-		private MenuItem tabsMenu;
-		private MenuItem errorsTabMenuItem;
-		private MenuItem notRunTabMenuItem;
-		private MenuItem consoleOutMenuItem;
-		private MenuItem consoleErrorMenuItem;
-		private MenuItem traceTabMenuItem;
-		private MenuItem loggingTabMenuItem;
-		private MenuItem menuSeparator;
-		private MenuItem internalTraceTabMenuItem;
-
-		private System.Windows.Forms.TabPage errorTab;
-		private NUnit.UiKit.ErrorDisplay errorDisplay;
-		private NUnit.UiKit.TextDisplayTabPage stdoutTab;
-		private NUnit.UiKit.TextDisplayTabPage traceTab;
-		private NUnit.UiKit.TextDisplayTabPage loggingTab;
-		private NUnit.UiKit.TextDisplayTabPage internalTraceTab;
-		private NUnit.UiKit.TextDisplayTabPage stderrTab;
-		private System.Windows.Forms.TabPage notRunTab;
-		private NUnit.UiKit.NotRunTree notRunTree;
-		private System.Windows.Forms.TabControl tabControl;
-		private System.Windows.Forms.MenuItem copyDetailMenuItem;
-		/// <summary> 
-		/// Required designer variable.
-		/// </summary>
-		private System.ComponentModel.Container components = null;
-
-		public ResultTabs()
-		{
-			// This call is required by the Windows.Forms Form Designer.
-			InitializeComponent();
-
-			this.tabsMenu = new MenuItem();
-			this.errorsTabMenuItem = new System.Windows.Forms.MenuItem();
-			this.notRunTabMenuItem = new System.Windows.Forms.MenuItem();
-			this.consoleOutMenuItem = new System.Windows.Forms.MenuItem();
-			this.consoleErrorMenuItem = new System.Windows.Forms.MenuItem();
-			this.traceTabMenuItem = new System.Windows.Forms.MenuItem();
-			this.loggingTabMenuItem = new System.Windows.Forms.MenuItem();
-			this.menuSeparator = new System.Windows.Forms.MenuItem();
-			this.internalTraceTabMenuItem = new System.Windows.Forms.MenuItem();
-
-			this.tabsMenu.MergeType = MenuMerge.Add;
-			this.tabsMenu.MergeOrder = 1;
-			this.tabsMenu.MenuItems.AddRange(
-				new System.Windows.Forms.MenuItem[] 
-				{
-					this.errorsTabMenuItem,
-					this.notRunTabMenuItem,
-					this.consoleOutMenuItem,
-					this.consoleErrorMenuItem,
-					this.traceTabMenuItem,
-					this.loggingTabMenuItem,
-					this.menuSeparator,
-					this.internalTraceTabMenuItem
-				} );
-			this.tabsMenu.Text = "&Result Tabs";
-			this.tabsMenu.Visible = true;
-
-			this.errorsTabMenuItem.Index = 0;
-			this.errorsTabMenuItem.Text = "&Errors && Failures";
-			this.errorsTabMenuItem.Click += new System.EventHandler(this.errorsTabMenuItem_Click);
-
-			this.notRunTabMenuItem.Index = 1;
-			this.notRunTabMenuItem.Text = "Tests &Not Run";
-			this.notRunTabMenuItem.Click += new System.EventHandler(this.notRunTabMenuItem_Click);
-
-			this.consoleOutMenuItem.Index = 2;
-			this.consoleOutMenuItem.Text = "Console.&Out";
-			this.consoleOutMenuItem.Click += new System.EventHandler(this.consoleOutMenuItem_Click);
-
-			this.consoleErrorMenuItem.Index = 3;
-			this.consoleErrorMenuItem.Text = "Console.&Error";
-			this.consoleErrorMenuItem.Click += new System.EventHandler(this.consoleErrorMenuItem_Click);
-
-			this.traceTabMenuItem.Index = 4;
-			this.traceTabMenuItem.Text = "&Trace Output";
-			this.traceTabMenuItem.Click += new System.EventHandler(this.traceTabMenuItem_Click);
-
-			this.loggingTabMenuItem.Index = 5;
-			this.loggingTabMenuItem.Text = "&Log Output";
-			this.loggingTabMenuItem.Click += new System.EventHandler(this.loggingTabMenuItem_Click);
-
-			this.menuSeparator.Index = 6;
-			this.menuSeparator.Text = "-";
-			
-			this.internalTraceTabMenuItem.Index = 7;
-			this.internalTraceTabMenuItem.Text = "&Internal Trace";
-			this.internalTraceTabMenuItem.Click += new System.EventHandler(this.internalTraceTabMenuItem_Click);
-
-//			this.traceListener = new TextWriterTraceListener( this.internalTraceTab.Writer, "Internal" );
-//			System.Diagnostics.Trace.Listeners.Add( this.traceListener );
-		}
-
-		/// <summary> 
-		/// Clean up any resources being used.
-		/// </summary>
-		protected override void Dispose( bool disposing )
-		{
-			if( disposing )
-			{
-				if(components != null)
-				{
-					components.Dispose();
-				}
-			}
-			base.Dispose( disposing );
-		}
-
-		#region Component Designer generated code
-		/// <summary> 
-		/// Required method for Designer support - do not modify 
-		/// the contents of this method with the code editor.
-		/// </summary>
-		private void InitializeComponent()
-		{
-			this.tabControl = new System.Windows.Forms.TabControl();
-			this.errorTab = new System.Windows.Forms.TabPage();
-			this.errorDisplay = new NUnit.UiKit.ErrorDisplay();
-			this.stdoutTab = new NUnit.UiKit.TextDisplayTabPage();
-			this.loggingTab = new NUnit.UiKit.TextDisplayTabPage();
-			this.traceTab = new NUnit.UiKit.TextDisplayTabPage();
-			this.notRunTab = new System.Windows.Forms.TabPage();
-			this.notRunTree = new NUnit.UiKit.NotRunTree();
-			this.stderrTab = new NUnit.UiKit.TextDisplayTabPage();
-			this.internalTraceTab = new NUnit.UiKit.TextDisplayTabPage();
-			this.copyDetailMenuItem = new System.Windows.Forms.MenuItem();
-			this.tabControl.SuspendLayout();
-			this.errorTab.SuspendLayout();
-			this.notRunTab.SuspendLayout();
-			this.SuspendLayout();
-			// 
-			// tabControl
-			// 
-			this.tabControl.Alignment = System.Windows.Forms.TabAlignment.Bottom;
-			this.tabControl.Controls.Add(this.errorTab);
-			this.tabControl.Controls.Add(this.stdoutTab);
-			this.tabControl.Controls.Add(this.stderrTab);
-			this.tabControl.Controls.Add(this.traceTab);
-			this.tabControl.Controls.Add(this.notRunTab);
-			this.tabControl.Controls.Add(this.loggingTab);
-			this.tabControl.Controls.Add(this.internalTraceTab);
-			this.tabControl.Dock = System.Windows.Forms.DockStyle.Fill;
-			this.tabControl.ForeColor = System.Drawing.Color.Red;
-			this.tabControl.ItemSize = new System.Drawing.Size(99, 18);
-			this.tabControl.Location = new System.Drawing.Point(0, 0);
-			this.tabControl.Name = "tabControl";
-			this.tabControl.SelectedIndex = 0;
-			this.tabControl.Size = new System.Drawing.Size(488, 280);
-			this.tabControl.TabIndex = 3;
-			this.tabControl.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.tabControl_DrawItem);
-			this.tabControl.SelectedIndexChanged += new System.EventHandler(this.tabControl_SelectedIndexChanged);
-			// 
-			// errorTab
-			// 
-			this.errorTab.Controls.Add(this.errorDisplay);
-			this.errorTab.ForeColor = System.Drawing.SystemColors.ControlText;
-			this.errorTab.Location = new System.Drawing.Point(4, 4);
-			this.errorTab.Name = "errorTab";
-			this.errorTab.Size = new System.Drawing.Size(480, 254);
-			this.errorTab.TabIndex = 0;
-			this.errorTab.Text = "Errors and Failures";
-			// 
-			// errorDisplay
-			// 
-			this.errorDisplay.Dock = System.Windows.Forms.DockStyle.Fill;
-			this.errorDisplay.Location = new System.Drawing.Point(0, 0);
-			this.errorDisplay.Name = "errorDisplay";
-			this.errorDisplay.Size = new System.Drawing.Size(480, 254);
-			this.errorDisplay.TabIndex = 0;
-			// 
-			// stdoutTab
-			// 
-			this.stdoutTab.Font = new System.Drawing.Font("Courier New", 8F);
-			this.stdoutTab.ForeColor = System.Drawing.SystemColors.ControlText;
-			this.stdoutTab.Location = new System.Drawing.Point(4, 4);
-			this.stdoutTab.Name = "stdoutTab";
-			this.stdoutTab.Size = new System.Drawing.Size(480, 254);
-			this.stdoutTab.TabIndex = 3;
-			this.stdoutTab.Text = "Console.Out";
-			this.stdoutTab.Visible = false;
-			// 
-			// loggingTab
-			// 
-			this.loggingTab.Location = new System.Drawing.Point(4, 4);
-			this.loggingTab.Name = "loggingTab";
-			this.loggingTab.Size = new System.Drawing.Size(480, 254);
-			this.loggingTab.TabIndex = 6;
-			this.loggingTab.Text = "Log Output";
-			// 
-			// traceTab
-			// 
-			this.traceTab.Font = new System.Drawing.Font("Courier New", 8F);
-			this.traceTab.ForeColor = System.Drawing.SystemColors.ControlText;
-			this.traceTab.Location = new System.Drawing.Point(4, 4);
-			this.traceTab.Name = "traceTab";
-			this.traceTab.Size = new System.Drawing.Size(480, 254);
-			this.traceTab.TabIndex = 4;
-			this.traceTab.Text = "Trace Output";
-			this.traceTab.Visible = false;
-			// 
-			// notRunTab
-			// 
-			this.notRunTab.Controls.Add(this.notRunTree);
-			this.notRunTab.ForeColor = System.Drawing.SystemColors.ControlText;
-			this.notRunTab.Location = new System.Drawing.Point(4, 4);
-			this.notRunTab.Name = "notRunTab";
-			this.notRunTab.Size = new System.Drawing.Size(480, 254);
-			this.notRunTab.TabIndex = 1;
-			this.notRunTab.Text = "Tests Not Run";
-			this.notRunTab.Visible = false;
-			// 
-			// notRunTree
-			// 
-			this.notRunTree.Dock = System.Windows.Forms.DockStyle.Fill;
-			this.notRunTree.ImageIndex = -1;
-			this.notRunTree.Indent = 19;
-			this.notRunTree.ItemHeight = 16;
-			this.notRunTree.Location = new System.Drawing.Point(0, 0);
-			this.notRunTree.Name = "notRunTree";
-			this.notRunTree.SelectedImageIndex = -1;
-			this.notRunTree.Size = new System.Drawing.Size(480, 254);
-			this.notRunTree.TabIndex = 0;
-			// 
-			// stderrTab
-			// 
-			this.stderrTab.Font = new System.Drawing.Font("Courier New", 8F);
-			this.stderrTab.ForeColor = System.Drawing.SystemColors.ControlText;
-			this.stderrTab.Location = new System.Drawing.Point(4, 4);
-			this.stderrTab.Name = "stderrTab";
-			this.stderrTab.Size = new System.Drawing.Size(480, 254);
-			this.stderrTab.TabIndex = 2;
-			this.stderrTab.Text = "Console.Error";
-			this.stderrTab.Visible = false;
-			// 
-			// internalTraceTab
-			// 
-			this.internalTraceTab.Font = new System.Drawing.Font("Courier New", 8F);
-			this.internalTraceTab.ForeColor = System.Drawing.SystemColors.ControlText;
-			this.internalTraceTab.Location = new System.Drawing.Point(4, 4);
-			this.internalTraceTab.Name = "internalTraceTab";
-			this.internalTraceTab.Size = new System.Drawing.Size(480, 254);
-			this.internalTraceTab.TabIndex = 5;
-			this.internalTraceTab.Text = "Internal Trace";
-			this.internalTraceTab.Visible = false;
-			// 
-			// copyDetailMenuItem
-			// 
-			this.copyDetailMenuItem.Index = -1;
-			this.copyDetailMenuItem.Text = "Copy";
-			// 
-			// ResultTabs
-			// 
-			this.Controls.Add(this.tabControl);
-			this.Name = "ResultTabs";
-			this.Size = new System.Drawing.Size(488, 280);
-			this.tabControl.ResumeLayout(false);
-			this.errorTab.ResumeLayout(false);
-			this.notRunTab.ResumeLayout(false);
-			this.ResumeLayout(false);
-
-		}
-		#endregion
-	
-		public void Clear()
-		{
-			errorDisplay.Clear();
-			notRunTree.Nodes.Clear();
-
-			stdoutTab.Clear();
-			stderrTab.Clear();
-			traceTab.Clear();
-		}
-
-		public MenuItem TabsMenu
-		{
-			get { return tabsMenu; }
-		}
-
-		protected override void OnLoad(EventArgs e)
-		{
-			if ( !this.DesignMode )
-			{
-				this.settings = Services.UserSettings;
-
-				LoadSettingsAndUpdateTabPages();
-
-				UpdateFixedFont();
-				Subscribe( Services.TestLoader.Events );
-				Services.UserSettings.Changed += new SettingsEventHandler(UserSettings_Changed);
-
-				errorDisplay.Subscribe( Services.TestLoader.Events );
-				notRunTree.Subscribe( Services.TestLoader.Events );
-			}
-
-			base.OnLoad (e);
-		}
-
-		private void LoadSettingsAndUpdateTabPages()
-		{
-			errorsTabMenuItem.Checked = settings.GetSetting( "Gui.ResultTabs.DisplayErrorsTab", true );
-			notRunTabMenuItem.Checked = settings.GetSetting( "Gui.ResultTabs.DisplayNotRunTab", true );
-			consoleOutMenuItem.Checked = settings.GetSetting( "Gui.ResultTabs.DisplayConsoleOutputTab", true );
-			consoleErrorMenuItem.Checked = settings.GetSetting( "Gui.ResultTabs.DisplayConsoleErrorTab", true );
-			traceTabMenuItem.Checked = settings.GetSetting( "Gui.ResultTabs.DisplayTraceTab", true );
-			loggingTabMenuItem.Checked = settings.GetSetting( "Gui.ResultTabs.DisplayTraceTab", true );
-			internalTraceTabMenuItem.Checked = settings.GetSetting( "Gui.ResultTabs.DisplayInternalTraceTab", true );
-
-			UpdateTabPages();
-		}
-
-		private void UpdateFixedFont()
-		{
-			Font fixedFont = null;
-			string fontDescription = settings.GetSetting( "Gui.FixedFont", "" );
-			if ( fontDescription == "" )
-			{
-				fixedFont = new Font( "Courier New", 8.0f );
-			}
-			else
-			{
-				TypeConverter converter = TypeDescriptor.GetConverter(typeof(Font));
-				fixedFont = (Font)converter.ConvertFrom(fontDescription);
-			}
-
-			stdoutTab.Font = stderrTab.Font = traceTab.Font = internalTraceTab.Font = fixedFont;
-		}
-
-		private void UpdateTabPages()
-		{
-			updating = true;
-			tabControl.TabPages.Clear();
-
-			if ( errorsTabMenuItem.Checked )
-				tabControl.TabPages.Add( errorTab );
-			if ( notRunTabMenuItem.Checked )
-				tabControl.TabPages.Add( notRunTab );
-			if ( consoleOutMenuItem.Checked )
-				tabControl.TabPages.Add( stdoutTab );
-			if ( consoleErrorMenuItem.Checked )
-				tabControl.TabPages.Add( stderrTab );
-			if ( traceTabMenuItem.Checked )
-				tabControl.TabPages.Add( traceTab );
-			if ( loggingTabMenuItem.Checked )
-				tabControl.TabPages.Add( loggingTab );
-			if ( internalTraceTabMenuItem.Checked )
-				tabControl.TabPages.Add( internalTraceTab );
-
-			tabControl.SelectedIndex = settings.GetSetting( "Gui.ResultTabs.SelectedTab", 0 );
-
-			updating = false;
-		}
-
-		private void UserSettings_Changed( object sender, SettingsEventArgs e )
-		{
-			if( e.SettingName.StartsWith( "Gui.ResultTabs.Display" )  )
-				LoadSettingsAndUpdateTabPages();
-			else if ( e.SettingName == "Gui.FixedFont" )
-				UpdateFixedFont();
-		}
-
-		private void errorsTabMenuItem_Click(object sender, System.EventArgs e)
-		{
-			settings.SaveSetting( "Gui.ResultTabs.DisplayErrorsTab", errorsTabMenuItem.Checked = !errorsTabMenuItem.Checked );
-		}
-
-		private void notRunTabMenuItem_Click(object sender, System.EventArgs e)
-		{
-			settings.SaveSetting( "Gui.ResultTabs.DisplayNotRunTab", notRunTabMenuItem.Checked = !notRunTabMenuItem.Checked );
-		}
-
-		private void consoleOutMenuItem_Click(object sender, System.EventArgs e)
-		{
-			settings.SaveSetting( "Gui.ResultTabs.DisplayConsoleOutputTab", consoleOutMenuItem.Checked = !consoleOutMenuItem.Checked );
-		}
-
-		private void consoleErrorMenuItem_Click(object sender, System.EventArgs e)
-		{
-			settings.SaveSetting( "Gui.ResultTabs.DisplayConsoleErrorTab", consoleErrorMenuItem.Checked = !consoleErrorMenuItem.Checked );
-		}
-
-		private void traceTabMenuItem_Click(object sender, System.EventArgs e)
-		{
-			settings.SaveSetting( "Gui.ResultTabs.DisplayTraceTab", traceTabMenuItem.Checked = !traceTabMenuItem.Checked );
-		}
-
-		private void loggingTabMenuItem_Click(object sender, System.EventArgs e)
-		{
-			settings.SaveSetting( "Gui.ResultTabs.DisplayLoggingTab", loggingTabMenuItem.Checked = !loggingTabMenuItem.Checked );
-		}
-
-		private void internalTraceTabMenuItem_Click(object sender, System.EventArgs e)
-		{
-			settings.SaveSetting( "Gui.ResultTabs.DisplayInternalTraceTab", internalTraceTabMenuItem.Checked = !internalTraceTabMenuItem.Checked );
-		}
-
-		private void tabControl_SelectedIndexChanged(object sender, System.EventArgs e)
-		{
-			if ( !updating )
-			{
-				int index = tabControl.SelectedIndex;
-				if ( index >=0 && index < tabControl.TabCount )
-					settings.SaveSetting( "Gui.ResultTabs.SelectedTab", index );
-			}
-		}
-
-		#region TestObserver Members
-
-		public void Subscribe(ITestEvents events)
-		{
-			events.TestLoaded += new TestEventHandler(OnTestLoaded);
-			events.TestUnloaded += new TestEventHandler(OnTestUnloaded);
-			events.TestReloaded += new TestEventHandler(OnTestReloaded);
-			events.RunStarting += new TestEventHandler(OnRunStarting);
-			events.TestStarting += new TestEventHandler(OnTestStarting);
-			events.TestOutput += new TestEventHandler(OnTestOutput);
-		}
-
-		private void OnRunStarting(object sender, TestEventArgs args)
-		{
-			this.Clear();
-		}
-
-		private void OnTestStarting(object sender, TestEventArgs args)
-		{
-			if ( settings.GetSetting( "Gui.ResultTabs.DisplayTestLabels", false ) )
-			{
-				//this.stdoutTab.AppendText( string.Format( "***** {0}\n", args.TestName.FullName ) );
-				this.stdoutTab.Writer.WriteLine( "***** {0}", args.TestName.FullName );
-			}
-		}
-
-		private void OnTestLoaded(object sender, TestEventArgs args)
-		{
-			this.Clear();
-		}
-
-		private void OnTestUnloaded(object sender, TestEventArgs args)
-		{
-			this.Clear();
-		}
-		private void OnTestReloaded(object sender, TestEventArgs args)
-		{
-			if ( settings.GetSetting( "Options.TestLoader.ClearResultsOnReload", false ) )
-				this.Clear();
-		}
-
-		private void OnTestOutput(object sender, TestEventArgs args)
-		{
-			TestOutput output = args.TestOutput;
-			switch(output.Type)
-			{
-				case TestOutputType.Out:
-					this.stdoutTab.Writer.Write( output.Text );
-					break;
-				case TestOutputType.Error:
-					if ( settings.GetSetting( "Gui.ResultTabs.MergeErrorOutput", false ) )
-						this.stdoutTab.Writer.Write( output.Text );
-					else
-						this.stderrTab.Writer.Write( output.Text );
-					break;
-				case TestOutputType.Trace:
-					if ( settings.GetSetting( "Gui.ResultTabs.MergeTraceOutput", false ) )
-						this.stdoutTab.Writer.Write( output.Text );
-					else
-						this.traceTab.Writer.Write( output.Text );
-					break;
-				case TestOutputType.Log:
-					this.loggingTab.Writer.Write( output.Text );
-					break;
-			}
-		}
-		#endregion
-
-		private void tabControl_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e)
-		{
-			bool selected = e.Index == tabControl.SelectedIndex;
-
-			Font font = selected ? new Font( e.Font, FontStyle.Bold ) : e.Font;
-			Brush backBrush = new SolidBrush( selected ? SystemColors.Control : SystemColors.Window );
-			Brush foreBrush = new SolidBrush( SystemColors.ControlText );
-
-			e.Graphics.FillRectangle( backBrush, e.Bounds );
-			Rectangle r = e.Bounds;
-			r.Y += 3; r.Height -= 3;
-			StringFormat sf = new StringFormat();
-			sf.Alignment = StringAlignment.Center;
-			e.Graphics.DrawString( tabControl.TabPages[e.Index].Text, font, foreBrush, r, sf );
-
-			foreBrush.Dispose();
-			backBrush.Dispose();
-			if ( selected )
-				font.Dispose();
-		}
-	}
-}
diff --git a/src/GuiComponents/UiKit/SavedResultTabs.resx b/src/GuiComponents/UiKit/SavedResultTabs.resx
deleted file mode 100644
index d955a0c..0000000
--- a/src/GuiComponents/UiKit/SavedResultTabs.resx
+++ /dev/null
@@ -1,298 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 1.3
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">1.3</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1">this is my long string</data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        [base64 mime encoded serialized .NET Framework object]
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        [base64 mime encoded string representing a byte array form of the .NET Framework object]
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used forserialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>1.3</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <data name="tabControl.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="tabControl.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="tabControl.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="tabControl.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="tabControl.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="tabControl.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="errorTab.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="errorTab.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="errorTab.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="errorTab.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="errorTab.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="errorTab.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="errorDisplay.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="errorDisplay.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="errorDisplay.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="stdoutTab.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="stdoutTab.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="stdoutTab.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="stdoutTab.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="stdoutTab.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="stdoutTab.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="loggingTab.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="loggingTab.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="loggingTab.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="loggingTab.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="loggingTab.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="loggingTab.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="traceTab.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="traceTab.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="traceTab.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="traceTab.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="traceTab.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="traceTab.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="notRunTab.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="notRunTab.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="notRunTab.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="notRunTab.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="notRunTab.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="notRunTab.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="notRunTree.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="notRunTree.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="notRunTree.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="stderrTab.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="stderrTab.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="stderrTab.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="stderrTab.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="stderrTab.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="stderrTab.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="internalTraceTab.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="internalTraceTab.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="internalTraceTab.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="internalTraceTab.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="internalTraceTab.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="internalTraceTab.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="copyDetailMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="copyDetailMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>80</value>
-  </data>
-  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>(Default)</value>
-  </data>
-  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.Name">
-    <value>ResultTabs</value>
-  </data>
-  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-</root>
\ No newline at end of file
diff --git a/src/GuiComponents/UiKit/ScrollingTextDisplayForm.cs b/src/GuiComponents/UiKit/ScrollingTextDisplayForm.cs
new file mode 100644
index 0000000..a7f19d5
--- /dev/null
+++ b/src/GuiComponents/UiKit/ScrollingTextDisplayForm.cs
@@ -0,0 +1,147 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Text;
+using System.IO;
+using System.Collections;
+using System.Reflection;
+using System.Windows.Forms;
+using System.Drawing;
+using NUnit.Util;
+using NUnit.Core;
+
+namespace NUnit.UiKit
+{
+    public class ScrollingTextDisplayForm : Form
+    {
+		private System.Windows.Forms.Button okButton;
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.Container components = null;
+		private System.Windows.Forms.RichTextBox textBox;
+        private System.Windows.Forms.Label message;
+
+		public ScrollingTextDisplayForm()
+		{
+			//
+			// Required for Windows Form Designer support
+			//
+			InitializeComponent();
+
+			//
+			// TODO: Add any constructor code after InitializeComponent call
+			//
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if(components != null)
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Windows Form Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			this.okButton = new System.Windows.Forms.Button();
+			this.textBox = new System.Windows.Forms.RichTextBox();
+            this.message = new System.Windows.Forms.Label();
+			this.SuspendLayout();
+			// 
+			// okButton
+			// 
+			this.okButton.Anchor = System.Windows.Forms.AnchorStyles.Bottom;
+			this.okButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+            this.okButton.Location = new System.Drawing.Point(284, 441);
+            this.okButton.Name = "okButton";
+			this.okButton.Size = new System.Drawing.Size(90, 27);
+			this.okButton.TabIndex = 1;
+			this.okButton.Text = "Close";
+			// 
+			// textBox
+			// 
+			this.textBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+				| System.Windows.Forms.AnchorStyles.Left) 
+				| System.Windows.Forms.AnchorStyles.Right)));
+			this.textBox.Location = new System.Drawing.Point(10, 65);
+			this.textBox.Name = "textBox";
+			this.textBox.ReadOnly = true;
+            this.textBox.Size = new System.Drawing.Size(640, 362);
+            this.textBox.TabIndex = 3;
+			this.textBox.Text = "";
+			// 
+			// message
+			// 
+            this.message.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+                | System.Windows.Forms.AnchorStyles.Right)));
+            this.message.Location = new System.Drawing.Point(19, 9);
+            this.message.Name = "message";
+            this.message.Size = new System.Drawing.Size(631, 46);
+            this.message.TabIndex = 2;
+            this.message.Text = "";
+            // 
+			// TestAssemblyInfoForm
+			// 
+            this.ClientSize = new System.Drawing.Size(669, 480);
+            this.Controls.Add(this.textBox);
+            this.Controls.Add(this.message);
+			this.Controls.Add(this.okButton);
+			this.Name = "ScrollingTextDisplayForm";
+			this.Text = "NUnit";
+			this.Resize += new System.EventHandler(this.ScrollingTextDisplayForm_Resize);
+			this.ResumeLayout(false);
+
+		}
+		#endregion
+
+        protected RichTextBox TextBox
+        {
+            get { return textBox; }
+        }
+
+        protected Label Message
+        {
+            get { return message; }
+        }
+
+        protected override void OnLoad(EventArgs e)
+        {
+            base.OnLoad(e);
+
+            SetMessageLabelSize();
+        }
+
+        private void ScrollingTextDisplayForm_Resize(object sender, System.EventArgs e)
+        {
+            SetMessageLabelSize();
+        }
+
+        private void SetMessageLabelSize()
+        {
+            Rectangle rect = message.ClientRectangle;
+            Graphics g = Graphics.FromHwnd(Handle);
+            SizeF sizeNeeded = g.MeasureString(message.Text, message.Font, rect.Width);
+            int delta = sizeNeeded.ToSize().Height - rect.Height;
+
+            message.Height += delta;
+            textBox.Top += delta;
+            textBox.Height -= delta;
+        }
+    }
+}
diff --git a/src/GuiComponents/UiKit/SettingsDialogBase.cs b/src/GuiComponents/UiKit/SettingsDialogBase.cs
index 9a9e19d..4a3f661 100644
--- a/src/GuiComponents/UiKit/SettingsDialogBase.cs
+++ b/src/GuiComponents/UiKit/SettingsDialogBase.cs
@@ -1,3 +1,8 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using System.Drawing;
 using System.Collections;
@@ -90,7 +95,6 @@ namespace NUnit.UiKit
 			// 
 			// SettingsDialogBase
 			// 
-			this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);
 			this.ClientSize = new System.Drawing.Size(336, 458);
 			this.Controls.Add(this.cancelButton);
 			this.Controls.Add(this.okButton);
@@ -101,7 +105,7 @@ namespace NUnit.UiKit
 			this.Name = "SettingsDialogBase";
 			this.ShowInTaskbar = false;
 			this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
-			this.Text = "Options";
+			this.Text = "Settings";
 			this.Closed += new System.EventHandler(this.SettingsDialogBase_Closed);
 			this.ResumeLayout(false);
 
diff --git a/src/GuiComponents/UiKit/SettingsPage.cs b/src/GuiComponents/UiKit/SettingsPage.cs
index 40fd0f3..efaf489 100644
--- a/src/GuiComponents/UiKit/SettingsPage.cs
+++ b/src/GuiComponents/UiKit/SettingsPage.cs
@@ -1,3 +1,8 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using System.Collections;
 using System.ComponentModel;
diff --git a/src/GuiComponents/UiKit/SimpleSettingsDialog.cs b/src/GuiComponents/UiKit/SimpleSettingsDialog.cs
index 0583f74..5556f5b 100644
--- a/src/GuiComponents/UiKit/SimpleSettingsDialog.cs
+++ b/src/GuiComponents/UiKit/SimpleSettingsDialog.cs
@@ -1,3 +1,8 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using System.Collections;
 using System.ComponentModel;
@@ -84,7 +89,6 @@ namespace NUnit.UiKit
 			// 
 			// SimpleSettingsDialog
 			// 
-			this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);
 			this.ClientSize = new System.Drawing.Size(490, 426);
 			this.Controls.Add(this.panel1);
 			this.Controls.Add(this.groupBox1);
diff --git a/src/GuiComponents/UiKit/SimpleTextDisplay.cs b/src/GuiComponents/UiKit/SimpleTextDisplay.cs
deleted file mode 100644
index 21ca17f..0000000
--- a/src/GuiComponents/UiKit/SimpleTextDisplay.cs
+++ /dev/null
@@ -1,177 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.ComponentModel;
-using System.Drawing;
-using System.IO;
-using System.Text;
-using System.Windows.Forms;
-using NUnit.Core;
-using NUnit.Util;
-
-namespace NUnit.UiKit
-{
-	/// <summary>
-	/// Summary description for SimpleTextDisplay.
-	/// </summary>
-	public class SimpleTextDisplay : System.Windows.Forms.ScrollableControl, TextDisplay
-	{
-		/// <summary>
-		/// Required designer variable.
-		/// </summary>
-		private System.ComponentModel.Container components = null;
-
-		private StringBuilder builder;
-
-		private SizeF exactSize = SizeF.Empty;
-
-		private float fastPathHeightAdjust;
-
-		private TextDisplayContent content;
-
-		public SimpleTextDisplay()
-		{
-			this.builder = new StringBuilder();
-
-			// This call is required by the Windows.Forms Form Designer.
-			InitializeComponent();
-
-			// TODO: Add any initialization after the InitComponent call
-		}
-
-		/// <summary>
-		/// Clean up any resources being used.
-		/// </summary>
-		protected override void Dispose( bool disposing )
-		{
-			if( disposing )
-			{
-				if( components != null )
-					components.Dispose();
-			}
-			base.Dispose( disposing );
-		}
-
-		#region Component Designer generated code
-		/// <summary>
-		/// Required method for Designer support - do not modify 
-		/// the contents of this method with the code editor.
-		/// </summary>
-		private void InitializeComponent()
-		{
-			components = new System.ComponentModel.Container();
-		}
-		#endregion
-
-		protected override void OnPaint(PaintEventArgs pe)
-		{
-			Graphics g = pe.Graphics;
-			string text = builder.ToString();
-			Rectangle clip = pe.ClipRectangle;
-
-			g.DrawString( text, this.Font, Brushes.Black, this.AutoScrollPosition );
-
-			// Calling the base class OnPaint
-			base.OnPaint(pe);
-		}
-
-		protected override void OnHandleCreated(EventArgs e)
-		{
-			if ( builder.Length > 0 )
-			{
-				this.exactSize = MeasureString( builder.ToString() );
-				this.AutoScrollMinSize = exactSize.ToSize();
-			}
-
-			this.OnFontChanged(e);
-
-			base.OnHandleCreated (e);
-		}
-
-		protected override void OnFontChanged(EventArgs e)
-		{
-			base.OnFontChanged (e);
-
-			SizeF measuredSize = this.MeasureString( "abc" );
-			this.fastPathHeightAdjust = measuredSize.Height - Font.GetHeight();
-		}
-
-	
-		#region TextDisplay Members
-		public TextDisplayContent Content
-		{
-			get { return content; }
-			set { content = value; }
-		}
-
-		public void Clear()
-		{
-			builder.Length = 0;
-			this.AutoScrollMinSize = new Size(0,0);
-			this.Invalidate();
-		}
-
-		public void Write( string text )
-		{
-			int lengthSoFar = builder.Length;
-
-			builder.Append( text );
-
-			if ( this.IsHandleCreated )
-			{
-				bool isUpdateVisible = this.AutoScrollPosition.Y + this.AutoScrollMinSize.Height <= this.ClientRectangle.Height;
-
-				if ( text != null && lengthSoFar > 0 && builder[lengthSoFar-1] == '\n' ) // use fast path
-				{
-
-					SizeF textSize = MeasureString( text );
-					this.exactSize = new SizeF( 
-						Math.Max( this.exactSize.Width, textSize.Width ),
-						this.exactSize.Height + textSize.Height - this.fastPathHeightAdjust );
-					this.AutoScrollMinSize = exactSize.ToSize();
-				}
-				else
-				{
-					this.exactSize = MeasureString( builder.ToString() );
-					this.AutoScrollMinSize = exactSize.ToSize();
-				}
-				
-				if ( isUpdateVisible ) this.Invalidate();
-			}
-		}
-
-		public void Write(TestOutput output)
-		{
-			Write(output.Text);
-		}
-
-		public void WriteLine( string text )
-		{
-			Write( text + Environment.NewLine );
-		}
-
-		public string GetText()
-		{
-			return this.builder.ToString();
-		}
-		#endregion
-
-		#region TestObserver Methods
-		public void Subscribe(ITestEvents events)
-		{
-		}
-		#endregion
-
-		#region Private Methods
-		private SizeF MeasureString(string text)
-		{
-			return Graphics.FromHwnd(this.Handle).MeasureString( text, this.Font );
-		}
-		#endregion
-	}
-}
diff --git a/src/GuiComponents/UiKit/SimpleTextDisplay.resx b/src/GuiComponents/UiKit/SimpleTextDisplay.resx
deleted file mode 100644
index dd0ea4d..0000000
--- a/src/GuiComponents/UiKit/SimpleTextDisplay.resx
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<root>
-	<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-		<xsd:element name="root" msdata:IsDataSet="true">
-			<xsd:complexType>
-				<xsd:choice maxOccurs="unbounded">
-					<xsd:element name="data">
-						<xsd:complexType>
-							<xsd:sequence>
-								<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-								<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-							</xsd:sequence>
-							<xsd:attribute name="name" type="xsd:string" />
-							<xsd:attribute name="type" type="xsd:string" />
-							<xsd:attribute name="mimetype" type="xsd:string" />
-						</xsd:complexType>
-					</xsd:element>
-					<xsd:element name="resheader">
-						<xsd:complexType>
-							<xsd:sequence>
-								<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-							</xsd:sequence>
-							<xsd:attribute name="name" type="xsd:string" use="required" />
-						</xsd:complexType>
-					</xsd:element>
-				</xsd:choice>
-			</xsd:complexType>
-		</xsd:element>
-	</xsd:schema>
-	<resheader name="ResMimeType">
-		<value>text/microsoft-resx</value>
-	</resheader>
-	<resheader name="Version">
-		<value>1.0.0.0</value>
-	</resheader>
-	<resheader name="Reader">
-		<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-	</resheader>
-	<resheader name="Writer">
-		<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-	</resheader>
-</root>
diff --git a/src/GuiComponents/UiKit/Skipped.png b/src/GuiComponents/UiKit/Skipped.png
new file mode 100644
index 0000000..7c9fc64
Binary files /dev/null and b/src/GuiComponents/UiKit/Skipped.png differ
diff --git a/src/GuiComponents/UiKit/StatusBar.cs b/src/GuiComponents/UiKit/StatusBar.cs
index 799e98b..ba51409 100644
--- a/src/GuiComponents/UiKit/StatusBar.cs
+++ b/src/GuiComponents/UiKit/StatusBar.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -17,13 +17,15 @@ namespace NUnit.UiKit
 		private StatusBarPanel statusPanel = new StatusBarPanel();
 		private StatusBarPanel testCountPanel = new StatusBarPanel();
 		private StatusBarPanel testsRunPanel = new StatusBarPanel();
+		private StatusBarPanel errorsPanel = new StatusBarPanel();
 		private StatusBarPanel failuresPanel = new StatusBarPanel();
 		private StatusBarPanel timePanel = new StatusBarPanel();
 
 		private int testCount = 0;
 		private int testsRun = 0;
+		private int errors = 0;
 		private int failures = 0;
-		private int time = 0;
+		private double time = 0.0;
 
 		private bool displayProgress = false;
 
@@ -38,23 +40,19 @@ namespace NUnit.UiKit
 			Panels.Add( statusPanel );
 			Panels.Add( testCountPanel );
 			Panels.Add( testsRunPanel );
+			Panels.Add( errorsPanel );
 			Panels.Add( failuresPanel );
 			Panels.Add( timePanel );
 
 			statusPanel.AutoSize = System.Windows.Forms.StatusBarPanelAutoSize.Spring;
 			statusPanel.BorderStyle = StatusBarPanelBorderStyle.None;
 			statusPanel.Text = "Status";
-
-			// Temporarily remove AutoSize due to Mono 1.2 rc problems
-			//
-			//testCountPanel.AutoSize = System.Windows.Forms.StatusBarPanelAutoSize.Contents;
-			testCountPanel.MinWidth = 120;
-			//testsRunPanel.AutoSize = System.Windows.Forms.StatusBarPanelAutoSize.Contents;
-			testsRunPanel.MinWidth = 120;
-			//failuresPanel.AutoSize = System.Windows.Forms.StatusBarPanelAutoSize.Contents;
-			failuresPanel.MinWidth = 104;
-			//timePanel.AutoSize = System.Windows.Forms.StatusBarPanelAutoSize.Contents;
-			timePanel.MinWidth = 120;
+			
+			testCountPanel.AutoSize = StatusBarPanelAutoSize.Contents;
+			testsRunPanel.AutoSize = StatusBarPanelAutoSize.Contents;
+			errorsPanel.AutoSize = StatusBarPanelAutoSize.Contents;
+			failuresPanel.AutoSize = StatusBarPanelAutoSize.Contents;
+			timePanel.AutoSize = StatusBarPanelAutoSize.Contents;
 
 			ShowPanels = true;
 			InitPanels();
@@ -92,50 +90,72 @@ namespace NUnit.UiKit
 
 			this.testCount = testCount;
 			this.testsRun = 0;
+			this.errors = 0;
 			this.failures = 0;
-			this.time = 0;
+			this.time = 0.0;
 
 			InitPanels();
 		}
 
 		private void InitPanels()
 		{
+			this.testCountPanel.MinWidth = 50;
 			DisplayTestCount();
+
+			this.testsRunPanel.MinWidth = 50;
 			this.testsRunPanel.Text = "";
+
+			this.errorsPanel.MinWidth = 50;
+			this.errorsPanel.Text = "";
+			
+			this.failuresPanel.MinWidth = 50;
 			this.failuresPanel.Text = "";
+			
+			this.timePanel.MinWidth = 50;
 			this.timePanel.Text = "";
 		}
 
 		private void DisplayTestCount()
 		{
-			this.testCountPanel.Text = "Test Cases : " + testCount.ToString();
+            testCountPanel.Text = "Test Cases : " + testCount.ToString();
 		}
 
 		private void DisplayTestsRun()
 		{
-			this.testsRunPanel.Text = "Tests Run : " + testsRun.ToString();
+            testsRunPanel.Text = "Tests Run : " + testsRun.ToString();
+		}
+
+		private void DisplayErrors()
+		{
+            errorsPanel.Text = "Errors : " + errors.ToString();
 		}
 
 		private void DisplayFailures()
 		{
-			this.failuresPanel.Text = "Failures : " + failures.ToString();
+            failuresPanel.Text = "Failures : " + failures.ToString();
 		}
 
 		private void DisplayTime()
 		{
-			this.timePanel.Text = "Time : " + time.ToString();
+            timePanel.Text = "Time : " + time.ToString();
 		}
 
 		private void DisplayResult(TestResult result)
 		{
 			ResultSummarizer summarizer = new ResultSummarizer(result);
 
-			int failureCount = summarizer.FailureCount;
+            //this.testCount = summarizer.ResultCount;
+            this.testsRun = summarizer.TestsRun;
+			this.errors = summarizer.Errors;
+            this.failures = summarizer.Failures;
+            this.time = summarizer.Time;
 
-			failuresPanel.Text = "Failures : " + failureCount.ToString();
-			testsRunPanel.Text = "Tests Run : " + summarizer.ResultCount.ToString();
-			timePanel.Text = "Time : " + summarizer.Time.ToString();
-		}
+            DisplayTestCount();
+            DisplayTestsRun();
+            DisplayErrors();
+            DisplayFailures();
+            DisplayTime();
+        }
 
 		public void OnTestLoaded( object sender, TestEventArgs e )
 		{
@@ -156,9 +176,11 @@ namespace NUnit.UiKit
 		{
 			Initialize( e.TestCount, "Running :" + e.Name );
 			DisplayTestCount();
-			DisplayFailures();
-			DisplayTime();
-		}
+            DisplayTestsRun();
+            DisplayErrors();
+            DisplayFailures();
+            DisplayTime();
+        }
 
 		private void OnRunFinished(object sender, TestEventArgs e )
 		{
@@ -198,14 +220,28 @@ namespace NUnit.UiKit
 			{
 				++testsRun;
 				DisplayTestsRun();
-				if ( e.Result.IsFailure ) 
-				{
-					++failures;
-					DisplayFailures();
+                switch ( e.Result.ResultState )
+                {
+                    case ResultState.Error:
+                    case ResultState.Cancelled:
+    					++errors;
+	    				DisplayErrors();
+                        break;
+                    case ResultState.Failure:
+    					++failures;
+	    				DisplayFailures();
+                        break;
 				}
 			}
 		}
 
+//        protected override void OnFontChanged(EventArgs e)
+//        {
+//            base.OnFontChanged(e);
+//
+//            this.Height = (int)(this.Font.Height * 1.6);
+//        }
+
 		#region TestObserver Members
 
 		public void Subscribe(ITestEvents events)
diff --git a/src/GuiComponents/UiKit/Success.jpg b/src/GuiComponents/UiKit/Success.jpg
deleted file mode 100644
index 3d8e760..0000000
Binary files a/src/GuiComponents/UiKit/Success.jpg and /dev/null differ
diff --git a/src/GuiComponents/UiKit/Success.png b/src/GuiComponents/UiKit/Success.png
new file mode 100644
index 0000000..2a30150
Binary files /dev/null and b/src/GuiComponents/UiKit/Success.png differ
diff --git a/src/GuiComponents/UiKit/TabbedOptionsDialog.cs b/src/GuiComponents/UiKit/TabbedOptionsDialog.cs
deleted file mode 100644
index faea55d..0000000
--- a/src/GuiComponents/UiKit/TabbedOptionsDialog.cs
+++ /dev/null
@@ -1,77 +0,0 @@
-using System;
-using System.Collections;
-using System.ComponentModel;
-using System.Drawing;
-using System.Windows.Forms;
-
-namespace NUnit.UiKit
-{
-	public class TabbedOptionsDialog : NUnit.UiKit.OptionsDialogBase
-	{
-		private System.Windows.Forms.TabControl tabControl1;
-		private System.ComponentModel.IContainer components = null;
-
-		public TabbedOptionsDialog()
-		{
-			// This call is required by the Windows Form Designer.
-			InitializeComponent();
-
-			// TODO: Add any initialization after the InitializeComponent call
-		}
-
-		/// <summary>
-		/// Clean up any resources being used.
-		/// </summary>
-		protected override void Dispose( bool disposing )
-		{
-			if( disposing )
-			{
-				if (components != null) 
-				{
-					components.Dispose();
-				}
-			}
-			base.Dispose( disposing );
-		}
-
-		#region Designer generated code
-		/// <summary>
-		/// Required method for Designer support - do not modify
-		/// the contents of this method with the code editor.
-		/// </summary>
-		private void InitializeComponent()
-		{
-			this.tabControl1 = new System.Windows.Forms.TabControl();
-			this.SuspendLayout();
-			// 
-			// tabControl1
-			// 
-			this.tabControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
-				| System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.tabControl1.ItemSize = new System.Drawing.Size(46, 18);
-			this.tabControl1.Location = new System.Drawing.Point(10, 9);
-			this.tabControl1.Name = "tabControl1";
-			this.tabControl1.SelectedIndex = 0;
-			this.tabControl1.Size = new System.Drawing.Size(310, 420);
-			this.tabControl1.TabIndex = 2;
-			// 
-			// TabbedOptionsDialog
-			// 
-			this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);
-			this.ClientSize = new System.Drawing.Size(320, 456);
-			this.Controls.Add(this.tabControl1);
-			this.Name = "TabbedOptionsDialog";
-			this.Controls.SetChildIndex(this.tabControl1, 0);
-			this.ResumeLayout(false);
-
-		}
-		#endregion
-
-		protected void LoadTabPage( TabPage tabPage )
-		{
-			tabControl1.Controls.Add( tabPage );
-		}
-	}
-}
-
diff --git a/src/GuiComponents/UiKit/TabbedOptionsDialog.resx b/src/GuiComponents/UiKit/TabbedOptionsDialog.resx
deleted file mode 100644
index cc38c0b..0000000
--- a/src/GuiComponents/UiKit/TabbedOptionsDialog.resx
+++ /dev/null
@@ -1,148 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 1.3
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">1.3</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1">this is my long string</data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        [base64 mime encoded serialized .NET Framework object]
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        [base64 mime encoded string representing a byte array form of the .NET Framework object]
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used forserialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>1.3</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <data name="tabControl1.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="tabControl1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="tabControl1.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="tabControl1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="tabControl1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="tabControl1.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>(Default)</value>
-  </data>
-  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="$this.Name">
-    <value>TabbedOptionsDialog</value>
-  </data>
-  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>80</value>
-  </data>
-  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-</root>
\ No newline at end of file
diff --git a/src/GuiComponents/UiKit/TabbedSettingsDialog.cs b/src/GuiComponents/UiKit/TabbedSettingsDialog.cs
index 4c24cc3..75aa049 100644
--- a/src/GuiComponents/UiKit/TabbedSettingsDialog.cs
+++ b/src/GuiComponents/UiKit/TabbedSettingsDialog.cs
@@ -1,57 +1,62 @@
-using System;
-using System.Collections;
-using System.ComponentModel;
-using System.Drawing;
-using System.Windows.Forms;
-
-namespace NUnit.UiKit
-{
-	public class TabbedSettingsDialog : NUnit.UiKit.SettingsDialogBase
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Collections;
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace NUnit.UiKit
+{
+	public class TabbedSettingsDialog : NUnit.UiKit.SettingsDialogBase
 	{
-		protected System.Windows.Forms.TabControl tabControl1;
-		private System.ComponentModel.IContainer components = null;
-
-		public static void Display( Form owner, params SettingsPage[] pages )
-		{
-			using( TabbedSettingsDialog dialog = new TabbedSettingsDialog() )
-			{
+		protected System.Windows.Forms.TabControl tabControl1;
+		private System.ComponentModel.IContainer components = null;
+
+		public static void Display( Form owner, params SettingsPage[] pages )
+		{
+			using( TabbedSettingsDialog dialog = new TabbedSettingsDialog() )
+			{
 				owner.Site.Container.Add( dialog );
 				dialog.Font = owner.Font;
 				dialog.SettingsPages.AddRange( pages ); 
 				dialog.ShowDialog();
-			}
-		}
-
-		public TabbedSettingsDialog()
-		{
-			// This call is required by the Windows Form Designer.
-			InitializeComponent();
-
-			// TODO: Add any initialization after the InitializeComponent call
-		}
-
-		/// <summary>
-		/// Clean up any resources being used.
-		/// </summary>
-		protected override void Dispose( bool disposing )
-		{
-			if( disposing )
-			{
-				if (components != null) 
-				{
-					components.Dispose();
-				}
-			}
-			base.Dispose( disposing );
-		}
-
-		#region Designer generated code
-		/// <summary>
-		/// Required method for Designer support - do not modify
-		/// the contents of this method with the code editor.
-		/// </summary>
-		private void InitializeComponent()
-		{
+			}
+		}
+
+		public TabbedSettingsDialog()
+		{
+			// This call is required by the Windows Form Designer.
+			InitializeComponent();
+
+			// TODO: Add any initialization after the InitializeComponent call
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if (components != null) 
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
 			this.tabControl1 = new System.Windows.Forms.TabControl();
 			this.SuspendLayout();
 			// 
@@ -79,7 +84,6 @@ namespace NUnit.UiKit
 			// 
 			// TabbedSettingsDialog
 			// 
-			this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);
 			this.ClientSize = new System.Drawing.Size(474, 426);
 			this.Controls.Add(this.tabControl1);
 			this.Name = "TabbedSettingsDialog";
@@ -89,9 +93,9 @@ namespace NUnit.UiKit
 			this.Controls.SetChildIndex(this.tabControl1, 0);
 			this.ResumeLayout(false);
 
-		}
-		#endregion
-
+		}
+		#endregion
+
 		private void TabbedSettingsDialog_Load(object sender, System.EventArgs e)
 		{
 			foreach( SettingsPage page in SettingsPages )
@@ -102,6 +106,6 @@ namespace NUnit.UiKit
 				this.tabControl1.TabPages.Add( tabPage );
 			}
 		}
-	}
-}
-
+	}
+}
+
diff --git a/src/GuiComponents/UiKit/TestForm.cs b/src/GuiComponents/UiKit/TestForm.cs
deleted file mode 100644
index 88b6553..0000000
--- a/src/GuiComponents/UiKit/TestForm.cs
+++ /dev/null
@@ -1,77 +0,0 @@
-using System;
-using System.Drawing;
-using System.Collections;
-using System.ComponentModel;
-using System.Windows.Forms;
-
-namespace NUnit.UiKit
-{
-	/// <summary>
-	/// Summary description for TestForm.
-	/// </summary>
-	public class TestForm : System.Windows.Forms.Form
-	{
-		private NUnit.UiKit.ResultTabs resultTabs;
-		/// <summary>
-		/// Required designer variable.
-		/// </summary>
-		private System.ComponentModel.Container components = null;
-
-		public TestForm()
-		{
-			//
-			// Required for Windows Form Designer support
-			//
-			InitializeComponent();
-
-			//
-			// TODO: Add any constructor code after InitializeComponent call
-			//
-		}
-
-		/// <summary>
-		/// Clean up any resources being used.
-		/// </summary>
-		protected override void Dispose( bool disposing )
-		{
-			if( disposing )
-			{
-				if(components != null)
-				{
-					components.Dispose();
-				}
-			}
-			base.Dispose( disposing );
-		}
-
-		#region Windows Form Designer generated code
-		/// <summary>
-		/// Required method for Designer support - do not modify
-		/// the contents of this method with the code editor.
-		/// </summary>
-		private void InitializeComponent()
-		{
-			this.resultTabs = new NUnit.UiKit.ResultTabs();
-			this.SuspendLayout();
-			// 
-			// resultTabs
-			// 
-			this.resultTabs.Dock = System.Windows.Forms.DockStyle.Fill;
-			this.resultTabs.Location = new System.Drawing.Point(0, 0);
-			this.resultTabs.Name = "resultTabs";
-			this.resultTabs.Size = new System.Drawing.Size(824, 536);
-			this.resultTabs.TabIndex = 0;
-			// 
-			// TestForm
-			// 
-			this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);
-			this.ClientSize = new System.Drawing.Size(824, 536);
-			this.Controls.Add(this.resultTabs);
-			this.Name = "TestForm";
-			this.Text = "TestForm";
-			this.ResumeLayout(false);
-
-		}
-		#endregion
-	}
-}
diff --git a/src/GuiComponents/UiKit/TestForm.resx b/src/GuiComponents/UiKit/TestForm.resx
deleted file mode 100644
index e6ca681..0000000
--- a/src/GuiComponents/UiKit/TestForm.resx
+++ /dev/null
@@ -1,139 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 1.3
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">1.3</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1">this is my long string</data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        [base64 mime encoded serialized .NET Framework object]
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        [base64 mime encoded string representing a byte array form of the .NET Framework object]
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used forserialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>1.3</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <data name="resultTabs.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="resultTabs.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="resultTabs.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>(Default)</value>
-  </data>
-  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.Name">
-    <value>TestForm</value>
-  </data>
-  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>80</value>
-  </data>
-  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-</root>
\ No newline at end of file
diff --git a/src/GuiComponents/UiKit/TestLoaderUI.cs b/src/GuiComponents/UiKit/TestLoaderUI.cs
index f5ae446..31fcc29 100644
--- a/src/GuiComponents/UiKit/TestLoaderUI.cs
+++ b/src/GuiComponents/UiKit/TestLoaderUI.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -88,6 +88,23 @@ namespace NUnit.UiKit
 			OpenProject( owner, testFileName, null, null );
 		}
 
+//		public static void OpenResults( Form owner )
+//		{
+//			TestLoader loader = Services.TestLoader;
+//			
+//			OpenFileDialog dlg = new OpenFileDialog();
+//			System.ComponentModel.ISite site = owner == null ? null : owner.Site;
+//			if ( site != null ) dlg.Site = site;
+//			dlg.Title = "Open Test Results";
+//
+//			dlg.Filter = "XML Files (*.xml)|*.xml|All Files (*.*)|*.*";
+//			dlg.FilterIndex = 1;
+//			dlg.FileName = "";
+//
+//			if ( dlg.ShowDialog( owner ) == DialogResult.OK ) 
+//				OpenProject( owner, dlg.FileName );
+//		}
+
 		public static void AddToProject( Form owner )
 		{
 			AddToProject( owner, null );
@@ -121,52 +138,53 @@ namespace NUnit.UiKit
 
 			if ( dlg.ShowDialog( owner ) != DialogResult.OK )
 				return;
-			
-			if ( PathUtils.IsAssemblyFileType( dlg.FileName ) )
-				config.Assemblies.Add( dlg.FileName );
-			else if ( VSProject.IsProjectFile( dlg.FileName ) )
-			try
-			{
-				VSProject vsProject = new VSProject( dlg.FileName );
-				MessageBoxButtons buttons;
-				string msg;
-					
-				if ( configName != null && vsProject.Configs.Contains( configName ) )
-				{
-					msg = "The project being added may contain multiple configurations;\r\r" +
-						"Select\tYes to add all configurations found.\r" +
-						"\tNo to add only the " + configName + " configuration.\r" +
-						"\tCancel to exit without modifying the project.";
-					buttons = MessageBoxButtons.YesNoCancel;
-				}
-				else
-				{
-					msg = "The project being added may contain multiple configurations;\r\r" +
-						"Select\tOK to add all configurations found.\r" +
-						"\tCancel to exit without modifying the project.";
-					buttons = MessageBoxButtons.OKCancel;
-				}
-					
-				DialogResult result = UserMessage.Ask( msg, buttons );
-				if ( result == DialogResult.Yes || result == DialogResult.OK )
-				{
-					loader.TestProject.Add( vsProject );
-					if ( loader.IsTestLoaded )
-						loader.ReloadTest();
-					else
-						loader.LoadTest();
-				}
-				else if ( result == DialogResult.No )
-				{
-					foreach( string assembly in vsProject.Configs[configName].Assemblies )
-						config.Assemblies.Add( assembly );
-				}
-			}
-			catch( Exception ex )
-			{
-				UserMessage.DisplayFailure( ex.Message, "Invalid VS Project" );
-			}
-		}
+
+            if (PathUtils.IsAssemblyFileType(dlg.FileName))
+            {
+                config.Assemblies.Add(dlg.FileName);
+                return;
+            }
+            else if (VSProject.IsProjectFile(dlg.FileName))
+                try
+                {
+                    VSProject vsProject = new VSProject(dlg.FileName);
+                    MessageBoxButtons buttons;
+                    string msg;
+
+                    if (configName != null && vsProject.Configs.Contains(configName))
+                    {
+                        msg = "The project being added may contain multiple configurations;\r\r" +
+                            "Select\tYes to add all configurations found.\r" +
+                            "\tNo to add only the " + configName + " configuration.\r" +
+                            "\tCancel to exit without modifying the project.";
+                        buttons = MessageBoxButtons.YesNoCancel;
+                    }
+                    else
+                    {
+                        msg = "The project being added may contain multiple configurations;\r\r" +
+                            "Select\tOK to add all configurations found.\r" +
+                            "\tCancel to exit without modifying the project.";
+                        buttons = MessageBoxButtons.OKCancel;
+                    }
+
+                    DialogResult result = UserMessage.Ask(msg, buttons);
+                    if (result == DialogResult.Yes || result == DialogResult.OK)
+                    {
+                        loader.TestProject.Add(vsProject);
+                        return;
+                    }
+                    else if (result == DialogResult.No)
+                    {
+                        foreach (string assembly in vsProject.Configs[configName].Assemblies)
+                            config.Assemblies.Add(assembly);
+                        return;
+                    }
+                }
+                catch (Exception ex)
+                {
+                    UserMessage.DisplayFailure(ex.Message, "Invalid VS Project");
+                }
+        }
 
 		public static void AddAssembly( Form owner )
 		{
@@ -187,8 +205,8 @@ namespace NUnit.UiKit
 			dlg.FilterIndex = 1;
 			dlg.FileName = "";
 
-			if ( dlg.ShowDialog( owner ) == DialogResult.OK )
-				config.Assemblies.Add( dlg.FileName );
+            if (dlg.ShowDialog(owner) == DialogResult.OK)
+                config.Assemblies.Add(dlg.FileName);
 		}
 
 		public static void AddVSProject( Form owner )
@@ -214,14 +232,13 @@ namespace NUnit.UiKit
 				{
 					VSProject vsProject = new VSProject( dlg.FileName );
 					loader.TestProject.Add( vsProject );
-					loader.LoadTest();
 				}
 				catch( Exception ex )
 				{
 					UserMessage.DisplayFailure( ex.Message, "Invalid VS Project" );
 				}
 			}
-		}
+        }
 
 		private static bool CanWriteProjectFile( string path )
 		{
@@ -234,7 +251,7 @@ namespace NUnit.UiKit
 			TestLoader loader = Services.TestLoader;
 
 			if ( Path.IsPathRooted( loader.TestProject.ProjectPath ) &&
-				 NUnitProject.IsProjectFile( loader.TestProject.ProjectPath ) &&
+				 NUnitProject.IsNUnitProjectFile( loader.TestProject.ProjectPath ) &&
 				 CanWriteProjectFile( loader.TestProject.ProjectPath ) )
 				loader.TestProject.Save();
 			else
@@ -273,7 +290,7 @@ namespace NUnit.UiKit
 			SaveFileDialog dlg = new SaveFileDialog();
 			dlg.Title = "New Test Project";
 			dlg.Filter = "NUnit Test Project (*.nunit)|*.nunit|All Files (*.*)|*.*";
-			dlg.FileName = NUnitProject.GenerateProjectName();
+			dlg.FileName = Services.ProjectService.GenerateProjectName();
 			dlg.DefaultExt = "nunit";
 			dlg.ValidateNames = true;
 			dlg.OverwritePrompt = true;
@@ -295,11 +312,12 @@ namespace NUnit.UiKit
 		private static DialogResult SaveProjectIfDirty( Form owner )
 		{
 			DialogResult result = DialogResult.OK;
-			TestLoader loader = Services.TestLoader;
+			NUnitProject project = Services.TestLoader.TestProject;
 
-			if( loader.TestProject.IsDirty )
+			if( project.IsDirty )
 			{
-				string msg = "Project has been changed. Do you want to save changes?";
+				string msg = string.Format(
+                    "Project {0} has been changed. Do you want to save changes?",project.Name);
 
 				result = UserMessage.Ask( msg, MessageBoxButtons.YesNoCancel );
 				if ( result == DialogResult.Yes )
diff --git a/src/GuiComponents/UiKit/TestPropertiesDialog.cs b/src/GuiComponents/UiKit/TestPropertiesDialog.cs
index c5fd06b..3261837 100644
--- a/src/GuiComponents/UiKit/TestPropertiesDialog.cs
+++ b/src/GuiComponents/UiKit/TestPropertiesDialog.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System.Drawing;
@@ -99,337 +99,337 @@ namespace NUnit.UiKit
 		/// </summary>
 		private void InitializeComponent()
 		{
-			this.pinButton = new System.Windows.Forms.CheckBox();
-			this.testResult = new System.Windows.Forms.Label();
-			this.testName = new System.Windows.Forms.Label();
-			this.groupBox1 = new System.Windows.Forms.GroupBox();
-			this.categories = new System.Windows.Forms.ListBox();
-			this.properties = new System.Windows.Forms.ListBox();
-			this.label11 = new System.Windows.Forms.Label();
-			this.ignoreReason = new CP.Windows.Forms.ExpandingLabel();
-			this.label5 = new System.Windows.Forms.Label();
-			this.testType = new System.Windows.Forms.Label();
-			this.label8 = new System.Windows.Forms.Label();
-			this.label7 = new System.Windows.Forms.Label();
-			this.description = new CP.Windows.Forms.ExpandingLabel();
-			this.label6 = new System.Windows.Forms.Label();
-			this.testCaseCount = new System.Windows.Forms.Label();
-			this.label4 = new System.Windows.Forms.Label();
-			this.shouldRun = new System.Windows.Forms.Label();
-			this.label2 = new System.Windows.Forms.Label();
-			this.fullName = new CP.Windows.Forms.ExpandingLabel();
-			this.label1 = new System.Windows.Forms.Label();
-			this.label3 = new System.Windows.Forms.Label();
-			this.stackTrace = new CP.Windows.Forms.ExpandingLabel();
-			this.groupBox2 = new System.Windows.Forms.GroupBox();
-			this.assertCount = new System.Windows.Forms.Label();
-			this.label10 = new System.Windows.Forms.Label();
-			this.elapsedTime = new System.Windows.Forms.Label();
-			this.message = new CP.Windows.Forms.ExpandingLabel();
-			this.label12 = new System.Windows.Forms.Label();
-			this.groupBox1.SuspendLayout();
-			this.groupBox2.SuspendLayout();
-			this.SuspendLayout();
-			// 
-			// pinButton
-			// 
-			this.pinButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
-			this.pinButton.Appearance = System.Windows.Forms.Appearance.Button;
-			this.pinButton.Location = new System.Drawing.Point(440, 8);
-			this.pinButton.Name = "pinButton";
-			this.pinButton.Size = new System.Drawing.Size(20, 20);
-			this.pinButton.TabIndex = 14;
-			this.pinButton.Click += new System.EventHandler(this.pinButton_Click);
-			this.pinButton.CheckedChanged += new System.EventHandler(this.pinButton_CheckedChanged);
-			// 
-			// testResult
-			// 
-			this.testResult.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Bold);
-			this.testResult.Location = new System.Drawing.Point(16, 16);
-			this.testResult.Name = "testResult";
-			this.testResult.Size = new System.Drawing.Size(120, 16);
-			this.testResult.TabIndex = 46;
-			this.testResult.Text = "Failure";
-			this.testResult.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
-			// 
-			// testName
-			// 
-			this.testName.Location = new System.Drawing.Point(144, 16);
-			this.testName.Name = "testName";
-			this.testName.Size = new System.Drawing.Size(280, 16);
-			this.testName.TabIndex = 49;
-			this.testName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
-			// 
-			// groupBox1
-			// 
-			this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.groupBox1.Controls.Add(this.categories);
-			this.groupBox1.Controls.Add(this.properties);
-			this.groupBox1.Controls.Add(this.label11);
-			this.groupBox1.Controls.Add(this.ignoreReason);
-			this.groupBox1.Controls.Add(this.label5);
-			this.groupBox1.Controls.Add(this.testType);
-			this.groupBox1.Controls.Add(this.label8);
-			this.groupBox1.Controls.Add(this.label7);
-			this.groupBox1.Controls.Add(this.description);
-			this.groupBox1.Controls.Add(this.label6);
-			this.groupBox1.Controls.Add(this.testCaseCount);
-			this.groupBox1.Controls.Add(this.label4);
-			this.groupBox1.Controls.Add(this.shouldRun);
-			this.groupBox1.Controls.Add(this.label2);
-			this.groupBox1.Controls.Add(this.fullName);
-			this.groupBox1.Controls.Add(this.label1);
-			this.groupBox1.Location = new System.Drawing.Point(16, 48);
-			this.groupBox1.Name = "groupBox1";
-			this.groupBox1.Size = new System.Drawing.Size(440, 376);
-			this.groupBox1.TabIndex = 50;
-			this.groupBox1.TabStop = false;
-			this.groupBox1.Text = "Test Details";
-			// 
-			// categories
-			// 
-			this.categories.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.categories.ItemHeight = 16;
-			this.categories.Location = new System.Drawing.Point(104, 152);
-			this.categories.Name = "categories";
-			this.categories.Size = new System.Drawing.Size(320, 52);
-			this.categories.TabIndex = 58;
-			// 
-			// properties
-			// 
-			this.properties.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.properties.ItemHeight = 16;
-			this.properties.Location = new System.Drawing.Point(104, 304);
-			this.properties.Name = "properties";
-			this.properties.Size = new System.Drawing.Size(320, 52);
-			this.properties.TabIndex = 57;
-			// 
-			// label11
-			// 
-			this.label11.Location = new System.Drawing.Point(24, 312);
-			this.label11.Name = "label11";
-			this.label11.Size = new System.Drawing.Size(80, 16);
-			this.label11.TabIndex = 56;
-			this.label11.Text = "Properties:";
-			// 
-			// ignoreReason
-			// 
-			this.ignoreReason.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.ignoreReason.CopySupported = true;
-			this.ignoreReason.Expansion = CP.Windows.Forms.TipWindow.ExpansionStyle.Vertical;
-			this.ignoreReason.Location = new System.Drawing.Point(112, 248);
-			this.ignoreReason.Name = "ignoreReason";
-			this.ignoreReason.RightToLeft = System.Windows.Forms.RightToLeft.No;
-			this.ignoreReason.Size = new System.Drawing.Size(312, 48);
-			this.ignoreReason.TabIndex = 42;
-			// 
-			// label5
-			// 
-			this.label5.Location = new System.Drawing.Point(24, 248);
-			this.label5.Name = "label5";
-			this.label5.RightToLeft = System.Windows.Forms.RightToLeft.No;
-			this.label5.Size = new System.Drawing.Size(80, 16);
-			this.label5.TabIndex = 43;
-			this.label5.Text = "Reason:";
-			// 
-			// testType
-			// 
-			this.testType.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.testType.Location = new System.Drawing.Point(112, 32);
-			this.testType.Name = "testType";
-			this.testType.Size = new System.Drawing.Size(312, 16);
-			this.testType.TabIndex = 55;
-			// 
-			// label8
-			// 
-			this.label8.Location = new System.Drawing.Point(24, 32);
-			this.label8.Name = "label8";
-			this.label8.Size = new System.Drawing.Size(80, 16);
-			this.label8.TabIndex = 54;
-			this.label8.Text = "Test Type:";
-			// 
-			// label7
-			// 
-			this.label7.Location = new System.Drawing.Point(24, 152);
-			this.label7.Name = "label7";
-			this.label7.Size = new System.Drawing.Size(80, 16);
-			this.label7.TabIndex = 52;
-			this.label7.Text = "Categories:";
-			// 
-			// description
-			// 
-			this.description.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.description.CopySupported = true;
-			this.description.Expansion = CP.Windows.Forms.TipWindow.ExpansionStyle.Both;
-			this.description.Location = new System.Drawing.Point(112, 96);
-			this.description.Name = "description";
-			this.description.Size = new System.Drawing.Size(312, 48);
-			this.description.TabIndex = 51;
-			// 
-			// label6
-			// 
-			this.label6.Location = new System.Drawing.Point(24, 96);
-			this.label6.Name = "label6";
-			this.label6.Size = new System.Drawing.Size(80, 17);
-			this.label6.TabIndex = 50;
-			this.label6.Text = "Description:";
-			// 
-			// testCaseCount
-			// 
-			this.testCaseCount.Location = new System.Drawing.Point(112, 216);
-			this.testCaseCount.Name = "testCaseCount";
-			this.testCaseCount.Size = new System.Drawing.Size(48, 15);
-			this.testCaseCount.TabIndex = 49;
-			// 
-			// label4
-			// 
-			this.label4.Location = new System.Drawing.Point(24, 216);
-			this.label4.Name = "label4";
-			this.label4.Size = new System.Drawing.Size(80, 15);
-			this.label4.TabIndex = 48;
-			this.label4.Text = "Test Count:";
-			// 
-			// shouldRun
-			// 
-			this.shouldRun.Location = new System.Drawing.Point(304, 216);
-			this.shouldRun.Name = "shouldRun";
-			this.shouldRun.Size = new System.Drawing.Size(88, 15);
-			this.shouldRun.TabIndex = 47;
-			this.shouldRun.Text = "Yes";
-			// 
-			// label2
-			// 
-			this.label2.Location = new System.Drawing.Point(188, 216);
-			this.label2.Name = "label2";
-			this.label2.Size = new System.Drawing.Size(84, 15);
-			this.label2.TabIndex = 46;
-			this.label2.Text = "Should Run?";
-			// 
-			// fullName
-			// 
-			this.fullName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.fullName.CopySupported = true;
-			this.fullName.Location = new System.Drawing.Point(112, 63);
-			this.fullName.Name = "fullName";
-			this.fullName.Size = new System.Drawing.Size(312, 17);
-			this.fullName.TabIndex = 45;
-			// 
-			// label1
-			// 
-			this.label1.Location = new System.Drawing.Point(24, 63);
-			this.label1.Name = "label1";
-			this.label1.Size = new System.Drawing.Size(80, 17);
-			this.label1.TabIndex = 44;
-			this.label1.Text = "Full Name:";
-			// 
-			// label3
-			// 
-			this.label3.Location = new System.Drawing.Point(16, 392);
-			this.label3.Name = "label3";
-			this.label3.Size = new System.Drawing.Size(64, 15);
-			this.label3.TabIndex = 47;
-			this.label3.Text = "Message:";
-			this.label3.TextAlign = System.Drawing.ContentAlignment.TopRight;
-			// 
-			// stackTrace
-			// 
-			this.stackTrace.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
-				| System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.stackTrace.CopySupported = true;
-			this.stackTrace.Expansion = CP.Windows.Forms.TipWindow.ExpansionStyle.Both;
-			this.stackTrace.Location = new System.Drawing.Point(112, 128);
-			this.stackTrace.Name = "stackTrace";
-			this.stackTrace.Size = new System.Drawing.Size(312, 49);
-			this.stackTrace.TabIndex = 45;
-			// 
-			// groupBox2
-			// 
-			this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
-				| System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.groupBox2.Controls.Add(this.assertCount);
-			this.groupBox2.Controls.Add(this.label10);
-			this.groupBox2.Controls.Add(this.elapsedTime);
-			this.groupBox2.Controls.Add(this.message);
-			this.groupBox2.Controls.Add(this.stackTrace);
-			this.groupBox2.Controls.Add(this.label12);
-			this.groupBox2.Location = new System.Drawing.Point(16, 432);
-			this.groupBox2.Name = "groupBox2";
-			this.groupBox2.Size = new System.Drawing.Size(440, 192);
-			this.groupBox2.TabIndex = 51;
-			this.groupBox2.TabStop = false;
-			this.groupBox2.Text = "Result";
-			// 
-			// assertCount
-			// 
-			this.assertCount.Location = new System.Drawing.Point(240, 32);
-			this.assertCount.Name = "assertCount";
-			this.assertCount.Size = new System.Drawing.Size(176, 16);
-			this.assertCount.TabIndex = 61;
-			this.assertCount.Text = "Assert Count:";
-			// 
-			// label10
-			// 
-			this.label10.Location = new System.Drawing.Point(24, 63);
-			this.label10.Name = "label10";
-			this.label10.Size = new System.Drawing.Size(80, 17);
-			this.label10.TabIndex = 60;
-			this.label10.Text = "Message:";
-			// 
-			// elapsedTime
-			// 
-			this.elapsedTime.Location = new System.Drawing.Point(24, 32);
-			this.elapsedTime.Name = "elapsedTime";
-			this.elapsedTime.Size = new System.Drawing.Size(192, 16);
-			this.elapsedTime.TabIndex = 58;
-			this.elapsedTime.Text = "Execution Time:";
-			// 
-			// message
-			// 
-			this.message.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.message.CopySupported = true;
-			this.message.Expansion = CP.Windows.Forms.TipWindow.ExpansionStyle.Both;
-			this.message.Location = new System.Drawing.Point(112, 63);
-			this.message.Name = "message";
-			this.message.Size = new System.Drawing.Size(312, 49);
-			this.message.TabIndex = 57;
-			// 
-			// label12
-			// 
-			this.label12.Location = new System.Drawing.Point(24, 128);
-			this.label12.Name = "label12";
-			this.label12.Size = new System.Drawing.Size(80, 16);
-			this.label12.TabIndex = 56;
-			this.label12.Text = "Stack:";
-			// 
-			// TestPropertiesDialog
-			// 
-			this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);
-			this.ClientSize = new System.Drawing.Size(472, 634);
-			this.Controls.Add(this.groupBox2);
-			this.Controls.Add(this.groupBox1);
-			this.Controls.Add(this.testName);
-			this.Controls.Add(this.testResult);
-			this.Controls.Add(this.pinButton);
-			this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow;
-			this.MaximizeBox = false;
-			this.MinimizeBox = false;
-			this.Name = "TestPropertiesDialog";
-			this.ShowInTaskbar = false;
-			this.Text = "Test Properties";
-			this.Load += new System.EventHandler(this.TestPropertiesDialog_Load);
-			this.groupBox1.ResumeLayout(false);
-			this.groupBox2.ResumeLayout(false);
-			this.ResumeLayout(false);
+            this.pinButton = new System.Windows.Forms.CheckBox();
+            this.testResult = new System.Windows.Forms.Label();
+            this.testName = new System.Windows.Forms.Label();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.categories = new System.Windows.Forms.ListBox();
+            this.properties = new System.Windows.Forms.ListBox();
+            this.label11 = new System.Windows.Forms.Label();
+            this.ignoreReason = new CP.Windows.Forms.ExpandingLabel();
+            this.label5 = new System.Windows.Forms.Label();
+            this.testType = new System.Windows.Forms.Label();
+            this.label8 = new System.Windows.Forms.Label();
+            this.label7 = new System.Windows.Forms.Label();
+            this.description = new CP.Windows.Forms.ExpandingLabel();
+            this.label6 = new System.Windows.Forms.Label();
+            this.testCaseCount = new System.Windows.Forms.Label();
+            this.label4 = new System.Windows.Forms.Label();
+            this.shouldRun = new System.Windows.Forms.Label();
+            this.label2 = new System.Windows.Forms.Label();
+            this.fullName = new CP.Windows.Forms.ExpandingLabel();
+            this.label1 = new System.Windows.Forms.Label();
+            this.label3 = new System.Windows.Forms.Label();
+            this.stackTrace = new CP.Windows.Forms.ExpandingLabel();
+            this.groupBox2 = new System.Windows.Forms.GroupBox();
+            this.assertCount = new System.Windows.Forms.Label();
+            this.label10 = new System.Windows.Forms.Label();
+            this.elapsedTime = new System.Windows.Forms.Label();
+            this.message = new CP.Windows.Forms.ExpandingLabel();
+            this.label12 = new System.Windows.Forms.Label();
+            this.groupBox1.SuspendLayout();
+            this.groupBox2.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // pinButton
+            // 
+            this.pinButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+            this.pinButton.Appearance = System.Windows.Forms.Appearance.Button;
+            this.pinButton.Location = new System.Drawing.Point(440, 8);
+            this.pinButton.Name = "pinButton";
+            this.pinButton.Size = new System.Drawing.Size(20, 20);
+            this.pinButton.TabIndex = 14;
+            this.pinButton.Click += new System.EventHandler(this.pinButton_Click);
+            this.pinButton.CheckedChanged += new System.EventHandler(this.pinButton_CheckedChanged);
+            // 
+            // testResult
+            // 
+            this.testResult.Font = new System.Drawing.Font(FontFamily.GenericSansSerif, 9F, System.Drawing.FontStyle.Bold);
+            this.testResult.Location = new System.Drawing.Point(16, 16);
+            this.testResult.Name = "testResult";
+            this.testResult.Size = new System.Drawing.Size(120, 16);
+            this.testResult.TabIndex = 46;
+            this.testResult.Text = "Failure";
+            this.testResult.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+            // 
+            // testName
+            // 
+            this.testName.Location = new System.Drawing.Point(144, 16);
+            this.testName.Name = "testName";
+            this.testName.Size = new System.Drawing.Size(280, 16);
+            this.testName.TabIndex = 49;
+            this.testName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.groupBox1.Controls.Add(this.categories);
+            this.groupBox1.Controls.Add(this.properties);
+            this.groupBox1.Controls.Add(this.label11);
+            this.groupBox1.Controls.Add(this.ignoreReason);
+            this.groupBox1.Controls.Add(this.label5);
+            this.groupBox1.Controls.Add(this.testType);
+            this.groupBox1.Controls.Add(this.label8);
+            this.groupBox1.Controls.Add(this.label7);
+            this.groupBox1.Controls.Add(this.description);
+            this.groupBox1.Controls.Add(this.label6);
+            this.groupBox1.Controls.Add(this.testCaseCount);
+            this.groupBox1.Controls.Add(this.label4);
+            this.groupBox1.Controls.Add(this.shouldRun);
+            this.groupBox1.Controls.Add(this.label2);
+            this.groupBox1.Controls.Add(this.fullName);
+            this.groupBox1.Controls.Add(this.label1);
+            this.groupBox1.Location = new System.Drawing.Point(16, 48);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(440, 376);
+            this.groupBox1.TabIndex = 50;
+            this.groupBox1.TabStop = false;
+            this.groupBox1.Text = "Test Details";
+            // 
+            // categories
+            // 
+            this.categories.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.categories.ItemHeight = 16;
+            this.categories.Location = new System.Drawing.Point(104, 152);
+            this.categories.Name = "categories";
+            this.categories.Size = new System.Drawing.Size(320, 52);
+            this.categories.TabIndex = 58;
+            // 
+            // properties
+            // 
+            this.properties.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.properties.ItemHeight = 16;
+            this.properties.Location = new System.Drawing.Point(104, 304);
+            this.properties.Name = "properties";
+            this.properties.Size = new System.Drawing.Size(320, 52);
+            this.properties.TabIndex = 57;
+            // 
+            // label11
+            // 
+            this.label11.Location = new System.Drawing.Point(24, 312);
+            this.label11.Name = "label11";
+            this.label11.Size = new System.Drawing.Size(80, 16);
+            this.label11.TabIndex = 56;
+            this.label11.Text = "Properties:";
+            // 
+            // ignoreReason
+            // 
+            this.ignoreReason.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.ignoreReason.CopySupported = true;
+            this.ignoreReason.Expansion = CP.Windows.Forms.TipWindow.ExpansionStyle.Vertical;
+            this.ignoreReason.Location = new System.Drawing.Point(112, 248);
+            this.ignoreReason.Name = "ignoreReason";
+            this.ignoreReason.RightToLeft = System.Windows.Forms.RightToLeft.No;
+            this.ignoreReason.Size = new System.Drawing.Size(312, 48);
+            this.ignoreReason.TabIndex = 42;
+            // 
+            // label5
+            // 
+            this.label5.Location = new System.Drawing.Point(24, 248);
+            this.label5.Name = "label5";
+            this.label5.RightToLeft = System.Windows.Forms.RightToLeft.No;
+            this.label5.Size = new System.Drawing.Size(80, 16);
+            this.label5.TabIndex = 43;
+            this.label5.Text = "Reason:";
+            // 
+            // testType
+            // 
+            this.testType.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.testType.Location = new System.Drawing.Point(112, 32);
+            this.testType.Name = "testType";
+            this.testType.Size = new System.Drawing.Size(312, 16);
+            this.testType.TabIndex = 55;
+            // 
+            // label8
+            // 
+            this.label8.Location = new System.Drawing.Point(24, 32);
+            this.label8.Name = "label8";
+            this.label8.Size = new System.Drawing.Size(80, 16);
+            this.label8.TabIndex = 54;
+            this.label8.Text = "Test Type:";
+            // 
+            // label7
+            // 
+            this.label7.Location = new System.Drawing.Point(24, 152);
+            this.label7.Name = "label7";
+            this.label7.Size = new System.Drawing.Size(80, 16);
+            this.label7.TabIndex = 52;
+            this.label7.Text = "Categories:";
+            // 
+            // description
+            // 
+            this.description.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.description.CopySupported = true;
+            this.description.Expansion = CP.Windows.Forms.TipWindow.ExpansionStyle.Both;
+            this.description.Location = new System.Drawing.Point(112, 96);
+            this.description.Name = "description";
+            this.description.Size = new System.Drawing.Size(312, 48);
+            this.description.TabIndex = 51;
+            // 
+            // label6
+            // 
+            this.label6.Location = new System.Drawing.Point(24, 96);
+            this.label6.Name = "label6";
+            this.label6.Size = new System.Drawing.Size(80, 17);
+            this.label6.TabIndex = 50;
+            this.label6.Text = "Description:";
+            // 
+            // testCaseCount
+            // 
+            this.testCaseCount.Location = new System.Drawing.Point(112, 216);
+            this.testCaseCount.Name = "testCaseCount";
+            this.testCaseCount.Size = new System.Drawing.Size(48, 15);
+            this.testCaseCount.TabIndex = 49;
+            // 
+            // label4
+            // 
+            this.label4.Location = new System.Drawing.Point(24, 216);
+            this.label4.Name = "label4";
+            this.label4.Size = new System.Drawing.Size(80, 15);
+            this.label4.TabIndex = 48;
+            this.label4.Text = "Test Count:";
+            // 
+            // shouldRun
+            // 
+            this.shouldRun.Location = new System.Drawing.Point(304, 216);
+            this.shouldRun.Name = "shouldRun";
+            this.shouldRun.Size = new System.Drawing.Size(88, 15);
+            this.shouldRun.TabIndex = 47;
+            this.shouldRun.Text = "Yes";
+            // 
+            // label2
+            // 
+            this.label2.Location = new System.Drawing.Point(188, 216);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(84, 15);
+            this.label2.TabIndex = 46;
+            this.label2.Text = "Should Run?";
+            // 
+            // fullName
+            // 
+            this.fullName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.fullName.CopySupported = true;
+            this.fullName.Location = new System.Drawing.Point(112, 63);
+            this.fullName.Name = "fullName";
+            this.fullName.Size = new System.Drawing.Size(312, 17);
+            this.fullName.TabIndex = 45;
+            // 
+            // label1
+            // 
+            this.label1.Location = new System.Drawing.Point(24, 63);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(80, 17);
+            this.label1.TabIndex = 44;
+            this.label1.Text = "Full Name:";
+            // 
+            // label3
+            // 
+            this.label3.Location = new System.Drawing.Point(16, 392);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(64, 15);
+            this.label3.TabIndex = 47;
+            this.label3.Text = "Message:";
+            this.label3.TextAlign = System.Drawing.ContentAlignment.TopRight;
+            // 
+            // stackTrace
+            // 
+            this.stackTrace.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                        | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.stackTrace.CopySupported = true;
+            this.stackTrace.Expansion = CP.Windows.Forms.TipWindow.ExpansionStyle.Both;
+            this.stackTrace.Location = new System.Drawing.Point(112, 128);
+            this.stackTrace.Name = "stackTrace";
+            this.stackTrace.Size = new System.Drawing.Size(312, 49);
+            this.stackTrace.TabIndex = 45;
+            // 
+            // groupBox2
+            // 
+            this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                        | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.groupBox2.Controls.Add(this.assertCount);
+            this.groupBox2.Controls.Add(this.label10);
+            this.groupBox2.Controls.Add(this.elapsedTime);
+            this.groupBox2.Controls.Add(this.message);
+            this.groupBox2.Controls.Add(this.stackTrace);
+            this.groupBox2.Controls.Add(this.label12);
+            this.groupBox2.Location = new System.Drawing.Point(16, 432);
+            this.groupBox2.Name = "groupBox2";
+            this.groupBox2.Size = new System.Drawing.Size(440, 192);
+            this.groupBox2.TabIndex = 51;
+            this.groupBox2.TabStop = false;
+            this.groupBox2.Text = "Result";
+            // 
+            // assertCount
+            // 
+            this.assertCount.Location = new System.Drawing.Point(240, 32);
+            this.assertCount.Name = "assertCount";
+            this.assertCount.Size = new System.Drawing.Size(176, 16);
+            this.assertCount.TabIndex = 61;
+            this.assertCount.Text = "Assert Count:";
+            // 
+            // label10
+            // 
+            this.label10.Location = new System.Drawing.Point(24, 63);
+            this.label10.Name = "label10";
+            this.label10.Size = new System.Drawing.Size(80, 17);
+            this.label10.TabIndex = 60;
+            this.label10.Text = "Message:";
+            // 
+            // elapsedTime
+            // 
+            this.elapsedTime.Location = new System.Drawing.Point(24, 32);
+            this.elapsedTime.Name = "elapsedTime";
+            this.elapsedTime.Size = new System.Drawing.Size(192, 16);
+            this.elapsedTime.TabIndex = 58;
+            this.elapsedTime.Text = "Execution Time:";
+            // 
+            // message
+            // 
+            this.message.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.message.CopySupported = true;
+            this.message.Expansion = CP.Windows.Forms.TipWindow.ExpansionStyle.Both;
+            this.message.Location = new System.Drawing.Point(112, 63);
+            this.message.Name = "message";
+            this.message.Size = new System.Drawing.Size(312, 49);
+            this.message.TabIndex = 57;
+            // 
+            // label12
+            // 
+            this.label12.Location = new System.Drawing.Point(24, 128);
+            this.label12.Name = "label12";
+            this.label12.Size = new System.Drawing.Size(80, 16);
+            this.label12.TabIndex = 56;
+            this.label12.Text = "Stack:";
+            // 
+            // TestPropertiesDialog
+            // 
+            this.ClientSize = new System.Drawing.Size(472, 634);
+            this.Controls.Add(this.groupBox2);
+            this.Controls.Add(this.groupBox1);
+            this.Controls.Add(this.testName);
+            this.Controls.Add(this.testResult);
+            this.Controls.Add(this.pinButton);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow;
+            this.MaximizeBox = false;
+            this.MinimizeBox = false;
+            this.Name = "TestPropertiesDialog";
+            this.ShowInTaskbar = false;
+            this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Show;
+            this.Text = "Test Properties";
+            this.Load += new System.EventHandler(this.TestPropertiesDialog_Load);
+            this.groupBox1.ResumeLayout(false);
+            this.groupBox2.ResumeLayout(false);
+            this.ResumeLayout(false);
 
 		}
 
@@ -519,8 +519,26 @@ namespace NUnit.UiKit
 			ignoreReason.Text = test.IgnoreReason;
 			testCaseCount.Text = test.TestCount.ToString();
 			properties.Items.Clear();
-			foreach( DictionaryEntry entry in test.Properties )
-				properties.Items.Add( entry.Key + "=" + entry.Value.ToString() );
+            foreach (DictionaryEntry entry in test.Properties)
+            {
+                if (entry.Value is ICollection)
+                {
+                    ICollection items = (ICollection)entry.Value;
+                    if (items.Count == 0) continue;
+
+                    StringBuilder sb = new StringBuilder();
+                    foreach (object item in items)
+                    {
+                        if (sb.Length > 0)
+                            sb.Append(",");
+                        sb.Append(item.ToString());
+                    }
+                    
+                    properties.Items.Add( entry.Key.ToString() + "=" +sb.ToString() );
+                }
+                else
+                    properties.Items.Add( entry.Key.ToString() + "=" + entry.Value.ToString());
+            }
 
 			message.Text = "";
 			elapsedTime.Text = "Execution Time:";
diff --git a/src/GuiComponents/UiKit/TestPropertiesDialog.resx b/src/GuiComponents/UiKit/TestPropertiesDialog.resx
index 685f98c..ff31a6d 100644
--- a/src/GuiComponents/UiKit/TestPropertiesDialog.resx
+++ b/src/GuiComponents/UiKit/TestPropertiesDialog.resx
@@ -3,7 +3,7 @@
   <!-- 
     Microsoft ResX Schema 
     
-    Version 1.3
+    Version 2.0
     
     The primary goals of this format is to allow a simple XML format 
     that is mostly human readable. The generation and parsing of the 
@@ -14,16 +14,17 @@
     
     ... ado.net/XML headers & schema ...
     <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">1.3</resheader>
+    <resheader name="version">2.0</resheader>
     <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
     <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1">this is my long string</data>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
     <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
     <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        [base64 mime encoded serialized .NET Framework object]
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
     </data>
     <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
     </data>
                 
     There are any number of "resheader" rows that contain simple 
@@ -35,7 +36,7 @@
     Classes that don't support this are serialized and stored with the 
     mimetype set.
     
-    The mimetype is used forserialized objects, and tells the 
+    The mimetype is used for serialized objects, and tells the 
     ResXResourceReader how to depersist the object. This is currently not 
     extensible. For a given mimetype the value must be set accordingly:
     
@@ -45,7 +46,7 @@
     
     mimetype: application/x-microsoft.net.object.binary.base64
     value   : The object must be serialized with 
-            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
             : and then encoded with base64 encoding.
     
     mimetype: application/x-microsoft.net.object.soap.base64
@@ -59,18 +60,37 @@
             : and then encoded with base64 encoding.
     -->
   <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
     <xsd:element name="root" msdata:IsDataSet="true">
       <xsd:complexType>
         <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
           <xsd:element name="data">
             <xsd:complexType>
               <xsd:sequence>
                 <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                 <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
               </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
               <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
               <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
             </xsd:complexType>
           </xsd:element>
           <xsd:element name="resheader">
@@ -89,312 +109,12 @@
     <value>text/microsoft-resx</value>
   </resheader>
   <resheader name="version">
-    <value>1.3</value>
+    <value>2.0</value>
   </resheader>
   <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
   <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
-  <data name="pinButton.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="pinButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="pinButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="testResult.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="testResult.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="testResult.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="testName.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="testName.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="testName.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="groupBox1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="groupBox1.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="groupBox1.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="groupBox1.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="groupBox1.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="groupBox1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="categories.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="categories.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="categories.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="properties.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="properties.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="properties.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label11.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="label11.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label11.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="ignoreReason.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="ignoreReason.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="ignoreReason.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="label5.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="label5.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label5.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="testType.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="testType.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="testType.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label8.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="label8.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label8.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label7.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="label7.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label7.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="description.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="description.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="description.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="label6.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="label6.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label6.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="testCaseCount.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="testCaseCount.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="testCaseCount.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label4.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="label4.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label4.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="shouldRun.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="shouldRun.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="shouldRun.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label2.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="label2.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label2.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="fullName.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="fullName.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="fullName.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="label1.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="label1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label3.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="label3.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label3.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="stackTrace.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="stackTrace.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="stackTrace.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="groupBox2.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="groupBox2.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="groupBox2.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="groupBox2.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="groupBox2.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="groupBox2.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="assertCount.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="assertCount.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="assertCount.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label10.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="label10.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label10.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="elapsedTime.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="elapsedTime.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="elapsedTime.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="message.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="message.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="message.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="label12.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="label12.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label12.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Name">
-    <value>TestPropertiesDialog</value>
-  </data>
-  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>(Default)</value>
-  </data>
-  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>80</value>
-  </data>
-  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
 </root>
\ No newline at end of file
diff --git a/src/GuiComponents/UiKit/TestSuiteTreeNode.cs b/src/GuiComponents/UiKit/TestSuiteTreeNode.cs
index 0e794f5..fe16c73 100644
--- a/src/GuiComponents/UiKit/TestSuiteTreeNode.cs
+++ b/src/GuiComponents/UiKit/TestSuiteTreeNode.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 namespace NUnit.UiKit
@@ -44,6 +44,7 @@ namespace NUnit.UiKit
 		public static readonly int FailureIndex = 1;
 		public static readonly int SuccessIndex = 2;
 		public static readonly int IgnoredIndex = 3;
+	    public static readonly int InconclusiveIndex = 4;
 
 		#endregion
 
@@ -105,9 +106,6 @@ namespace NUnit.UiKit
 				if ( result == null )
 					return test.RunState.ToString();
 
-				if ( !result.Executed )
-					return result.RunState.ToString();
-				
 				return result.ResultState.ToString();
 			}
 		}
@@ -134,20 +132,12 @@ namespace NUnit.UiKit
 		}
 
 		/// <summary>
-		/// Clear the result field of this node
-		/// </summary>
-		public void ClearResult()
-		{
-			this.result = null;
-			ImageIndex = SelectedImageIndex = InitIndex;
-		}
-
-		/// <summary>
 		/// Clear the result of this node and all its children
 		/// </summary>
 		public void ClearResults()
 		{
-			ClearResult();
+			this.result = null;
+			ImageIndex = SelectedImageIndex = InitIndex;
 
 			foreach(TestSuiteTreeNode node in Nodes)
 				node.ClearResults();
@@ -162,34 +152,32 @@ namespace NUnit.UiKit
 			if ( this.result == null )
 				return InitIndex;
 			
-			switch( this.result.RunState )
+			switch( this.result.ResultState )
 			{
-				case RunState.Runnable:
-					return InitIndex;
-				case RunState.Skipped:
+                case ResultState.Inconclusive:
+			        return InconclusiveIndex;
+                case ResultState.Skipped:
 					return SkippedIndex;
-				case RunState.Ignored:
-				default:
+                case ResultState.NotRunnable:
+                case ResultState.Failure:
+                case ResultState.Error:
+                case ResultState.Cancelled:
+			        return FailureIndex;
+				case ResultState.Ignored:
 					return IgnoredIndex;
-				case RunState.Executed:
-					switch( this.result.ResultState )
+				case ResultState.Success:
+					int index = SuccessIndex;
+					foreach( TestSuiteTreeNode node in this.Nodes )
 					{
-						case ResultState.Failure:
-						case ResultState.Error:
+						if ( node.ImageIndex == FailureIndex )
 							return FailureIndex;
-						default:
-						case ResultState.Success:
-							int index = SuccessIndex;
-							foreach( TestSuiteTreeNode node in this.Nodes )
-							{
-								if ( node.ImageIndex == FailureIndex )
-									return FailureIndex;
-								if ( node.ImageIndex == IgnoredIndex )
-									index = IgnoredIndex;
-							}
-							return index;
+						if ( node.ImageIndex == IgnoredIndex )
+							index = IgnoredIndex;
 					}
-			}
+					return index;
+                default:
+			        return InitIndex;
+            }
 		}
 
 		internal void Accept(TestSuiteTreeNodeVisitor visitor) 
diff --git a/src/GuiComponents/UiKit/TestSuiteTreeView.cs b/src/GuiComponents/UiKit/TestSuiteTreeView.cs
index e38a124..d483d97 100644
--- a/src/GuiComponents/UiKit/TestSuiteTreeView.cs
+++ b/src/GuiComponents/UiKit/TestSuiteTreeView.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -32,6 +32,8 @@ namespace NUnit.UiKit
 	/// </summary>
 	public class TestSuiteTreeView : TreeView
 	{
+        static Logger log = InternalTrace.GetLogger(typeof(TestSuiteTreeView));
+
 		#region DisplayStyle Enumeraton
 
 		/// <summary>
@@ -48,9 +50,17 @@ namespace NUnit.UiKit
 
 		#endregion
 
-		#region Instance Variables
+        #region TreeStructureChangedException
+        private class TreeStructureChangedException : Exception
+        {
+            public TreeStructureChangedException(string message)
+                :base( message ) { }
+        }
+        #endregion
 
-		/// <summary>
+        #region Instance Variables
+
+        /// <summary>
 		/// Hashtable provides direct access to TestNodes
 		/// </summary>
 		private Hashtable treeMap = new Hashtable();
@@ -72,11 +82,6 @@ namespace NUnit.UiKit
 		private bool displayProgress = true;
 
 		/// <summary>
-		/// Whether to clear test results when tests change
-		/// </summary>
-		private bool clearResultsOnChange;
-
-		/// <summary>
 		/// The properties dialog if displayed
 		/// </summary>
 		private TestPropertiesDialog propertiesDialog;
@@ -115,46 +120,61 @@ namespace NUnit.UiKit
 			this.ContextMenu.Popup += new System.EventHandler( ContextMenu_Popup );
 
 			// See if there are any overriding images in the directory;
-			string imageDir = Path.GetDirectoryName( PathUtils.GetAssemblyPath( Assembly.GetExecutingAssembly() ) );
-			
-			string successFile = Path.Combine( imageDir, "Success.jpg" );
-			if ( File.Exists( successFile ) )
-				treeImages.Images[TestSuiteTreeNode.SuccessIndex] = Image.FromFile( successFile );
+            LoadAlternateImages();
+		}
 
-			string failureFile = Path.Combine( imageDir, "Failure.jpg" );
-			if ( File.Exists( failureFile ) )
-				treeImages.Images[TestSuiteTreeNode.FailureIndex] = Image.FromFile( failureFile );
-			
-			string ignoredFile = Path.Combine( imageDir, "Ignored.jpg" );
-			if ( File.Exists( ignoredFile ) )
-				treeImages.Images[TestSuiteTreeNode.IgnoredIndex] = Image.FromFile( ignoredFile );
+        private void LoadAlternateImages()
+        {
+            string[] imageNames = { "Skipped", "Failure", "Success", "Ignored", "Inconclusive" };
 
-			if ( !this.DesignMode )
-				this.clearResultsOnChange = 
-					Services.UserSettings.GetSetting( "Options.TestLoader.ClearResultsOnReload", false );
-		}
+            for (int index = 0; index < imageNames.Length; index++)
+                LoadAlternateImage(index, imageNames[index]);
+        }
+
+        private void LoadAlternateImage(int index, string name)
+        {
+            string imageDir = Path.GetDirectoryName(PathUtils.GetAssemblyPath(Assembly.GetExecutingAssembly()));
+
+            string[] extensions = { ".png", ".jpg" };
+
+            foreach (string ext in extensions)
+            {
+                string filePath = Path.Combine(imageDir, name + ext);
+                if (File.Exists(filePath))
+                {
+                    treeImages.Images[index] = Image.FromFile(filePath);
+                    break;
+                }
+            }
+        }
 
 		private void InitializeComponent()
 		{
-			this.components = new System.ComponentModel.Container();
-			System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(TestSuiteTreeView));
-			this.treeImages = new System.Windows.Forms.ImageList(this.components);
-			// 
-			// treeImages
-			// 
-			this.treeImages.ColorDepth = System.Windows.Forms.ColorDepth.Depth24Bit;
-			this.treeImages.ImageSize = new System.Drawing.Size(16, 16);
-			this.treeImages.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("treeImages.ImageStream")));
-			this.treeImages.TransparentColor = System.Drawing.Color.White;
-			// 
-			// TestSuiteTreeView
-			// 
-			this.ImageIndex = 0;
-			this.ImageList = this.treeImages;
-			this.SelectedImageIndex = 0;
-			this.DoubleClick += new System.EventHandler(this.TestSuiteTreeView_DoubleClick);
-			this.DragEnter += new System.Windows.Forms.DragEventHandler(this.TestSuiteTreeView_DragEnter);
-			this.DragDrop += new System.Windows.Forms.DragEventHandler(this.TestSuiteTreeView_DragDrop);
+            this.components = new System.ComponentModel.Container();
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TestSuiteTreeView));
+            this.treeImages = new System.Windows.Forms.ImageList(this.components);
+            this.SuspendLayout();
+            // 
+            // treeImages
+            // 
+            this.treeImages.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("treeImages.ImageStream")));
+            this.treeImages.TransparentColor = System.Drawing.Color.White;
+            this.treeImages.Images.SetKeyName(0, "Skipped.png");
+            this.treeImages.Images.SetKeyName(1, "Failure.png");
+            this.treeImages.Images.SetKeyName(2, "Success.png");
+            this.treeImages.Images.SetKeyName(3, "Ignored.png");
+            this.treeImages.Images.SetKeyName(4, "Inconclusive.png");
+            // 
+            // TestSuiteTreeView
+            // 
+            this.ImageIndex = 0;
+            this.ImageList = this.treeImages;
+            this.SelectedImageIndex = 0;
+            this.DoubleClick += new System.EventHandler(this.TestSuiteTreeView_DoubleClick);
+            this.DragDrop += new System.Windows.Forms.DragEventHandler(this.TestSuiteTreeView_DragDrop);
+            this.DragEnter += new System.Windows.Forms.DragEventHandler(this.TestSuiteTreeView_DragEnter);
+            this.ResumeLayout(false);
+
 		}
 
 		public void Initialize( ITestLoader loader, ITestEvents events )
@@ -189,7 +209,7 @@ namespace NUnit.UiKit
 		}
 
 		/// <summary>
-		/// Property determining whether tree should redraw nodes
+		/// Property determining whether tree should reDraw nodes
 		/// as tests are complete in order to show progress.
 		/// </summary>
 		[Category( "Behavior" ), DefaultValue( true )]
@@ -200,40 +220,40 @@ namespace NUnit.UiKit
 			set { displayProgress = value; }
 		}
 
-		[Category( "Appearance" ), DefaultValue( false )]
-		[Description("Indicates whether checkboxes are displayed beside test nodes")]
-		public new bool CheckBoxes
-		{
-			get { return base.CheckBoxes; }
-			set 
-			{ 
-				if ( base.CheckBoxes != value )
-				{
+        [Category( "Appearance" ), DefaultValue( false )]
+        [Description("Indicates whether checkboxes are displayed beside test nodes")]
+        public new bool CheckBoxes
+        {
+            get { return base.CheckBoxes; }
+            set 
+            { 
+                if ( base.CheckBoxes != value )
+                {
                     VisualState visualState = !value && this.TopNode != null
                         ? new VisualState(this)
                         : null;
 
-					base.CheckBoxes = value;
+                    base.CheckBoxes = value;
 
-					if ( CheckBoxesChanged != null )
-						CheckBoxesChanged(this, new EventArgs());
+                    if ( CheckBoxesChanged != null )
+                        CheckBoxesChanged(this, new EventArgs());
 
-					if ( visualState != null )
-					{
-						try
-						{
+                    if (visualState != null)
+                    {
+                        try
+                        {
                             suppressEvents = true;
                             visualState.ShowCheckBoxes = this.CheckBoxes;
-                            visualState.Restore(this);
-						}
-						finally
-						{
-							suppressEvents = false;
-						}
-					}
-				}
-			}
-		}
+                            RestoreVisualState( visualState );
+                        }
+                        finally
+                        {
+                            suppressEvents = false;
+                        }
+                    }
+                }
+            }
+        }
 
 		/// <summary>
 		/// The currently selected test.
@@ -360,8 +380,8 @@ namespace NUnit.UiKit
 			if ( test != null )
 			{
 				Invoke( new LoadHandler( Reload ), new object[]{ test } );
-				if ( clearResultsOnChange )
-					ClearResults();
+				if ( Services.UserSettings.GetSetting( "Options.TestLoader.ClearResultsOnReload", false ) )
+					ClearAllResults();
 			}
 		}
 
@@ -388,7 +408,13 @@ namespace NUnit.UiKit
 		private void OnRunStarting( object sender, TestEventArgs e )
 		{
 			CheckPropertiesDialog();
-			ClearResults();
+#if ACCUMULATE_RESULTS
+			if ( runningTests != null )
+				foreach( ITest test in runningTests )
+					this[test].ClearResults();
+#else
+			ClearAllResults();
+#endif
 			runCommandEnabled = false;
 		}
 
@@ -414,7 +440,6 @@ namespace NUnit.UiKit
 		#region Context Menu
 		/// <summary>
 		/// Handles right mouse button down by
-		/// 
 		/// remembering the proper context item
 		/// and implements multiple select with the left button.
 		/// </summary>
@@ -427,19 +452,19 @@ namespace NUnit.UiKit
 				TreeNode theNode = GetNodeAt( e.X, e.Y );
 				contextNode = theNode as TestSuiteTreeNode;
 			}
-			//			else if (e.Button == MouseButtons.Left )
-			//			{
-			//				if ( Control.ModifierKeys == Keys.Control )
-			//				{
-			//					TestSuiteTreeNode theNode = GetNodeAt( e.X, e.Y ) as TestSuiteTreeNode;
-			//					if ( theNode != null )
-			//						theNode.Selected = true;
-			//				}
-			//				else
-			//				{
-			//					ClearSelected();
-			//				}
-			//			}
+//			else if (e.Button == MouseButtons.Left )
+//			{
+//				if ( Control.ModifierKeys == Keys.Control )
+//				{
+//					TestSuiteTreeNode theNode = GetNodeAt( e.X, e.Y ) as TestSuiteTreeNode;
+//					if ( theNode != null )
+//						theNode.IsSelected = true;
+//				}
+//				else
+//				{
+//					ClearSelected();
+//				}
+//			}
 
 			base.OnMouseDown( e );
 		}
@@ -472,7 +497,10 @@ namespace NUnit.UiKit
 				this.ContextMenu.MenuItems.Add( runAllMenuItem );
 
 				MenuItem runFailedMenuItem = new MenuItem( "Run &Failed", new EventHandler( runFailedMenuItem_Click ) );
-				runFailedMenuItem.Enabled = runCommandEnabled && loader.TestResult != null && loader.TestResult.IsFailure;
+                TestResult result = loader.TestResult;
+			    runFailedMenuItem.Enabled = runCommandEnabled && result != null &&
+			        (result.ResultState == ResultState.Failure || 
+                     result.ResultState == ResultState.Error);
 
 				this.ContextMenu.MenuItems.Add( runFailedMenuItem );
 
@@ -648,10 +676,10 @@ namespace NUnit.UiKit
 			if ( fileNames.Length == 1 )
 			{
 				string fileName = fileNames[0];
-				bool isProject = Services.UserSettings.GetSetting( "Options.TestLoader.VisualStudioSupport", false ) 
-					? NUnitProject.CanLoadAsProject( fileName )
-					: NUnitProject.IsProjectFile( fileName );
-
+				bool isProject = NUnitProject.IsNUnitProjectFile( fileName );
+				if ( Services.UserSettings.GetSetting( "Options.TestLoader.VisualStudioSupport", false ) )
+					isProject |= Services.ProjectService.CanConvertFrom( fileName );
+				
 				return isProject || PathUtils.IsAssemblyFileType( fileName );
 			}
 
@@ -735,7 +763,7 @@ namespace NUnit.UiKit
 		/// <summary>
 		/// Clear all the results in the tree.
 		/// </summary>
-		public void ClearResults()
+		public void ClearAllResults()
 		{
 			foreach ( TestSuiteTreeNode rootNode in Nodes )
 				rootNode.ClearResults();
@@ -762,6 +790,7 @@ namespace NUnit.UiKit
 				{
 					EndUpdate();
 					contextNode = null;
+                    this.Select();
 				}
 
 				if ( Services.UserSettings.GetSetting( "Gui.TestTree.SaveVisualState", true ) && loader != null)
@@ -799,7 +828,32 @@ namespace NUnit.UiKit
 		/// <param name="test">Test suite to be loaded</param>
 		public void Reload( TestNode test )
 		{
-			UpdateNode( (TestSuiteTreeNode) Nodes[0], test );
+            bool reloadOK = false;
+            try
+            {
+                string selectedName = ((TestSuiteTreeNode)SelectedNode).Test.TestName.FullName;
+
+                UpdateNode((TestSuiteTreeNode)Nodes[0], test, new ArrayList());
+
+                TreeNode selectedNode = this.FindNodeByName(selectedName);
+                if (selectedNode != null)
+                {
+                    SelectedNode = selectedNode;
+                    selectedNode.EnsureVisible();
+                }
+
+                reloadOK = true;
+            }
+            catch (TreeStructureChangedException)
+            {
+            }
+
+            // The tree has changed, probably due to settings
+            // changes, so just load it cleanly.
+            if ( !reloadOK )
+                Load(test);
+
+            this.Focus();
 		}
 
 		/// <summary>
@@ -884,8 +938,8 @@ namespace NUnit.UiKit
 				propertiesDialog = new TestPropertiesDialog( node );
 				propertiesDialog.Owner = owner;
 				propertiesDialog.StartPosition = FormStartPosition.Manual;
-				propertiesDialog.Left = owner.Left + ( owner.Width - propertiesDialog.Width ) / 2;
-				propertiesDialog.Top = owner.Top + ( owner.Height - propertiesDialog.Height ) / 2;
+				propertiesDialog.Left = Math.Max(0, owner.Left + ( owner.Width - propertiesDialog.Width ) / 2);
+				propertiesDialog.Top = Math.Max(0, owner.Top + ( owner.Height - propertiesDialog.Height ) / 2);
 				propertiesDialog.Show();
 				propertiesDialog.Closed += new EventHandler( OnPropertiesDialogClosed );
 			}
@@ -1011,10 +1065,9 @@ namespace NUnit.UiKit
 
 			nodes.Add( node );
 			
-			TestSuiteResult suiteResult = rootResult as TestSuiteResult;
-			if ( suiteResult != null )
+			if ( rootResult.HasResults )
 			{
-				foreach( TestResult result in suiteResult.Results )
+				foreach( TestResult result in rootResult.Results )
 					AddTreeNodes( node.Nodes, result, highlight );
 			}
 
@@ -1028,12 +1081,12 @@ namespace NUnit.UiKit
 			string key = node.Test.TestName.UniqueName;
 
 			if ( treeMap.ContainsKey( key ) )
-				Trace.WriteLine( "Duplicate entry: " + key );
+				log.Error( "Duplicate entry: " + key );
 				//				UserMessage.Display( string.Format( 
 				//					"The test {0} is duplicated\r\rResults will not be displayed correctly in the tree.", node.Test.FullName ), "Duplicate Test" );
 			else
 			{
-				//Trace.WriteLine( "Added to map: " + node.Test.UniqueName );
+				log.Debug( "Added to map: " + node.Test.TestName.UniqueName );
 				treeMap.Add( key, node );
 			}
 		}
@@ -1077,10 +1130,10 @@ namespace NUnit.UiKit
 		/// <param name="node">Node to be updated</param>
 		/// <param name="test">Test to plug into node</param>
 		/// <returns>True if a child node was added or deleted</returns>
-		private bool UpdateNode( TestSuiteTreeNode node, TestNode test )
+		private bool UpdateNode( TestSuiteTreeNode node, TestNode test, IList deletedNodes )
 		{
 			if ( node.Test.TestName.FullName != test.TestName.FullName )
-				throw( new ArgumentException( 
+				throw( new TreeStructureChangedException( 
 					string.Format( "Attempting to update {0} with {1}", node.Test.TestName.FullName, test.TestName.FullName ) ) );
 
 			treeMap.Remove( node.Test.TestName.UniqueName );
@@ -1090,7 +1143,7 @@ namespace NUnit.UiKit
 			if ( !test.IsSuite )
 				return false;
 
-			bool showChildren = UpdateNodes( node.Nodes, test.Tests );
+			bool showChildren = UpdateNodes( node.Nodes, test.Tests, deletedNodes );
 
 			if ( showChildren ) node.Expand();
 
@@ -1105,26 +1158,35 @@ namespace NUnit.UiKit
 		/// </summary>
 		/// <param name="nodes">List of nodes to be matched</param>
 		/// <param name="tests">List of tests to be matched</param>
+        /// <param name="deletedNodes">List of nodes previously removed,
+        /// in case they show up lower in the tree.</param>
 		/// <returns>True if the parent should expand to show that something was added or deleted</returns>
-		private bool UpdateNodes( IList nodes, IList tests )
+		private bool UpdateNodes( IList nodes, IList tests, IList deletedNodes )
 		{
-			// As of NUnit 2.3.6006, the newly reloaded tests 
-			// are guaranteed to be in the same order as the
-			// originally loaded tests. Hence, we can merge
-			// the two lists. However, we can only use an
-			// equality comparison, since we don't know what
-			// determines the order. Hence the two passes.
+			// For NUnit 2.4 and the original release of 2.5, the newly
+            // reloaded tests were guaranteed to be in the same order as 
+            // the originally loaded tests, so we simply merged the two
+            // lists. Beginning with NUnit 2.5.1, this is no longer 
+            // guaranteed - parameterized tests may be re-ordered within 
+            // their containing suite. Therefore, we no longer rely on 
+            // ordering of tests within a suite.
 
 			bool showChanges = false;
 
-			// Pass1: delete nodes as needed
+            // We use two passes to keep the code as simple as possible
+            //
+			// Pass1: delete nodes that are not in the list of tests.
+            // Some of these nodes may reappear lower in the tree,
+            // if we are switching from fixture display to tree display,
+            // so we save them for checking later.
 			int nodeIndex = nodes.Count;
 			while( --nodeIndex >= 0 )
 			{
 				TestSuiteTreeNode node = (TestSuiteTreeNode)nodes[nodeIndex];
-				if ( NodeWasDeleted( node, tests ) )
+				if ( !IsTestInList( node.Test, tests ) )
 				{
-					Trace.WriteLine( "Deleting " + node.Test.TestName.Name );
+					log.Debug( "Deleting " + node.Test.TestName.Name );
+                    deletedNodes.Add(node);
 					RemoveNode( node );
 					showChanges = true;
 				}
@@ -1139,21 +1201,58 @@ namespace NUnit.UiKit
 				TestSuiteTreeNode node = nodeIndex < nodes.Count ? (TestSuiteTreeNode)nodes[nodeIndex] : null;
 
 				if ( node != null && node.Test.TestName.FullName == test.TestName.FullName )
-					UpdateNode( node, test );
+					UpdateNode( node, test, deletedNodes );
 				else
 				{
-					TestSuiteTreeNode newNode = new TestSuiteTreeNode( test );
-					AddToMap( newNode );
-					nodes.Insert( nodeIndex, newNode );
-			
-					if ( test.IsSuite )
-					{
-						foreach( TestNode childTest in test.Tests )
-							AddTreeNodes( newNode.Nodes, childTest, false );
-					}
-
-					showChanges = true;
-				}
+                    TestSuiteTreeNode newNode = null;
+                    for (int i = nodeIndex + 1; i < nodes.Count; i++)
+                    {
+                        TestSuiteTreeNode tryNode = (TestSuiteTreeNode)nodes[i];
+                        if (tryNode.Test.TestName.FullName == test.TestName.FullName)
+                        {
+                            // Exchange the two nodes
+                            nodes.Remove(tryNode);
+                            if (node != null) nodes.Remove(node);
+
+                            nodes.Insert(nodeIndex, tryNode);
+                            if ( node != null )nodes.Insert(i, node);
+
+                            UpdateNode(tryNode, test, deletedNodes);
+                            newNode = tryNode;
+                            break;
+                        }
+                    }
+
+                    // Create a new node or use a deleted node
+                    if (newNode == null)
+                    {
+                        // Check previously deleted nodes
+                        foreach (TestSuiteTreeNode deletedNode in deletedNodes)
+                            if (deletedNode.Test.TestName.FullName == test.TestName.FullName)
+                            {
+                                newNode = deletedNode;
+                                deletedNodes.Remove(deletedNode);
+                                break;
+                            }
+
+                        // If not found, it's completely new
+                        if (newNode == null)
+                            newNode = new TestSuiteTreeNode(test);
+
+                        AddToMap(newNode);
+                        nodes.Insert(nodeIndex, newNode);
+
+                        if (test.IsSuite)
+                        {
+                            if (UpdateNodes(newNode.Nodes, test.Tests, deletedNodes))
+                                newNode.Expand();
+                            //foreach( TestNode childTest in test.Tests )
+                            //    AddTreeNodes(newNode.Nodes, childTest, false);
+                        }
+
+                        showChanges = true;
+                    }
+                }
 
 				nodeIndex++;
 			}
@@ -1162,18 +1261,18 @@ namespace NUnit.UiKit
 		}
 
 		/// <summary>
-		/// Helper returns true if the node test is not in
-		/// the list of tests provided.
+		/// Helper returns true if the test provided as the first argument
+        /// is found in the list of tests provided as the second argument
 		/// </summary>
-		/// <param name="node">Node to examine</param>
-		/// <param name="tests">List of tests to match with node</param>
-		private bool NodeWasDeleted( TestSuiteTreeNode node, IList tests )
+		/// <param name="node">Test to examine</param>
+		/// <param name="tests">List of tests to match against</param>
+		private bool IsTestInList( ITest test, IList tests )
 		{
-			foreach ( TestNode test in tests )
-				if( Match( node, test ) )
-					return false;
+			foreach ( ITest candidate in tests )
+				if( candidate.TestName.FullName == test.TestName.FullName )
+					return true;
 
-			return true;
+			return false;
 		}
 
 		/// <summary>
@@ -1268,17 +1367,70 @@ namespace NUnit.UiKit
 			return treeMap[test.TestName.UniqueName] as TestSuiteTreeNode;
 		}
 
+        private TestSuiteTreeNode FindNodeByName( string fullName )
+        {
+            foreach( string uname in treeMap.Keys )
+            {
+                int rbrack = uname.IndexOf(']');
+                string name = rbrack >=0 ? uname.Substring(rbrack+1) : uname;
+                if ( name == fullName )
+                    return treeMap[uname] as TestSuiteTreeNode;
+            }
+
+            return null;
+        }
+
 		private void RestoreVisualState()
 		{
-			if ( loader != null )
-			{
-				string fileName = VisualState.GetVisualStateFileName(loader.TestFileName);
-				if ( File.Exists( fileName ) )
-				{
-					VisualState.LoadFrom(fileName).Restore(this);
-					this.Select();
-				}
-			}
+            if (loader != null)
+            {
+                string fileName = VisualState.GetVisualStateFileName(loader.TestFileName);
+                if (File.Exists(fileName))
+                {
+                    RestoreVisualState(VisualState.LoadFrom(fileName));
+                }
+            }
+        }
+
+        private void RestoreVisualState( VisualState visualState )
+        {
+            this.CheckBoxes = visualState.ShowCheckBoxes;
+
+            foreach (VisualTreeNode visualNode in visualState.Nodes)
+            {
+                TestSuiteTreeNode treeNode = this[visualNode.UniqueName];
+                if (treeNode != null)
+                {
+                    if (treeNode.IsExpanded != visualNode.Expanded)
+                        treeNode.Toggle();
+
+                    treeNode.Checked = visualNode.Checked;
+                }
+            }
+
+            if (visualState.SelectedNode != null)
+            {
+                TestSuiteTreeNode treeNode = this[visualState.SelectedNode];
+                if (treeNode != null)
+                    this.SelectedNode = treeNode;
+            }
+
+            if (visualState.TopNode != null)
+            {
+                TestSuiteTreeNode treeNode = this[visualState.TopNode];
+                if (treeNode != null)
+                    TryToSetTopNode(treeNode);
+            }
+
+            if (visualState.SelectedCategories != null)
+            {
+                TestFilter filter = new CategoryFilter(visualState.SelectedCategories.Split(new char[] { ',' }));
+                if (visualState.ExcludeCategories)
+                    filter = new NotFilter(filter);
+                this.CategoryFilter = filter;
+            }
+
+            this.Select();
 		}
 		#endregion
 
@@ -1298,7 +1450,9 @@ namespace NUnit.UiKit
 	{
 		public override void Visit(TestSuiteTreeNode node)
 		{
-			if (!node.Test.IsSuite && node.Result != null && node.Result.IsFailure)
+			if (!node.Test.IsSuite && node.Result != null && 
+                (node.Result.ResultState == ResultState.Failure || 
+                 node.Result.ResultState == ResultState.Error) )
 			{
 				node.Checked = true;
 				node.EnsureVisible();
@@ -1326,7 +1480,9 @@ namespace NUnit.UiKit
 
 		public override void Visit(TestSuiteTreeNode node)
 		{
-			if (!node.Test.IsSuite && node.Result != null && node.Result.IsFailure)
+			if (!node.Test.IsSuite && node.Result != null && 
+                    (node.Result.ResultState == ResultState.Failure || 
+                     node.Result.ResultState == ResultState.Error) )
 			{
 				tests.Add(node.Test);
 				filter.Add(node.Test.TestName);
diff --git a/src/GuiComponents/UiKit/TestSuiteTreeView.resx b/src/GuiComponents/UiKit/TestSuiteTreeView.resx
index 7b68f0b..107afc8 100644
--- a/src/GuiComponents/UiKit/TestSuiteTreeView.resx
+++ b/src/GuiComponents/UiKit/TestSuiteTreeView.resx
@@ -3,7 +3,7 @@
   <!-- 
     Microsoft ResX Schema 
     
-    Version 1.3
+    Version 2.0
     
     The primary goals of this format is to allow a simple XML format 
     that is mostly human readable. The generation and parsing of the 
@@ -14,16 +14,17 @@
     
     ... ado.net/XML headers & schema ...
     <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">1.3</resheader>
+    <resheader name="version">2.0</resheader>
     <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
     <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1">this is my long string</data>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
     <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
     <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        [base64 mime encoded serialized .NET Framework object]
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
     </data>
     <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
     </data>
                 
     There are any number of "resheader" rows that contain simple 
@@ -35,7 +36,7 @@
     Classes that don't support this are serialized and stored with the 
     mimetype set.
     
-    The mimetype is used forserialized objects, and tells the 
+    The mimetype is used for serialized objects, and tells the 
     ResXResourceReader how to depersist the object. This is currently not 
     extensible. For a given mimetype the value must be set accordingly:
     
@@ -45,7 +46,7 @@
     
     mimetype: application/x-microsoft.net.object.binary.base64
     value   : The object must be serialized with 
-            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
             : and then encoded with base64 encoding.
     
     mimetype: application/x-microsoft.net.object.soap.base64
@@ -59,18 +60,37 @@
             : and then encoded with base64 encoding.
     -->
   <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
     <xsd:element name="root" msdata:IsDataSet="true">
       <xsd:complexType>
         <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
           <xsd:element name="data">
             <xsd:complexType>
               <xsd:sequence>
                 <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                 <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
               </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
               <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
               <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
             </xsd:complexType>
           </xsd:element>
           <xsd:element name="resheader">
@@ -89,122 +109,90 @@
     <value>text/microsoft-resx</value>
   </resheader>
   <resheader name="version">
-    <value>1.3</value>
+    <value>2.0</value>
   </resheader>
   <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
   <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
-  <data name="treeImages.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Public</value>
-  </data>
-  <data name="treeImages.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="treeImages.Location" type="System.Drawing.Point, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+  <metadata name="treeImages.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>17, 17</value>
-  </data>
+  </metadata>
   <data name="treeImages.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
     <value>
-        AAEAAAD/////AQAAAAAAAAAMAgAAAFpTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0xLjAuNTAw
-        MC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZT
-        eXN0ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMA
-        AADCEwAAAk1TRnQBSQFMAgEBBAEAAQkBAAEEAQABEAEAARABAAT/ARkBAAj/AUIBTQE2BwABNgMAASgD
-        AAFAAwABMAMAAQEBAAEYBgABJP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
-        AP8A/wD/ACoAA/oD+wkAA/kD+gMAA/0JAAP8A/gD+wMAAfQB6wH/AfQB9gH/AeEB+QH3AeIB/wH6AeMB
-        9gH7AfEB+wH/AdYB1QH8AekB5gH/Ae4B6gH/Ad0B3gH6AfIB/AH/Ae4B/wH5Ad8B+QHrAe0B/wH8Ae0B
-        6QH8AfYB5gH/AeEB+gHYAe4B/wHkAfwB/wHwAfMB/QHwAeIB/wHyAc0B/wHmAbQB/QHLAa0B/wG+AbIB
-        /wG5Ab4B/wHBAeoB7wHuAf8B7wL/Ae8B8AH/AfkB8gH3AvkB5wHuAfEB9AL/AegC8AL9Af8B9gH+Af8B
-        zAHqAe8B4QL/AfMB/AH/AvkB/wHuAfQB/wHqAfkB/wHfAfcB/QHoAv8B5AHtAfAB+AL/AfEB/wH+Ae0B
-        /wH8AwAD/gb7A/gD7QPeA9UD2gPhA+sD9gkAA/sB/QH7Af8CAAEHAeYB9gH1Ad0B7wH6AekB9AH/AaEB
-        pQHmAYYBgAHXAWkBYQHAAWEBWAGyAaUBowHpAZoBoQHMAeQB8gH/AeUB9gHzAQABBQEDAgABCwH7Ae4B
-        /wHqAfYB6gHlAe8B4gH9Af8B9QHvAf8B6QGuAeoBtAGNAeABmwFvAc0BgAFvAdgBfQFdAc4BYAGIAeUB
-        igG+AesBygHHAdYBzgH4AfwB6QL/AfQB+wH4AfoB9gH1Af8B7QH5AfsB8AH5AfwB8QH1AfoB4AHzAfgB
-        zwL/AZsB2wHfAXwBsAG3AQABCAEQAQABDwEXAZ8B1wHcAYkCzwG/AfgB9wHtAv8B7QHxAvIB+AH3AfgB
-        /wH+A/0GAAPuA9cDxwPCA8EDvQPEA88D3gP0BgAD+AHoAfIB4gEKAQ8BBgEIAQQBCQHEAb0B6AFgAVsB
-        yAEmASABuwElARQB0AEFAQABtgEqARgB0QE2AS4ByQExATUBpgGNAZUB2AIAAQ4BBwEAAQEB/wH7Af8B
-        8gHrAfoB/wH1Af8B/QH6Af8B2wHvAdwBowHaAZsBdAHbAWgBUwHWAUoBQgHNAUYBPQHRAUUBRAHbAT4B
-        JQGzASQBTQHLAWcBbwHNAYYBswHnAasB6AH5AdgB/wH7Af8B+gHkAf8B4QHtAfEB8gH+Af8B7AH3Af8B
-        sAHYAd0BbQLPAVcB2AHVAWEB6AHmAQABEAEOAQABEAEOAUcB1QHOAT4B3AHQAWQB3wHVAaQBywHNAf8B
-        /QL/AfwC/wH9Af8D/AP9A/AD0wO6A7UDvQPEA7oGvQPDA9kD9QMAA/wB/QH/AfEB3AHgAdsBCAEAASIC
-        AAE/ATsBNwG1ARIBDAG9AQ8BAAHhASUBEQH/AQoBAAHhARABCAHKAQ0BFQGYAgABPAIAASoB5wHYAfgB
-        +QHvAv8B+wH/AfEB8gH/AesB/QH+AZgBywGZAXgB0gFuAUkBzwE5ASIBugETAUoB2AFFATYBwwEyAUEB
-        2gE3AS8B1AEtASwB3AFDAUEB3wFXAXEB2gFrAbMB7AGnAfoB/wH8AfoB6gH/AdwB+gH/AdQB+gH/AZoB
-        0QHWAXcB0wHUAUgB4AHbATYB6AHhAUwB+AH0AUQB7QHqAUUB7wHpAU4B/wH6ATYB/QHvATcB3gHRAYcB
-        2gHYAawBxwHLAu8B9QH/AfUB+wMAA+4DzAO6A7wGxgO+A78DwAO7A7cDxAPfA/gDAAH/AfwB9wHpAeUB
-        /gFAATsBlgIAAU8CAAFFARgBIgGeARgBFQHgAQMBAAHnARUBEQHzASQBJwHdAgABRgIAATIBIgEjAYUB
-        mgGSAekB7wHhAf8B9AHkAe8BuQHuAdMBpgHqAbUBawHNAWMBRQHFATYBMAHMASsBTQHgAUgBVAG2AUQB
-        AAEyAgABNQEAAT8B2gE7ASIB5QEjAQQBzQEHAS4B1wEnAXQB6AFvAcgB+QHTAfEC/wHGAv8BgQHWAdgB
-        WAHZAdYBSgH3Ae8BFAHqAd8BQQL/AUQB5wHpAQABGgEfAQABEQEUAVUC/wE8AfsB9AE3Ae4B5AFKAeEB
-        2AFxAdgB0wHSAf0B/wHzAf4B/wMAA+IDxAO8A8MDyAPEA78DvAO/A8ADvQO/A9AD7QMAAf8B8wH/AYwB
-        hAHAATwBOgHCARsBIwG8AgABVAIAAVABGwEhAcABFQETAcoBFwEVAc0CAAFyAgABXgExAUIBsAEpAS8B
-        xAEhARwBnwHmAdsC/wH7Af8BtQH+AcYBfAHcAYIBQQHOATEBJwHKARUBRwHpAUoBNwHCATsBAAFGAgAB
-        JwIAASgBAAFDAc0BQAE2Af8BKwEXAfkBCgEgAeQBFgFCAdEBPgGhAeUBqgHTAfIB4wG9Av8BdAHbAd4B
-        OgHqAeMBKwL/AREB/wH9AQoB8QHpAUYB8wH2AQABGwEjAQABFwEgAU8B5QHrAUwC/AFIAf8B/AExAeoB
-        4AFTAeYB3gGJAdAB0wHbAfwB/wP0A9oDxQbDBr0DxAa9A8EDwwPAA8YD5AMAAeUB1gH/AWsBYgHDAgsB
-        twEAAQkBygEFASEBxgIAAXICAAFFAUgBRQGbAgABTAIAAV8BHAEmAdcCAAHEAgABwAEiASEBxAHIAccB
-        /wH3AfYB+gHIAf8BxwFpAcwBYAEjAdYBCQFBAf8BLAErAb8BNQEAATACAAE4AQABTwHBAUUBAAEeAgAB
-        PgEAAQoB1gEAARYB/gEAASwB6AEaATwBwAEwAa8B7wGtAeEB/wHlAdAB+wH/AXMB0AHZATAB8gHsAQ8B
-        /wH7AQQB/wH5ARcC/wEwAfcB+QEAARABGAEAAQkBGAEAARwBKQFNAeUB6gFDAfQB8QFBAfwB8wEuAckB
-        xAGTAeoB7gHKAf4B/wMAA9MDswO5A8YDwwO8A70DwwO+A8ADwwO+A78D3gMAAd0BzwH/AVUBTAHAAQkB
-        CwHIAQUBFAHsAQABEQHUAQABGQGoAgABQAIAARkCAAEqATgBLwGkAQIBCAHXAQEBCwH/AQkBCgH8AggB
-        ugGKAY0BygHpAe4B7wG5AeUBsAF4AdcBaQEgAeYBBQEaAfUBBQEAAUsCAAE3AQABQwHuAUQBOQHTATgB
-        AAEkAgABKQEAAS8B5QEiAR0B6QEGAUcB9QEzATkBuAEnAY4BzQGDAdQB8wHMAdYB7wH/AYsB4AHqAS8B
-        +QHyAQEB/wH0AQcB+wHzARcB/gH7ARMC7wFHAv8BagH2Af8BAAEJARgBAAEKARYBaQH1AfsBTgH/Af4B
-        KwHQAckBfAHTAdcByQH6Af8D+APTA7oDvwPGA8ADvwPIA8oDvgPAA8MDvAPFA+YDAAHwAeAB/wFXAUwB
-        wAEMAQ0ByQEAARAB5QEAAQ0BzgEIASYBtQIAATgCAAEZAgABKgE+ATUBqgEAAQQB0wEAAQkB/wIAAfAB
-        AQEAAbEBqQGqAecB8gH2AfcByAHoAcUBfwHWAXYBIAHlAQ0BDAH1AQABJgHoASABJAHeASYBFQHqARgB
-        IwHsASkBQQHUAU4BAAE2AgABPAEAAUMB1QE7AU4B5QE7ATYBtAEfAacB6AGTAdMB9QG/Ab4BzQHgAXsB
-        xwHTATQB/AH1AQsB/wH1ATYC/wEcAuwBHwL/ARQB+wH5AS8C/wFJAeUB6wEAARsBLQEAAQYBEgFKAfQB
-        7gE/AecB4AF/AckBzwHeAfoB/wMAA90DwAO9A8EDvAO3A7gGuwPAA74DuQPNA+0D/QHsAd0B/wGHAXwB
-        3AESAREBuwEAAQkByQEQASwB0AIAAWQCAAFDAT8BOgGPAgABSAIAAVsBGAEhAc8BDAEWAd8BAAEBAdMB
-        PwE6Ad0BvQG6AfIB4wHgAeIBvQHaAcABgAHQAX0BLQHjASEBFAH5AQgBHgH9ARgBFgH4ARcBCgH1AgsB
-        7wEQARsB4wEkAQABPwIAASgBAAFeAboBWwE7AcQBLQFaAdkBSAGqAeoBmAHvAf8B2wHfAfEB/wGMAdoB
-        4QE0AfYB7wERAfQB6QEAAhUBRwH3AfgBEwHyAfABHAL/ARYB9wHyAVQB/gH/AQABAgEUAQABAwERAVkB
-        +QHzASsBzAHCAZsB2wHgAe0B/QH/AwAD5gPHA7wDvgPCA8EDvwPAA8QDxgO9A7sD1wP1A/kB8gHmAfoB
-        jQGEAb0BOAE1AboBIgEpAb4CAAFMAgABTQEOAREBrwEUAREBxQEeARoB0QIAAXACAAFPASgBNgGgAgAB
-        lAE7ATQBswHoAdsC/wH7Af8BsgHbAbwBhAHQAYkBPwHVATwBFgHkARQBAAH3AQgBAAH/AQQBCgH1AQMB
-        BgHyAQABCQH/AQoBHgHpASABAAEvAgABFgEAAUoBxQJFAcUBQAGqAecBpQHZAfQB0wHaAv8BbQHHAcgB
-        PwH9AfIBNwH/AfcBAAERARQBAAENARIBPAL/ARYB8gHsATIB+AH0AVQB7QHuAQABBwERAQABDgEUAWYB
-        /QH0AVQB3wHUAaEB2AHbAeAB7QH1AwAD8QPVA8ADuwPBBsYDxwPBA8ADvwPHA+MD/AP+Av8B+AHfAdkB
-        8AFnAWABtQIAAU0CAAFGAR8BJwGgARwBFwHeARsBEAH6AQkBAQHhAh8B0QIAAUMCAAE3AVIBUQGvAZwB
-        kAHiAfoB6QL/AfQB+wHhAfcB5QG3AesBuwFyAd4BdAEtAdcBNwEAAeUBFQEAAfgBDAEUAf8BDQEWAf8B
-        BwEAAfoBAAEUAeoBDwEAAS0CAAESAQABawHMAWwBgAHfAYQB3QH/AeAB7AH3Ae8BzAH5Af0BlAHkAeMB
-        QAHVAcsBSwHsAeIBcQHlAeYBAAEMAQ8BAAEdARwBRwH0AfABXAH7AfkBAAEQAQ8BAAEVARcBiQH3AfUB
-        QwHEAbsBbgHXAc4B1QP7Af4B/wMAA/4D7APTA8EDvAO6A7gDvgOvA7UDzQPgA/IGAAHuAfUB2gH9Af4B
-        9QEGAQABFgECAQABPAEmAR8BmAEdARUBwAEdAQgB5gENAQAB5QEPAQAB3gElARwB1wEdASABoAIAATkC
-        AAEmAf8B7AH/AfIB5gHyAe8B5QHrAf8B+gH/Ae8B9gHpAa4B6QGvAWEB1AFzARwBzgFHAQIB2gEnAQcB
-        8QEJAQwB+gEAASIB/wETATAB6wEjAU4BvwFGAQABHAEAAYMBtwGHAcoB5wHQAf0B+gH/AfgB5gH9AdcC
-        +QHLAfkB+gGXAeAB3gFvAdMBzgFaAdgB0wFpAeoB5wEAARABEgEAAQsBDQEAAg0BAAEPAQsBXQHnAd8B
-        YAHiAdcBhwHoAd4BlwHPAcoB+AP/Af0B/wP8BgAD8QPeA88DxQPAA8sDvgPMA+sD+gP+AwAD+wH9Af8B
-        7wECAQUBAAEHAgAB1gHLAfEBigGDAesBIQEWAawBMgEcAdMBIwEKAcoBJQEQAcMBEAEFAZsCNgGiAZEB
-        kwHTAQQBAAELARsBDgEMAfYB7AHyAf8B+wL/AfMB/AH/AvgB4QH0AeMBpgHmAbwBYQHXAYwBOAHTAVoB
-        JwHaASsBKQHbARgBQgHXASkBNwG2ASUBXwHMAWYBmQHgAacBxgHXAcwB/wH5Af8B9AHoAfQB/wH7Af8B
-        8wL/Ae0C/wHUAfMB9AGhAdsB2gFzAdsB1AFvAdkB0wGAAb8BwwGTAccBzQGDAcgBywF9AdgB1QFrAeAB
-        1wFrAdkBzQGwAfMB6gHmAf8C/gH5AfgB/wH1AfQD+wP9BgAD+wPwA+gD5gPrA+gD9QwABPgB8QH4AgAB
-        AwH2Af8B/AHbAekB7wHjAeoB/wLgAf8BpgGdAe4BgwF3AdEBhAF3AcsBtgGwAfEB5gHpAf8B1gHfAewB
-        9gH/AfsBAAEDAQABDwEFAREB+AHnAfwC/wHwAv8B+QH/AfoB/wHsAfsB/gG/AfgB1wGfAesBsQGVAd4B
-        lgGeAdYBjwGfAboBewHQAe4BvQGbAdwBvAGvAeQB2gH/AfkC/wHtAvkB/wHqAfQB/wHiAf8B/QH+AfsB
-        +QH4AegB/gH8AckB8AHuAdMC/wG0AeIB4wGeAcEBxQG5AdkB3wG0AdQB2QGlAcwBzgGaAcwBygHTAv8B
-        3AH/Af4B4QH6AfAC/wH7Af8B/gH5AwAD+wP4A/4DAAP+A/wDAAP7CQAD9AP+BgAB+AHrAf8B+QH3Af8B
-        2wHwAegB7AH/AfkB8wL/AfAB9gH/AewB5wH/AfoB8gH/Ae4B5wH/AfkB9gH/AdgB3QHeAfYB/wH4Ad4B
-        9AHhAeMB8wHoAf8B+gH/AfQB3wH4AfkB/wHgAfYB9AHpAfwB6QH/AfgB7wH/AeIB/AHvAdAB9gHaAdcB
-        6gHXAeoB5gHbAf8B7QLpAdUB1AHIAfUB+AHTAv8B9QHgAv8B9gH/AfoB/wHiAdQB/wG5Af8B+QH6Af8B
-        +QH3Ae8C/wHkAv8B4wH1AfYB4gHzAfYB7AL/AeAB9gH8AeYB9AH6AfEC/wHoAfcB+QHlAfwB+AHhAf8B
-        9wHtAf8B+QL/AfkB/wH7AfQBQgFNAT4HAAE+AwABKAMAAUADAAEwAwABAQEAAQEFAAGAAQEWAAP//wAC
-        AAE5AXEGAAGAAQ4GAAFgAQYHAAECBgABgAEBBgABgAEBBwABAQYAAYABAQcAAQEGAAGABwABgAcAAYAH
-        AAGAAQMGAAFgAQIGAAEwAR4GAAGJAXMGAAs=
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
+        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
+        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAA2
+        DwAAAk1TRnQBSQFMAgEBBQEAAQkBAAEEAQABEAEAARABAAT/ARkBAAj/AUIBTQE2BwABNgMAASgDAAFA
+        AwABIAMAAQEBAAEYBgABGOEAA9YDtwOYA4ADtQPWqwADnAGdAYQBlQHIAYABsQFRASwBRgErARgBJAFc
+        AT0BUgGeAYYBlgOcpQABhAGDAYQByQGBAbQB2AFVAbAB3AFhAbYBZgExAVYBLQEWASYBdgE5AWMB3AFk
+        AbcBzAGJAbcBhAGDAYSfAAOcAckBfgGyAdgBUgGvAd4BaAG5AeMBegHCAeIBhAHEAb8BdAGnAc8BeQG0
+        AeMBegHCAd4BaAG5AcwBiQG3A5yZAAPWAZ0BhAGVAdUBSgGqAdwBYQG2AeMBegHCAekBkAHNAXYBUAFq
+        ATABIgErAXMBTgFnAekBkAHNAeMBegHCAdwBZAG3AZ4BhgGWA9aWAAO3AcYBfAGwAdcBUAGtAd8BawG7
+        AeYBhwHIAe0BoQHVAZABbQGFATEBJwEuAU8BPAFJAeUBmwHOAeYBhwHIAd8BawG7AcgBhQGzA7eWAAOb
+        AdMBaQGxAdgBUgGvAd8BbwG8AeYBjwHNAe8BqAHYAboBkwGtATMBLQIxAScBLgFaAT8BUQHcAYQBwAHf
+        AW8BvAHWAXgBugOblgADmwHTAWkBsQHXAVABrQHbAZEB0wHfAacB3wHmAbAB4QHzAbgB4QGmAYMBmgEy
+        ASUBLgEvASABKwFWATIBSwHVAWYBsgHWAXYBuQOblgADtwHGAXwBsAHVAUoBqgHXAbEB6AHaAbQB6QHg
+        Aa4B4wHrAaYB2QHvAagB2AGrAXQBmgEyAR8BLAEtARgBJwGRAUABeAHIAYABsQO3lgAD1gGdAYQBlQHS
+        AT8BpQHNAckB8wGzAZQBwQHeAZ4B2gHlAYoBygHnAYsBygHmAYcByAFpATgBWQEsARUBJQFpASgBVgGd
+        AYQBlQPWmQADnAHJAX4BsgFhAR0BTAEvARQBJwGBATkBawHAAVwBoQHHAWMBpwG4AVgBmgE9ARsBMwEr
+        ARABIwFzAUkBZgOcnwABfQF8AX0BQwEqATwBKQEMASABKwEOASIBKwEQASMBKwEQASMBKwEQASMBKgEO
+        ASEBKgEaASQBeAF3AXilAAOWAVoBSgFVATQBIQEuASkBFAEiASkBFAEiASgBGAEiATEBKQEvA3+rAAPW
+        A7QDjwONA6UD0f8A/wAGAAaDJAADygOjBn8DowPKEgADvAM3BgAD1gO3BpsDtwPWBgADNwO8EgAD1gO3
+        BpsDtwPWHgAD1gN/Bh8DfwPWGwADgANtA3wDcQNzA30DbQOADwADCAMAA1UDnAF+AYEBmgFvAXsBvAFa
+        AWkBxgFaAWkBxgFyAXwBvgF+AYIBmgOcA1UDAAMIDwADnAF5AZgBeQFhAa8BYQE9AZUBPQFTAcABUwFr
+        AbgBawF8AZgBfAOcGAADnAF+AYoBjwFeAYIBigEUASMBJgEUASQBJwFfAYYBjQF+AYwBkAOcFQADYwN9
+        A1wDYwNqA2wDagNmA4MDYwwAA3sGAAFXAWABkwEwAUQBxQE0AUcByQE4AUwBzAE6AU0BzgE4AUwBzAE3
+        AUoBygFbAWMBlgYAA3sMAAGDAYQBgwFiAbcBYgEhAbkBIQERAUEBEQEJARsBCQFAAcEBQAE+AcQBPgE1
+        AcABNQFvAbwBbwGDAYQBgxIAA4MBbwGVAZ4BJAF8AY0BIwGIAZYBJAGMAZkBIwGLAZYBJQGPAZwBJwGK
+        AZgBcQGdAaUDgw8AA4ADfwNgA28DewOEA4cDhAN7A28DhwOADAADEQMAAQgBDAEkATcBSQHDAUMBVQHU
+        AUkBWwHYAUsBXQHaAUkBWwHYAUABUQHKAQoBDgElAwADEQwAA5wBYQG3AWEBHQG4AR0BIAFrASAGAAE2
+        AW8BNgFhAdIBYQFRAcwBUQE6AcMBOgFvAbwBbwOcDAADnAFvAZMBnQEgAXoBiwEkAY4BmwEhAYIBiwEK
+        AScBKAEJASMBJAEhAYYBjAEoAZ8BqQEkAY4BmwFxAZ0BpQOcCQADygNtA2ADcAOCA5IDnQOhA50DkgOC
+        A3IDcAPKBgAD1gFSAVQBYwYAARIBFwE3AU4BXwHYAVkBaQHkAVwBbQHmAVcBZgHeARUBGQE5BgABUwFV
+        AWUD1gYAA9YBeQGYAXkBEwGzARMBJAGOASQBAQECAQEGAAEHAQsBBwF3AckBdwFuAdcBbgFRAcwBUQE1
+        AcABNQF8AZgBfAPWBgAD1gF+AYoBjwEiAXIBhQEjAYgBlgEoAZ8BqQEmAZwBoQEJAScBKAEKASgBKQEi
+        AYwBjgEsAbQBugEoAZ8BqQEnAYoBmAF+AYwBkAPWBgADowN+A2YDewOQA6MDtAO8A7QDowOQA3sDiAOj
+        BgADtwFvAXkBvAEXASABXQYAAR0BIgFIAWYBdgHrAWwBewHvASABJQFLBgABHgEnAWIBdQGAAcEDtwYA
+        A7cBXgG0AV4BFQGWARUBBQEPAQUDAAEEAQcBBAYAAT0BWAE9AYQB3wGEAWEB0gFhAT4BxAE+AWsBuAFr
+        A7cGAAO3AWsBkQGaAR8BdwGJASUBkQGeASoBqwGyASwBtgG5AQoCKwELAS4BLQEUAlMBLQG7Ab4BKgGr
+        AbIBJQGRAZ4BbQGZAaIDtwYAA38DdANpA38DlQOrA8ED1wPBA6sDlQN/A4QDfwYAA5sBVgFmAcMBMgFG
+        AcgBGQEgAVAGAAEoAS0BWQEuATMBXQYAAR4BJQFUAUEBVAHTAWABbwHLA5sGAAObAS0BhgEtAQIBCgEC
+        BgABXQGWAV0BOQFNATkDAAMBAXEBtQFxAWgB1AFoAUIBxgFCAVMBwAFTA5sGAAObAVEBhQGVASABegGL
+        ASYBlAGgATQBsQG6ATEByQHKARgBZQFkAQwBMwExAQsBLgEtARIBSgFLASgBoQGoASUBlAGgAVQBlQGh
+        A5sGAAN/A3MDZgN7A5ADowO0A7wDtAOjA5ADewOBA38GAAObAVQBYwHDATABRAHFAT4BUQHOARcBHAFB
+        DAABGwEgAUQBTAFeAdgBPwFSAdEBYAFtAcoDmwYAA5sBFgFBARYEAAECAQABQgF4AUYBjwHeAZQBjQHM
+        AY4BBgEIAQYDAAEfATQBHwFhAdIBYQE+AcQBPgFQAcABUAObBgADmwFRAYUBlQEfAXcBiQFkAakBwQFy
+        Ab0B0gFfAcgB1wE1AtUBFwFhAWABCgIrAQkBJwEoAQwBMAEyAR8BegGFAVMBkgGeA5sGAAOjA3wDXQKB
+        AYgCkgGbApYBmAOdA6EDnQOSA4IDcAODA6MGAAO3AWsBdwG5ASoBPwHDATgBTAHMATwBSAGcAgQBBwYA
+        AgMBBwE6AUYBnwFFAVcB1gE4AUwBzAFyAXwBvgO3BgADtwFbAa8BWwEEATIBBAFFAYYBTQGWAdEBrAGc
+        AdYBrwGVAd0BngFEAW0BRAYAASkBZgEpATEBvwExAWQBtwFkA7cGAAO3AWsBkQGaASIBcgGFAZ0BvQHe
+        AZYBwQHgAXUBwgHYAT8BxQHMAS8BxwHIARkBZwFpAQkBJAElAQgBIAEiARABPAFCAW0BlgGfA7cGAAPK
+        A20DUgKGAZQCnAGuApIBnAOEA4cDhAN7A28DYwNtA8oGAAPWAX0BgAGZASABMwGhARIBGQFLAQEBAgED
+        AwACAgEDAwEDAAMBARYBHQFOASsBPAGoAX4BggGaA9YGAAPWAXkBmAF5AQUBrgEFAYUByAGdAbQB0QHV
+        AZ0B0QG1AYYB0wGTAWQBywFkAQ0BHQENBgABEQFgAREBeQGYAXkD1gYAA9YBfgGKAY8BHwFmAXkBwQHE
+        AeoBnQG/Ad8BbAG1AcsBMQGtAbUBKwGvAbYBKgGrAbIBEwFKAU4BBwEcAR8BCQEhASUBfgGKAY8D1gkA
+        A4ADfQNNAqkBxAKJAZcDbQNsA2oDYwNZA30DgAkAA9ADNQMBBgABEwEUARoBbwF2AbUBSwFWAakBBgEI
+        ARYGAAMBAzUD0AkAA5wBYQG3AWEBBQGuAQUBmQHMAbUBeQHJAYsBUAHGAVUBQgHGAUIBNgGsATYBBQEV
+        AQUGAAM/DAADnAFEAVoBYQEHARoBHwEhAVYBYwElAYcBlgElAZEBngElAZQBoAEkAY8BnAENATMBOAEG
+        ARgBHAEZASEBIwOWDwADYwN9A1ADTQNPA1EDTwNQA30DYwwAA4QGAAIFAQgBDwEYAlYBYwHDAVQBZAHR
+        ASsBPwHDASUBOAGzAREBGwFYAgUBCAYAA4QMAAGDAYQBgwFhAbcBYQEFAa4BBQEPAbIBDwEaAbcBGgEd
+        AbgBHQEaAbcBGgEQAZcBEAEIAQ4BCAYAAykJAAPfAx4BFQEdAR8BBgEUARgBCgElASwBEAE8AUUBEgFD
+        AUwBCwEqATABBgEWARoBFQEdAR8DTBUAA4ADbQN8BnADfANtA4ASAAMgA3cDkQF8AX8BmAFoAXIBtwFN
+        AV0BvQFOAV8BvQFpAXQBuAF9AX8BmAORA3cDIBIAA5wBeQGYAXkBXgG0AV4BPgG4Aj4BuAE+AV4BtAFe
+        AXkBmAF5A4oDQAMAA44MAAO2AzABGAEbARwBFQEdAR8BDwEaAR0BDwEaAR0BFQEdAR8BGAEbARwDNhsA
+        A8oDowZ/A6MDyh4AA9YDtwabA7cD1h4AA9YDtwabA7cD1gYAA6sVAAOCAzsDLAMoAyoDf88AAUIBTQE+
+        BwABPgMAASgDAAFAAwABIAMAAQEBAAEBBgABARYAA/8BAAL/BgAB+AEfBgAB8AEPBgAB4AEHBgABwAED
+        BgABgAEBBgABgAEBBgABgAEBBgABgAEBBgABgAEBBgABgAEBBgABwAEDBgAB4AEHBgAB8AEPBgAB+AEf
+        BgAC/wYABv8B/gF/AfgBHwGYARkB+AEfAfgBHwHwAQ8BgAEBAfABDwHwAQ8B4AEHAYABAQHgAQcB4AEH
+        AcABAwHAAQMBwAEDAcABAwGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEB
+        AYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQHAAQMBgAEB
+        AcABAwHAAQMB4AEHAYABAQHgAQEBwAEHAfABDwHAAQMB8AEBAeABDwH4AR8B+AEfAfgBGwH4AR8I/ws=
 </value>
   </data>
-  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <metadata name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>False</value>
-  </data>
-  <data name="$this.Name">
-    <value>TestSuiteTreeView</value>
-  </data>
+  </metadata>
 </root>
\ No newline at end of file
diff --git a/src/GuiComponents/UiKit/TestTree.cs b/src/GuiComponents/UiKit/TestTree.cs
index 0c66958..862a137 100644
--- a/src/GuiComponents/UiKit/TestTree.cs
+++ b/src/GuiComponents/UiKit/TestTree.cs
@@ -1,11 +1,12 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
 using System.Collections;
+using System.Collections.Generic;
 using System.ComponentModel;
 using System.Drawing;
 using System.Data;
@@ -26,7 +27,7 @@ namespace NUnit.UiKit
 		// Contains all available categories, whether
 		// selected or not. Unselected members of this
 		// list are displayed in selectedList
-		private IList availableCategories;
+		private IList availableCategories = new List<string>();
 
 		// Our test loader
 		private TestLoader loader;
@@ -235,11 +236,14 @@ namespace NUnit.UiKit
 			{
 				if ( availableCategories.Contains( category ) )
 				{
-					selectedList.Items.Add( category );
+					if (!selectedList.Items.Contains(category))
+					{
+						selectedList.Items.Add(category);
+					}
 					availableList.Items.Remove( category );
-				}
 
-				this.excludeCheckbox.Checked = exclude;
+					this.excludeCheckbox.Checked = exclude;
+				}
 			}
 
 			UpdateCategoryFilter();
@@ -329,7 +333,6 @@ namespace NUnit.UiKit
 		/// </summary>
 		private void InitializeComponent()
 		{
-			System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(TestTree));
 			this.tabs = new System.Windows.Forms.TabControl();
 			this.testPage = new System.Windows.Forms.TabPage();
 			this.testPanel = new System.Windows.Forms.Panel();
diff --git a/src/GuiComponents/UiKit/TextBoxDisplay.cs b/src/GuiComponents/UiKit/TextBoxDisplay.cs
index 01583da..71680da 100644
--- a/src/GuiComponents/UiKit/TextBoxDisplay.cs
+++ b/src/GuiComponents/UiKit/TextBoxDisplay.cs
@@ -1,10 +1,12 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 using System.Windows.Forms;
+using System.Drawing;
+using System.ComponentModel;
 using NUnit.Core;
 using NUnit.Util;
 
@@ -16,10 +18,13 @@ namespace NUnit.UiKit
 	/// </summary>
 	public class TextBoxDisplay : System.Windows.Forms.RichTextBox, TextDisplay, TestObserver
 	{
-		private ContextMenu contextMenu = new ContextMenu();
 		private MenuItem copyMenuItem;
 		private MenuItem selectAllMenuItem;
 		private MenuItem wordWrapMenuItem;
+		private MenuItem fontMenuItem;
+		private MenuItem increaseFontMenuItem;
+		private MenuItem decreaseFontMenuItem;
+		private MenuItem restoreFontMenuItem;
 
 		private TextDisplayContent content;
 
@@ -33,7 +38,12 @@ namespace NUnit.UiKit
 			this.copyMenuItem = new MenuItem( "&Copy", new EventHandler( copyMenuItem_Click ) );
 			this.selectAllMenuItem = new MenuItem( "Select &All", new EventHandler( selectAllMenuItem_Click ) );
 			this.wordWrapMenuItem = new MenuItem( "&Word Wrap", new EventHandler( wordWrapMenuItem_Click ) );
-			this.ContextMenu.MenuItems.AddRange( new MenuItem[] { copyMenuItem, selectAllMenuItem, wordWrapMenuItem } );
+			this.fontMenuItem = new MenuItem( "Font" );
+			this.increaseFontMenuItem = new MenuItem( "Increase", new EventHandler( increaseFontMenuItem_Click ) );
+			this.decreaseFontMenuItem = new MenuItem( "Decrease", new EventHandler( decreaseFontMenuItem_Click ) );
+			this.restoreFontMenuItem = new MenuItem( "Restore", new EventHandler( restoreFontMenuItem_Click ) );
+			this.fontMenuItem.MenuItems.AddRange( new MenuItem[] { increaseFontMenuItem, decreaseFontMenuItem, new MenuItem("-"), restoreFontMenuItem } );
+			this.ContextMenu.MenuItems.AddRange( new MenuItem[] { copyMenuItem, selectAllMenuItem, wordWrapMenuItem, fontMenuItem } );
 			this.ContextMenu.Popup += new EventHandler(ContextMenu_Popup);
 		}
 
@@ -52,6 +62,29 @@ namespace NUnit.UiKit
 			this.WordWrap = this.wordWrapMenuItem.Checked = !this.wordWrapMenuItem.Checked;
 		}
 
+		private void increaseFontMenuItem_Click(object sender, EventArgs e)
+		{
+			applyFont( new Font( this.Font.FontFamily, this.Font.SizeInPoints * 1.2f, this.Font.Style ) );
+		}
+
+		private void decreaseFontMenuItem_Click(object sender, EventArgs e)
+		{
+			applyFont( new Font( this.Font.FontFamily, this.Font.SizeInPoints / 1.2f, this.Font.Style ) );
+		}
+
+		private void restoreFontMenuItem_Click(object sender, EventArgs e)
+		{
+			applyFont( new Font( FontFamily.GenericMonospace, 8.0f ) );
+		}
+
+		private void applyFont( Font font )
+		{
+			this.Font = font;
+			TypeConverter converter = TypeDescriptor.GetConverter(typeof(Font));
+			Services.UserSettings.SaveSetting( "Gui.FixedFont", 
+                converter.ConvertToString( null, System.Globalization.CultureInfo.InvariantCulture, font ) );
+		}
+		
 		private void ContextMenu_Popup(object sender, EventArgs e)
 		{
 			this.copyMenuItem.Enabled = this.SelectedText != "";
@@ -108,6 +141,12 @@ namespace NUnit.UiKit
 			}
 		}
 
+		protected override void OnFontChanged(EventArgs e)
+		{
+			// Do nothing - this control uses it's own font
+		}
+
+
 		#region TextDisplay Members
 		public TextDisplayContent Content
 		{
diff --git a/src/GuiComponents/UiKit/TextBoxWriter.cs b/src/GuiComponents/UiKit/TextBoxWriter.cs
deleted file mode 100644
index 5324740..0000000
--- a/src/GuiComponents/UiKit/TextBoxWriter.cs
+++ /dev/null
@@ -1,170 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-namespace NUnit.UiKit
-{
-	using System;
-	using System.IO;
-	using System.Windows.Forms;
-	using System.Text;
-
-	/// <summary>
-	/// TextBoxWriter translates a series of writes to a TextBox display.
-	/// Note that no locking is performed because this class is only written 
-	/// to by BufferedStringTextWriter which does locking. However the 
-	/// class does do an extra level of buffering in the case where the 
-	/// control has not yet been created at the time of the Write().
-	/// </summary>
-	public class TextBoxWriter : TextWriter
-	{
-		#region Private Fields
-		
-		/// <summary>
-		/// The TextBoxBase-derived control we write to
-		/// </summary>
-		private TextBoxBase textBox;
-		
-		/// <summary>
-		/// StringBuilder to hold text until the control is actually  created
-		/// </summary>
-		private StringBuilder sb;
-
-		#endregion
-    			
-		#region Constructors
-
-		public TextBoxWriter(TextBox textBox)
-		{
-			this.textBox = textBox;
-			textBox.HandleCreated += new EventHandler( OnHandleCreated );
-		}
-    			
-		public TextBoxWriter(RichTextBox textBox)
-		{
-			this.textBox = textBox;
-			textBox.HandleCreated += new EventHandler( OnHandleCreated );
-		}
-
-		#endregion
-
-		#region TextBoxWriterMethods
-
-		/// <summary>
-		/// Clear both the TextBox and the buffer.
-		/// </summary>
-		public void Clear()
-		{
-			textBox.Clear();
-			sb = null;
-		}
-
-		#endregion
-
-		#region TextWriter Overrides
-
-		/// <summary>
-		/// Flush the buffer to the TextBox, if it has been 
-		/// created, and clear the buffer.
-		/// </summary>
-		public override void Flush()
-		{
-			if ( textBox.IsHandleCreated && sb != null )
-				AppendToTextBox( sb.ToString() );
-			sb = null;
-		}
-
-		/// <summary>
-		/// Write a single char
-		/// </summary>
-		/// <param name="c">The char to write</param>
-		public override void Write(char c)
-		{
-			Write( c.ToString() );
-		}
-
-		/// <summary>
-		/// Write a string
-		/// </summary>
-		/// <param name="s">The string to write</param>
-		public override void Write(String s)
-		{
-			if ( textBox.IsHandleCreated )
-			{
-				if ( sb != null )
-				{
-					sb.Append( s );
-					Flush();
-				}
-				else
-					AppendToTextBox( s );
-			}
-			else
-			{
-				if ( sb == null )
-					sb = new StringBuilder();
-				sb.Append( s );
-			}
-		}
-
-		/// <summary>
-		/// Write a string followed by a newline.
-		/// </summary>
-		/// <param name="s">The string to write</param>
-		public override void WriteLine(string s)
-		{
-			Write( s + "\r\n" );
-		}
-
-		/// <summary>
-		/// The encoding in use for this TextWriter.
-		/// </summary>
-		public override Encoding Encoding
-		{
-			get { return Encoding.Default; }
-		}
-
-		#endregion
-
-		#region MarshalByRefObject Overrides
-
-		public override Object InitializeLifetimeService()
-		{
-			return null;
-		}
-
-		#endregion
-
-		#region Internal Helpers
-
-		/// <summary>
-		/// Delegate used to append text to the text box
-		/// </summary>
-		private delegate void AppendTextHandler( string s );
-
-		/// <summary>
-		/// Append to the text box using the proper thread
-		/// </summary>
-		/// <param name="s">The string to append</param>
-		private void AppendToTextBox( string s )
-		{
-			textBox.Invoke( new AppendTextHandler( textBox.AppendText ),
-				new object[] { s } );
-		}
-
-		/// <summary>
-		/// Respond to creation of the text box handle by flushing
-		/// any buffered text so that it is displayed.
-		/// </summary>
-		/// <param name="sender"></param>
-		/// <param name="e"></param>
-		private void OnHandleCreated( object sender, EventArgs e )
-		{
-			Flush();
-		}
-
-		#endregion
-	}
-}
diff --git a/src/GuiComponents/UiKit/TextBoxWriter.cs.txt b/src/GuiComponents/UiKit/TextBoxWriter.cs.txt
deleted file mode 100644
index 2c3079c..0000000
--- a/src/GuiComponents/UiKit/TextBoxWriter.cs.txt
+++ /dev/null
@@ -1,193 +0,0 @@
-#region Copyright (c) 2002, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Philip A. Craig
-/************************************************************************************
-'
-' Copyright © 2002 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov
-' Copyright © 2000-2002 Philip A. Craig
-'
-' This software is provided 'as-is', without any express or implied warranty. In no 
-' event will the authors be held liable for any damages arising from the use of this 
-' software.
-' 
-' Permission is granted to anyone to use this software for any purpose, including 
-' commercial applications, and to alter it and redistribute it freely, subject to the 
-' following restrictions:
-'
-' 1. The origin of this software must not be misrepresented; you must not claim that 
-' you wrote the original software. If you use this software in a product, an 
-' acknowledgment (see the following) in the product documentation is required.
-'
-' Portions Copyright © 2002 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov 
-' or Copyright © 2000-2002 Philip A. Craig
-'
-' 2. Altered source versions must be plainly marked as such, and must not be 
-' misrepresented as being the original software.
-'
-' 3. This notice may not be removed or altered from any source distribution.
-'
-'***********************************************************************************/
-#endregion
-
-namespace NUnit.UiKit
-{
-	using System;
-	using System.IO;
-	using System.Windows.Forms;
-	using System.Text;
-
-	/// <summary>
-	/// TextBoxWriter translates a series of writes to a TextBox display.
-	/// Note that no locking is performed because this class is only written 
-	/// to by BufferedStringTextWriter which does locking. However the 
-	/// class does do an extra level of buffering in the case where the 
-	/// control has not yet been created at the time of the Write().
-	/// </summary>
-	public class TextBoxWriter : TextWriter
-	{
-		#region Private Fields
-		
-		/// <summary>
-		/// The TextBoxBase-derived control we write to
-		/// </summary>
-		private TextBoxBase textBox;
-		
-		/// <summary>
-		/// StringBuilder to hold text until the control is actually  created
-		/// </summary>
-		private StringBuilder sb;
-
-		#endregion
-    			
-		#region Constructors
-
-		public TextBoxWriter(TextBox textBox)
-		{
-			this.textBox = textBox;
-			textBox.HandleCreated += new EventHandler( OnHandleCreated );
-		}
-    			
-		public TextBoxWriter(RichTextBox textBox)
-		{
-			this.textBox = textBox;
-			textBox.HandleCreated += new EventHandler( OnHandleCreated );
-		}
-
-		#endregion
-
-		#region TextBoxWriterMethods
-
-		/// <summary>
-		/// Clear both the TextBox and the buffer.
-		/// </summary>
-		public void Clear()
-		{
-			textBox.Clear();
-			sb = null;
-		}
-
-		#endregion
-
-		#region TextWriter Overrides
-
-		/// <summary>
-		/// Flush the buffer to the TextBox, if it has been 
-		/// created, and clear the buffer.
-		/// </summary>
-		public override void Flush()
-		{
-			if ( textBox.IsHandleCreated && sb != null )
-				AppendToTextBox( sb.ToString() );
-			sb = null;
-		}
-
-		/// <summary>
-		/// Write a single char
-		/// </summary>
-		/// <param name="c">The char to write</param>
-		public override void Write(char c)
-		{
-			Write( c.ToString() );
-		}
-
-		/// <summary>
-		/// Write a string
-		/// </summary>
-		/// <param name="s">The string to write</param>
-		public override void Write(String s)
-		{
-			if ( textBox.IsHandleCreated )
-			{
-				if ( sb != null )
-				{
-					sb.Append( s );
-					Flush();
-				}
-				else
-					AppendToTextBox( s );
-			}
-			else
-			{
-				if ( sb == null )
-					sb = new StringBuilder();
-				sb.Append( s );
-			}
-		}
-
-		/// <summary>
-		/// Write a string followed by a newline.
-		/// </summary>
-		/// <param name="s">The string to write</param>
-		public override void WriteLine(string s)
-		{
-			Write( s + "\r\n" );
-		}
-
-		/// <summary>
-		/// The encoding in use for this TextWriter.
-		/// </summary>
-		public override Encoding Encoding
-		{
-			get { return Encoding.Default; }
-		}
-
-		#endregion
-
-		#region MarshalByRefObject Overrides
-
-		public override Object InitializeLifetimeService()
-		{
-			return null;
-		}
-
-		#endregion
-
-		#region Internal Helpers
-
-		/// <summary>
-		/// Delegate used to append text to the text box
-		/// </summary>
-		private delegate void AppendTextHandler( string s );
-
-		/// <summary>
-		/// Append to the text box using the proper thread
-		/// </summary>
-		/// <param name="s">The string to append</param>
-		private void AppendToTextBox( string s )
-		{
-			textBox.Invoke( new AppendTextHandler( textBox.AppendText ),
-				new object[] { s } );
-		}
-
-		/// <summary>
-		/// Respond to creation of the text box handle by flushing
-		/// any buffered text so that it is displayed.
-		/// </summary>
-		/// <param name="sender"></param>
-		/// <param name="e"></param>
-		private void OnHandleCreated( object sender, EventArgs e )
-		{
-			Flush();
-		}
-
-		#endregion
-	}
-}
diff --git a/src/GuiComponents/UiKit/TextDisplay.cs b/src/GuiComponents/UiKit/TextDisplay.cs
index 0d0f3de..caae3bf 100644
--- a/src/GuiComponents/UiKit/TextDisplay.cs
+++ b/src/GuiComponents/UiKit/TextDisplay.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -10,17 +10,17 @@ using NUnit.Core;
 
 namespace NUnit.UiKit
 {
-	[Flags]
-	public enum TextDisplayContent
-	{
-		Empty = 0,
-		Out = 1,
-		Error = 2,
-		Trace = 4,
-		Log = 8,
-		Labels = 64,
-		LabelOnlyOnOutput = 128
-	}
+	[Flags]
+	public enum TextDisplayContent
+	{
+		Empty = 0,
+		Out = 1,
+		Error = 2,
+		Trace = 4,
+		Log = 8,
+		Labels = 64,
+		LabelOnlyOnOutput = 128
+	}
 
 	/// <summary>
 	/// The TextDisplay interface is implemented by object - generally
diff --git a/src/GuiComponents/UiKit/TextDisplayTabPage.cs b/src/GuiComponents/UiKit/TextDisplayTabPage.cs
index 2b1a61f..0b95903 100644
--- a/src/GuiComponents/UiKit/TextDisplayTabPage.cs
+++ b/src/GuiComponents/UiKit/TextDisplayTabPage.cs
@@ -1,9 +1,9 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
-#define TABS_USE_TEXTBOX
+
 using System;
 using System.IO;
 using System.Windows.Forms;
@@ -17,30 +17,24 @@ namespace NUnit.UiKit
 	/// </summary>
 	public class TextDisplayTabPage : TabPage
 	{
-#if TABS_USE_TEXTBOX
 		private TextBoxDisplay display;
-#else
-		private SimpleTextDisplay display;
-#endif
-
-//		private string prefix;
 
 		public TextDisplayTabPage()
 		{
-#if TABS_USE_TEXTBOX
 			this.display = new TextBoxDisplay();
-#else
-			this.display = new SimpleTextDisplay();
-#endif
-			this.display.Dock = DockStyle.Fill;
-
+			this.display.Dock = DockStyle.Fill;		
 			this.Controls.Add( display );
 		}
 
+		public System.Drawing.Font DisplayFont
+		{
+			get { return display.Font; }
+			set { display.Font = value; }
+		}
+
 		public TextDisplayTabPage( TextDisplayTabSettings.TabInfo tabInfo ) : this()
 		{
 			this.Name = tabInfo.Name;
-//			this.prefix = TextDisplayTabSettings.Prefix + tabInfo.Name;
 			this.Text = tabInfo.Title;
 			this.Display.Content = tabInfo.Content;
 		}
diff --git a/src/GuiComponents/UiKit/TextDisplayTabPage.resx b/src/GuiComponents/UiKit/TextDisplayTabPage.resx
deleted file mode 100644
index dd0ea4d..0000000
--- a/src/GuiComponents/UiKit/TextDisplayTabPage.resx
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<root>
-	<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-		<xsd:element name="root" msdata:IsDataSet="true">
-			<xsd:complexType>
-				<xsd:choice maxOccurs="unbounded">
-					<xsd:element name="data">
-						<xsd:complexType>
-							<xsd:sequence>
-								<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-								<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-							</xsd:sequence>
-							<xsd:attribute name="name" type="xsd:string" />
-							<xsd:attribute name="type" type="xsd:string" />
-							<xsd:attribute name="mimetype" type="xsd:string" />
-						</xsd:complexType>
-					</xsd:element>
-					<xsd:element name="resheader">
-						<xsd:complexType>
-							<xsd:sequence>
-								<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-							</xsd:sequence>
-							<xsd:attribute name="name" type="xsd:string" use="required" />
-						</xsd:complexType>
-					</xsd:element>
-				</xsd:choice>
-			</xsd:complexType>
-		</xsd:element>
-	</xsd:schema>
-	<resheader name="ResMimeType">
-		<value>text/microsoft-resx</value>
-	</resheader>
-	<resheader name="Version">
-		<value>1.0.0.0</value>
-	</resheader>
-	<resheader name="Reader">
-		<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-	</resheader>
-	<resheader name="Writer">
-		<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-	</resheader>
-</root>
diff --git a/src/GuiComponents/UiKit/TextDisplayTabSettings.cs b/src/GuiComponents/UiKit/TextDisplayTabSettings.cs
index 6a45169..f031fb9 100644
--- a/src/GuiComponents/UiKit/TextDisplayTabSettings.cs
+++ b/src/GuiComponents/UiKit/TextDisplayTabSettings.cs
@@ -1,3 +1,8 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using System.Collections;
 
@@ -5,79 +10,63 @@ namespace NUnit.UiKit
 {
 	public class TextDisplayTabSettings
 	{
-		private TabInfoCollection tabInfo;
-		private NUnit.Util.ISettings settings;
-
-		public static readonly string Prefix = "Gui.TextOutput.";
-
-		public void LoadSettings()
-		{
-			LoadSettings( NUnit.Util.Services.UserSettings );
-		}
-
-		public void LoadSettings(NUnit.Util.ISettings settings)
-		{
-			this.settings = settings;
-
-			TabInfoCollection info = new TabInfoCollection();
-			string tabList = (string)settings.GetSetting( Prefix + "TabList" );
-
-			if ( tabList != null ) 
-			{
-				string[] tabNames = tabList.Split( new char[] { ',' } );
-				foreach( string name in tabNames )
-				{
-					string prefix = Prefix + name;
-					string text = (string)settings.GetSetting(prefix + ".Title");
-					if ( text == null )
-						break;
-
-					TabInfo tab = new TabInfo( name, text );
-					tab.Content = (TextDisplayContent)settings.GetSetting(prefix + ".Content", TextDisplayContent.Empty );
-					tab.Enabled = settings.GetSetting( prefix + ".Enabled", true );
-					info.Add( tab );
-				}
-			}
-
-			if ( info.Count > 0 )		
-				tabInfo = info;
-			else 
-				LoadDefaults();
-		}
-
-		public void LoadDefaults()
-		{
-			tabInfo = new TabInfoCollection();
-
-			// Get any legacy settings
-			bool mergeErrorOutput = settings.GetSetting( "Gui.ResultTabs.MergeErrorOutput", false );
-			bool mergeTraceOutput = settings.GetSetting( "Gui.ResultTabs.MergeTraceOutput", false );
-
-			TabInfo tab0 = tabInfo.AddNewTab( "Console.Out" );
-			tab0.Content = TextDisplayContent.Out;
-			if ( mergeErrorOutput )
-				tab0.Content |= TextDisplayContent.Error;
-			if ( mergeTraceOutput )
-				tab0.Content |= TextDisplayContent.Trace;
-			if ( settings.GetSetting( "Gui.ResultTabs.DisplayTestLabels", false ) )
-				tab0.Content |= TextDisplayContent.Labels;
-			tab0.Enabled = settings.GetSetting( "Gui.ResultTabs.DisplayConsoleOutputTab", true );
-
-			TabInfo tab1 = tabInfo.AddNewTab( "Console.Error" );
-			tab1.Content = mergeErrorOutput ? TextDisplayContent.Empty : TextDisplayContent.Error;
-			tab1.Enabled = settings.GetSetting( "Gui.ResultTabs.DisplayConsoleErrorTab", true );
-
-			TabInfo tab2 = tabInfo.AddNewTab( "Trace" );
-			tab2.Content = mergeTraceOutput ? TextDisplayContent.Empty : TextDisplayContent.Trace;
-			tab2.Enabled = settings.GetSetting( "Gui.ResultTabs.DisplayTraceTab", true );
-
-			TabInfo tab3 = tabInfo.AddNewTab( "Log" );
-			tab3.Content = TextDisplayContent.Log;
-			tab3.Enabled = settings.GetSetting( "Gui.ResultTabs.DisplayLoggingTab", true );
-		}
-
-		public void ApplySettings()
-		{
+		private TabInfoCollection tabInfo;
+		private NUnit.Util.ISettings settings;
+
+		public static readonly string Prefix = "Gui.TextOutput.";
+
+		public void LoadSettings()
+		{
+			LoadSettings( NUnit.Util.Services.UserSettings );
+		}
+
+		public void LoadSettings(NUnit.Util.ISettings settings)
+		{
+			this.settings = settings;
+
+			TabInfoCollection info = new TabInfoCollection();
+			string tabList = (string)settings.GetSetting( Prefix + "TabList" );
+
+			if ( tabList != null ) 
+			{
+				string[] tabNames = tabList.Split( new char[] { ',' } );
+				foreach( string name in tabNames )
+				{
+					string prefix = Prefix + name;
+					string text = (string)settings.GetSetting(prefix + ".Title");
+					if ( text == null )
+						break;
+
+					TabInfo tab = new TabInfo( name, text );
+					tab.Content = (TextDisplayContent)settings.GetSetting(prefix + ".Content", TextDisplayContent.Empty );
+					tab.Enabled = settings.GetSetting( prefix + ".Enabled", true );
+					info.Add( tab );
+				}
+			}
+
+			if ( info.Count > 0 )		
+				tabInfo = info;
+			else 
+				LoadDefaults();
+		}
+
+		public void LoadDefaults()
+		{
+			tabInfo = new TabInfoCollection();
+
+            TabInfo tab = tabInfo.AddNewTab("Text Output");
+		    tab.Content =
+		        TextDisplayContent.Out |
+		        TextDisplayContent.Error |
+		        TextDisplayContent.Trace |
+		        TextDisplayContent.Log |
+		        TextDisplayContent.Labels |
+		        TextDisplayContent.LabelOnlyOnOutput;
+		    tab.Enabled = true;
+        }
+
+		public void ApplySettings()
+		{
 			System.Text.StringBuilder tabNames = new System.Text.StringBuilder();
 			foreach( TabInfo tab in tabInfo )
 			{
@@ -102,78 +91,78 @@ namespace NUnit.UiKit
 					if ( tabInfo[tabName] == null )
 						settings.RemoveGroup( Prefix + tabName );
 			}
-		}
-
-		public TabInfoCollection Tabs
-		{
-			get { return tabInfo; }
-		}
-	
-		public class TabInfo
-		{
-			public string Name;
-			public string Title;
-			public TextDisplayContent Content = TextDisplayContent.Empty;
-			public bool Enabled = true;
-
-			public TabInfo( string name, string title )
-			{
-				this.Name = name;
-				this.Title = title;
-			}
-		}
-
-		public class TabInfoCollection : CollectionBase
-		{
-			public void Add( TabInfo tabInfo )
-			{
-				InnerList.Add( tabInfo );
-			}
-
-			public TabInfo AddNewTab( string title )
-			{
-				TabInfo tabInfo = new TabInfo( GetNextName(), title );
-				InnerList.Add( tabInfo );
-				return tabInfo;
-			}
-
-			public void Insert( int index, TabInfo tabInfo )
-			{
-				InnerList.Insert(index, tabInfo);
-			}
-
-			private string GetNextName()
-			{
-				for( int i = 0;;i++ )
-				{
-					string name = string.Format( "Tab{0}", i );
-					if ( this[name] == null )
-						return name;
-				}
-			}
-
-			public TabInfo this[int index]
-			{
-				get { return (TabInfo)InnerList[index]; }
-				set { InnerList[index] = value; }
-			}
-
-			public TabInfo this[string name]
-			{
-				get
-				{
-					foreach ( TabInfo info in InnerList )
-						if ( info.Name == name )
-							return info;
-
-					return null;
-				}
-			}
-
-			public bool Contains( string name )
-			{
-				return this[name] != null;
-			}
-		}
-	}
+		}
+
+		public TabInfoCollection Tabs
+		{
+			get { return tabInfo; }
+		}
+	
+		public class TabInfo
+		{
+			public string Name;
+			public string Title;
+			public TextDisplayContent Content = TextDisplayContent.Empty;
+			public bool Enabled = true;
+
+			public TabInfo( string name, string title )
+			{
+				this.Name = name;
+				this.Title = title;
+			}
+		}
+
+		public class TabInfoCollection : CollectionBase
+		{
+			public void Add( TabInfo tabInfo )
+			{
+				InnerList.Add( tabInfo );
+			}
+
+			public TabInfo AddNewTab( string title )
+			{
+				TabInfo tabInfo = new TabInfo( GetNextName(), title );
+				InnerList.Add( tabInfo );
+				return tabInfo;
+			}
+
+			public void Insert( int index, TabInfo tabInfo )
+			{
+				InnerList.Insert(index, tabInfo);
+			}
+
+			private string GetNextName()
+			{
+				for( int i = 0;;i++ )
+				{
+					string name = string.Format( "Tab{0}", i );
+					if ( this[name] == null )
+						return name;
+				}
+			}
+
+			public TabInfo this[int index]
+			{
+				get { return (TabInfo)InnerList[index]; }
+				set { InnerList[index] = value; }
+			}
+
+			public TabInfo this[string name]
+			{
+				get
+				{
+					foreach ( TabInfo info in InnerList )
+						if ( info.Name == name )
+							return info;
+
+					return null;
+				}
+			}
+
+			public bool Contains( string name )
+			{
+				return this[name] != null;
+			}
+		}
+	}
 }
diff --git a/src/GuiComponents/UiKit/TextDisplayWriter.cs b/src/GuiComponents/UiKit/TextDisplayWriter.cs
index 5d64a59..2e8877a 100644
--- a/src/GuiComponents/UiKit/TextDisplayWriter.cs
+++ b/src/GuiComponents/UiKit/TextDisplayWriter.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/GuiComponents/UiKit/TextOutputSettingsPage.cs b/src/GuiComponents/UiKit/TextOutputSettingsPage.cs
index c263f90..bc15b2c 100644
--- a/src/GuiComponents/UiKit/TextOutputSettingsPage.cs
+++ b/src/GuiComponents/UiKit/TextOutputSettingsPage.cs
@@ -1,3 +1,8 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using System.Collections;
 using System.ComponentModel;
diff --git a/src/GuiComponents/UiKit/TipWindow.cs b/src/GuiComponents/UiKit/TipWindow.cs
index b93fbe9..29fa50f 100644
--- a/src/GuiComponents/UiKit/TipWindow.cs
+++ b/src/GuiComponents/UiKit/TipWindow.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2002-2003, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -129,7 +129,6 @@ namespace CP.Windows.Forms
 			// 
 			// TipWindow
 			// 
-			this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);
 			this.BackColor = System.Drawing.Color.LightYellow;
 			this.ClientSize = new System.Drawing.Size(292, 268);
 			this.ControlBox = false;
diff --git a/src/GuiComponents/UiKit/TreeBasedSettingsDialog.cs b/src/GuiComponents/UiKit/TreeBasedSettingsDialog.cs
index facf838..0d00604 100644
--- a/src/GuiComponents/UiKit/TreeBasedSettingsDialog.cs
+++ b/src/GuiComponents/UiKit/TreeBasedSettingsDialog.cs
@@ -1,8 +1,14 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using System.Collections;
 using System.ComponentModel;
 using System.Drawing;
 using System.Windows.Forms;
+using NUnit.Util;
 
 namespace NUnit.UiKit
 {
@@ -112,7 +118,6 @@ namespace NUnit.UiKit
 			// 
 			// TreeBasedSettingsDialog
 			// 
-			this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);
 			this.ClientSize = new System.Drawing.Size(682, 426);
 			this.Controls.Add(this.groupBox1);
 			this.Controls.Add(this.panel1);
@@ -137,20 +142,58 @@ namespace NUnit.UiKit
 			if ( treeView1.VisibleCount >= treeView1.GetNodeCount( true ) )
 				treeView1.ExpandAll();
 
-			if ( treeView1.Nodes.Count > 0 )
-				SelectInitialPage(treeView1.Nodes);
+            SelectInitialPage();
 
 			treeView1.Select();
 		}
 
-		private void SelectInitialPage(TreeNodeCollection nodes)
+        private void SelectInitialPage()
+        {
+            string initialPage = Services.UserSettings.GetSetting("Gui.Settings.InitialPage") as string;
+
+            if (initialPage != null)
+                SelectPage(initialPage);
+            else if (treeView1.Nodes.Count > 0)
+                SelectFirstPage(treeView1.Nodes);
+        }
+
+        private void SelectPage(string initialPage)
+        {
+            TreeNode node = FindNode(treeView1.Nodes, initialPage);
+            if (node != null)
+                treeView1.SelectedNode = node;
+            else
+                SelectFirstPage(treeView1.Nodes);
+        }
+
+        private TreeNode FindNode(TreeNodeCollection nodes, string key)
+        {
+            int dot = key.IndexOf('.');
+            string tail = null;
+
+            if (dot >= 0)
+            {
+                tail = key.Substring(dot + 1);
+                key = key.Substring(0, dot);
+            }
+
+            foreach (TreeNode node in nodes)
+                if (node.Text == key)
+                    return tail == null
+                        ? node
+                        : FindNode(node.Nodes, tail);
+
+            return null;
+        }
+
+		private void SelectFirstPage(TreeNodeCollection nodes)
 		{
 			if ( nodes[0].Nodes.Count == 0 )
 				treeView1.SelectedNode = nodes[0];
 			else
 			{
 				nodes[0].Expand();
-				SelectInitialPage(nodes[0].Nodes);
+				SelectFirstPage(nodes[0].Nodes);
 			}
 		}
 
@@ -187,6 +230,7 @@ namespace NUnit.UiKit
 		{
 			string key = e.Node.FullPath;
 			SettingsPage page = SettingsPages[key];
+            Services.UserSettings.SaveSetting("Gui.Settings.InitialPage", key);
 
 			if ( page != null && page != current )
 			{
diff --git a/src/GuiComponents/UiKit/UserMessage.cs b/src/GuiComponents/UiKit/UserMessage.cs
index 16a0d61..54fd5d6 100644
--- a/src/GuiComponents/UiKit/UserMessage.cs
+++ b/src/GuiComponents/UiKit/UserMessage.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -60,26 +60,43 @@ namespace NUnit.UiKit
 			return DisplayFailure( exception, null, caption );
 		}
 
-		public static DialogResult DisplayFailure( Exception exception, string message, string caption )
-		{
-			Exception ex = exception;
-			StringBuilder sb = new StringBuilder();		
-			sb.AppendFormat( "{0} : {1}", ex.GetType().ToString(), ex.Message );
-			while( ex.InnerException != null )
-			{
-				ex = ex.InnerException;
-				sb.AppendFormat( "\r----> {0} : {1}", ex.GetType().ToString(), ex.Message );
-			}
-
-			if ( message != null )
-				sb.AppendFormat( "\r\r{0}", message );
-
-			sb.Append( "\r\rFor further information, use the Exception Details menu item." );
-
-			return DisplayFailure( sb.ToString(), caption );
-		}
-
-		public static DialogResult DisplayInfo( string message )
+        public static DialogResult DisplayFailure(Exception exception, string message, string caption)
+        {
+            Exception ex = exception;
+            StringBuilder sb = new StringBuilder();
+            sb.AppendFormat("{0} : {1}", ex.GetType().ToString(), ex.Message);
+            while (ex.InnerException != null)
+            {
+                ex = ex.InnerException;
+                sb.AppendFormat("\r----> {0} : {1}", ex.GetType().ToString(), ex.Message);
+            }
+
+            if (message != null)
+                sb.AppendFormat("\r\r{0}", message);
+
+            sb.Append("\r\rFor further information, use the Exception Details menu item.");
+
+            return DisplayFailure(sb.ToString(), caption);
+        }
+
+        public static DialogResult DisplayFatalError(Exception exception, string message, string caption)
+        {
+            Exception ex = exception;
+            StringBuilder sb = new StringBuilder();
+            sb.AppendFormat("{0} : {1}", ex.GetType().ToString(), ex.Message);
+            while (ex.InnerException != null)
+            {
+                ex = ex.InnerException;
+                sb.AppendFormat("\r----> {0} : {1}", ex.GetType().ToString(), ex.Message);
+            }
+
+            if (message != null)
+                sb.AppendFormat("\r\r{0}", message);
+
+            return DisplayFailure(sb.ToString(), caption);
+        }
+
+        public static DialogResult DisplayInfo(string message)
 		{
 			return DisplayInfo( message, nunitCaption );
 		}
diff --git a/src/GuiComponents/UiKit/VisualState.cs b/src/GuiComponents/UiKit/VisualState.cs
index 49070ee..f1df1a9 100644
--- a/src/GuiComponents/UiKit/VisualState.cs
+++ b/src/GuiComponents/UiKit/VisualState.cs
@@ -1,5 +1,11 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using System.IO;
+using System.Collections.Generic;
 using System.Windows.Forms;
 using System.Xml.Serialization;
 using NUnit.Core;
@@ -26,7 +32,7 @@ namespace NUnit.UiKit
 		public bool ExcludeCategories;
 
 		[XmlArrayItem("Node")]
-		public VisualTreeNode[] Nodes;
+		public List<VisualTreeNode> Nodes;
 		#endregion
 
 		#region Static Methods
@@ -65,7 +71,9 @@ namespace NUnit.UiKit
 			this.ShowCheckBoxes = treeView.CheckBoxes;
 			this.TopNode = ((TestSuiteTreeNode)treeView.TopNode).Test.TestName.UniqueName;
 			this.SelectedNode = ((TestSuiteTreeNode)treeView.SelectedNode).Test.TestName.UniqueName;
-			this.Nodes = new VisualTreeNode[] { new VisualTreeNode((TestSuiteTreeNode)treeView.Nodes[0]) };
+			this.Nodes = new List<VisualTreeNode>();
+            ProcessTreeNodes( (TestSuiteTreeNode)treeView.Nodes[0] );
+
 			if ( !treeView.CategoryFilter.IsEmpty )
 			{
 				ITestFilter filter = treeView.CategoryFilter;
@@ -78,43 +86,23 @@ namespace NUnit.UiKit
 				this.SelectedCategories = filter.ToString();
 			}
 		}
-		#endregion
 
-		#region Instance Methods
-        public void Restore(TestSuiteTreeView tree)
+        private void ProcessTreeNodes(TestSuiteTreeNode node)
         {
-            if (ShowCheckBoxes != tree.CheckBoxes)
-                tree.CheckBoxes = ShowCheckBoxes;
-
-            foreach (VisualTreeNode visualNode in Nodes)
-                visualNode.Restore(tree);
-
-            if (SelectedNode != null)
-            {
-                TestSuiteTreeNode treeNode = tree[SelectedNode];
-                if (treeNode != null)
-                    tree.SelectedNode = treeNode;
-            }
-
-            if (TopNode != null)
-            {
-                TestSuiteTreeNode treeNode = tree[TopNode];
-                if (treeNode != null)
-                    tree.TryToSetTopNode(treeNode);
-            }
+            if (IsInteresting(node))
+                this.Nodes.Add(new VisualTreeNode(node));
 
+            foreach (TestSuiteTreeNode childNode in node.Nodes)
+                ProcessTreeNodes(childNode);
+        }
 
-			if (this.SelectedCategories != null)
-			{
-				TestFilter filter = new CategoryFilter( this.SelectedCategories.Split( new char[] { ',' } ) );
-				if ( this.ExcludeCategories )
-					filter = new NotFilter( filter );
-				tree.CategoryFilter = filter;
-			}
-			
-			tree.Select();
+        private bool IsInteresting(TestSuiteTreeNode node)
+        {
+            return node.IsExpanded || node.Checked;
         }
+		#endregion
 
+		#region Instance Methods
 		public void Save( string fileName )
 		{
 			using ( StreamWriter writer = new StreamWriter( fileName ) )
@@ -153,29 +141,6 @@ namespace NUnit.UiKit
 			this.UniqueName = treeNode.Test.TestName.UniqueName;
 			this.Expanded = treeNode.IsExpanded;
 			this.Checked = treeNode.Checked;
-			int count = treeNode.Nodes.Count;
-			if ( count > 0 )
-			{
-				this.Nodes = new VisualTreeNode[count];
-				for( int i = 0; i < count; i++ )
-					this.Nodes[i] = new VisualTreeNode( (TestSuiteTreeNode)treeNode.Nodes[i] );
-			}
 		}
-
-        public void Restore(TestSuiteTreeView tree)
-        {
-            TestSuiteTreeNode treeNode = tree[this.UniqueName];
-            if (treeNode != null)
-            {
-                if (treeNode.IsExpanded != this.Expanded)
-                    treeNode.Toggle();
-
-                treeNode.Checked = this.Checked;
-
-                if (this.Nodes != null)
-                    foreach (VisualTreeNode childNode in this.Nodes)
-                        childNode.Restore(tree);
-            }
-        }
-	}
+    }
 }
diff --git a/src/GuiComponents/UiKit/WaitCursor.cs b/src/GuiComponents/UiKit/WaitCursor.cs
index cfa38ae..1c802fc 100644
--- a/src/GuiComponents/UiKit/WaitCursor.cs
+++ b/src/GuiComponents/UiKit/WaitCursor.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2002-2003, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/GuiComponents/UiKit/WritableTextDisplay.resx b/src/GuiComponents/UiKit/WritableTextDisplay.resx
deleted file mode 100644
index dd0ea4d..0000000
--- a/src/GuiComponents/UiKit/WritableTextDisplay.resx
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<root>
-	<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-		<xsd:element name="root" msdata:IsDataSet="true">
-			<xsd:complexType>
-				<xsd:choice maxOccurs="unbounded">
-					<xsd:element name="data">
-						<xsd:complexType>
-							<xsd:sequence>
-								<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-								<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-							</xsd:sequence>
-							<xsd:attribute name="name" type="xsd:string" />
-							<xsd:attribute name="type" type="xsd:string" />
-							<xsd:attribute name="mimetype" type="xsd:string" />
-						</xsd:complexType>
-					</xsd:element>
-					<xsd:element name="resheader">
-						<xsd:complexType>
-							<xsd:sequence>
-								<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-							</xsd:sequence>
-							<xsd:attribute name="name" type="xsd:string" use="required" />
-						</xsd:complexType>
-					</xsd:element>
-				</xsd:choice>
-			</xsd:complexType>
-		</xsd:element>
-	</xsd:schema>
-	<resheader name="ResMimeType">
-		<value>text/microsoft-resx</value>
-	</resheader>
-	<resheader name="Version">
-		<value>1.0.0.0</value>
-	</resheader>
-	<resheader name="Reader">
-		<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-	</resheader>
-	<resheader name="Writer">
-		<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-	</resheader>
-</root>
diff --git a/src/GuiComponents/UiKit/Yellow.jpg b/src/GuiComponents/UiKit/Yellow.jpg
deleted file mode 100644
index 0549b70..0000000
Binary files a/src/GuiComponents/UiKit/Yellow.jpg and /dev/null differ
diff --git a/src/GuiComponents/UiKit/nunit.uikit.build b/src/GuiComponents/UiKit/nunit.uikit.build
index 3287a48..49501ac 100644
--- a/src/GuiComponents/UiKit/nunit.uikit.build
+++ b/src/GuiComponents/UiKit/nunit.uikit.build
@@ -1,16 +1,11 @@
 <?xml version="1.0"?>
 <project name="NUnitUiKit" default="build" basedir=".">
 
-  <target name="build">
-    <csc target="library" 
-    output="${current.build.dir}/nunit.uikit.dll"
-    debug="${build.debug}" define="${build.defines}">
-      <sources>
+  <patternset id="source-files">
         <include name="AddConfigurationDialog.cs"/>
         <include name="AddTabPageDialog.cs"/>
         <include name="AppContainer.cs"/>
         <include name="AssemblyInfo.cs"/>
-        <include name="CommonAssemblyInfo.cs"/>
         <include name="ConfigurationEditor.cs"/>
         <include name="EditTabPagesDialog.cs"/>
         <include name="ErrorDisplay.cs"/>
@@ -27,7 +22,7 @@
         <include name="ResultTabs.cs"/>
         <include name="SettingsDialogBase.cs"/>
         <include name="SimpleSettingsDialog.cs"/>
-        <include name="SimpleTextDisplay.cs"/>
+        <include name="ScrollingTextDisplayForm.cs"/>
         <include name="SettingsPage.cs"/>
         <include name="StatusBar.cs"/>
         <include name="TabbedSettingsDialog.cs"/>
@@ -48,12 +43,9 @@
         <include name="UserMessage.cs"/>
         <include name="VisualState.cs"/>
         <include name="WaitCursor.cs"/>
-        <include name="../../CommonAssemblyInfo.cs"/>
-      </sources>
-      <nowarn>
-        <warning number="1699" if="${runtime.version=='2.0'}"/>
-      </nowarn>
-      <resources prefix="NUnit.UiKit">
+  </patternset>
+
+  <patternset id="resource-files">
         <include name="AddConfigurationDialog.resx"/>
         <include name="AddTabPageDialog.resx"/>
         <include name="ConfigurationEditor.resx"/>
@@ -61,6 +53,7 @@
         <include name="ErrorDisplay.resx"/>
         <include name="ExpandingLabel.resx"/>
         <include name="ExpandingTextBox.resx"/>
+        <include name="LongRunningOperationDisplay.resx"/>
         <include name="NotRunTree.resx"/>
         <include name="ProgressBar.resx"/>
         <include name="RenameConfigurationDialog.resx"/>
@@ -68,7 +61,6 @@
         <include name="SettingsDialogBase.resx"/>
         <include name="SettingsPage.resx"/>
         <include name="SimpleSettingsDialog.resx"/>
-        <include name="SimpleTextDisplay.resx"/>
         <include name="StatusBar.resx"/>
         <include name="TabbedSettingsDialog.resx"/>
         <include name="TestPropertiesDialog.resx"/>
@@ -79,32 +71,61 @@
         <include name="TextOutputSettingsPage.resx"/>
         <include name="TipWindow.resx"/>
         <include name="TreeBasedSettingsDialog.resx"/>
+        <include name="UserMessage.resx"/>
         <include name="Ellipsis.gif"/>
         <include name="pinned.gif"/>
         <include name="unpinned.gif"/>
+  </patternset>
+
+  <patternset id="content-files">
+    <include name="Success.png"/>
+    <include name="Failure.png"/>
+    <include name="Ignored.png"/>
+    <include name="Skipped.png"/>
+    <include name="Inconclusive.png"/>
+  </patternset>
+
+  <target name="build">
+    <csc target="library" 
+    output="${current.lib.dir}/nunit.uikit.dll"
+    debug="${build.debug}" define="${build.defines}">
+      <sources>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
+      </sources>
+      <nowarn>
+        <warning number="1699" if="${runtime.version>='2.0'}"/>
+      </nowarn>
+      <resources prefix="NUnit.UiKit">
+        <patternset refid="resource-files"/>
       </resources>
-      <references basedir="${current.build.dir}">
+      <references basedir="${current.lib.dir}">
         <include name="System.Windows.Forms.dll"/>
         <include name="System.Drawing.dll"/>
         <include name="System.Data.dll"/>
+        <include name="nunit.uiexception.dll"/>
         <include name="nunit.core.interfaces.dll"/>
         <include name="nunit.core.dll"/>
         <include name="nunit.util.dll"/>
       </references>
     </csc>
 
-    <copy todir="${current.build.dir}">
+    <copy todir="${current.lib.dir}">
       <fileset>
-        <include name="Success.jpg"/>
-        <include name="Failure.jpg"/>
-        <include name="Ignored.jpg"/>
+        <patternset refid="content-files"/>
       </fileset>
     </copy>
   </target>
 
   <target name="package">
     <copy todir="${package.src.dir}/GuiComponents/UiKit">
-      <fileset refid="source-files" />
+      <fileset>
+        <patternset refid="source-files"/>
+        <patternset refid="resource-files"/>
+        <patternset refid="content-files"/>
+        <include name="nunit.uikit.dll.csproj"/>
+        <include name="nunit.uikit.build"/>
+      </fileset>
     </copy>
   </target>
 
diff --git a/src/GuiComponents/UiKit/nunit.uikit.dll.csproj b/src/GuiComponents/UiKit/nunit.uikit.dll.csproj
index 18603ef..ff3d8b8 100644
--- a/src/GuiComponents/UiKit/nunit.uikit.dll.csproj
+++ b/src/GuiComponents/UiKit/nunit.uikit.dll.csproj
@@ -1,479 +1,313 @@
-<VisualStudioProject>
-    <CSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{27531BBF-183D-4C3A-935B-D840B9F1A3A4}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = ""
-                AssemblyKeyContainerName = ""
-                AssemblyName = "nunit.uikit"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "Library"
-                PreBuildEvent = ""
-                PostBuildEvent = ""
-                RootNamespace = "NUnit.UiKit"
-                RunPostBuildEvent = "OnBuildSuccess"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "true"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "true"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-                <Config
-                    Name = "Release"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "false"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "System"
-                    AssemblyName = "System"
-                    HintPath = "E:\WINNT\Microsoft.NET\Framework\v1.0.3705\System.dll"
-                />
-                <Reference
-                    Name = "System.Data"
-                    AssemblyName = "System.Data"
-                    HintPath = "E:\WINNT\Microsoft.NET\Framework\v1.0.3705\System.Data.dll"
-                />
-                <Reference
-                    Name = "System.XML"
-                    AssemblyName = "System.Xml"
-                    HintPath = "E:\WINNT\Microsoft.NET\Framework\v1.0.3705\System.XML.dll"
-                />
-                <Reference
-                    Name = "System.Drawing"
-                    AssemblyName = "System.Drawing"
-                    HintPath = "E:\WINNT\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll"
-                />
-                <Reference
-                    Name = "System.Windows.Forms"
-                    AssemblyName = "System.Windows.Forms"
-                    HintPath = "E:\WINNT\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll"
-                />
-                <Reference
-                    Name = "nunit.util.dll"
-                    Project = "{61CE9CE5-943E-44D4-A381-814DC1406767}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.core.interfaces.dll"
-                    Project = "{435428F8-5995-4CE4-8022-93D595A8CC0F}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.core.dll"
-                    Project = "{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-            </References>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "AddConfigurationDialog.cs"
-                    SubType = "Form"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "AddConfigurationDialog.resx"
-                    DependentUpon = "AddConfigurationDialog.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "AddTabPageDialog.cs"
-                    SubType = "Form"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "AddTabPageDialog.resx"
-                    DependentUpon = "AddTabPageDialog.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "AppContainer.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "AssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CommonAssemblyInfo.cs"
-                    Link = "..\..\CommonAssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ConfigurationEditor.cs"
-                    SubType = "Form"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ConfigurationEditor.resx"
-                    DependentUpon = "ConfigurationEditor.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "EditTabPagesDialog.cs"
-                    SubType = "Form"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "EditTabPagesDialog.resx"
-                    DependentUpon = "EditTabPagesDialog.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "Ellipsis.gif"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "ErrorDisplay.cs"
-                    SubType = "UserControl"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ErrorDisplay.resx"
-                    DependentUpon = "ErrorDisplay.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "ExpandingLabel.cs"
-                    SubType = "Component"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ExpandingLabel.resx"
-                    DependentUpon = "ExpandingLabel.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "ExpandingTextBox.cs"
-                    SubType = "Component"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ExpandingTextBox.resx"
-                    DependentUpon = "ExpandingTextBox.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "Failure.jpg"
-                    BuildAction = "Content"
-                />
-                <File
-                    RelPath = "FolderBrowser.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Gray.jpg"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "GuiAttachedConsole.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "GuiTestEventDispatcher.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Ignored.jpg"
-                    BuildAction = "Content"
-                />
-                <File
-                    RelPath = "LongRunningOperationDisplay.cs"
-                    SubType = "Form"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "LongRunningOperationDisplay.resx"
-                    DependentUpon = "LongRunningOperationDisplay.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "NotRunTree.cs"
-                    SubType = "Component"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "NotRunTree.resx"
-                    DependentUpon = "NotRunTree.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "pinned.gif"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "ProgressBar.cs"
-                    SubType = "Component"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ProgressBar.resx"
-                    DependentUpon = "ProgressBar.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "RecentFileMenuHandler.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RenameConfigurationDialog.cs"
-                    SubType = "Form"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RenameConfigurationDialog.resx"
-                    DependentUpon = "RenameConfigurationDialog.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "ResultTabs.cs"
-                    SubType = "UserControl"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ResultTabs.resx"
-                    DependentUpon = "ResultTabs.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "SettingsDialogBase.cs"
-                    SubType = "Form"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SettingsDialogBase.resx"
-                    DependentUpon = "SettingsDialogBase.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "SettingsPage.cs"
-                    SubType = "UserControl"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SettingsPage.resx"
-                    DependentUpon = "SettingsPage.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "SimpleSettingsDialog.cs"
-                    SubType = "Form"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SimpleSettingsDialog.resx"
-                    DependentUpon = "SimpleSettingsDialog.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "SimpleTextDisplay.cs"
-                    SubType = "Component"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SimpleTextDisplay.resx"
-                    DependentUpon = "SimpleTextDisplay.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "StatusBar.cs"
-                    SubType = "Component"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "StatusBar.resx"
-                    DependentUpon = "StatusBar.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "Success.jpg"
-                    BuildAction = "Content"
-                />
-                <File
-                    RelPath = "TabbedSettingsDialog.cs"
-                    SubType = "Form"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TabbedSettingsDialog.resx"
-                    DependentUpon = "TabbedSettingsDialog.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "TestLoaderUI.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestPropertiesDialog.cs"
-                    SubType = "Form"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestPropertiesDialog.resx"
-                    DependentUpon = "TestPropertiesDialog.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "TestSuiteTreeNode.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestSuiteTreeView.cs"
-                    SubType = "Component"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestSuiteTreeView.resx"
-                    DependentUpon = "TestSuiteTreeView.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "TestTree.cs"
-                    SubType = "UserControl"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestTree.resx"
-                    DependentUpon = "TestTree.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "TextBoxDisplay.cs"
-                    SubType = "Component"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TextDisplay.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TextDisplayTabPage.cs"
-                    SubType = "Component"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TextDisplayTabPage.resx"
-                    DependentUpon = "TextDisplayTabPage.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "TextDisplayTabSettings.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TextDisplayWriter.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TextOutputSettingsPage.cs"
-                    SubType = "UserControl"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TextOutputSettingsPage.resx"
-                    DependentUpon = "TextOutputSettingsPage.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "TipWindow.cs"
-                    SubType = "Form"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TipWindow.resx"
-                    DependentUpon = "TipWindow.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "TreeBasedSettingsDialog.cs"
-                    SubType = "Form"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TreeBasedSettingsDialog.resx"
-                    DependentUpon = "TreeBasedSettingsDialog.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "unpinned.gif"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "UserMessage.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "UserMessage.resx"
-                    DependentUpon = "UserMessage.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "VisualState.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "WaitCursor.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-            </Include>
-        </Files>
-    </CSHARP>
-</VisualStudioProject>
-
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{27531BBF-183D-4C3A-935B-D840B9F1A3A4}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit.uikit</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.UiKit</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\lib\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>1699</NoWarn>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\lib\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>1699</NoWarn>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Drawing">
+      <Name>System.Drawing</Name>
+    </Reference>
+    <Reference Include="System.Windows.Forms">
+      <Name>System.Windows.Forms</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
+      <Name>nunit.util.dll</Name>
+      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
+      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
+      <Name>nunit.core.dll</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
+      <Name>nunit.core.interfaces.dll</Name>
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\GuiException\UiException\nunit.uiexception.dll.csproj">
+      <Project>{3E87A106-EB20-4147-84C8-95B0BB43A1D4}</Project>
+      <Name>nunit.uiexception.dll</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="AddConfigurationDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="AddTabPageDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="AppContainer.cs" />
+    <Compile Include="AssemblyInfo.cs" />
+    <Compile Include="ConfigurationEditor.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="EditTabPagesDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="ErrorDisplay.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ExpandingLabel.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="ExpandingTextBox.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="GuiAttachedConsole.cs" />
+    <Compile Include="GuiTestEventDispatcher.cs" />
+    <Compile Include="LongRunningOperationDisplay.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="NotRunTree.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="ProgressBar.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="RecentFileMenuHandler.cs" />
+    <Compile Include="RenameConfigurationDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="ResultTabs.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ScrollingTextDisplayForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="SettingsDialogBase.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="SettingsPage.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="SimpleSettingsDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="StatusBar.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="TabbedSettingsDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="TestLoaderUI.cs" />
+    <Compile Include="TestPropertiesDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="TestSuiteTreeNode.cs" />
+    <Compile Include="TestSuiteTreeView.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="TestTree.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="TextBoxDisplay.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="TextDisplay.cs" />
+    <Compile Include="TextDisplayTabPage.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="TextDisplayTabSettings.cs" />
+    <Compile Include="TextDisplayWriter.cs" />
+    <Compile Include="TextOutputSettingsPage.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="TipWindow.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="TreeBasedSettingsDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="UserMessage.cs" />
+    <Compile Include="VisualState.cs" />
+    <Compile Include="WaitCursor.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="AddConfigurationDialog.resx">
+      <DependentUpon>AddConfigurationDialog.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="AddTabPageDialog.resx">
+      <DependentUpon>AddTabPageDialog.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ConfigurationEditor.resx">
+      <DependentUpon>ConfigurationEditor.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="EditTabPagesDialog.resx">
+      <DependentUpon>EditTabPagesDialog.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ErrorDisplay.resx">
+      <DependentUpon>ErrorDisplay.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ExpandingLabel.resx">
+      <DependentUpon>ExpandingLabel.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ExpandingTextBox.resx">
+      <DependentUpon>ExpandingTextBox.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="LongRunningOperationDisplay.resx">
+      <DependentUpon>LongRunningOperationDisplay.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="NotRunTree.resx">
+      <DependentUpon>NotRunTree.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ProgressBar.resx">
+      <DependentUpon>ProgressBar.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="RenameConfigurationDialog.resx">
+      <DependentUpon>RenameConfigurationDialog.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ResultTabs.resx">
+      <DependentUpon>ResultTabs.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="SettingsDialogBase.resx">
+      <DependentUpon>SettingsDialogBase.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="SettingsPage.resx">
+      <DependentUpon>SettingsPage.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="SimpleSettingsDialog.resx">
+      <DependentUpon>SimpleSettingsDialog.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="StatusBar.resx">
+      <DependentUpon>StatusBar.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="TabbedSettingsDialog.resx">
+      <DependentUpon>TabbedSettingsDialog.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="TestPropertiesDialog.resx">
+      <DependentUpon>TestPropertiesDialog.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="TestSuiteTreeView.resx">
+      <DependentUpon>TestSuiteTreeView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="TestTree.resx">
+      <DependentUpon>TestTree.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="TextOutputSettingsPage.resx">
+      <DependentUpon>TextOutputSettingsPage.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="TipWindow.resx">
+      <DependentUpon>TipWindow.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="TreeBasedSettingsDialog.resx">
+      <DependentUpon>TreeBasedSettingsDialog.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="UserMessage.resx">
+      <DependentUpon>UserMessage.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="pinned.gif" />
+    <EmbeddedResource Include="unpinned.gif" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Ellipsis.gif" />
+    <Content Include="Failure.png" />
+    <Content Include="Ignored.png" />
+    <Content Include="Inconclusive.png" />
+    <Content Include="Skipped.png" />
+    <Content Include="Success.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit.uikit.build" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/GuiComponents/UiKit/nunit.uikit.dll_VS2005.csproj b/src/GuiComponents/UiKit/nunit.uikit.dll_VS2005.csproj
deleted file mode 100644
index b05054b..0000000
--- a/src/GuiComponents/UiKit/nunit.uikit.dll_VS2005.csproj
+++ /dev/null
@@ -1,306 +0,0 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>8.0.50727</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{27531BBF-183D-4C3A-935B-D840B9F1A3A4}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ApplicationIcon>
-    </ApplicationIcon>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit.uikit</AssemblyName>
-    <AssemblyOriginatorKeyFile>
-    </AssemblyOriginatorKeyFile>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.UiKit</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <StartupObject>
-    </StartupObject>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-    <SignAssembly>false</SignAssembly>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release2005|AnyCPU' ">
-    <OutputPath>bin\Release2005\</OutputPath>
-    <DefineConstants>TRACE;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <Optimize>true</Optimize>
-    <NoWarn>1699</NoWarn>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug2005|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\Debug2005\</OutputPath>
-    <DefineConstants>TRACE;DEBUG;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <NoWarn>1699</NoWarn>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Drawing">
-      <Name>System.Drawing</Name>
-    </Reference>
-    <Reference Include="System.Windows.Forms">
-      <Name>System.Windows.Forms</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="AddConfigurationDialog.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="AddTabPageDialog.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="AppContainer.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="AssemblyInfo.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="ConfigurationEditor.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="EditTabPagesDialog.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="ErrorDisplay.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="ExpandingLabel.cs">
-      <SubType>Component</SubType>
-    </Compile>
-    <Compile Include="ExpandingTextBox.cs">
-      <SubType>Component</SubType>
-    </Compile>
-    <Compile Include="FolderBrowser.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="GuiAttachedConsole.cs" />
-    <Compile Include="GuiTestEventDispatcher.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="LongRunningOperationDisplay.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="NotRunTree.cs">
-      <SubType>Component</SubType>
-    </Compile>
-    <Compile Include="ProgressBar.cs">
-      <SubType>Component</SubType>
-    </Compile>
-    <Compile Include="RecentFileMenuHandler.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="RenameConfigurationDialog.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="ResultTabs.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="SettingsDialogBase.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="SettingsPage.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="SimpleSettingsDialog.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="SimpleTextDisplay.cs">
-      <SubType>Component</SubType>
-    </Compile>
-    <Compile Include="StatusBar.cs">
-      <SubType>Component</SubType>
-    </Compile>
-    <Compile Include="TabbedSettingsDialog.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="TestLoaderUI.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestPropertiesDialog.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="TestSuiteTreeNode.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestSuiteTreeView.cs">
-      <SubType>Component</SubType>
-    </Compile>
-    <Compile Include="TestTree.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="TextBoxDisplay.cs">
-      <SubType>Component</SubType>
-    </Compile>
-    <Compile Include="TextDisplay.cs" />
-    <Compile Include="TextDisplayTabPage.cs">
-      <SubType>Component</SubType>
-    </Compile>
-    <Compile Include="TextDisplayTabSettings.cs" />
-    <Compile Include="TextDisplayWriter.cs" />
-    <Compile Include="TextOutputSettingsPage.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="TipWindow.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="TreeBasedSettingsDialog.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="UserMessage.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="VisualState.cs" />
-    <Compile Include="WaitCursor.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <EmbeddedResource Include="AddConfigurationDialog.resx">
-      <DependentUpon>AddConfigurationDialog.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="AddTabPageDialog.resx">
-      <DependentUpon>AddTabPageDialog.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="ConfigurationEditor.resx">
-      <DependentUpon>ConfigurationEditor.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="EditTabPagesDialog.resx">
-      <DependentUpon>EditTabPagesDialog.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="Ellipsis.gif" />
-    <EmbeddedResource Include="ErrorDisplay.resx">
-      <DependentUpon>ErrorDisplay.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="ExpandingLabel.resx">
-      <DependentUpon>ExpandingLabel.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="ExpandingTextBox.resx">
-      <DependentUpon>ExpandingTextBox.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="Gray.jpg" />
-    <EmbeddedResource Include="Green.jpg" />
-    <EmbeddedResource Include="LongRunningOperationDisplay.resx">
-      <DependentUpon>LongRunningOperationDisplay.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="pinned.gif" />
-    <EmbeddedResource Include="ProgressBar.resx">
-      <DependentUpon>ProgressBar.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="Red.jpg" />
-    <EmbeddedResource Include="RenameConfigurationDialog.resx">
-      <DependentUpon>RenameConfigurationDialog.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="ResultTabs.resx">
-      <DependentUpon>ResultTabs.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="SettingsDialogBase.resx">
-      <DependentUpon>SettingsDialogBase.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="SettingsPage.resx">
-      <DependentUpon>SettingsPage.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="SimpleSettingsDialog.resx">
-      <DependentUpon>SimpleSettingsDialog.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="SimpleTextDisplay.resx">
-      <DependentUpon>SimpleTextDisplay.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="StatusBar.resx">
-      <DependentUpon>StatusBar.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="TabbedSettingsDialog.resx">
-      <DependentUpon>TabbedSettingsDialog.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="TestPropertiesDialog.resx">
-      <DependentUpon>TestPropertiesDialog.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="TestSuiteTreeView.resx">
-      <DependentUpon>TestSuiteTreeView.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="TestTree.resx">
-      <DependentUpon>TestTree.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="TextOutputSettingsPage.resx">
-      <DependentUpon>TextOutputSettingsPage.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="TipWindow.resx">
-      <DependentUpon>TipWindow.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="TreeBasedSettingsDialog.resx">
-      <DependentUpon>TreeBasedSettingsDialog.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="unpinned.gif" />
-    <EmbeddedResource Include="UserMessage.resx">
-      <DependentUpon>UserMessage.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="Yellow.jpg" />
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll_VS2005.csproj">
-      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
-      <Name>nunit.util.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll_VS2005.csproj">
-      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
-      <Name>nunit.core.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll_VS2005.csproj">
-      <Project>{DCC88998-255A-4247-B658-71DD932E9873}</Project>
-      <Name>nunit.core.interfaces.dll_VS2005</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <Content Include="Failure.jpg" />
-    <Content Include="Ignored.jpg" />
-    <Content Include="Success.jpg" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
-</Project>
\ No newline at end of file
diff --git a/src/GuiComponents/tests/AddConfigurationDialogTests.cs b/src/GuiComponents/tests/AddConfigurationDialogTests.cs
index 6a2e075..10d39f9 100644
--- a/src/GuiComponents/tests/AddConfigurationDialogTests.cs
+++ b/src/GuiComponents/tests/AddConfigurationDialogTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2002-2003, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/GuiComponents/tests/ErrorDisplayTests.cs b/src/GuiComponents/tests/ErrorDisplayTests.cs
index 877e3c1..9374843 100644
--- a/src/GuiComponents/tests/ErrorDisplayTests.cs
+++ b/src/GuiComponents/tests/ErrorDisplayTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -31,13 +31,13 @@ namespace NUnit.UiKit.Tests
 		{
 			AssertControlExists( "detailList", typeof( ListBox ) );
 			AssertControlExists( "tabSplitter", typeof( Splitter ) );
-			AssertControlExists( "stackTrace", typeof( CP.Windows.Forms.ExpandingTextBox ) );
+			AssertControlExists( "errorBrowser", typeof( NUnit.UiException.Controls.ErrorBrowser ) );
 		}
 
 		[Test]
 		public void ControlsArePositionedCorrectly()
 		{
-			AssertControlsAreStackedVertically( "detailList", "tabSplitter", "stackTrace" );
+			AssertControlsAreStackedVertically( "detailList", "tabSplitter", "errorBrowser" );
 		}
 	}
 }
diff --git a/src/GuiComponents/tests/LongRunningOperationDisplayTests.cs b/src/GuiComponents/tests/LongRunningOperationDisplayTests.cs
index c6ec81c..e914d50 100644
--- a/src/GuiComponents/tests/LongRunningOperationDisplayTests.cs
+++ b/src/GuiComponents/tests/LongRunningOperationDisplayTests.cs
@@ -1,3 +1,9 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
 using System;
 using System.Windows.Forms;
 using NUnit.Framework;
diff --git a/src/GuiComponents/tests/ProgressBarTests.cs b/src/GuiComponents/tests/ProgressBarTests.cs
index 426ff3d..4a3307e 100644
--- a/src/GuiComponents/tests/ProgressBarTests.cs
+++ b/src/GuiComponents/tests/ProgressBarTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2002-2003, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 namespace NUnit.UiKit.Tests
@@ -22,8 +22,8 @@ namespace NUnit.UiKit.Tests
 	{
 		private TestProgressBar progressBar;
 		private MockTestEventSource mockEvents;
-		private string testsDll = "mock-assembly.dll";
-		private TestNode suite;
+		private string testsDll = MockAssembly.AssemblyPath;
+		private TestSuite suite;
 		int testCount;
 
 		[SetUp]
@@ -32,7 +32,7 @@ namespace NUnit.UiKit.Tests
 			progressBar = new TestProgressBar();
 
 			TestSuiteBuilder builder = new TestSuiteBuilder();
-			suite = new TestNode( builder.Build( new TestPackage( testsDll ) ) );
+			suite = builder.Build( new TestPackage( testsDll ) );
 
 			mockEvents = new MockTestEventSource( suite );
 		}
@@ -51,8 +51,8 @@ namespace NUnit.UiKit.Tests
 			Assert.AreEqual( 0, progressBar.Minimum );
 			Assert.AreEqual( MockAssembly.Tests, progressBar.Maximum );
 			Assert.AreEqual( 1, progressBar.Step );
-			Assert.AreEqual( MockAssembly.Tests, progressBar.Value );
-			Assert.AreEqual( Color.Yellow, progressBar.ForeColor );
+			Assert.AreEqual( MockAssembly.ResultCount, progressBar.Value );
+			Assert.AreEqual( Color.Red, progressBar.ForeColor );
 		}
 
 		private void OnTestFinished( object sender, TestEventArgs e )
diff --git a/src/GuiComponents/tests/ProgressDisplayTests.cs.txt b/src/GuiComponents/tests/ProgressDisplayTests.cs.txt
deleted file mode 100644
index 6a13e61..0000000
--- a/src/GuiComponents/tests/ProgressDisplayTests.cs.txt
+++ /dev/null
@@ -1,89 +0,0 @@
-#region Copyright (c) 2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig
-/************************************************************************************
-'
-' Copyright  2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole
-' Copyright  2000-2002 Philip A. Craig
-'
-' This software is provided 'as-is', without any express or implied warranty. In no 
-' event will the authors be held liable for any damages arising from the use of this 
-' software.
-' 
-' Permission is granted to anyone to use this software for any purpose, including 
-' commercial applications, and to alter it and redistribute it freely, subject to the 
-' following restrictions:
-'
-' 1. The origin of this software must not be misrepresented; you must not claim that 
-' you wrote the original software. If you use this software in a product, an 
-' acknowledgment (see the following) in the product documentation is required.
-'
-' Portions Copyright  2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole
-' or Copyright  2000-2002 Philip A. Craig
-'
-' 2. Altered source versions must be plainly marked as such, and must not be 
-' misrepresented as being the original software.
-'
-' 3. This notice may not be removed or altered from any source distribution.
-'
-'***********************************************************************************/
-#endregion
-#if XXX
-namespace NUnit.UiKit.Tests
-{
-	using System;
-	using System.Drawing;
-	using NUnit.Framework;
-	using NUnit.Core;
-	using NUnit.Util;
-	using NUnit.Tests.Assemblies;
-	using NUnit.TestUtilities;
-
-	/// <summary>
-	/// Summary description for ProgressDisplayTests.
-	/// </summary>
-	[TestFixture]
-	public class ProgressDisplayTests
-	{
-		private ProgressDisplay progressDisplay;
-		private MockTestEventSource mockEvents;
-		private string testsDll = "mock-assembly.dll";
-		private TestNode suite;
-		int testCount;
-
-		[SetUp]
-		public void Setup()
-		{
-			progressDisplay = new ProgressDisplay();
-
-			TestSuiteBuilder builder = new TestSuiteBuilder();
-			suite = new TestNode( builder.Build( testsDll ) );
-
-			mockEvents = new MockTestEventSource( suite );
-		}
-
-		// .NET 1.0 sometimes throws:
-		// ExternalException : A generic error occurred in GDI+.
-		[Test, Platform(Exclude = "Net-1.0")]
-		public void TestProgressDisplay()
-		{
-			progressDisplay.Subscribe( mockEvents );
-			mockEvents.TestFinished += new TestEventHandler( OnTestFinished );
-
-			testCount = 0;
-			mockEvents.SimulateTestRun();
-			
-			Assert.AreEqual( 0, progressDisplay.Minimum );
-			Assert.AreEqual( MockAssembly.Tests, progressDisplay.Maximum );
-			Assert.AreEqual( 1, progressDisplay.Step );
-			Assert.AreEqual( MockAssembly.Tests, progressDisplay.Value );
-			Assert.AreEqual( Color.Yellow, progressDisplay.ForeColor );
-		}
-
-		private void OnTestFinished( object sender, TestEventArgs e )
-		{
-			++testCount;
-			// Assumes delegates are called in order of adding
-			Assert.AreEqual( testCount, progressDisplay.Value );
-		}
-	}
-}
-#endif
diff --git a/src/GuiComponents/tests/RecentFileMenuHandlerTests.cs b/src/GuiComponents/tests/RecentFileMenuHandlerTests.cs
index 6d10785..5355399 100644
--- a/src/GuiComponents/tests/RecentFileMenuHandlerTests.cs
+++ b/src/GuiComponents/tests/RecentFileMenuHandlerTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2002-2003, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -25,7 +25,7 @@ namespace NUnit.UiKit.Tests
 			menu = new MenuItem();
 			files = new FakeRecentFiles();
 			handler = new RecentFileMenuHandler( menu, files );
-            handler.ShowMissingFiles = true;
+            handler.CheckFilesExist = false;
         }
 
 		[Test]
diff --git a/src/GuiComponents/tests/SimpleTextDisplayTests.cs b/src/GuiComponents/tests/SimpleTextDisplayTests.cs
deleted file mode 100644
index aa10cc4..0000000
--- a/src/GuiComponents/tests/SimpleTextDisplayTests.cs
+++ /dev/null
@@ -1,152 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-using System.Drawing;
-using System.Windows.Forms;
-using NUnit.Framework;
-
-namespace NUnit.UiKit.Tests
-{
-	/// <summary>
-	/// Summary description for SimpleTextDisplayTests.
-	/// </summary>
-	[TestFixture]
-	public class SimpleTextDisplayTests
-	{
-		SimpleTextDisplay textDisplay;
-		static readonly string NL = Environment.NewLine;
-		static readonly string myText = "Here is one line" + NL + "Here is another" + NL;
-		static readonly string fiveLines = 
-			"This is line 1" + NL + "This is line 2" + NL + "This is line 3" + NL + "This is line 4" + NL +"This is line 5" + NL;
-		static readonly string twoParts =
-			"This line written in two parts" + NL + "The final line" + NL;
-		static readonly string threeParts =
-			"This line written in three parts" + NL + "The final line" + NL;
-
-		[SetUp]
-		public void Init()
-		{
-			textDisplay = new SimpleTextDisplay(); 
-		}
-
-		[TearDown]
-		public void CleanUp()
-		{
-			textDisplay.Dispose();
-		}
-
-		private void AppendLines( int count )
-		{
-			for( int index = 1; index <= count; ++index )
-				textDisplay.WriteLine( string.Format( "This is line {0}", index ) );
-		}
-
-		private Size getTextSize( string text )
-		{
-			return Graphics.FromHwnd( textDisplay.Handle ).MeasureString(text, textDisplay.Font ).ToSize();
-		}
-
-		[Test]
-		public void SetText_BeforeCreation()
-		{
-			textDisplay.Write( myText );
-			Assert.AreEqual( myText, textDisplay.GetText() );
-			Assert.AreEqual( Size.Empty, textDisplay.AutoScrollMinSize );
-			textDisplay.CreateControl();
-			Assert.AreEqual( myText, textDisplay.GetText() );
-			Assert.AreEqual( getTextSize( myText ), textDisplay.AutoScrollMinSize );
-		}
-
-		[Test]
-		public void SetText_AfterCreation()
-		{
-			textDisplay.CreateControl();
-			textDisplay.Write( myText );
-			Assert.AreEqual( myText, textDisplay.GetText() );
-			Assert.AreEqual( getTextSize( myText ), textDisplay.AutoScrollMinSize );
-		}
-
-		[Test]
-		public void ClearText_BeforeCreation()
-		{
-			textDisplay.Write( "text that should be cleared" );
-			textDisplay.Clear();
-
-			Assert.AreEqual( "", textDisplay.GetText() );
-			Assert.AreEqual( Size.Empty, textDisplay.AutoScrollMinSize );
-		}
-
-		[Test]
-		public void ClearText_AfterCreation()
-		{
-			textDisplay.Write( "text that should be cleared" );
-			textDisplay.CreateControl();
-			textDisplay.Clear();
-
-			Assert.AreEqual( "", textDisplay.GetText() );
-			Assert.AreEqual( Size.Empty, textDisplay.AutoScrollMinSize );
-		}
-
-		[Test]
-		public void AppendText_BeforeCreation()
-		{
-			AppendLines( 5 );
-			textDisplay.Write( "This line written" );
-			textDisplay.WriteLine( " in two parts" );
-			textDisplay.WriteLine( "The final line" );
-
-			string expected = fiveLines + twoParts;
-			Assert.AreEqual( expected, textDisplay.GetText() );
-			Assert.AreEqual( Size.Empty, textDisplay.AutoScrollMinSize );
-		}
-
-		[Test]
-		public void AppendText_AfterCreation()
-		{
-			textDisplay.CreateControl();
-			AppendLines( 5 );
-			Assert.AreEqual( getTextSize( textDisplay.GetText() ), textDisplay.AutoScrollMinSize );
-			textDisplay.Write( "This line written" );
-			Assert.AreEqual( getTextSize( textDisplay.GetText() ), textDisplay.AutoScrollMinSize );
-			textDisplay.Write( " in three" );
-			Assert.AreEqual( getTextSize( textDisplay.GetText() ), textDisplay.AutoScrollMinSize );
-			textDisplay.WriteLine( " parts" );
-			Assert.AreEqual( getTextSize( textDisplay.GetText() ), textDisplay.AutoScrollMinSize );
-			textDisplay.WriteLine( "The final line" );
-			Assert.AreEqual( getTextSize( textDisplay.GetText() ), textDisplay.AutoScrollMinSize );
-
-			string expected = fiveLines + threeParts;
-			Assert.AreEqual( expected, textDisplay.GetText() );
-			Assert.AreEqual( getTextSize( expected ), textDisplay.AutoScrollMinSize );
-		}
-
-		[Test]
-		public void AppendText_BeforeAndAfterCreation()
-		{
-			AppendLines( 5 );
-			textDisplay.Write( "This line written" );
-			textDisplay.CreateControl();
-			textDisplay.WriteLine( " in two parts" );
-			textDisplay.WriteLine( "The final line" );
-
-			string expected = fiveLines + twoParts;
-			Assert.AreEqual( expected, textDisplay.GetText() );
-			Assert.AreEqual( getTextSize( expected ), textDisplay.AutoScrollMinSize );
-		}
-
-		[Test]
-		public void StressTest()
-		{
-			textDisplay.CreateControl();
-			DateTime startTime = DateTime.Now;
-			AppendLines( 1000 );
-			DateTime endTime = DateTime.Now;
-			Assert.AreEqual( 9*14 + 90*15 + 900*16 + 17 + 1000*NL.Length, textDisplay.GetText().Length );
-			Assert.AreEqual( getTextSize( textDisplay.GetText() ), textDisplay.AutoScrollMinSize );
-		}
-	}
-}
diff --git a/src/GuiComponents/tests/StatusBarTests.cs b/src/GuiComponents/tests/StatusBarTests.cs
index d50686c..53603be 100644
--- a/src/GuiComponents/tests/StatusBarTests.cs
+++ b/src/GuiComponents/tests/StatusBarTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2002-2003, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -21,9 +21,9 @@ namespace NUnit.UiKit.Tests
 	{
 		private StatusBar statusBar;
 		private MockTestEventSource mockEvents;
-		private string testsDll = "mock-assembly.dll";
-		TestNode suite;
-		int testCount;
+		private static string testsDll = MockAssembly.AssemblyPath;
+		TestSuite suite;
+	    int testCount = 0;
 
 		[SetUp]
 		public void Setup()
@@ -31,7 +31,7 @@ namespace NUnit.UiKit.Tests
 			statusBar = new StatusBar();
 
 			TestSuiteBuilder builder = new TestSuiteBuilder();
-			suite = new TestNode( builder.Build( new TestPackage( testsDll ) ) );
+			suite = builder.Build( new TestPackage( testsDll ) );
 
 			mockEvents = new MockTestEventSource( suite );
 		}
@@ -76,10 +76,14 @@ namespace NUnit.UiKit.Tests
 				PanelMessage( "Test Cases", MockAssembly.Tests ), 
 				statusBar.Panels[1].Text );
 			Assert.AreEqual( 
-				PanelMessage( "Tests Run", MockAssembly.Tests - MockAssembly.NotRun ),
+				PanelMessage( "Tests Run", MockAssembly.TestsRun ),
 				statusBar.Panels[2].Text );
-			Assert.AreEqual( "Failures : 0", statusBar.Panels[3].Text );
-			Assert.AreEqual( "Time : 0", statusBar.Panels[4].Text );
+			Assert.AreEqual( 
+				PanelMessage( "Errors", MockAssembly.Errors ),
+				statusBar.Panels[3].Text );
+			Assert.AreEqual( 
+				PanelMessage( "Failures", MockAssembly.Failures ),
+				statusBar.Panels[4].Text );
 		}
 
         // .NET 1.0 sometimes throws:
@@ -91,6 +95,7 @@ namespace NUnit.UiKit.Tests
 			statusBar.Subscribe( mockEvents );
 
 			testCount = 0;
+            testCount = 0;
 			mockEvents.TestFinished += new TestEventHandler( OnTestFinished );
 
 			mockEvents.SimulateTestRun();
@@ -99,10 +104,14 @@ namespace NUnit.UiKit.Tests
 				PanelMessage( "Test Cases", MockAssembly.Tests ), 
 				statusBar.Panels[1].Text );
 			Assert.AreEqual( 
-				PanelMessage( "Tests Run", MockAssembly.Tests - MockAssembly.NotRun ),
+				PanelMessage( "Tests Run", MockAssembly.TestsRun ),
 				statusBar.Panels[2].Text );
-			Assert.AreEqual( "Failures : 0", statusBar.Panels[3].Text );
-			Assert.AreEqual( "Time : 0", statusBar.Panels[4].Text );
+			Assert.AreEqual( 
+				PanelMessage( "Errors", MockAssembly.Errors ),
+				statusBar.Panels[3].Text );
+			Assert.AreEqual(
+				PanelMessage( "Failures", MockAssembly.Failures ),
+				statusBar.Panels[4].Text );
 		}
 
 		private void OnTestFinished( object sender, TestEventArgs e )
@@ -110,67 +119,21 @@ namespace NUnit.UiKit.Tests
 			Assert.AreEqual( 
 				PanelMessage( "Test Cases", MockAssembly.Tests ),
 				statusBar.Panels[1].Text );
-			Assert.AreEqual( "Failures : 0", statusBar.Panels[3].Text );
-			Assert.AreEqual( "Time : 0", statusBar.Panels[4].Text );
-
-			// Note: Assumes delegates are called in order of adding
-			switch( ++testCount )
-			{
-				case 1:
-					CheckTestDisplay( "NUnit.Tests.Assemblies.MockTestFixture.ExplicitlyRunTest", e, 0 );
-					break;
-				case 2:
-					CheckTestDisplay( "NUnit.Tests.Assemblies.MockTestFixture.MockTest1", e, 1 );
-					break;
-				case 3:
-					CheckTestDisplay( "NUnit.Tests.Assemblies.MockTestFixture.MockTest2", e, 2 );
-					break;
-				case 4:
-					CheckTestDisplay( "NUnit.Tests.Assemblies.MockTestFixture.MockTest3", e, 3 );
-					break;
-				case 5:
-					CheckTestDisplay( "NUnit.Tests.Assemblies.MockTestFixture.MockTest4", e, 3 );
-					break;
-				case 6:
-					CheckTestDisplay( "NUnit.Tests.Assemblies.MockTestFixture.MockTest5", e, 3 );
-					break;
-				case 7:
-					CheckTestDisplay( "NUnit.Tests.Assemblies.MockTestFixture.TestWithManyProperties", e, 4 );
-					break;
-				case 8:
-					CheckTestDisplay( "NUnit.Tests.ExplicitFixture.Test1", e, 4 );
-					break;
-				case 9:
-					CheckTestDisplay( "NUnit.Tests.ExplicitFixture.Test2", e, 4 );
-					break;
-				case 10:
-					CheckTestDisplay( "NUnit.Tests.IgnoredFixture.Test1", e, 4 );
-					break;
-				case 11:
-					CheckTestDisplay( "NUnit.Tests.IgnoredFixture.Test2", e, 4 );
-					break;
-				case 12:
-					CheckTestDisplay( "NUnit.Tests.IgnoredFixture.Test3", e, 4 );
-					break;
-				case 13:
-					CheckTestDisplay( "NUnit.Tests.Singletons.OneTestCase.TestCase", e, 5 );
-					break;
-				case 14:			
-					CheckTestDisplay( "NUnit.Tests.TestAssembly.MockTestFixture.MyTest", e, 6 );
-					break;
-			}
-		}
 
-		private void CheckTestDisplay( string expected, TestEventArgs e, int testsRun )
-		{
-			Assert.AreEqual( expected, e.Result.Test.TestName.FullName );
-			int index = expected.LastIndexOf( '.' ) + 1;
-			StringAssert.EndsWith( expected.Substring( index ), statusBar.Panels[0].Text );
-			if ( testsRun > 0 )
-				Assert.AreEqual( PanelMessage( "Tests Run", testsRun ), statusBar.Panels[2].Text );
-			else
-				Assert.AreEqual( "", statusBar.Panels[2].Text );
-		}
+            StringAssert.EndsWith( e.Result.Test.TestName.Name, statusBar.Panels[0].Text );
+            
+		    string runPanel = statusBar.Panels[2].Text;
+		    int testsRun = 0;
+            if (runPanel != "")
+            {
+                StringAssert.StartsWith( "Tests Run : ", runPanel );
+                testsRun = int.Parse(runPanel.Substring(12));
+            }
+
+            Assert.GreaterOrEqual( testsRun, testCount);
+            Assert.LessOrEqual( testsRun, testCount + 1);
+		    testCount = testsRun;
+   		}
 
 		private static string PanelMessage( string text, int count )
 		{
diff --git a/src/GuiComponents/tests/TestSuiteTreeNodeTests.cs b/src/GuiComponents/tests/TestSuiteTreeNodeTests.cs
index ad6435f..c9e516f 100644
--- a/src/GuiComponents/tests/TestSuiteTreeNodeTests.cs
+++ b/src/GuiComponents/tests/TestSuiteTreeNodeTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2002-2003, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 namespace NUnit.UiKit.Tests
@@ -21,7 +21,7 @@ namespace NUnit.UiKit.Tests
 	{
 		TestSuite testSuite;
 		Test testFixture;
-		NUnit.Core.TestCase testCase;
+		Test testCase;
 
 		TestInfo suiteInfo;
 		TestInfo fixtureInfo;
@@ -37,7 +37,7 @@ namespace NUnit.UiKit.Tests
 			suiteInfo = new TestInfo( testSuite );
 			fixtureInfo = new TestInfo( testFixture );
 
-			testCase = (NUnit.Core.TestCase)testFixture.Tests[0];
+			testCase = (NUnit.Core.Test)testFixture.Tests[0];
 			testCaseInfo = new TestInfo( testCase );
 		}
 
@@ -48,39 +48,49 @@ namespace NUnit.UiKit.Tests
 			
 			node = new TestSuiteTreeNode( suiteInfo );
 			Assert.AreEqual( "MyTestSuite", node.Text );
-			Assert.AreEqual( "Test Suite", node.TestType );
+			Assert.AreEqual( "TestSuite", node.TestType );
 
 			node = new TestSuiteTreeNode( fixtureInfo );
 			Assert.AreEqual( "MockTestFixture", node.Text );
-			Assert.AreEqual( "Test Fixture", node.TestType );
+			Assert.AreEqual( "TestFixture", node.TestType );
 
 			node = new TestSuiteTreeNode( testCaseInfo );
 			Assert.AreEqual( "MockTest1", node.Text );
-			Assert.AreEqual( "Test Case", node.TestType );
+			Assert.AreEqual( "TestMethod", node.TestType );
 		}
 
-		[Test]
-		public void SetResult_Init()
-		{
-			TestSuiteTreeNode node = new TestSuiteTreeNode( testCaseInfo );
-			TestCaseResult result = new TestCaseResult( testCaseInfo );
-
-			node.Result = result;
-			Assert.AreEqual( "NUnit.Tests.Assemblies.MockTestFixture.MockTest1", node.Result.Name );
-			Assert.AreEqual( TestSuiteTreeNode.InitIndex, node.ImageIndex );
-			Assert.AreEqual( TestSuiteTreeNode.InitIndex, node.SelectedImageIndex );
-			Assert.AreEqual( "Runnable", node.StatusText );
-		}
-
-		[Test]
+        [Test]
+        public void ResultNotSet()
+        {
+            TestSuiteTreeNode node = new TestSuiteTreeNode(testCaseInfo);
+
+            Assert.AreEqual(TestSuiteTreeNode.InitIndex, node.ImageIndex);
+            Assert.AreEqual(TestSuiteTreeNode.InitIndex, node.SelectedImageIndex);
+        }
+
+        [Test]
+        public void SetResult_Inconclusive()
+        {
+            TestSuiteTreeNode node = new TestSuiteTreeNode(testCaseInfo);
+            TestResult result = new TestResult(testCaseInfo);
+
+            result.SetResult(ResultState.Inconclusive, null, null);
+            node.Result = result;
+            Assert.AreEqual("MockTest1", node.Result.Name);
+            Assert.AreEqual(TestSuiteTreeNode.InconclusiveIndex, node.ImageIndex);
+            Assert.AreEqual(TestSuiteTreeNode.InconclusiveIndex, node.SelectedImageIndex);
+            Assert.AreEqual(result.ResultState.ToString(), node.StatusText);
+        }
+
+        [Test]
 		public void SetResult_Ignore()
 		{
 			TestSuiteTreeNode node = new TestSuiteTreeNode( testCaseInfo );
-			TestCaseResult result = new TestCaseResult( testCaseInfo );
+			TestResult result = new TestResult( testCaseInfo );
 
 			result.Ignore( "reason" );
 			node.Result = result;
-			Assert.AreEqual( "NUnit.Tests.Assemblies.MockTestFixture.MockTest1", node.Result.Name );
+			Assert.AreEqual( "MockTest1", node.Result.Name );
 			Assert.AreEqual( TestSuiteTreeNode.IgnoredIndex, node.ImageIndex );
 			Assert.AreEqual( TestSuiteTreeNode.IgnoredIndex, node.SelectedImageIndex );
 			Assert.AreEqual( "Ignored", node.StatusText );
@@ -90,7 +100,7 @@ namespace NUnit.UiKit.Tests
 		public void SetResult_Success()
 		{
 			TestSuiteTreeNode node = new TestSuiteTreeNode( testCaseInfo );
-			TestCaseResult result = new TestCaseResult( testCaseInfo );
+			TestResult result = new TestResult( testCaseInfo );
 
 			result.Success();
 			node.Result = result;
@@ -103,7 +113,7 @@ namespace NUnit.UiKit.Tests
 		public void SetResult_Failure()
 		{
 			TestSuiteTreeNode node = new TestSuiteTreeNode( testCaseInfo );
-			TestCaseResult result = new TestCaseResult( testCaseInfo );
+			TestResult result = new TestResult( testCaseInfo );
 
 			result.Failure("message", "stacktrace");
 			node.Result = result;
@@ -116,9 +126,9 @@ namespace NUnit.UiKit.Tests
 		public void SetResult_Skipped()
 		{
 			TestSuiteTreeNode node = new TestSuiteTreeNode( testCaseInfo );
-			TestCaseResult result = new TestCaseResult( testCaseInfo );
+			TestResult result = new TestResult( testCaseInfo );
 
-			result.RunState = RunState.Skipped;
+            result.Skip("");
 			node.Result = result;
 			Assert.AreEqual( TestSuiteTreeNode.SkippedIndex, node.ImageIndex );
 			Assert.AreEqual( TestSuiteTreeNode.SkippedIndex, node.SelectedImageIndex );
@@ -128,27 +138,27 @@ namespace NUnit.UiKit.Tests
 		[Test]
 		public void ClearResult()
 		{
-			TestCaseResult result = new TestCaseResult( testCaseInfo );
+			TestResult result = new TestResult( testCaseInfo );
 			result.Failure("message", "stacktrace");
 
 			TestSuiteTreeNode node = new TestSuiteTreeNode( result );
 			Assert.AreEqual( TestSuiteTreeNode.FailureIndex, node.ImageIndex );
 			Assert.AreEqual( TestSuiteTreeNode.FailureIndex, node.SelectedImageIndex );
 
-			node.ClearResult();
+			node.ClearResults();
 			Assert.AreEqual( null, node.Result );
 			Assert.AreEqual( TestSuiteTreeNode.InitIndex, node.ImageIndex );
 			Assert.AreEqual( TestSuiteTreeNode.InitIndex, node.SelectedImageIndex );
 		}
 		
 		[Test]
-		public void ClearResults()
+		public void ClearNestedResults()
 		{
-			TestCaseResult testCaseResult = new TestCaseResult( testCaseInfo );
+			TestResult testCaseResult = new TestResult( testCaseInfo );
 			testCaseResult.Success();
-			TestSuiteResult testSuiteResult = new TestSuiteResult( fixtureInfo, "MockTestFixture" );
+			TestResult testSuiteResult = new TestResult( fixtureInfo );
 			testSuiteResult.AddResult( testCaseResult );
-			testSuiteResult.RunState = RunState.Executed;
+            testSuiteResult.Success();
 
 			TestSuiteTreeNode node1 = new TestSuiteTreeNode( testSuiteResult );
 			TestSuiteTreeNode node2 = new TestSuiteTreeNode( testCaseResult );
diff --git a/src/GuiComponents/tests/TestSuiteTreeViewFixture.cs b/src/GuiComponents/tests/TestSuiteTreeViewFixture.cs
index 60d8a05..7d37e11 100644
--- a/src/GuiComponents/tests/TestSuiteTreeViewFixture.cs
+++ b/src/GuiComponents/tests/TestSuiteTreeViewFixture.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2002-2003, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 namespace NUnit.UiKit.Tests
@@ -18,12 +18,11 @@ namespace NUnit.UiKit.Tests
 	/// Summary description for TestSuiteFixture.
 	/// </summary>
 	/// 
-	[TestFixture]
 	public class TestSuiteTreeViewFixture
 	{
-		private string testsDll = "mock-assembly.dll";
-		private Test suite;
-		private TestSuiteTreeView treeView;
+		protected string testsDll = MockAssembly.AssemblyPath;
+		protected Test suite;
+        protected TestSuiteTreeView treeView;
 
 		[SetUp]
 		public void SetUp() 
@@ -32,8 +31,13 @@ namespace NUnit.UiKit.Tests
 			suite = builder.Build( new TestPackage( testsDll ) );
 
 			treeView = new TestSuiteTreeView();
+            treeView.Load(new TestNode(suite));
 		}
+    }
 
+    [TestFixture]
+    public class TestSuiteTreeViewTests : TestSuiteTreeViewFixture
+    {
 		private bool AllExpanded( TreeNode node)
 		{
 			if ( node.Nodes.Count == 0 )
@@ -57,10 +61,10 @@ namespace NUnit.UiKit.Tests
 		[Test]
 		public void BuildTreeView()
 		{
-			treeView.Load( new TestNode( suite ) );
+            //treeView.Load( new TestNode( suite ) );
 			Assert.IsNotNull( treeView.Nodes[0] );
 			Assert.AreEqual( MockAssembly.Nodes, treeView.GetNodeCount( true ) );
-			Assert.AreEqual( "mock-assembly.dll", treeView.Nodes[0].Text );	
+			Assert.AreEqual( testsDll, treeView.Nodes[0].Text );	
 			Assert.AreEqual( "NUnit", treeView.Nodes[0].Nodes[0].Text );
 			Assert.AreEqual( "Tests", treeView.Nodes[0].Nodes[0].Nodes[0].Text );
 		}
@@ -68,13 +72,13 @@ namespace NUnit.UiKit.Tests
 		[Test]
 		public void BuildFromResult()
 		{
-			TestResult result = suite.Run( new NullListener() );
+            TestResult result = suite.Run(new NullListener(), TestFilter.Empty);
 			treeView.Load( result );
 			Assert.AreEqual( MockAssembly.Nodes - MockAssembly.Explicit - MockAssembly.ExplicitFixtures, 
 				treeView.GetNodeCount( true ) );
 			
 			TestSuiteTreeNode node = treeView.Nodes[0] as TestSuiteTreeNode;
-			Assert.AreEqual( "mock-assembly.dll", node.Text );
+			Assert.AreEqual( testsDll, node.Text );
 			Assert.IsNotNull( node.Result, "No Result on top-level Node" );
 	
 			node = node.Nodes[0].Nodes[0] as TestSuiteTreeNode;
@@ -90,14 +94,14 @@ namespace NUnit.UiKit.Tests
 					Assert.IsNotNull( node.Result, "No Result on TestFixture" );
 					Assert.AreEqual( true, node.Result.Executed, "MockTestFixture: Executed" );
 
-					TestSuiteTreeNode test1 = node.Nodes[0] as TestSuiteTreeNode;
+					TestSuiteTreeNode test1 = node.Nodes[2] as TestSuiteTreeNode;
 					Assert.AreEqual( "MockTest1", test1.Text );
 					Assert.IsNotNull( test1.Result, "No Result on TestCase" );
 					Assert.AreEqual( true, test1.Result.Executed, "MockTest1: Executed" );
 					Assert.AreEqual( false, test1.Result.IsFailure, "MockTest1: IsFailure");
 					Assert.AreEqual( TestSuiteTreeNode.SuccessIndex, test1.ImageIndex );
 
-					TestSuiteTreeNode test4 = node.Nodes[3] as TestSuiteTreeNode;
+					TestSuiteTreeNode test4 = node.Nodes[5] as TestSuiteTreeNode;
 					Assert.AreEqual( false, test4.Result.Executed, "MockTest4: Executed" );
 					Assert.AreEqual( TestSuiteTreeNode.IgnoredIndex, test4.ImageIndex );
 					return;
@@ -135,7 +139,7 @@ namespace NUnit.UiKit.Tests
 		[Test]
 		public void ClearTree()
 		{
-			treeView.Load( new TestNode( suite ) );
+            //treeView.Load( new TestNode( suite ) );
 			
 			treeView.Clear();
 			Assert.AreEqual( 0, treeView.Nodes.Count );
@@ -144,15 +148,15 @@ namespace NUnit.UiKit.Tests
 		[Test]
 		public void SetTestResult()
 		{
-			treeView.Load( new TestNode( suite ) );
+            //treeView.Load( new TestNode( suite ) );
 			
 			TestSuite fixture = (TestSuite)findTest( "MockTestFixture", suite );		
-			TestSuiteResult result = new TestSuiteResult( new TestInfo( fixture ), "My test result" );
+			TestResult result = new TestResult( new TestInfo( fixture ) );
 			treeView.SetTestResult( result );
 
 			TestSuiteTreeNode fixtureNode = FixtureNode( treeView );
 			Assert.IsNotNull(fixtureNode.Result,  "Result not set" );
-			Assert.AreEqual( "My test result", fixtureNode.Result.Name );
+			Assert.AreEqual( fixture.TestName.Name, fixtureNode.Result.Name );
 			Assert.AreEqual( fixtureNode.Test.TestName.FullName, fixtureNode.Result.Test.TestName.FullName );
 		}
 
@@ -174,55 +178,10 @@ namespace NUnit.UiKit.Tests
 			return result;
 		}
 
-		[Test]
-		public void ReloadTree()
-		{
-			// TODO: 
-			// This test is not a true simulation of what happens
-			// when a test is reloaded because the old nodes don't
-			// actually
-			treeView.Load( new TestNode( suite ) );
-
-			Assert.AreEqual( MockAssembly.Tests, suite.TestCount );
-			Assert.AreEqual( MockAssembly.Nodes, treeView.GetNodeCount( true ) );
-			CheckTree( treeView, suite, "initially" );
-
-			TestSuite nunitNamespaceSuite = suite.Tests[0] as TestSuite;
-			TestSuite testsNamespaceSuite = nunitNamespaceSuite.Tests[0] as TestSuite;
-			TestSuite assembliesNamespaceSuite = testsNamespaceSuite.Tests[0] as TestSuite;
-			testsNamespaceSuite.Tests.RemoveAt( 0 );
-			ReassignTestIDs( suite );
-			
-			treeView.Reload( new TestNode( suite ) );
-			CheckTree( treeView, suite, "after remove" );
-
-			Assert.AreEqual( MockAssembly.Tests - MockTestFixture.Tests, suite.TestCount );
-			Assert.AreEqual( MockAssembly.Nodes - MockTestFixture.Nodes - 1, treeView.GetNodeCount( true ) );
-
-			testsNamespaceSuite.Tests.Insert( 0, assembliesNamespaceSuite );
-			ReassignTestIDs( suite );
-
-			treeView.Reload( new TestNode( suite ) );
-			CheckTree( treeView, suite, "after insert" );
-
-			Assert.AreEqual( MockAssembly.Tests, suite.TestCount );
-			Assert.AreEqual( MockAssembly.Nodes, treeView.GetNodeCount( true ) );
-		}
-
-		[Test]
-		[ExpectedException( typeof(ArgumentException) )]
-		public void ReloadTreeWithWrongTest()
-		{
-			treeView.Load( new TestNode( suite ) );
-
-			TestSuite suite2 = new TestSuite( "WrongSuite" );
-			treeView.Reload( new TestNode( suite2 ) );
-		}
-
-		[Test]
+        [Test]
 		public void ProcessChecks()
 		{
-			treeView.Load( new TestNode( suite ) );
+            //treeView.Load( new TestNode( suite ) );
 
 			Assert.AreEqual(0, treeView.CheckedTests.Length);
 			Assert.IsFalse(Checked(treeView.Nodes));
@@ -286,52 +245,213 @@ namespace NUnit.UiKit.Tests
 
 			return result;
 		}
-
-		// Reload re-assigns the test IDs, so we do that here
-		private void ReassignTestIDs( Test test )
-		{
-			test.TestName.TestID = new TestID();
-
-			if ( test.IsSuite )
-				foreach( Test child in test.Tests )
-					ReassignTestIDs( child );
-		}
-
-		private void CheckTree( TestSuiteTreeView treeView, Test suite, string msg )
-		{
-			CheckThatTreeMatchesTests( treeView, suite, "Tree out of order " + msg );
-			CheckTreeMap( treeView, suite, "Map incorrect " + msg );
-		}
-
-		private void CheckThatTreeMatchesTests( TestSuiteTreeView treeView, Test suite, string msg )
-		{
-			CheckThatNodeMatchesTest( (TestSuiteTreeNode)treeView.Nodes[0], suite, msg );
-		}
-
-		private void CheckThatNodeMatchesTest( TestSuiteTreeNode node, Test test, string msg )
-		{
-			Assert.AreEqual( test.TestName, node.Test.TestName );
-
-			if ( test.IsSuite )
-			{
-				Assert.AreEqual( test.Tests.Count, node.Nodes.Count, "{0}: Incorrect count for {1}", msg, test.TestName.FullName );
-
-				for( int index = 0; index < test.Tests.Count; index++ )
-				{
-					CheckThatNodeMatchesTest( (TestSuiteTreeNode)node.Nodes[index], (Test)test.Tests[index], msg );
-				}
-			}
-		}
-
-		private void CheckTreeMap( TestSuiteTreeView treeView, Test test, string msg )
-		{
-			TestSuiteTreeNode node = treeView[test.TestName.UniqueName];
-			Assert.IsNotNull( node, "{0}: {1} not in map", msg, test.TestName.UniqueName );
-			Assert.AreEqual( test.TestName, treeView[test.TestName.UniqueName].Test.TestName, msg );
-
-			if ( test.IsSuite )
-				foreach( Test child in test.Tests )
-					CheckTreeMap( treeView, child, msg );
-		}
 	}
+
+    [TestFixture]
+    public class TestSuiteTreeViewReloadTests : TestSuiteTreeViewFixture
+    {
+        private TestSuite nunitNamespaceSuite;
+        private TestSuite testsNamespaceSuite;
+        private TestSuite assembliesNamespaceSuite;
+        private TestSuite mockTestFixture;
+        private int originalTestCount;
+
+        [SetUp]
+        public void Initialize()
+        {
+            nunitNamespaceSuite = suite.Tests[0] as TestSuite;
+            testsNamespaceSuite = nunitNamespaceSuite.Tests[0] as TestSuite;
+            assembliesNamespaceSuite = testsNamespaceSuite.Tests[0] as TestSuite;
+            mockTestFixture = assembliesNamespaceSuite.Tests[0] as TestSuite;
+            originalTestCount = suite.TestCount;
+        }
+
+        [Test]
+        public void VerifyCheckTreeWorks()
+        {
+            CheckTreeAgainstSuite(suite, "initially");
+        }
+
+        [Test]
+        public void CanReloadWithoutChange()
+        {
+            treeView.Reload(new TestNode(suite));
+            CheckTreeAgainstSuite(suite, "unchanged");
+        }
+
+        [Test]
+        public void CanReloadAfterDeletingOneTestCase()
+        {
+            mockTestFixture.Tests.RemoveAt(0);
+            Assert.AreEqual(originalTestCount - 1, suite.TestCount);
+
+            ReassignTestIDsAndReload(suite);
+            CheckTreeAgainstSuite(suite, "after removing test case");
+        }
+
+        [Test]
+        public void CanReloadAfterDeletingThreeTestCases()
+        {
+            mockTestFixture.Tests.RemoveAt(4);
+            mockTestFixture.Tests.RemoveAt(2);
+            mockTestFixture.Tests.RemoveAt(0);
+            Assert.AreEqual(originalTestCount - 3, suite.TestCount);
+            
+            ReassignTestIDsAndReload(suite);
+            CheckTreeAgainstSuite(suite, "after removing test case");
+        }
+
+        [Test]
+        public void CanReloadAfterDeletingBranch()
+        {
+            int removeCount = ((Test)testsNamespaceSuite.Tests[0]).TestCount;
+            testsNamespaceSuite.Tests.RemoveAt(0);
+            Assert.AreEqual(originalTestCount-removeCount, suite.TestCount);
+            
+            ReassignTestIDsAndReload(suite);
+            CheckTreeAgainstSuite(suite, "after removing branch");
+        }
+
+        [Test]
+        public void CanReloadAfterInsertingTestCase()
+        {
+            mockTestFixture.Tests.Add(new NUnitTestMethod((MethodInfo)MethodInfo.GetCurrentMethod()));
+            Assert.AreEqual(originalTestCount + 1, suite.TestCount);
+            
+            ReassignTestIDsAndReload(suite);
+            CheckTreeAgainstSuite(suite, "after inserting test case");
+        }
+
+        [Test]
+        public void CanReloadAfterInsertingTestFixture()
+        {
+            Test fixture = new TestSuite(this.GetType());
+            testsNamespaceSuite.Tests.Add(fixture);
+            Assert.AreEqual(originalTestCount + fixture.TestCount, suite.TestCount);
+
+            ReassignTestIDsAndReload(suite);
+            CheckTreeAgainstSuite(suite, "after inserting test case");
+        }
+
+        [Test]
+        public void ReloadTreeWithWrongTest()
+        {
+            TestSuite suite2 = new TestSuite("WrongSuite");
+            treeView.Reload(new TestNode(suite2));
+        }
+
+        [Test]
+        public void CanReloadAfterChangingOrder()
+        {
+            // Just swap the first and second test
+            object first = mockTestFixture.Tests[0];
+            mockTestFixture.Tests.RemoveAt(0);
+            mockTestFixture.Tests.Insert(1, first);
+            Assert.AreEqual(originalTestCount, suite.TestCount);
+
+            ReassignTestIDsAndReload(suite);
+            CheckTreeAgainstSuite(suite, "after reordering");
+        }
+
+        [Test]
+        public void CanReloadAfterMultipleChanges()
+        {
+            // Add a fixture
+            Test fixture = new TestSuite(this.GetType());
+            testsNamespaceSuite.Tests.Add(fixture);
+
+            // Remove two tests
+            mockTestFixture.Tests.RemoveAt(4);
+            mockTestFixture.Tests.RemoveAt(2);
+            
+            // Interchange two tests
+            object first = mockTestFixture.Tests[0];
+            mockTestFixture.Tests.RemoveAt(0);
+            mockTestFixture.Tests.Insert(2, first);
+
+            // Add an new test case
+            mockTestFixture.Tests.Add(new NUnitTestMethod((MethodInfo)MethodInfo.GetCurrentMethod()));
+
+            int expectedCount = fixture.TestCount - 1;
+            Assert.AreEqual(originalTestCount + expectedCount, suite.TestCount);
+
+            ReassignTestIDsAndReload(suite);
+            CheckTreeAgainstSuite(suite, "after multiple changes");
+        }
+
+        [Test]
+        public void CanReloadAfterTurningOffAutoNamespaces()
+        {
+            TestSuiteBuilder builder = new TestSuiteBuilder();
+            TestPackage package = new TestPackage(testsDll);
+            package.Settings["AutoNamespaceSuites"] = false;
+            TestSuite suite2 = builder.Build(package);
+            Assert.AreEqual(originalTestCount, suite2.TestCount);
+            Assert.AreEqual(MockAssembly.Classes, suite2.Tests.Count);
+
+            ReassignTestIDsAndReload(suite2);
+            CheckTreeAgainstSuite(suite2, "after turning automatic namespaces OFF");
+
+            // TODO: This currently doesn't work
+            //ReassignTestIDsAndReload(suite);
+            //CheckTreeAgainstSuite(suite, "after turning automatic namespaces ON");
+        }
+
+        private void CheckTreeAgainstSuite(Test suite, string msg)
+        {
+            CheckThatTreeMatchesTests(treeView, suite, "Tree out of order " + msg);
+            CheckTreeMap(treeView, suite, "Map incorrect " + msg);
+        }
+
+        private void CheckThatTreeMatchesTests(TestSuiteTreeView treeView, Test suite, string msg)
+        {
+            CheckThatNodeMatchesTest((TestSuiteTreeNode)treeView.Nodes[0], suite, msg);
+        }
+
+        private void CheckThatNodeMatchesTest(TestSuiteTreeNode node, Test test, string msg)
+        {
+            Assert.AreEqual(test.TestName, node.Test.TestName, "{0}: Names do not match for {1}", msg, test.TestName.FullName);
+
+            if (test.IsSuite)
+            {
+                //if ( test.TestName.FullName == "NUnit.Tests.Assemblies.MockTestFixture" )
+                //    foreach( TestSuiteTreeNode n in node.Nodes )
+                //        Console.WriteLine( n.Test.TestName );
+
+                Assert.AreEqual(test.Tests.Count, node.Nodes.Count, "{0}: Incorrect count for {1}", msg, test.TestName.FullName);
+
+                for (int index = 0; index < test.Tests.Count; index++)
+                {
+                    CheckThatNodeMatchesTest((TestSuiteTreeNode)node.Nodes[index], (Test)test.Tests[index], msg);
+                }
+            }
+        }
+
+        private void CheckTreeMap(TestSuiteTreeView treeView, Test test, string msg)
+        {
+            TestSuiteTreeNode node = treeView[test.TestName.UniqueName];
+            Assert.IsNotNull(node, "{0}: {1} not in map", msg, test.TestName.UniqueName);
+            Assert.AreEqual(test.TestName, treeView[test.TestName.UniqueName].Test.TestName, msg);
+
+            if (test.IsSuite)
+                foreach (Test child in test.Tests)
+                    CheckTreeMap(treeView, child, msg);
+        }
+
+        // Reload re-assigns the test IDs, so we simulate it
+        private void ReassignTestIDs(Test test)
+        {
+            test.TestName.TestID = new TestID();
+
+            if (test.IsSuite)
+                foreach (Test child in test.Tests)
+                    ReassignTestIDs(child);
+        }
+
+        private void ReassignTestIDsAndReload(Test test)
+        {
+            ReassignTestIDs(test);
+            treeView.Reload(new TestNode(test));
+        }
+    }
 }
diff --git a/src/GuiComponents/tests/TestTreeTests.cs b/src/GuiComponents/tests/TestTreeTests.cs
new file mode 100644
index 0000000..32c96a6
--- /dev/null
+++ b/src/GuiComponents/tests/TestTreeTests.cs
@@ -0,0 +1,47 @@
+// ****************************************************************
+// Copyright 2010, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Reflection;
+using NUnit.Framework;
+
+namespace NUnit.UiKit.Tests
+{
+	[TestFixture]
+	public class TestTreeTests
+	{
+		[Test]
+		public void SameCategoryShouldNotBeSelectedMoreThanOnce()
+		{
+			// arrange
+			TestTree target = new TestTree();
+
+			// we need to populate the available categories
+			// this can be done via TestLoader but this way the test is isolated
+			FieldInfo fieldInfo = typeof (TestTree).GetField("availableCategories", BindingFlags.NonPublic | BindingFlags.Instance);
+			Assert.IsNotNull(fieldInfo, "The field 'availableCategories' should be found.");
+			object fieldValue = fieldInfo.GetValue(target);
+			Assert.IsNotNull(fieldValue, "The value of 'availableCategories' should not be null.");
+			IList availableCategories = fieldValue as IList;
+			Assert.IsNotNull(availableCategories, "'availableCategories' field should be of type IList.");
+
+			string[] expectedSelectedCategories = new string[] { "Foo", "MockCategory" };
+			foreach (string availableCategory in expectedSelectedCategories)
+			{
+				availableCategories.Add(availableCategory);
+			}
+
+			// act
+			target.SelectCategories(expectedSelectedCategories, true);
+			target.SelectCategories(expectedSelectedCategories, true);
+			string[] actualSelectedCategories = target.SelectedCategories;
+
+			// assert
+			CollectionAssert.AreEquivalent(expectedSelectedCategories, actualSelectedCategories);
+		}
+	}
+}
diff --git a/src/GuiComponents/tests/TextBoxTests.cs b/src/GuiComponents/tests/TextBoxTests.cs
deleted file mode 100644
index 8cd0daa..0000000
--- a/src/GuiComponents/tests/TextBoxTests.cs
+++ /dev/null
@@ -1,83 +0,0 @@
-using System;
-using System.Windows.Forms;
-using NUnit.Framework;
-
-namespace NUnit.UiKit.Tests
-{
-	[TestFixture]
-	public class TextBoxTests
-	{
-		private TextBox textBox;
-		
-		[SetUp]
-		public void Init()
-		{
-			textBox = new TextBox();
-			textBox.Multiline=false;
-			textBox.CreateControl();
-		}
-
-		public void CleanUp()
-		{
-			textBox.Dispose();
-		}
-
-		[Test]
-		public void InitialState()
-		{
-			Assert.AreEqual( "", textBox.Text );
-			Assert.AreEqual( 0, textBox.Lines.Length );
-			Assert.AreEqual( false, textBox.Multiline );
-		}
-
-		[Test]
-		public void AppendText()
-		{
-			textBox.AppendText( "AAAA" );
-			textBox.AppendText( "BBB" );
-			textBox.AppendText( "CCCCC" );
-			Assert.AreEqual( "AAAABBBCCCCC", textBox.Text );
-			Assert.AreEqual( 1, textBox.Lines.Length );
-			Assert.AreEqual( "AAAABBBCCCCC", textBox.Lines[0] );
-		}
-
-		[Test]
-		public void AppendTextPlusCR()
-		{
-			textBox.AppendText( "AAAA\r" );
-			textBox.AppendText( "BBB\r" );
-			textBox.AppendText( "CCCCC\r" );
-//			Assert.AreEqual( "AAAA\rBBB\rCCCCC\r", textBox.Text );
-			Assert.AreEqual( 4, textBox.Lines.Length );
-			Assert.AreEqual( "AAAA", textBox.Lines[0] );
-			Assert.AreEqual( "BBB", textBox.Lines[1] );
-			Assert.AreEqual( "CCCCC", textBox.Lines[2] );
-		}
-
-		[Test]
-		public void AppendTextPlusLF()
-		{
-			textBox.AppendText( "AAAA\n" );
-			textBox.AppendText( "BBB\n" );
-			textBox.AppendText( "CCCCC\n" );
-//			Assert.AreEqual( "AAAA\nBBB\nCCCCC\n", textBox.Text );
-			Assert.AreEqual( 4, textBox.Lines.Length );
-			Assert.AreEqual( "AAAA", textBox.Lines[0] );
-			Assert.AreEqual( "BBB", textBox.Lines[1] );
-			Assert.AreEqual( "CCCCC", textBox.Lines[2] );
-		}
-
-		[Test]
-		public void AppendTextPlusCRLF()
-		{
-			textBox.AppendText( "AAAA\r\n" );
-			textBox.AppendText( "BBB\r\n" );
-			textBox.AppendText( "CCCCC\r\n" );
-//			Assert.AreEqual( "AAAA\r\nBBB\r\nCCCCC\r\n", textBox.Text );
-			Assert.AreEqual( 4, textBox.Lines.Length );
-			Assert.AreEqual( "AAAA", textBox.Lines[0] );
-			Assert.AreEqual( "BBB", textBox.Lines[1] );
-			Assert.AreEqual( "CCCCC", textBox.Lines[2] );
-		}
-	}
-}
diff --git a/src/GuiComponents/tests/TextBoxWriterTests.cs b/src/GuiComponents/tests/TextBoxWriterTests.cs
deleted file mode 100644
index 936640d..0000000
--- a/src/GuiComponents/tests/TextBoxWriterTests.cs
+++ /dev/null
@@ -1,81 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-using System.Windows.Forms;
-using NUnit.Framework;
-
-namespace NUnit.UiKit.Tests
-{
-	[TestFixture]
-	public class TextBoxWriterTests
-	{
-		private TextBoxWriter textBoxWriter;
-		private RichTextBox textBox;
-		
-		[SetUp]
-		public void Init()
-		{
-			textBox = new RichTextBox();
-			textBox.Multiline = true;
-			textBoxWriter = new TextBoxWriter( textBox );
-			textBox.CreateControl();
-		}
-
-		public void CleanUp()
-		{
-			textBox.Dispose();
-		}
-
-		[Test]
-		public void CreateWriter()
-		{
-			Assert.IsNotNull( textBoxWriter );
-			Assert.AreEqual( "", textBox.Text );
-			Assert.AreEqual( 0, textBox.Lines.Length );
-		}
-
-		private void WriteTestLines( int count, int start )
-		{
-			for( int index = start; index < start + count; ++index )
-				textBoxWriter.WriteLine( string.Format( "This is line {0}", index ) );
-		}
-
-		private void WriteTestLines( int count )
-		{
-			WriteTestLines( count, 1 );
-		}
-
-		[Test]
-		public void WriteLines()
-		{
-			WriteTestLines( 5 );
-			Assert.AreEqual( "This is line 3", textBox.Lines[2] );
-		}
-
-		[Test]
-		public void Write()
-		{
-			textBoxWriter.Write( "I wrote this" );
-			textBoxWriter.Write( " in three parts" );
-			textBoxWriter.Write( '!' );
-			
-			Assert.AreEqual( "I wrote this in three parts!", textBox.Text );
-		}
-
-		[Test, Platform(Exclude="Mono", Reason="Mono 1.2.2 mixes up lines")]
-		public void MixedWrites()
-		{
-			WriteTestLines( 5 );
-			textBoxWriter.Write( "This line written" );
-			textBoxWriter.WriteLine( " in two parts" );
-			textBoxWriter.WriteLine( "The final line" );
-
-			Assert.AreEqual( "This line written in two parts", textBox.Lines[5] );
-			Assert.AreEqual( "The final line", textBox.Lines[6] );
-		}
-	}
-}
diff --git a/src/GuiComponents/tests/TextBoxWriterTests.cs.txt b/src/GuiComponents/tests/TextBoxWriterTests.cs.txt
deleted file mode 100644
index c62b112..0000000
--- a/src/GuiComponents/tests/TextBoxWriterTests.cs.txt
+++ /dev/null
@@ -1,71 +0,0 @@
-using System;
-using System.Windows.Forms;
-using NUnit.Framework;
-
-namespace NUnit.UiKit.Tests
-{
-	[TestFixture]
-	public class TextBoxWriterTests
-	{
-		private TextBoxWriter textBoxWriter;
-		private RichTextBox textBox;
-		
-		[SetUp]
-		public void Init()
-		{
-			textBox = new RichTextBox();
-			textBoxWriter = new TextBoxWriter( textBox );
-			textBox.CreateControl();
-		}
-
-		[Test]
-		public void CreateWriter()
-		{
-			Assert.IsNotNull( textBoxWriter );
-			Assert.AreEqual( 0, textBox.Lines.Length );
-			Assert.AreEqual( "", textBox.Text );
-			Assert.AreEqual( 0, textBox.Lines.Length );
-		}
-
-		private void WriteTestLines( int count, int start )
-		{
-			for( int index = start; index < start + count; ++index )
-				textBoxWriter.WriteLine( string.Format( "This is line {0}", index ) );
-		}
-
-		private void WriteTestLines( int count )
-		{
-			WriteTestLines( count, 1 );
-		}
-
-		[Test]//, Platform(Exclude="Mono")]
-		public void WriteLines()
-		{
-			WriteTestLines( 5 );
-			Assert.AreEqual( "", textBox.Text );
-			Assert.AreEqual( "This is line 3", textBox.Lines[2] );
-		}
-
-		[Test]//, Platform(Exclude="Mono")]
-		public void Write()
-		{
-			textBoxWriter.Write( "I wrote this" );
-			textBoxWriter.Write( " in three parts" );
-			textBoxWriter.Write( '!' );
-
-			Assert.AreEqual( "I wrote this in three parts!", textBox.Lines[0] );
-		}
-
-		[Test]//, Platform(Exclude="Mono")]
-		public void MixedWrites()
-		{
-			WriteTestLines( 5 );
-			textBoxWriter.Write( "This line written" );
-			textBoxWriter.WriteLine( " in two parts" );
-			textBoxWriter.WriteLine( "The final line" );
-
-			Assert.AreEqual( "This line written in two parts", textBox.Lines[5] );
-			Assert.AreEqual( "The final line", textBox.Lines[6] );
-		}
-	}
-}
diff --git a/src/GuiComponents/tests/TextDisplayWriterTests.cs b/src/GuiComponents/tests/TextDisplayWriterTests.cs
deleted file mode 100644
index 60ea4cc..0000000
--- a/src/GuiComponents/tests/TextDisplayWriterTests.cs
+++ /dev/null
@@ -1,92 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-
-namespace NUnit.UiKit.Tests
-{
-	[TestFixture]
-	public class TextDisplayWriterTestsUsingSimpleTextDisplay : TextDisplayWriterTests
-	{
-		protected override object createDisplayObject()
-		{
-			return new SimpleTextDisplay();
-		}
-	}
-
-	[TestFixture]
-	public class TextDisplayWriterTestsUsingTextBoxDisplay : TextDisplayWriterTests
-	{
-		protected override object createDisplayObject()
-		{
-			return new TextBoxDisplay();
-		}
-	}
-
-	public abstract class TextDisplayWriterTests
-	{
-		protected TextDisplay textDisplay;
-		protected TextDisplayWriter textDisplayWriter;
-
-		[SetUp]
-		public void Init()
-		{
-			textDisplay = (TextDisplay)createDisplayObject();
-			textDisplayWriter = new TextDisplayWriter( textDisplay );
-		}
-
-		[TearDown]
-		public void CleanUp()
-		{
-			textDisplayWriter.Close();
-			IDisposable display = textDisplay as IDisposable;
-			if ( display != null )
-				display.Dispose();
-		}
-
-		protected abstract object createDisplayObject();
-
-		private void WriteTestLines( int count )
-		{
-			for( int index = 1; index <= count; ++index )
-				textDisplayWriter.WriteLine( string.Format( "This is line {0}", index ) );
-		}
-
-		[Test]
-		public void WriteLines()
-		{
-			WriteTestLines( 5 );
-			Assert.AreEqual(
-				"This is line 1\nThis is line 2\nThis is line 3\nThis is line 4\nThis is line 5\n",
-				textDisplay.Text.Replace("\r\n", "\n") );
-		}
-
-		[Test]
-		public void Write()
-		{
-			textDisplayWriter.Write( "I wrote this" );
-			textDisplayWriter.Write( " in three parts" );
-			textDisplayWriter.Write( '!' );
-			
-			Assert.AreEqual( "I wrote this in three parts!", textDisplay.Text );
-		}
-
-		[Test]
-		public void MixedWrites()
-		{
-			WriteTestLines( 5 );
-			textDisplayWriter.Write( "This line written" );
-			textDisplayWriter.WriteLine( " in two parts" );
-			textDisplayWriter.WriteLine( "The final line" );
-
-			Assert.AreEqual(
-				"This is line 1\nThis is line 2\nThis is line 3\nThis is line 4\nThis is line 5\n" +
-				"This line written in two parts\nThe final line\n",
-				textDisplay.Text.Replace("\r\n","\n" ) );
-		}
-	}
-}
diff --git a/src/GuiComponents/tests/VisualStateTests.cs b/src/GuiComponents/tests/VisualStateTests.cs
index 2277bef..d27d8bc 100644
--- a/src/GuiComponents/tests/VisualStateTests.cs
+++ b/src/GuiComponents/tests/VisualStateTests.cs
@@ -1,3 +1,9 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
 using System;
 using System.IO;
 using NUnit.Framework;
diff --git a/src/GuiComponents/tests/nunit.uikit.tests.build b/src/GuiComponents/tests/nunit.uikit.tests.build
index 5764a59..403fed1 100644
--- a/src/GuiComponents/tests/nunit.uikit.tests.build
+++ b/src/GuiComponents/tests/nunit.uikit.tests.build
@@ -1,41 +1,50 @@
 <?xml version="1.0"?>
 <project name="NUnit.UiKit.Tests" default="build" basedir=".">
 
-  <target name="build">
-    <csc target="library" 
-        output="${current.build.dir}/nunit.uikit.tests.dll" 
-        debug="${build.debug}" define="${build.defines}">
-      <sources>
+  <patternset id="source-files">
         <include name="AddConfigurationDialogTests.cs"/>
         <include name="ErrorDisplayTests.cs"/>
         <include name="LongRunningOperationDisplayTests.cs"/>
         <include name="ProgressBarTests.cs"/>
         <include name="RecentFileMenuHandlerTests.cs"/>
-        <include name="SimpleTextDisplayTests.cs"/>
         <include name="StatusBarTests.cs"/>
         <include name="TestSuiteTreeNodeTests.cs"/>
         <include name="TestSuiteTreeViewFixture.cs"/>
+        <include name="TestTreeTests.cs"/>
         <include name="VisualStateTests.cs"/>
-        <include name="../../CommonAssemblyInfo.cs"/>
+  </patternset>
+
+  <target name="build">
+    <csc target="library" 
+        output="${current.test.dir}/nunit.uikit.tests.dll" 
+        debug="${build.debug}" define="${build.defines}">
+      <sources>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
       </sources>
-      <references basedir="${current.build.dir}">
+      <references>
         <include name="System.Windows.Forms.dll"/>
-	<include name="System.Drawing.dll"/>
-        <include name="nunit.framework.dll"/>
-        <include name="nunit.core.interfaces.dll"/>
-        <include name="nunit.core.dll"/>
-        <include name="nunit.util.dll"/>
-        <include name="nunit.uikit.dll"/>
-        <include name="test-utilities.dll"/>
-        <include name="mock-assembly.dll"/>
-        <include name="notestfixtures-assembly.dll"/>
+        <include name="System.Drawing.dll"/>
+        <include name="${current.framework.dir}/nunit.framework.dll"/>
+        <include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
+        <include name="${current.lib.dir}/nunit.core.dll"/>
+        <include name="${current.lib.dir}/nunit.util.dll"/>
+        <include name="${current.lib.dir}/nunit.uikit.dll"/>
+        <include name="${current.lib.dir}/nunit.uiexception.dll"/>
+        <include name="${current.test.dir}/test-utilities.dll"/>
+        <include name="${current.test.dir}/mock-assembly.dll"/>
+        <include name="${current.test.dir}/notestfixtures-assembly.dll"/>
       </references>
     </csc>
   </target>
 
   <target name="package">
     <copy todir="${package.src.dir}/GuiComponents/tests">
-      <fileset refid="source-files" />
+      <fileset>
+        <patternset refid="source-files"/>
+        <include name="nunit.uikit.tests.csproj"/>
+        <include name="nunit.uikit.tests.build"/>
+      </fileset>
     </copy>
   </target>
 
diff --git a/src/GuiComponents/tests/nunit.uikit.tests.csproj b/src/GuiComponents/tests/nunit.uikit.tests.csproj
index 350ccf0..aaa07f3 100644
--- a/src/GuiComponents/tests/nunit.uikit.tests.csproj
+++ b/src/GuiComponents/tests/nunit.uikit.tests.csproj
@@ -1,191 +1,139 @@
-<VisualStudioProject>
-    <CSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{63EC3999-FA6B-4C5B-8805-5A88AF4CBD7B}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = ""
-                AssemblyKeyContainerName = ""
-                AssemblyName = "nunit.uikit.tests"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "Library"
-                PreBuildEvent = ""
-                PostBuildEvent = ""
-                RootNamespace = "NUnit.UiKit.Tests"
-                RunPostBuildEvent = "OnBuildSuccess"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "true"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-                <Config
-                    Name = "Release"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "false"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "System"
-                    AssemblyName = "System"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.dll"
-                />
-                <Reference
-                    Name = "System.Data"
-                    AssemblyName = "System.Data"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Data.dll"
-                />
-                <Reference
-                    Name = "System.XML"
-                    AssemblyName = "System.Xml"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.XML.dll"
-                />
-                <Reference
-                    Name = "nunit.framework.dll"
-                    Project = "{83DD7E12-A705-4DBA-9D71-09C8973D9382}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.uikit.dll"
-                    Project = "{27531BBF-183D-4C3A-935B-D840B9F1A3A4}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.util.dll"
-                    Project = "{61CE9CE5-943E-44D4-A381-814DC1406767}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "System.Windows.Forms"
-                    AssemblyName = "System.Windows.Forms"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Windows.Forms.dll"
-                />
-                <Reference
-                    Name = "mock-assembly"
-                    Project = "{2E368281-3BA8-4050-B05E-0E0E43F8F446}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "System.Drawing"
-                    AssemblyName = "System.Drawing"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Drawing.dll"
-                />
-                <Reference
-                    Name = "test-utilities"
-                    Project = "{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.core.dll"
-                    Project = "{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.core.interfaces.dll"
-                    Project = "{435428F8-5995-4CE4-8022-93D595A8CC0F}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-            </References>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "AddConfigurationDialogTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CommonAssemblyInfo.cs"
-                    Link = "..\..\CommonAssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ErrorDisplayTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "LongRunningOperationDisplayTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ProgressBarTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RecentFileMenuHandlerTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SimpleTextDisplayTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "StatusBarTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestSuiteTreeNodeTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestSuiteTreeViewFixture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "VisualStateTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-            </Include>
-        </Files>
-    </CSHARP>
-</VisualStudioProject>
-
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{63EC3999-FA6B-4C5B-8805-5A88AF4CBD7B}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit.uikit.tests</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.UiKit.Tests</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Drawing">
+      <Name>System.Drawing</Name>
+    </Reference>
+    <Reference Include="System.Windows.Forms">
+      <Name>System.Windows.Forms</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
+      <Name>nunit.util.dll</Name>
+      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
+      <Name>nunit.core.dll</Name>
+      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
+      <Name>nunit.core.interfaces.dll</Name>
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
+      <Name>nunit.framework.dll</Name>
+      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\..\tests\mock-assembly\mock-assembly.csproj">
+      <Name>mock-assembly</Name>
+      <Project>{2E368281-3BA8-4050-B05E-0E0E43F8F446}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\..\tests\test-utilities\test-utilities.csproj">
+      <Name>test-utilities</Name>
+      <Project>{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\UiKit\nunit.uikit.dll.csproj">
+      <Name>nunit.uikit.dll</Name>
+      <Project>{27531BBF-183D-4C3A-935B-D840B9F1A3A4}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\GuiException\UiException\nunit.uiexception.dll.csproj">
+      <Project>{3E87A106-EB20-4147-84C8-95B0BB43A1D4}</Project>
+      <Name>nunit.uiexception.dll</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="AddConfigurationDialogTests.cs" />
+    <Compile Include="ErrorDisplayTests.cs" />
+    <Compile Include="LongRunningOperationDisplayTests.cs" />
+    <Compile Include="ProgressBarTests.cs" />
+    <Compile Include="RecentFileMenuHandlerTests.cs" />
+    <Compile Include="StatusBarTests.cs" />
+    <Compile Include="TestSuiteTreeNodeTests.cs" />
+    <Compile Include="TestSuiteTreeViewFixture.cs" />
+    <Compile Include="TestTreeTests.cs" />
+    <Compile Include="VisualStateTests.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit.uikit.tests.build" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/GuiComponents/tests/nunit.uikit.tests.dll.config b/src/GuiComponents/tests/nunit.uikit.tests.dll.config
deleted file mode 100644
index 3238c85..0000000
--- a/src/GuiComponents/tests/nunit.uikit.tests.dll.config
+++ /dev/null
@@ -1,88 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<configuration>
-
-	<!--
-	 This is the configuration file for the NUnitTests.nunit test project. You may
-	 need to create a similar configuration file for your own test project. 
-	 
-	 In your own configuration file, the include any appSettings that you require.
-	 The <NUnit> section is only needed if you want to use a non-default value
-	 for any of the settings.
-	-->
-  <configSections>
-	<sectionGroup name="NUnit">
-		<section name="TestRunner" type="System.Configuration.NameValueSectionHandler"/>
-	</sectionGroup>
-  </configSections>
-  
-  <appSettings>
-    <!--   User application and configured property settings go here.-->
-    <!--   Example: <add key="settingName" value="settingValue"/> -->
-    <add key="test.setting" value="54321" />
-  </appSettings>
-
-  <NUnit>
-	<TestRunner>
-		<!-- Valid values are STA,MTA. Others ignored. -->
-		<add key="ApartmentState" value="MTA" />
-		
-		<!-- See ThreadPriority enum for other valid values -->
-		<add key="ThreadPriority" value="Normal" />
-	</TestRunner>
-  </NUnit>
-
-   <!--
-    The following <runtime> section allows running nunit tests under 
-    .NET 1.0 by redirecting assemblies. The appliesTo attribute
-    causes the section to be ignored except under .NET 1.0.
-   --> 
- <runtime>
-   
-    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
-			appliesTo="v1.0.3705">
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Data" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Drawing" 
-                          publicKeyToken="b03f5f7f11d50a3a" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Windows.Forms" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Xml" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-    </assemblyBinding>
-  
-  </runtime>
-
-</configuration> 
diff --git a/src/GuiComponents/tests/nunit.uikit.tests_VS2005.csproj b/src/GuiComponents/tests/nunit.uikit.tests_VS2005.csproj
deleted file mode 100644
index eba88f5..0000000
--- a/src/GuiComponents/tests/nunit.uikit.tests_VS2005.csproj
+++ /dev/null
@@ -1,123 +0,0 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>8.0.50727</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{63EC3999-FA6B-4C5B-8805-5A88AF4CBD7B}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ApplicationIcon>
-    </ApplicationIcon>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit.uikit.tests</AssemblyName>
-    <AssemblyOriginatorKeyFile>
-    </AssemblyOriginatorKeyFile>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.UiKit.Tests</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <StartupObject>
-    </StartupObject>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release2005|AnyCPU' ">
-    <OutputPath>bin\Release2005\</OutputPath>
-    <DefineConstants>TRACE;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <Optimize>true</Optimize>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug2005|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\Debug2005\</OutputPath>
-    <DefineConstants>TRACE;DEBUG;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Drawing">
-      <Name>System.Drawing</Name>
-    </Reference>
-    <Reference Include="System.Windows.Forms">
-      <Name>System.Windows.Forms</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="AddConfigurationDialogTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="ErrorDisplayTests.cs" />
-    <Compile Include="LongRunningOperationDisplayTests.cs" />
-    <Compile Include="ProgressBarTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="RecentFileMenuHandlerTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="SimpleTextDisplayTests.cs" />
-    <Compile Include="StatusBarTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestSuiteTreeNodeTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestSuiteTreeViewFixture.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="VisualStateTests.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll_VS2005.csproj">
-      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
-      <Name>nunit.util.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll_VS2005.csproj">
-      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
-      <Name>nunit.core.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll_VS2005.csproj">
-      <Project>{DCC88998-255A-4247-B658-71DD932E9873}</Project>
-      <Name>nunit.core.interfaces.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll_VS2005.csproj">
-      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
-      <Name>nunit.framework.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\tests\mock-assembly\mock-assembly_VS2005.csproj">
-      <Project>{2E368281-3BA8-4050-B05E-0E0E43F8F446}</Project>
-      <Name>mock-assembly_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\tests\test-utilities\test-utilities_VS2005.csproj">
-      <Project>{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}</Project>
-      <Name>test-utilities_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\UiKit\nunit.uikit.dll_VS2005.csproj">
-      <Project>{27531BBF-183D-4C3A-935B-D840B9F1A3A4}</Project>
-      <Name>nunit.uikit.dll_VS2005</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
-</Project>
\ No newline at end of file
diff --git a/src/GuiException/UiException/AssemblyInfo.cs b/src/GuiException/UiException/AssemblyInfo.cs
new file mode 100644
index 0000000..4835bf6
--- /dev/null
+++ b/src/GuiException/UiException/AssemblyInfo.cs
@@ -0,0 +1,11 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System.Reflection;
+
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("../../nunit.snk")]
+[assembly: AssemblyKeyName("")]
diff --git a/src/GuiException/UiException/CSharpParser/CSCode.cs b/src/GuiException/UiException/CSharpParser/CSCode.cs
new file mode 100644
index 0000000..7d7f6d1
--- /dev/null
+++ b/src/GuiException/UiException/CSharpParser/CSCode.cs
@@ -0,0 +1,354 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Collections;
+using NUnit.UiException.CodeFormatters;
+
+namespace NUnit.UiException.CodeFormatters
+{
+    /// <summary>
+    /// (Formerly named CSCode)
+    /// 
+    /// Implements ITextManager and adds new behaviors to provide support for basic
+    /// syntax coloring. 
+    /// </summary>
+    public class FormattedCode :
+        ITextManager
+    {
+        /// <summary>
+        /// Keeps tracks of the text and the data used by the syntax coloring feature.
+        /// </summary>
+        protected CodeInfo _codeInfo;
+
+        /// <summary>
+        /// Stores the character count of the longest line in this text.
+        /// </summary>
+        private int _maxLength;
+
+        /// <summary>
+        /// Builds a new instance of FormattedCode.
+        /// </summary>
+        public FormattedCode()
+        {
+            _codeInfo = NewCodeInfo();
+            _maxLength = 0;
+
+            return;
+        }
+
+        public FormattedCode(string csharpText, int[] strIndexes, byte[] tagValues, int[] lineIndexes)
+        {
+            UiExceptionHelper.CheckNotNull(csharpText, "csharpText");
+            UiExceptionHelper.CheckNotNull(strIndexes, "strIndexes");
+            UiExceptionHelper.CheckNotNull(tagValues, "tagValues");
+            UiExceptionHelper.CheckNotNull(lineIndexes, "lineIndexes");
+
+            _codeInfo = new CodeInfo();
+
+            _codeInfo.Text = csharpText;
+
+            _codeInfo.IndexArray = new List<int>();
+            foreach (int index in strIndexes)
+                _codeInfo.IndexArray.Add(index);
+
+            _codeInfo.TagArray = new List<byte>();
+            foreach (byte tag in tagValues)
+                _codeInfo.TagArray.Add(tag);
+
+            _codeInfo.LineArray = new List<int>();
+            foreach (int line in lineIndexes)
+                _codeInfo.LineArray.Add(line);
+
+            return;
+        }
+
+        public static FormattedCode Empty
+        {
+            get { return (new FormattedCode()); }
+        }
+
+        public CodeInfo CopyInfo()
+        {
+            FormattedCode copy;
+
+            copy = new FormattedCode(_codeInfo.Text, 
+                _codeInfo.IndexArray.ToArray(),
+                _codeInfo.TagArray.ToArray(), 
+                _codeInfo.LineArray.ToArray());
+
+            return (copy._codeInfo);
+        }
+
+        /// <summary>
+        /// Builds a new instance of CodeInfo.
+        /// </summary>
+        public static CodeInfo NewCodeInfo()
+        {
+            CodeInfo res;
+
+            res = new CodeInfo();
+            res.Text = "";
+            res.IndexArray = new List<int>();
+            res.LineArray = new List<int>();
+            res.TagArray = new List<byte>();
+
+            return (res);
+        }
+
+        /// <summary>
+        /// Gets the text currently managed by this object.
+        /// </summary>
+        public string Text
+        {
+            get { return (_codeInfo.Text); }           
+        }
+
+        /// <summary>
+        /// Gets the line count in the text currently
+        /// managed by this object.
+        /// </summary>
+        public int LineCount
+        {
+            get { return (_codeInfo.LineArray.Count); }
+        }
+
+        /// <summary>
+        /// Gets the character count of the longest line
+        /// in this text.
+        /// </summary>
+        public int MaxLength
+        {
+            get 
+            {
+                int i;
+
+                if (_maxLength == 0)
+                    for (i = 0; i < LineCount; ++i)
+                        _maxLength = Math.Max(_maxLength, this[i].Text.TrimEnd().Length);
+
+                return (_maxLength); 
+            }
+        }
+
+        /// <summary>
+        /// Gives access to the collection of ClassifiedToken at the specified lineIndex.
+        /// </summary>
+        /// <param name="lineIndex">A zero based startingPosition.</param>
+        /// <returns>The ClassifiedTokenCollection instance at this startingPosition.</returns>
+        public ClassifiedTokenCollection this[int lineIndex]
+        {
+            get { return (new InternalCSTokenCollection(_codeInfo, lineIndex)); }
+        }
+
+        /// <summary>
+        /// Gets the text at the specified line.
+        /// </summary>
+        /// <param name="lineIndex">A zero based startingPosition.</param>
+        /// <returns>The text at the specified line startingPosition.</returns>
+        public string GetTextAt(int lineIndex)
+        {
+            return (this[lineIndex].Text);
+        }
+
+        /// <summary>
+        /// An utility method that check data consistency. The operation
+        /// raises an exception if an error is found.
+        /// </summary>
+        public static void CheckData(FormattedCode data)
+        {
+            List<int> lines;
+            int line;
+            int bound;
+            int i;
+
+            UiExceptionHelper.CheckNotNull(data, "data");
+
+            UiExceptionHelper.CheckTrue(
+                data._codeInfo.IndexArray.Count == data._codeInfo.TagArray.Count,
+                "IndexArray.Count and TagArray.Count must match.",
+                "data");
+
+            bound = data._codeInfo.IndexArray.Count;
+            lines = data._codeInfo.LineArray;
+            for (i = 0; i < lines.Count; ++i)
+            {
+                line = lines[i];
+
+                UiExceptionHelper.CheckTrue(
+                    line >= 0 && line < bound,
+                    "Bad LineArray value at index " + i + ", value was: " + line + ", expected to be in: [0-" + bound + "[.",
+                    "data");
+
+                if (i == 0)
+                    continue;
+
+                UiExceptionHelper.CheckTrue(
+                    lines[i] > lines[i - 1],
+                    "Bad LineArray[" + i + "], value was: " + line + ", expected to be > than LineArray[" + (i - 1) + "]=" + lines[i - 1] + ".",
+                    "data");
+            }
+
+            return;
+        }
+
+        public override bool Equals(object obj)
+        {
+            FormattedCode arg;
+            int i;
+
+            if (obj == null ||
+                !(obj is FormattedCode))
+                return (false);
+
+            arg = obj as FormattedCode;
+
+            if (arg._codeInfo.Text != _codeInfo.Text ||
+                arg._codeInfo.IndexArray.Count != _codeInfo.IndexArray.Count ||
+                arg._codeInfo.TagArray.Count != _codeInfo.TagArray.Count ||
+                arg._codeInfo.LineArray.Count != _codeInfo.LineArray.Count)
+                return (false);
+
+            for (i = 0; i < arg._codeInfo.IndexArray.Count; ++i)
+                if (arg._codeInfo.IndexArray[i] != _codeInfo.IndexArray[i])
+                    return (false);
+
+            for (i = 0; i < arg._codeInfo.TagArray.Count; ++i)
+                if (arg._codeInfo.TagArray[i] != _codeInfo.TagArray[i])
+                    return (false);
+
+            for (i = 0; i < arg._codeInfo.LineArray.Count; ++i)
+                if (arg._codeInfo.LineArray[i] != _codeInfo.LineArray[i])
+                    return (false);
+
+            return (true);
+        }
+
+        public override int GetHashCode()
+        {
+            return base.GetHashCode();
+        }
+
+        public override string ToString()
+        {
+            string res;
+            string index_array;
+            string tag_array;
+            string line_array;
+            int i;
+
+            index_array = "";
+            for (i = 0; i < _codeInfo.IndexArray.Count; ++i)
+            {
+                if (i > 0)
+                    index_array += ", ";
+                index_array += "" + _codeInfo.IndexArray[i];
+            }
+
+            tag_array = "";
+            for (i = 0; i < _codeInfo.TagArray.Count; ++i)
+            {
+                if (i > 0)
+                    tag_array += ", ";
+                tag_array += "" + _codeInfo.TagArray[i];
+            }
+
+            line_array = "";
+            for (i = 0; i < _codeInfo.LineArray.Count; ++i)
+            {
+                if (i > 0)
+                    line_array += ", ";
+                line_array += "" + _codeInfo.LineArray[i];
+            }
+
+            res = String.Format(
+                "FormattedCode: [(text=[{0}], len={1}), (startingPosition=[{2}]), (tag=[{3}]), (line=[{4}])]",
+                _codeInfo.Text, _codeInfo.Text.Length,
+                index_array, tag_array, line_array);
+
+            return (res);
+        }
+
+        /// <summary>
+        /// A naive attempt to modelize a structure of data that manages the text to be
+        /// displayed and extra data to make basic syntax coloring at rendering time,
+        /// while keeping a low memory footprint.
+        /// 
+        /// At rendering time, CodeInfo is used to make a link between the text to be drawn
+        /// and the brush color to be used during the process. So it is possible to distinguishes
+        /// code, comments, keywords and strings.
+        ///   Currently, CodeInfo is used to split the text into a collection of couple of data,
+        /// where each couple is composed of:
+        ///     - a string of characters
+        ///     - a value (called tag) that classifies this string from 0 to 3.
+        ///       Where 0 corresponds to 'Code', 1 to 'Keyword' and so on.
+        ///  These couples are named 'ClassifiedToken'. At rendering time, the process can link each
+        ///  of these values to a particular System.Drawing.Brush instance and display text
+        ///  differently.
+        ///  
+        ///  However, keeping track of all these couples at any time could have a significative
+        ///  impact on memory especially for big files. Therefore, instead of storing all theses couples,
+        ///  CodeInfo stores just primitive information that allow to build ClassifiedToken instances on the fly.        
+        /// </summary>
+        public class CodeInfo
+        {
+            /// <summary>
+            /// Holds the entire text as a simple string.
+            /// </summary>
+            public string Text;
+
+            /// <summary>
+            /// Array of character indexes that refers to
+            /// the field "Text". Each value in this array
+            /// must be interpreted as the starting index position
+            /// in the string into Text.
+            /// </summary>
+            public List<int> IndexArray;
+
+            /// <summary>
+            /// Array of ClassificationTag values held as a
+            /// byte array. There is a one-to-one correspondance
+            /// with 'IndexArray'. i.e.: TagArray[0] refers to the
+            /// ClassificationTag value for string sequence at
+            /// IndexArray[0]. TagArray[1] refers value to IndexArray[1] and
+            /// so on... Hence, the following condition:
+            ///   - IndexArray.Count == TagArray.Count must be verified.
+            /// </summary>
+            public List<byte> TagArray;
+
+            /// <summary>
+            /// This index_array is used to easily locate the start of each
+            /// line of text, for instance: startingPosition[0] refers to line startingPosition 0,
+            /// startingPosition[1] refers to line startingPosition 1 and so on...
+            ///    However, there is a small indirection in that this index_array
+            /// doesn't directly hold string indexes but refers to the startingPosition
+            /// of the item to be used in 'IndexArray'.
+            ///    Therefore, LineArray[0] gives access to the startingPosition of the
+            /// IndexArray's item to be used to get the corresponding character
+            /// position. Hence, line 0 starts at: IndexArray[LineArray[0]]
+            /// line 1: IndexArray[LineArray[1]] and so on...
+            /// </summary>
+            public List<int> LineArray;
+        }
+
+        #region InternalCSTokenCollection
+
+        class InternalCSTokenCollection :
+            ClassifiedTokenCollection
+        {
+            public InternalCSTokenCollection(CodeInfo info, int lineIndex)
+            {
+                _info = info;
+                _lineIndex = lineIndex;
+
+                return;
+            }
+        }
+
+        #endregion       
+    }
+}
diff --git a/src/GuiException/UiException/CSharpParser/CSParser.cs b/src/GuiException/UiException/CSharpParser/CSParser.cs
new file mode 100644
index 0000000..e75f58a
--- /dev/null
+++ b/src/GuiException/UiException/CSharpParser/CSParser.cs
@@ -0,0 +1,240 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.UiException.CodeFormatters;
+
+namespace NUnit.UiException.CodeFormatters
+{
+    /// <summary>
+    /// (formerly named CSParser)
+    /// 
+    /// Helper class to build and setup FormattedCode instances from formatted C# texts.
+    /// </summary>
+    public class CSharpCodeFormatter :
+        ICodeFormatter
+    {
+        /// <summary>
+        /// The underlying data object of a FormattedCode instance.
+        /// </summary>
+        private FormattedCode.CodeInfo _info;
+
+        /// <summary>
+        /// Builds a new instance of CSharpCodeFormatter.
+        /// </summary>
+        public CSharpCodeFormatter()
+        {
+            _info = FormattedCode.NewCodeInfo();
+
+            return;
+        }
+
+        /// <summary>
+        /// Gets a new instance of FormattedCode.
+        /// To get useful FormattedCode instances, caller should ensure
+        /// that TryParse() was invoked first.
+        /// </summary>
+        public FormattedCode CSCode
+        {
+            get { return (new InternalFormattedCode(_info)); }
+        }
+
+        #region ICodeFormatter Membres
+
+        /// <summary>
+        /// Returns "C#"
+        /// </summary>
+        public string Language
+        {
+            get { return ("C#"); }
+        }
+
+        /// <summary>
+        /// Interprets and highlight the given string as C# code
+        /// and return the resulting FormattedCode instance.
+        /// </summary>
+        /// <param name="csharpCode">A string read as C# code.
+        /// This parameter must not be null.</param>
+        /// <returns>A FormattedCode instance containing data
+        /// to highlight the text with basic syntax coloring.</returns>
+        public FormattedCode Format(string csharpCode)
+        {
+            UiExceptionHelper.CheckNotNull(csharpCode, "csharpCode");
+
+            _info = FormattedCode.NewCodeInfo();
+            csharpCode = PreProcess(csharpCode);
+            Parse(csharpCode);
+
+            return (CSCode);
+        }
+
+        #endregion
+
+        /// <summary>
+        /// Prepare input text for the parsing stage.
+        /// </summary>
+        /// <param name="text">The text to be pre-processed.</param>
+        /// <returns>A string ready to be parsed.</returns>
+        protected string PreProcess(string text)
+        {
+            if (text == null)
+                return (null);
+
+            // this replace tabulation by space sequences. The reason is
+            // that the technique used to measure strings at rendering time
+            // fail to measure '\t' correctly and lines of text containing those
+            // characters are badly aligned.
+            //  The simplest thing to fix that is to remove tabs altogether.
+
+            return (text.Replace("\t", "    "));
+        }
+
+        /// <summary>
+        /// Analyzes the input text as C# code. This method doesn't return anything.
+        /// Callers may retrieve the result of this process by querying the FormattedCode property.
+        ///   Passing null results in raising an exception.
+        /// </summary>
+        /// <param name="csharp">The text to be analyzed.</param>
+        protected void Parse(string csharp)
+        {
+            TokenClassifier classifier;
+            ConcreteToken csToken;
+            ClassificationTag tag;
+            Lexer lexer;
+            StringBuilder text;
+            int tokenIndex;
+
+            UiExceptionHelper.CheckNotNull(csharp, "csharp");
+
+            csharp = PreProcess(csharp);
+
+            lexer = new Lexer();
+            lexer.Parse(csharp);
+
+            classifier = new TokenClassifier();
+            text = new StringBuilder();
+            csToken = null;
+            tokenIndex = 0;
+
+            // loop through each token in the text
+            while (lexer.Next())
+            {
+                // classify the current token 
+                tag = classifier.Classify(lexer.CurrentToken);
+
+                // if the tag cannot be merged with current csToken
+                // we flush csToken into _info and build a new instance
+                // from the current tag.
+                if (csToken == null ||
+                    !csToken.CanMerge(_info.LineArray.Count, tag))
+                {
+                    _flushToken(csToken, _info);
+                    csToken = new ConcreteToken(
+                        lexer.CurrentToken.Text, tag,
+                        lexer.CurrentToken.IndexStart,
+                        _info.LineArray.Count);
+                }
+
+                // append token's text into text
+                text.Append(lexer.CurrentToken.Text);
+
+                // handle newline character. Appends tokenIndex to LineArray
+                // and set tokenIndex to the start of the newline.
+                if (lexer.CurrentToken.Text == "\n")
+                {
+                    _info.LineArray.Add(tokenIndex);
+                    tokenIndex = _info.IndexArray.Count + 1;
+                }
+            }
+
+            // flush terminal token
+            _flushToken(csToken, _info);
+
+            if (csToken != null &&
+                _info.LineArray.Count == 0)
+                _info.LineArray.Add(tokenIndex);
+
+            _info.Text = csharp;
+
+            return;
+        }
+
+        /// <summary>
+        /// Appends data in token at the end of output.
+        /// </summary>
+        /// <param name="token">Token to be merged with output.</param>
+        /// <param name="output">Target location.</param>
+        private void _flushToken(ClassifiedToken token, FormattedCode.CodeInfo output)
+        {
+            if (token == null)
+                return;
+
+            output.IndexArray.Add(token.IndexStart);
+            output.TagArray.Add((byte)token.Tag);
+
+            return;
+        }
+
+        #region InternalFormattedCode
+
+        /// <summary>
+        /// Implements FormattedCode.
+        /// </summary>
+        class InternalFormattedCode :
+            FormattedCode
+        {
+            public InternalFormattedCode(FormattedCode.CodeInfo info)
+            {
+                _codeInfo = info;
+            }
+        }
+
+        #endregion
+
+        #region ConcreteToken
+
+        /// <summary>
+        /// Implements ClassifiedToken.
+        /// </summary>
+        class ConcreteToken :
+            ClassifiedToken
+        {
+            private int _lineIndex;
+
+            /// <summary>
+            /// Builds and setup a new instance of ClassifiedToken.
+            /// </summary>
+            /// <param name="text">The text in this token.</param>
+            /// <param name="tag">The smState tag.</param>
+            /// <param name="indexStart">Starting startingPosition of the string from the beginning of the text.</param>
+            /// <param name="lineIndex">The line startingPosition.</param>
+            public ConcreteToken(string text, ClassificationTag tag, int indexStart, int lineIndex)
+            {
+                _text = text;
+                _tag = tag;
+                _indexStart = indexStart;
+                _lineIndex = lineIndex;
+
+                return;
+            }
+
+            /// <summary>
+            /// Tests whether or not the given lineIndex and tag are compatible with
+            /// the ones in the current Token.
+            /// </summary>
+            /// <param name="lineIndex">A line startingPosition.</param>
+            /// <param name="tag">A smState tag.</param>
+            /// <returns>A boolean that says whether these data are compatible.</returns>
+            public bool CanMerge(int lineIndex, ClassificationTag tag)
+            {
+                return (_tag == tag && _lineIndex == lineIndex);
+            }
+        }
+
+        #endregion
+    }
+}
diff --git a/src/GuiException/UiException/CSharpParser/CSToken.cs b/src/GuiException/UiException/CSharpParser/CSToken.cs
new file mode 100644
index 0000000..b85dfc1
--- /dev/null
+++ b/src/GuiException/UiException/CSharpParser/CSToken.cs
@@ -0,0 +1,130 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace NUnit.UiException.CodeFormatters
+{
+    /// <summary>
+    /// This enum indicate the kind of a string sequence.
+    /// </summary>
+    public enum ClassificationTag : byte
+    {
+        /// <summary>
+        /// The string refer to C# source code.
+        /// </summary>
+        Code = 0,           // 0
+
+        /// <summary>
+        /// The string refers to C# keywords.
+        /// </summary>
+        Keyword = 1,        // 1
+
+        /// <summary>
+        /// The string refers to C# comments.
+        /// </summary>
+        Comment = 2,        // 2
+
+        /// <summary>
+        /// The string refers to a string/char value.
+        /// </summary>
+        String = 3          // 3
+    }
+
+    /// <summary>
+    /// (formerly named CSToken)
+    /// 
+    /// Classifies a string and make it falls into one of the categories below:
+    ///   - Code (the value should be interpreted as regular code)
+    ///   - Keyword (the value should be interpreted as a language keyword)
+    ///   - Comment (the value should be interpreted as comments)
+    ///   - String (the value should be interpreted as a string)
+    /// </summary>
+    public class ClassifiedToken
+    {
+        /// <summary>
+        /// The string held by this token.
+        /// </summary>
+        protected string _text; 
+
+        /// <summary>
+        /// The matching tag.
+        /// </summary>
+        protected ClassificationTag _tag;
+
+        /// <summary>
+        /// Starting startingPosition of the string.
+        /// </summary>
+        protected int _indexStart;
+
+        /// <summary>
+        /// This class cannot be build directly.
+        /// </summary>
+        protected ClassifiedToken()
+        {
+            // this class requires subclassing
+        }
+
+        /// <summary>
+        /// Gets the string value.
+        /// </summary>
+        public string Text
+        {
+            get { return (_text); }
+        }
+
+        /// <summary>
+        /// Gets the classification value for the string in Text.
+        ///   - Code:  Text should be interpreted as regular code,
+        ///   - Keyword: Text should be interpreted as a language keyword,
+        ///   - Comments: Text should be interpreted as comments,
+        ///   - String: Text should be interpreted as a string.
+        /// </summary>
+        public ClassificationTag Tag
+        {
+            get { return (_tag); }
+        }
+
+        /// <summary>
+        /// Gets the string's starting startingPosition.
+        /// </summary>
+        public int IndexStart
+        {
+            get { return (_indexStart); }
+        }
+
+        /// <summary>
+        /// Returns true if 'obj' is an instance of ClassifiedToken 
+        /// that contains same data that the current instance.
+        /// </summary>
+        public override bool Equals(object obj)
+        {
+            ClassifiedToken token;
+
+            if (obj == null || !(obj is ClassifiedToken))
+                return (false);
+
+            token = obj as ClassifiedToken;
+
+            return (Text == token.Text &&
+                    Tag == token.Tag);
+        }
+
+        public override int GetHashCode()
+        {
+            return base.GetHashCode();
+        }
+
+        public override string ToString()
+        {
+            return (String.Format(
+                "ClassifiedToken {Text='{0}', Tag={1}}",
+                Text,
+                Tag));
+        }
+    }
+}
diff --git a/src/GuiException/UiException/CSharpParser/CSTokenCollection.cs b/src/GuiException/UiException/CSharpParser/CSTokenCollection.cs
new file mode 100644
index 0000000..9a6c8c0
--- /dev/null
+++ b/src/GuiException/UiException/CSharpParser/CSTokenCollection.cs
@@ -0,0 +1,219 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Collections;
+
+namespace NUnit.UiException.CodeFormatters
+{
+    /// <summary>
+    /// (formerly named CSTokenCollection)
+    /// 
+    /// Manages an ordered collection of ClassifiedToken present in one line of text.
+    /// </summary>
+    public class ClassifiedTokenCollection
+    {
+        /// <summary>
+        /// Target location when building a ClassifiedToken instance on the fly.
+        /// </summary>
+        protected ClassifiedToken _token;
+
+        /// <summary>
+        /// Keeps tracks of the data source.
+        /// </summary>
+        protected FormattedCode.CodeInfo _info;
+
+        /// <summary>
+        /// Store the current line startingPosition.
+        /// </summary>
+        protected int _lineIndex;
+
+        /// <summary>
+        /// This class requires subclassing.
+        /// </summary>
+        protected ClassifiedTokenCollection()
+        {
+            _token = new InternalToken();
+        }
+
+        /// <summary>
+        /// Gets the number of ClassifiedToken present in this line of text.
+        /// </summary>
+        public int Count
+        {
+            get
+            {
+                int count;
+
+                if (_lineIndex + 1 < _info.LineArray.Count)
+                {
+                    count = _info.LineArray[_lineIndex + 1] -
+                            _info.LineArray[_lineIndex];
+                }
+                else
+                {
+                    count = _info.IndexArray.Count -
+                            _info.LineArray[_lineIndex];
+                }
+
+                return (count);
+            }
+        }
+
+        /// <summary>
+        /// Gets the ClassifiedToken instance at the specified startingPosition.
+        /// Warning: this indexer always return the same instance.
+        /// To keep data safe, it is strongly recommanded to make
+        /// a deep copy of the returned ClassifiedToken.
+        /// </summary>
+        /// <param name="startingPosition">A zero based value in the range: [0 - Count[</param>
+        /// <returns>The ClassifiedToken at this startingPosition.</returns>
+        public ClassifiedToken this[int index]
+        {
+            get
+            {
+                InternalToken result;
+
+                result = (InternalToken)_token;
+                _populateToken(_lineIndex, index, result);
+
+                return (result); 
+            }
+        }
+
+        /// <summary>
+        /// Gets the part of the text at the given position.
+        /// The returned string can be composed of one or severals words 
+        /// all with the same style.
+        /// </summary>
+        private void _populateToken(int lineIndex, int tokenIndex, InternalToken output)
+        {
+            int tagZero;
+            int tagStart;
+            int tagEnd;
+            int strIndex_start;
+            int strIndex_end;
+            string res;
+            ClassificationTag tag;
+
+            //
+            // Gets value of tagStart and tagEnd
+            // from which string indexes can be extracted 
+            //
+
+            tagZero = _info.LineArray[lineIndex];
+            tagStart = tagZero + tokenIndex;
+            tagEnd = tagStart + 1;
+
+            strIndex_start = _info.IndexArray[tagStart];
+
+            if (tagEnd < _info.IndexArray.Count)
+            {
+                strIndex_end = _info.IndexArray[tagEnd];
+                res = _info.Text.Substring(strIndex_start, strIndex_end - strIndex_start);
+            }
+            else
+                res = _info.Text.Substring(strIndex_start);
+
+            //
+            // Check the need to trimEnd() the resulting string.
+            // We only want to trimEnd when current string is the
+            // last part of the current line. Intermediary strings
+            // must not be trimed end. At display time this would
+            // lead to introduce bad shifting of text sequences.
+            //
+
+            if (res.EndsWith("\n"))
+                res = res.TrimEnd();
+
+            //
+            // Convert the byte code into a ClassificationTag
+            // for this string sequence
+            //
+
+            tag = _getTagFromByteValue(_info.TagArray[tagStart]);
+
+            // and populate result
+
+            output.Setup(res, tag);
+
+            return;
+        }
+
+        /// <summary>
+        /// Converts the given value into the matching ClassificationTag.
+        /// </summary>
+        private ClassificationTag _getTagFromByteValue(byte value)
+        {
+            switch (value)
+            {
+                case 0: return (ClassificationTag.Code);
+                case 1: return (ClassificationTag.Keyword);
+                case 2: return (ClassificationTag.Comment);
+                case 3: return (ClassificationTag.String);
+                default:
+                    UiExceptionHelper.CheckTrue(false, "should not reach this code", "value");
+                    break;
+            }
+
+            return (ClassificationTag.Code);
+        }
+
+        /// <summary>
+        /// Return a string filled with the text present at the current line startingPosition.
+        /// </summary>
+        public string Text
+        {
+            get
+            {
+                int index_start;
+                int index_start_ptr; 
+                int index_end;
+                int index_end_ptr;
+                string text;
+                
+                index_start_ptr = _info.LineArray[_lineIndex];
+                index_start = _info.IndexArray[index_start_ptr];
+
+                if (_lineIndex + 1 >= _info.LineArray.Count)
+                    index_end = _info.Text.Length;
+                else
+                {
+                    index_end_ptr = _info.LineArray[_lineIndex + 1];
+                    index_end = _info.IndexArray[index_end_ptr];
+                }
+
+                if (index_end - index_start < 0)
+                    throw new Exception(
+                        "ClassifiedTokenCollection: Text: error: calling substring with negative length");
+
+                text = _info.Text.Substring(index_start, index_end - index_start);
+                text = text.TrimEnd();
+
+                return (text);
+            }
+        }
+
+        #region InternalToken
+
+        class InternalToken : 
+            ClassifiedToken
+        {
+            public InternalToken()
+            {
+            }
+
+            public void Setup(string text, ClassificationTag tag)
+            {
+                _text = text;
+                _tag = tag;
+            }
+        }
+
+        #endregion                   
+    }
+}
diff --git a/src/GuiException/UiException/CSharpParser/LexToken.cs b/src/GuiException/UiException/CSharpParser/LexToken.cs
new file mode 100644
index 0000000..f3a510d
--- /dev/null
+++ b/src/GuiException/UiException/CSharpParser/LexToken.cs
@@ -0,0 +1,148 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace NUnit.UiException.CodeFormatters
+{
+    /// <summary>
+    /// This enum defines the list of all tags
+    /// that can be assigned to a particular string.
+    /// </summary>
+    public enum LexerTag
+    {
+        /// <summary>
+        /// All sequences but the ones below
+        /// </summary>
+        Text,
+
+        /// <summary>
+        /// White characters: ' ' \t \n
+        /// and other separators like:
+        ///     - '[' ']' '(' ')' ';'
+        /// </summary>
+        Separator,
+
+        /// <summary>
+        /// Char: \n
+        /// </summary>
+        EndOfLine,
+
+        /// <summary>
+        /// string: /*
+        /// </summary>
+        CommentC_Open,
+
+        /// <summary>
+        /// string: */
+        /// </summary>
+        CommentC_Close,
+
+        /// <summary>
+        /// string: //
+        /// </summary>
+        CommentCpp,
+
+        /// <summary>
+        /// Char: '
+        /// </summary>
+        SingleQuote,
+
+        /// <summary>
+        /// Char: "
+        /// </summary>
+        DoubleQuote
+    }
+
+    /// <summary>
+    /// This class is used to make the link between a string and a LexerTag value.
+    /// </summary>
+    public class LexToken
+    {
+        /// <summary>
+        /// The string in this token.
+        /// </summary>
+        protected string _text;
+
+        /// <summary>
+        /// The current tag.
+        /// </summary>
+        protected LexerTag _tag;
+
+        /// <summary>
+        /// The starting startingPosition.
+        /// </summary>
+        protected int _start;
+
+        public LexToken()
+        {
+            _text = null;
+            _tag = LexerTag.Text;
+            _start = -1;
+
+            return;
+        }
+
+        public LexToken(string text, LexerTag tag, int start)
+        {
+            _text = text;
+            _tag = tag;
+            _start = start;
+
+            return;
+        }
+
+        /// <summary>
+        /// Gets the string value.
+        /// </summary>
+        public string Text
+        {
+            get { return (_text); }
+        }
+
+        /// <summary>
+        /// Gets the tag value
+        /// </summary>
+        public LexerTag Tag
+        {
+            get { return (_tag); }
+        }
+
+        /// <summary>
+        /// Gets the starting startingPosition of the string.
+        /// </summary>
+        public int IndexStart
+        {
+            get { return (_start); }
+        }
+
+        public override bool Equals(object obj)
+        {
+            LexToken token;
+
+            if (obj == null || !(obj is LexToken))
+                return (false);
+
+            token = (LexToken)obj;
+
+            return (token.Text == Text &&
+                    token.IndexStart == IndexStart &&
+                    token.Tag == Tag);
+        }
+
+        public override int GetHashCode()
+        {
+            return base.GetHashCode();
+        }
+
+        public override string ToString()
+        {
+            return (String.Format("Token=([{0}], Index={1}, Tag={2})",
+                Text, IndexStart, Tag));
+        }
+    }
+}
diff --git a/src/GuiException/UiException/CSharpParser/Lexer.cs b/src/GuiException/UiException/CSharpParser/Lexer.cs
new file mode 100644
index 0000000..f831dc8
--- /dev/null
+++ b/src/GuiException/UiException/CSharpParser/Lexer.cs
@@ -0,0 +1,233 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace NUnit.UiException.CodeFormatters
+{
+    /// <summary>
+    /// Splits a text formatted as C# code into a list of identified tokens.
+    /// </summary>
+    public class Lexer
+    {
+        /// <summary>
+        /// Reading position in the current text.
+        /// </summary>
+        private int _position;
+
+        /// <summary>
+        /// Text where to fetch tokens.
+        /// </summary>
+        private string _text;
+
+        /// <summary>
+        /// Last identified token.
+        /// </summary>
+        private InternalToken _token;
+
+        /// <summary>
+        /// Holds pre-defined sequences.
+        /// </summary>
+        private TokenDictionary _dictionary;
+
+        /// <summary>
+        /// Builds a new instance of Lexer.
+        /// </summary>
+        public Lexer()
+        {
+            _position = 0;
+            _text = "";
+
+            _dictionary = new TokenDictionary();
+            _dictionary.Add("/*", LexerTag.CommentC_Open);
+            _dictionary.Add("*/", LexerTag.CommentC_Close);
+            _dictionary.Add("//", LexerTag.CommentCpp);
+
+            // Here: definition of one lengthed sequences
+            _dictionary.Add("\\", LexerTag.Text);
+            _dictionary.Add(" ", LexerTag.Separator);
+            _dictionary.Add("\t", LexerTag.Separator);
+            _dictionary.Add("\r", LexerTag.Separator);
+            _dictionary.Add(".", LexerTag.Separator);
+            _dictionary.Add(";", LexerTag.Separator);
+            _dictionary.Add("[", LexerTag.Separator);
+            _dictionary.Add("]", LexerTag.Separator);
+            _dictionary.Add("(", LexerTag.Separator);
+            _dictionary.Add(")", LexerTag.Separator);
+            _dictionary.Add("#", LexerTag.Separator);
+            _dictionary.Add(":", LexerTag.Separator);
+            _dictionary.Add("<", LexerTag.Separator);
+            _dictionary.Add(">", LexerTag.Separator);
+            _dictionary.Add("=", LexerTag.Separator);
+            _dictionary.Add(",", LexerTag.Separator);
+            _dictionary.Add("\n", LexerTag.EndOfLine);
+            _dictionary.Add("'", LexerTag.SingleQuote);
+            _dictionary.Add("\"", LexerTag.DoubleQuote);
+
+            return;
+        }
+
+        public TokenDictionary Dictionary
+        {
+            get { return (_dictionary); }
+        }
+
+        /// <summary>
+        /// Clear all previously defined sequences.
+        /// </summary>
+        protected void Clear()
+        {
+            _dictionary = new TokenDictionary();
+
+            return;
+        }
+
+        /// <summary>
+        /// Setup the text to be splitted in tokens. 
+        /// 
+        /// Client code must call Next() first before getting
+        /// the first available token (if any).
+        /// </summary>
+        public void Parse(string codeCSharp)
+        {
+            UiExceptionHelper.CheckNotNull(codeCSharp, "text");
+
+            _text = codeCSharp;
+            _position = 0;
+
+            return;
+        }
+
+        /// <summary>
+        /// Gets the token identifed after a call to Next().
+        /// The value may be null if the end of the text has been reached.
+        /// </summary>
+        public LexToken CurrentToken
+        {
+            get { return (_token); }
+        }
+
+        /// <summary>
+        /// Checks whether there are none visited tokens.
+        /// </summary>
+        public bool HasNext()
+        {
+            return (_position < _text.Length);
+        }
+
+        /// <summary>
+        /// Call this method to visit iteratively all tokens in the source text.
+        /// Each time a token has been identifier, the method returns true and the
+        /// identified Token is place under the CurrentToken property.
+        ///   When there is not more token to visit, the method returns false
+        /// and null is set in CurrentToken property.
+        /// </summary>
+        public bool Next()
+        {
+            char c;
+            LexToken token;
+            string prediction;
+            int pos;
+            int count;
+            int prediction_length;
+
+            _token = null;
+
+            if (!HasNext())
+                return (false);
+
+            pos = _position;
+            _token = new InternalToken(pos);
+            prediction_length = _dictionary[0].Text.Length;
+
+            while (pos < _text.Length)
+            {
+                c = _text[pos];
+                _token.AppendsChar(c);
+
+                prediction = "";
+                if (pos + 1 < _text.Length)
+                {
+                    count = Math.Min(prediction_length, _text.Length - pos - 1);
+                    prediction = _text.Substring(pos + 1, count);
+                }
+
+                token = _dictionary.TryMatch(_token.Text, prediction);
+
+                if (token != null)
+                {
+                    _token.SetText(token.Text);
+                    _token.SetIndex(_position);
+                    _token.SetLexerTag(token.Tag);
+                    _position += _token.Text.Length;
+
+                    break;
+                }
+
+                pos++;
+            }
+
+            return (true);
+        }
+
+        #region InternalToken
+
+        class InternalToken :
+            LexToken
+        {
+            /// <summary>
+            /// Builds a concrete instance of LexToken. By default, created instance
+            /// are setup with LexerTag.Text value.
+            /// </summary>
+            /// <param name="startingPosition">The starting startingPosition of this token in the text.</param>
+            public InternalToken(int index)
+            {
+                _tag = LexerTag.Text;
+                _text = "";
+                _start = index;
+
+                return;
+            }
+
+            /// <summary>
+            /// Appends this character to this token.
+            /// </summary>
+            public void AppendsChar(char c)
+            {
+                _text += c;
+            }
+
+            /// <summary>
+            /// Removes the "count" ending character of this token.
+            /// </summary>
+            public void PopChars(int count)
+            {
+                _text = _text.Remove(_text.Length - count);
+            }
+
+            /// <summary>
+            /// Set a new value to the Tag property.
+            /// </summary>
+            public void SetLexerTag(LexerTag tag)
+            {
+                _tag = tag;
+            }
+
+            public void SetText(string text)
+            {
+                _text = text;
+            }
+
+            public void SetIndex(int index)
+            {
+                _start = index;
+            }
+        }
+
+        #endregion
+    }
+}
diff --git a/src/GuiException/UiException/CSharpParser/TokenClassifier.cs b/src/GuiException/UiException/CSharpParser/TokenClassifier.cs
new file mode 100644
index 0000000..fa8cee9
--- /dev/null
+++ b/src/GuiException/UiException/CSharpParser/TokenClassifier.cs
@@ -0,0 +1,433 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace NUnit.UiException.CodeFormatters
+{
+    /// <summary>
+    /// Used at an internal stage to convert LexToken into ClassifiedToken. This class provides
+    /// a very basic semantic analysis to make text following in one the categories below:
+    ///     - regular code,
+    ///     - developper comments,
+    ///     - strings / character.
+    /// The output of this class is used by CSharpCodeFormatter to achieve the basic syntax coloring.
+    /// </summary>
+    public class TokenClassifier
+    {
+        #region SMSTATE code
+
+        // the list below contains constant values defining states for the finite
+        // smState machine that makes all the work of converting LexToken into ClassifiedToken.
+        // for instance, Lexer can send inputs like:
+        //
+        //   [Text][Separator][CommentC_Open][Text][CommentC_Close]
+        //
+        // This LexToken sequence can for instance be converted that way by TokenClassifier.
+        //
+        //   - [Text][Separator]                     => [Code]
+        //   - [CommentC_Open][Text][CommentC_Close] => [Comment]
+        // 
+
+        /// <summary>
+        /// State code for the smState machine.
+        /// State when reaching a code block.
+        /// </summary>
+        public const int SMSTATE_CODE = 0;
+
+        /// <summary>
+        /// State code for the smState machine.
+        /// State when reaching a C comment block.
+        /// </summary>
+        public const int SMSTATE_CCOMMENT = 1;
+
+        /// <summary>
+        /// State code for the smState machine.
+        /// State when reaching a C++ comment block.
+        /// </summary>
+        public const int SMSTATE_CPPCOMMENT = 2;
+
+        /// <summary>
+        /// State code for the smState machine.
+        /// State when reaching a char surrounded by single quotes.
+        /// </summary>
+        public const int SMSTATE_CHAR = 3;
+
+        /// <summary>
+        /// State code for the smState machine.
+        /// State when reaching a string surrounded by double quotes.
+        /// </summary>
+        public const int SMSTATE_STRING = 4;
+
+        #endregion
+
+        /// <summary>
+        /// A finite smState machine where states are: SMSTATE values and
+        /// transitions are LexToken.
+        /// </summary>
+        private StateMachine _sm;
+
+        /// <summary>
+        /// The current StateMachine's SMTATE code.
+        /// </summary>
+        private int _sm_output;
+
+        /// <summary>
+        /// Makes a link between SMSTATE code and ClassificationTag.
+        /// </summary>
+        private Dictionary<int, ClassificationTag> _tags;
+
+        /// <summary>
+        /// Contains the list of C# keywords.
+        /// </summary>
+        private Dictionary<string, bool> _keywords;
+
+        /// <summary>
+        /// Indicate whether Lexer is in escaping mode.
+        /// This flag is set to true when parsing "\\" and
+        /// can influate on the following LexerTag value.
+        /// </summary>
+        private bool _escaping;
+
+        /// <summary>
+        /// Build a new instance of TokenClassifier.
+        /// </summary>
+        public TokenClassifier()
+        {
+            string[] words;
+
+            _sm = new StateMachine();
+
+            _tags = new Dictionary<int, ClassificationTag>();
+            _tags.Add(SMSTATE_CODE, ClassificationTag.Code);
+            _tags.Add(SMSTATE_CCOMMENT, ClassificationTag.Comment);
+            _tags.Add(SMSTATE_CPPCOMMENT, ClassificationTag.Comment);
+            _tags.Add(SMSTATE_CHAR, ClassificationTag.String);
+            _tags.Add(SMSTATE_STRING, ClassificationTag.String);
+
+            // build the list of predefined keywords.
+            // this is from the official msdn site. Curiously, some keywords
+            // were ommited from the official documentation.
+            //   For instance "get", "set", "region" and "endregion" were
+            // not part of the official list. Maybe it's a mistake or a misunderstanding
+            // whatever... I want them paint in blue as well!
+
+            words = new string[] {
+                "abstract", "event", "new", "struct", "as", "explicit", "null", "switch",
+                "base", "extern", "object", "this", "bool", "false", "operator", "throw",
+                "break", "finally", "out", "true", "byte", "fixed", "override", "try", "case",
+                "float", "params", "typeof", "catch", "for", "private", "uint", "char",
+                "foreach", "protected", "ulong", "checked", "goto", "public", "unchecked",
+                "class", "if", "readonly", "unsafe", "const", "implicit", "ref", "ushort",
+                "continue", "in", "return", "using", "decimal", "int", "sbyte", "virtual",
+                "default", "interface", "sealed", "volatile", "delegate", "internal",
+                "short", "void", "do", "is", "sizeof", "while", "double", "lock", "stackalloc",
+                "else", "long", "static", "enum", "namespace", "string", "partial", "get", "set",
+                "region", "endregion",
+            };
+
+            _keywords = new Dictionary<string, bool>();
+            foreach (string key in words)
+                _keywords.Add(key, true);
+
+            Reset();
+
+            return;
+        }
+
+        /// <summary>
+        /// Tells whether TokenClassifier is currently in escaping mode. When true,
+        /// this flag causes TokenClassifier to override the final classification
+        /// of a basic entity (such as: ") to be treated as normal text instead of
+        /// being interpreted as a string delimiter.
+        /// </summary>
+        public bool Escaping
+        {
+            get { return (_escaping); }
+        }
+
+        /// <summary>
+        /// Reset the StateMachine to default value. (code block).
+        /// </summary>
+        public void Reset()
+        {
+            _sm_output = SMSTATE_CODE;
+            _escaping = false;
+
+            return;
+        }
+
+        /// <summary>
+        /// Classify the given LexToken into a ClassificationTag.
+        /// </summary>
+        /// <param name="token">The token to be classified.</param>
+        /// <returns>The smState value.</returns>
+        public ClassificationTag Classify(LexToken token)
+        {
+            int classTag;
+
+            UiExceptionHelper.CheckNotNull(token, "token");
+
+            classTag = AcceptLexToken(token);
+
+            if (classTag == SMSTATE_CODE &&
+                _keywords.ContainsKey(token.Text))
+                return (ClassificationTag.Keyword);
+
+            // Parsing a token whoose Text value is set to '\'
+            // causes the classifier to set/reset is escaping mode.
+
+            if (token.Text == "\\" &&
+                _sm_output == SMSTATE_STRING &&
+                !_escaping)
+                _escaping = true;
+            else
+                _escaping = false;
+
+            return (_tags[classTag]);
+        }
+
+        /// <summary>
+        /// Classify the given token and get its corresponding SMSTATE value.
+        /// </summary>
+        /// <param name="token">The LexToken to be classified.</param>
+        /// <returns>An SMSTATE value.</returns>
+        protected int AcceptLexToken(LexToken token)
+        {
+            int smState;
+
+            if (_escaping)
+                return (SMSTATE_STRING);
+
+            smState = GetTokenSMSTATE(_sm_output, token.Tag);
+            _sm_output = GetSMSTATE(_sm_output, token.Tag);
+
+            return (smState);
+        }
+
+        /// <summary>
+        /// Gets the SMSTATE under the "transition" going from "smState".
+        /// </summary>
+        /// <param name="smState">The current smState.</param>
+        /// <param name="transition">The current LexerTag.</param>
+        /// <returns>The new smState.</returns>
+        protected int GetSMSTATE(int smState, LexerTag transition)
+        {
+            return (_sm.GetSMSTATE(smState, transition));
+        }
+
+        /// <summary>
+        /// Gets a token SMSTATE under the "transition" going from "smState".
+        /// </summary>
+        /// <param name="smState">The current smState machine.</param>
+        /// <param name="transition">The LexerTag to be classified.</param>
+        /// <returns>The LexerTag's classification.</returns>
+        protected int GetTokenSMSTATE(int smState, LexerTag transition)
+        {
+            return (_sm.GetTokenSMSTATE(smState, transition));
+        }
+
+        #region StateMachine
+
+        /// <summary>
+        /// Defines a transition (of a state machine).
+        /// </summary>
+        class TransitionData
+        {
+            /// <summary>
+            /// The current transition.
+            /// </summary>
+            public LexerTag Transition;
+
+            /// <summary>
+            /// The SMSTATE code reached when following that transition.
+            /// </summary>
+            public int SMSTATE;
+
+            /// <summary>
+            /// The TokenSMSTATE reached when following that transition.
+            /// </summary>
+            public int TokenSMSTATE;
+
+            public TransitionData(LexerTag transition, int smState)
+            {
+                Transition = transition;
+
+                SMSTATE = smState;
+                TokenSMSTATE = smState;
+
+                return;
+            }
+
+            public TransitionData(LexerTag transition, int smState, int tokenSmState) :
+                this(transition, smState)
+            {
+                TokenSMSTATE = tokenSmState;
+            }
+        }
+
+        /// <summary>
+        /// Defines a state (of a state machine) and its associated transitions.
+        /// </summary>
+        class State
+        {
+            public int InitialState;
+            public TransitionData[] Transitions;
+
+            public State(int initialState, TransitionData[] transitions)
+            {
+                int i;
+                int j;
+
+                UiExceptionHelper.CheckNotNull(transitions, "transitions");
+                UiExceptionHelper.CheckTrue(
+                    transitions.Length == 8,
+                    "expecting transitions.Length to be 8",
+                    "transitions");
+
+                for (i = 0; i < transitions.Length; ++i)
+                    for (j = 0; j < transitions.Length; ++j)
+                    {
+                        if (j == i)
+                            continue;
+
+                        if (transitions[j].Transition == transitions[i].Transition)
+                            UiExceptionHelper.CheckTrue(false,
+                                String.Format("transition '{0}' already present", transitions[j].Transition),
+                                "transitions");
+                    }
+
+
+                InitialState = initialState;
+                Transitions = transitions;
+
+                return;
+            }
+
+            public TransitionData this[LexerTag transition]
+            {
+                get
+                {
+                    foreach (TransitionData couple in Transitions)
+                        if (couple.Transition == transition)
+                            return (couple);
+                    return (null);
+                }
+            }
+        }
+
+        /// <summary>
+        /// A finite state machine. Where states are SMSTATE codes and
+        /// transitions are LexTokens.
+        /// </summary>
+        class StateMachine
+        {
+            private State[] _states;
+
+            public StateMachine()
+            {
+                _states = new State[5];
+
+                // defines transitions from SMSTATE_CODE
+                _states[0] = new State(
+                    SMSTATE_CODE,
+                    new TransitionData[] {
+                        new TransitionData(LexerTag.EndOfLine, SMSTATE_CODE),
+                        new TransitionData(LexerTag.Separator, SMSTATE_CODE),
+                        new TransitionData(LexerTag.Text, SMSTATE_CODE),
+                        new TransitionData(LexerTag.CommentC_Open, SMSTATE_CCOMMENT),
+                        new TransitionData(LexerTag.CommentC_Close, SMSTATE_CODE, SMSTATE_CCOMMENT),
+                        new TransitionData(LexerTag.CommentCpp, SMSTATE_CPPCOMMENT),
+                        new TransitionData(LexerTag.SingleQuote, SMSTATE_CHAR),
+                        new TransitionData(LexerTag.DoubleQuote, SMSTATE_STRING),
+                    });
+
+                // defines transitions from SMSTATE_CCOMMENT
+                _states[1] = new State(
+                    SMSTATE_CCOMMENT,
+                    new TransitionData[] {
+                        new TransitionData(LexerTag.EndOfLine, SMSTATE_CCOMMENT),
+                        new TransitionData(LexerTag.Separator, SMSTATE_CCOMMENT),
+                        new TransitionData(LexerTag.Text, SMSTATE_CCOMMENT),
+                        new TransitionData(LexerTag.CommentC_Open, SMSTATE_CCOMMENT),
+                        new TransitionData(LexerTag.CommentC_Close, SMSTATE_CODE, SMSTATE_CCOMMENT),
+                        new TransitionData(LexerTag.CommentCpp, SMSTATE_CCOMMENT),
+                        new TransitionData(LexerTag.SingleQuote, SMSTATE_CCOMMENT),
+                        new TransitionData(LexerTag.DoubleQuote, SMSTATE_CCOMMENT),
+                    });
+
+                // defines transitions from SMSTATE_CPPCOMMENT
+                _states[2] = new State(
+                    SMSTATE_CPPCOMMENT,
+                    new TransitionData[] {
+                        new TransitionData(LexerTag.EndOfLine, SMSTATE_CODE),
+                        new TransitionData(LexerTag.Separator, SMSTATE_CPPCOMMENT),
+                        new TransitionData(LexerTag.Text, SMSTATE_CPPCOMMENT),
+                        new TransitionData(LexerTag.CommentC_Open, SMSTATE_CPPCOMMENT),
+                        new TransitionData(LexerTag.CommentC_Close, SMSTATE_CPPCOMMENT),
+                        new TransitionData(LexerTag.CommentCpp, SMSTATE_CPPCOMMENT),
+                        new TransitionData(LexerTag.SingleQuote, SMSTATE_CPPCOMMENT),
+                        new TransitionData(LexerTag.DoubleQuote, SMSTATE_CPPCOMMENT),
+                    });
+
+                // defines transition from SMSTATE_CHAR
+                _states[3] = new State(
+                    SMSTATE_CHAR,
+                    new TransitionData[] {
+                        new TransitionData(LexerTag.EndOfLine, SMSTATE_CHAR),
+                        new TransitionData(LexerTag.Separator, SMSTATE_CHAR),
+                        new TransitionData(LexerTag.Text, SMSTATE_CHAR),
+                        new TransitionData(LexerTag.CommentC_Open, SMSTATE_CHAR),
+                        new TransitionData(LexerTag.CommentC_Close, SMSTATE_CHAR),
+                        new TransitionData(LexerTag.CommentCpp, SMSTATE_CHAR),
+                        new TransitionData(LexerTag.SingleQuote, SMSTATE_CODE, SMSTATE_CHAR),
+                        new TransitionData(LexerTag.DoubleQuote, SMSTATE_CHAR),
+                    });
+
+                // defines transition from SMSTATE_STRING
+                _states[4] = new State(
+                    SMSTATE_STRING,
+                    new TransitionData[] {
+                        new TransitionData(LexerTag.EndOfLine, SMSTATE_STRING),
+                        new TransitionData(LexerTag.Separator, SMSTATE_STRING),
+                        new TransitionData(LexerTag.Text, SMSTATE_STRING),
+                        new TransitionData(LexerTag.CommentC_Open, SMSTATE_STRING),
+                        new TransitionData(LexerTag.CommentC_Close, SMSTATE_STRING),
+                        new TransitionData(LexerTag.CommentCpp, SMSTATE_STRING),
+                        new TransitionData(LexerTag.SingleQuote, SMSTATE_STRING),
+                        new TransitionData(LexerTag.DoubleQuote, SMSTATE_CODE, SMSTATE_STRING),
+                    });
+
+                return;
+            }
+
+            /// <summary>
+            /// Follow "transition" going from "smState" and returns reached SMSTATE.
+            /// </summary>
+            public int GetSMSTATE(int smState, LexerTag transition)
+            {
+                foreach (State st in _states)
+                    if (st.InitialState == smState)
+                        return (st[transition].SMSTATE);
+                return (SMSTATE_CODE);
+            }
+
+            /// <summary>
+            /// Follow "transition" going from "smState" and returns reached TokenSMSTATE.
+            /// </summary>
+            public int GetTokenSMSTATE(int smState, LexerTag transition)
+            {
+                foreach (State st in _states)
+                    if (st.InitialState == smState)
+                        return (st[transition].TokenSMSTATE);
+                return (SMSTATE_CODE);
+            }
+        }
+
+        #endregion
+    }
+}
diff --git a/src/GuiException/UiException/CSharpParser/TokenDictionary.cs b/src/GuiException/UiException/CSharpParser/TokenDictionary.cs
new file mode 100644
index 0000000..e76a4ee
--- /dev/null
+++ b/src/GuiException/UiException/CSharpParser/TokenDictionary.cs
@@ -0,0 +1,286 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Collections;
+
+namespace NUnit.UiException.CodeFormatters
+{
+    /// <summary>
+    /// TokenDictionary is responsible for defining and identifying a set of basic
+    /// strings in a given text that have a particular meaning. For instance:
+    ///  - Separator, (ex: "{" ";" "]" ...)
+    ///  - comment markers, (ex: "//" "/*" "*/")
+    ///  - string markers, (ex: '"' '\'')
+    ///  - Other -> "Text" (all other strings but the ones aboves).
+    /// To achieve this, TokenDictionary firstly defines methods to register and query which
+    /// strings have been registered. Secondly it defines a convenient method: TryMatch()
+    /// responsible for splitting a given string in one or two parts where the first one will
+    /// fall in one of the above categories. When calling TryMatch() iteratively --see Lexer--,
+    /// one can tag a text into a list of tokens that might server for a semantic analysis.
+    ///
+    /// TokenDictionary and Lexer are both responsible for dealing with the lexical analysis
+    /// job that is the first step to make basic syntax coloring. 
+    /// </summary>
+    /// <see cref="Lexer">Front class for the lexical analysis.</see>
+    public class TokenDictionary :
+        IEnumerable
+    {
+        private List<InternalLexToken> _list;
+        private List<LexToken> _working;
+
+        /// <summary>
+        /// Build an empty instance of TokenDictionary.
+        /// </summary>
+        public TokenDictionary()
+        {
+            _list = new List<InternalLexToken>();
+            _working = new List<LexToken>();
+
+            return;
+        }
+
+        /// <summary>
+        /// Gets the token count defined in this instance.
+        /// </summary>
+        public int Count
+        {
+            get { return (_list.Count); }
+        }
+
+        /// <summary>
+        /// Gets the token at the given index.
+        /// </summary>
+        /// <param name="index">Index of the token to be returned.</param>
+        /// <returns>The token at the specified index.</returns>
+        public LexToken this[int index]
+        {
+            get { return (_list[index]); }
+        }
+
+        /// <summary>
+        /// Build a new token and add it to the list of tokens known by TokenDictionary.
+        /// Tokens must be added from the longest text value to the shortest otherwise
+        /// an exception will be raised.
+        /// </summary>
+        /// <param name="value">
+        /// The token's text value. It must not be null nor empty. It must not be already
+        /// defined neither. If there are tokens already defined, value's length must not
+        /// be longer than the previous added token.
+        /// </param>
+        /// <param name="tag">The token's tag value.</param>
+        public void Add(string value, LexerTag tag)
+        {
+            InternalLexToken newToken;
+
+            UiExceptionHelper.CheckNotNull(value, "value");
+            UiExceptionHelper.CheckFalse(value == "",
+                "Token value must not be empty.", "value");
+            UiExceptionHelper.CheckFalse(
+                Contains(value),
+                String.Format("Token '{0}' is already defined.", value),
+                "value");
+            if (Count > 0)
+                UiExceptionHelper.CheckTrue(
+                    _list[Count - 1].Text.Length >= value.Length,
+                    "Tokens must be inserted from the longest to the shortest value.",
+                    "value");
+
+            newToken = new InternalLexToken(value, tag);
+
+            // loop through each item to populate
+            // newToken.StartingWith list.
+
+            foreach (InternalLexToken item in _list)
+                if (item.Text.StartsWith(value))
+                    newToken.StartingWith.Add(item);
+
+            _list.Add(newToken);
+
+            return;
+        }
+
+        /// <summary>
+        /// Tests whether the given string matches a token known by this instance.
+        /// </summary>
+        /// <param name="value">
+        ///     A string to be identify with a token in this instance.
+        /// </param>
+        /// <returns>
+        ///     True if the string matches a token's text
+        ///     value in this instance, false otherwise.
+        /// </returns>
+        public bool Contains(string value)
+        {
+            foreach (LexToken item in _list)
+                if (item.Text == value)
+                    return (true);
+            return (false);
+        }
+
+        /// <summary>
+        /// Try to match in "text" + "prediction" a token previously defined with the Add() method.
+        /// Since TryMatch() may return null, it should be called from a loop that scans iteratively
+        /// all characters of an input text.
+        ///
+        /// TryMatch() can put the caller in the two following situations: 
+        /// 1) if parameters "text"+"prediction" don't hold any token, null will be returned. In this
+        ///    case caller is expected to append to "text" one character more and to shift "prediction"
+        ///    by one character ahead before calling TryMatch() again.
+        /// 2) if parameters "text"+"prediction" look like [data]TOKEN --where [data] is any other string
+        ///    but the ones in tokens-- TryMatch() will return an instance of LexToken which LexToken.Text
+        ///    and LexToken.Tag properties will be setup with identified data. In this case caller is
+        ///    expected to shift its reading position by the lenght of text put in LexToken.Text. Besides
+        ///    "text" parameter should reset its length to 1 again.
+        /// </summary>
+        /// <param name="text">
+        /// At the very beginning, text should be of size 1 and set up with the first character from the
+        /// input text. Each time TryMatch() return null, the following character from the input text
+        /// should be appended to "text". Once a token is returned, this parameter should reset its size
+        /// to 1 and be filled with the character coming just after the identified string.
+        /// This parameter cannot be null.
+        /// </param>
+        /// <param name="prediction">
+        /// This parameter represents a constant sized string that goes just before the data in "text".
+        /// If the caller reach the end of the text and there are not enough character to fill "prediction"
+        /// completely this parameter can be filled with remaining character and eventually becoming empty.
+        /// The size of this string should be equal to the lenght of the longest token defined in
+        /// this instance of TokenDictionary.
+        /// This parameter cannot be null.
+        /// </param>
+        /// <returns>
+        /// The first identifiable LexToken in "text"+"prediction". Returns may be null.
+        /// </returns>
+        /// <see cref="Lexer.Next()">
+        /// To have a look on the loop implementation..
+        /// </see>
+        public LexToken TryMatch(string text, string prediction)
+        {
+            UiExceptionHelper.CheckNotNull(text, "text");
+            UiExceptionHelper.CheckNotNull(prediction, "prediction");
+
+            foreach (InternalLexToken token in _list)
+            {
+                if (text.EndsWith(token.Text))
+                {
+                    // text may look like [data]TOKEN
+                    // where [data] is normal text possibly empty.
+
+                    if (text.Length > token.Text.Length)
+                    {
+                        // get only [data] part
+                        return (new LexToken(
+                            text.Substring(0, text.Length - token.Text.Length),
+                            LexerTag.Text, -1));
+                    }
+
+                    // text looks like TOKEN, however we can't return text at
+                    // this stage before testing content of prediction. Since
+                    // there is a possibility that a longer TOKEN be in the concatenated
+                    // string: text + prediction. (note: longer TOKENs have higher
+                    // priority over shorter ones)
+
+                    if (prediction != "")
+                    {
+                        string pattern;
+                        int i;
+
+                        _working.Clear();
+                        PopulateTokenStartingWith(token, _working);
+
+                        for (i = 1; i < _working.Count; ++i)
+                        {
+                            if (_working[i].Text.Length <= text.Length ||
+                                _working[i].Text.Length > text.Length + prediction.Length)
+                                continue;
+                            pattern = text + prediction.Substring(0,
+                                _working[i].Text.Length - text.Length);
+                            if (_working[i].Text == pattern)
+                                return (_working[i]);
+                        }
+                    }
+
+                    return (token);
+                }
+            }
+
+            // no match found, if prediction is empty
+            // this means we reach end of text and return
+            // text as a LexerToken.Text
+
+            if (prediction == "")
+                return (new LexToken(text, LexerTag.Text, -1));
+
+            return (null);
+        }
+
+        /// <summary>
+        /// Builds the list of all LexToken which text value starts with the one in starter.
+        /// </summary>
+        /// <param name="starter">The token that the reference text.</param>
+        /// <param name="output">The list of tokens which text starts with the one in starter.</param>
+        protected void PopulateTokenStartingWith(LexToken starter, List<LexToken> output)
+        {
+            InternalLexToken token;
+
+            UiExceptionHelper.CheckNotNull(starter, "starter");
+            UiExceptionHelper.CheckNotNull(output, "output");
+
+            output.Add(starter);
+
+            token = (InternalLexToken)starter;
+            foreach (LexToken item in token.StartingWith)
+                output.Add(item);
+
+            return;
+        }
+
+        #region InternalLexToken
+
+        /// <summary>
+        /// Inherits of LexToken and add a public array that holds the list of all other tokens
+        /// which text values start with the one in the current instance.
+        /// </summary>
+        class InternalLexToken :
+            LexToken
+        {
+            /// <summary>
+            /// Holds the list of all other tokens which text values start like the one
+            /// in this instance. This array is used to solve ambiguity when finding a
+            /// string that could possibly represents more than one token.
+            /// </summary>
+            public List<LexToken> StartingWith;
+
+            /// <summary>
+            /// Build a new instance of InternalLexToken with the given data.
+            /// </summary>
+            /// <param name="value">The token's text value.</param>
+            /// <param name="tag">The token's tag value.</param>
+            public InternalLexToken(string value, LexerTag tag)
+            {
+                _start = -1;
+                _text = value;
+                _tag = tag;
+
+                StartingWith = new List<LexToken>();
+
+                return;
+            }
+        }
+
+        #endregion
+
+        #region IEnumerable Membres
+
+        public IEnumerator GetEnumerator()
+        {
+            return (_list.GetEnumerator());
+        }
+
+        #endregion
+    }
+}
diff --git a/src/GuiException/UiException/CodeFormatters/CodeFormatterCollection.cs b/src/GuiException/UiException/CodeFormatters/CodeFormatterCollection.cs
new file mode 100644
index 0000000..c5ca018
--- /dev/null
+++ b/src/GuiException/UiException/CodeFormatters/CodeFormatterCollection.cs
@@ -0,0 +1,203 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Collections;
+using System.Collections.Specialized;
+
+namespace NUnit.UiException.CodeFormatters
+{
+    /// <summary>
+    /// Makes the link between a file language and an ICodeFormatter.
+    /// This class is used to know which formatter need to be call
+    /// when displaying an ErrorItem.
+    /// </summary>
+    public class CodeFormatterCollection :
+        IEnumerable
+    {
+        /// <summary>
+        /// Maps language files to ICodeFormatters.
+        /// </summary>
+        private Dictionary<string, ICodeFormatter> _toFormatter;
+
+        /// <summary>
+        /// Builds an empty CodeFormatterCollection.
+        /// </summary>
+        public CodeFormatterCollection()
+        {
+            _toFormatter = new Dictionary<string, ICodeFormatter>();
+
+            return;
+        }
+
+        /// <summary>
+        /// Gets the size of the collection.
+        /// </summary>
+        public int Count
+        {
+            get { return (_toFormatter.Count); }
+        }
+
+        /// <summary>
+        /// Returns the ICodeFormatter that fit the given language.
+        /// </summary>
+        /// <param name="language">
+        /// A language name, such as: "C#" or "Java".
+        /// This parameter cannot be null.
+        /// </param>
+        /// <returns>
+        /// The ICodeFormatter that fit this language.
+        /// </returns>
+        /// <see cref="HasExtension"/>
+        public ICodeFormatter this[string language]
+        {
+            get
+            {
+                UiExceptionHelper.CheckNotNull(language, "language");
+
+                foreach (ICodeFormatter item in _toFormatter.Values)
+                    if (item.Language == language)
+                        return (item);
+
+                throw new ArgumentException("unknown language: '" + language + "'");
+            }
+        }
+        
+        /// <summary>
+        /// Checks whether there is a formatter that has been
+        /// assigned to the given file extension.
+        /// </summary>
+        /// <param name="language">A file extension such as: "cs".</param>
+        /// <returns>True if there is such formatter, false otherwise.</returns>
+        public bool HasExtension(string extension)
+        {
+            if (extension == null)
+                return (false);
+
+            extension = extension.ToLower();
+
+            return (_toFormatter.ContainsKey(extension));
+        }
+
+        /// <summary>
+        /// Tests whether the collection contains a formatter for the given language.
+        /// </summary>
+        /// <param name="language">
+        /// A language name. Ex: "C#", "Java"</param>
+        /// <returns>True if such formatter exists.</returns>
+        public bool HasLanguage(string languageName)
+        {
+            if (languageName == null)
+                return (false);
+
+            foreach (ICodeFormatter item in _toFormatter.Values)
+                if (item.Language == languageName)
+                    return (true);
+
+            return (false);
+        }
+
+        /// <summary>
+        /// Gets the ICodeFormatter that has been assigned to this extension.
+        /// </summary>
+        /// <param name="extension">The file extension. This parameter
+        /// cannot be null.</param>
+        /// <returns>The ICodeFormatter assigned to.</returns>
+        public ICodeFormatter GetFromExtension(string extension)
+        {
+            UiExceptionHelper.CheckNotNull(extension, "extension");
+            extension = extension.ToLower();
+            return (_toFormatter[extension]);
+        }
+       
+        /// <summary>
+        /// Registers an ICodeFormatter for the given language. The system
+        /// is not case sensitive.
+        /// </summary>
+        /// <param name="formatter">
+        /// A non null formatter.
+        /// </param>
+        /// <param name="language">
+        /// A non null file language.
+        /// The value must not be empty nor contain '.' and
+        /// must not have been already registered.
+        /// </param>
+        public void Register(ICodeFormatter formatter, string extension)
+        {
+            UiExceptionHelper.CheckNotNull(formatter, "formatter");
+            UiExceptionHelper.CheckNotNull(extension, "language");
+
+            extension = extension.ToLower();
+
+            UiExceptionHelper.CheckTrue(extension.Length > 0,
+                "language cannot be empty", "language");
+            UiExceptionHelper.CheckTrue(extension.LastIndexOf('.') == -1,
+                "language cannot contain '.'", "language");
+            UiExceptionHelper.CheckFalse(_toFormatter.ContainsKey(extension),
+                "language '" + extension + "' has already an handler. Remove handler first.",
+                "language");
+
+            _toFormatter.Add(extension, formatter);
+
+            return;
+        }
+
+        /// <summary>
+        /// Removes the formatter for the given file language.
+        /// The language is not case sensitive.
+        /// </summary>
+        /// <param name="language">A file language.</param>
+        public void Remove(string extension)
+        {
+            if (extension == null)
+                return;
+
+            extension = extension.ToLower();
+
+            _toFormatter.Remove(extension);
+
+            return;
+        }
+
+        /// <summary>
+        /// Removes all formatters.
+        /// </summary>
+        public void Clear()
+        {
+            _toFormatter.Clear();
+        }
+
+        /// <summary>
+        /// Returns a string collection with all registered extensions.
+        /// </summary>
+        public StringCollection Extensions
+        {
+            get
+            {
+                StringCollection res;
+
+                res = new StringCollection();
+                foreach (string extension in _toFormatter.Keys)
+                    res.Add(extension);
+
+                return (res);
+            }
+        }
+
+        #region IEnumerable Membres
+
+        /// <summary>
+        /// Returns an IEnumerator on all registered ICodeFormatter.
+        /// </summary>
+        public IEnumerator GetEnumerator()
+        {
+            return (_toFormatter.Values.GetEnumerator());
+        }
+
+        #endregion
+    }
+}
diff --git a/src/GuiException/UiException/CodeFormatters/GeneralCodeFormatter.cs b/src/GuiException/UiException/CodeFormatters/GeneralCodeFormatter.cs
new file mode 100644
index 0000000..4fa3db2
--- /dev/null
+++ b/src/GuiException/UiException/CodeFormatters/GeneralCodeFormatter.cs
@@ -0,0 +1,168 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.UiException.CodeFormatters;
+
+namespace NUnit.UiException.CodeFormatters
+{
+    /// <summary>
+    ///   GeneralCodeFormatter is the front class responsible for making a basic
+    /// syntax coloring of a string of text for a set of specific languages.
+    ///  The class encapsulates a set of algorithms where each of them addresses
+    /// a specific language formatting. The use of one or another algorithm at
+    /// analysing time is made through an language registering mechanism.
+    /// For instance C# files are covered by CSharpCodeFormatter which has
+    /// been assigned to "cs" language.
+    ///  If a query is made to GeneralCodeFormatter while there is no formatter
+    /// that fit the given file language a default formatting is applyied
+    /// through the use of the formatter registered into the property
+    /// DefaultFormatter.
+    /// </summary>
+    public class GeneralCodeFormatter :
+        IFormatterCatalog
+    {
+        /// <summary>
+        /// The set of formatting algorithms.
+        /// </summary>
+        private CodeFormatterCollection _formatters;
+
+        /// <summary>
+        /// The default formatter to be used as last resort.
+        /// </summary>
+        private ICodeFormatter _default;
+
+        /// <summary>
+        /// Build and initialises GeneralCodeFormatter.
+        /// </summary>
+        public GeneralCodeFormatter()
+        {
+            _formatters = new CodeFormatterCollection();
+            _formatters.Register(new CSharpCodeFormatter(), "cs");
+
+            _default = new PlainTextCodeFormatter();
+
+            return;
+        }
+
+        /// <summary>
+        /// Gets or sets the formatter to be used as last resort when
+        /// no formatter fit the given source language.
+        ///   The value cannot be null.
+        /// </summary>
+        public ICodeFormatter DefaultFormatter
+        {
+            get { return (_default); }
+            set 
+            {
+                UiExceptionHelper.CheckNotNull(value, "value");
+                _default = value;
+            }
+        }
+
+        /// <summary>
+        /// Gives access to the underlying formatter collection.
+        /// </summary>
+        public CodeFormatterCollection Formatters
+        {
+            get { return (_formatters); }
+        }
+        
+        /// <summary>
+        /// Gets the best formatter that fits the given language. If there
+        /// is no such formatter, a default one is returned.
+        /// </summary>
+        /// <param name="language">
+        /// The language name. Ex: "C#", "Java. This parameter cannot be null.
+        /// </param>
+        /// <returns>
+        /// A non-null ICodeFormatter that best fits the request.
+        /// </returns>
+        public ICodeFormatter GetFormatterFromLanguage(string languageName)
+        {
+            UiExceptionHelper.CheckNotNull(languageName, "language");
+
+            if (_formatters.HasLanguage(languageName))
+                return (_formatters[languageName]);
+
+            return (DefaultFormatter);
+        }
+
+        /// <summary>
+        /// Gets the formatter assigned to the given extension. If there
+        /// is no such assignment, the default formatter is returned.
+        /// </summary>
+        /// <param name="extension">
+        /// A file extension. Ex: "cs", "txt". This parameter cannot be null.
+        /// </param>
+        /// <returns>A non-null ICodeFormatter.</returns>
+        public ICodeFormatter GetFormatterFromExtension(string extension)
+        {
+            UiExceptionHelper.CheckNotNull(extension, "extension");
+
+            if (_formatters.HasExtension(extension))
+                return (_formatters.GetFromExtension(extension));
+
+            return (DefaultFormatter);
+        }
+
+        /// <summary>
+        /// A convenient method to make the formatting of a piece of code when
+        /// only the file extension is known. 
+        /// </summary>
+        /// <param name="code">The piece of code to be formatted. This parameter
+        /// cannot be null.</param>
+        /// <param name="extension">The file extension associated to this piece of code.
+        /// Ex: "cs", "cpp". This is used to pick the formatter assigned to. If no such
+        /// formatter exists, the default one is picked up.</param>
+        /// <returns>The FormattedCode for this piece of code.</returns>
+        public FormattedCode FormatFromExtension(string code, string extension)
+        {
+            UiExceptionHelper.CheckNotNull(code, "code");
+            UiExceptionHelper.CheckNotNull(extension, "extension");
+
+            if (_formatters.HasExtension(extension))
+                return (_formatters.GetFromExtension(extension).Format(code));
+
+            return (DefaultFormatter.Format(code));
+        }
+
+        #region IFormatterCatalog Membres
+
+        /// <summary>
+        /// Pick the best available formatter to format the given piece of code.
+        /// </summary>
+        /// <param name="code">The code to be formatted. This parameter cannot be null.</param>
+        /// <param name="language">
+        /// The language into which code has been written. Ex: "C#", "Java".
+        /// If no such formatter is available, a default formatting is applied.
+        /// This parameter cannot be null.
+        /// </param>
+        /// <returns>
+        /// The formatting for this piece of code.
+        /// </returns>
+        public FormattedCode Format(string code, string language)
+        {
+            UiExceptionHelper.CheckNotNull(code, "code");
+            UiExceptionHelper.CheckNotNull(language, "language");
+
+            if (_formatters.HasLanguage(language))
+                return (_formatters[language].Format(code));
+
+            return (DefaultFormatter.Format(code));
+        }
+
+        public string LanguageFromExtension(string extension)
+        {
+            if (_formatters.HasExtension(extension))
+                return (_formatters.GetFromExtension(extension).Language);
+            return (_default.Language);
+        }
+
+        #endregion
+    }
+}
diff --git a/src/GuiException/UiException/CodeFormatters/ICodeFormatter.cs b/src/GuiException/UiException/CodeFormatters/ICodeFormatter.cs
new file mode 100644
index 0000000..adc096a
--- /dev/null
+++ b/src/GuiException/UiException/CodeFormatters/ICodeFormatter.cs
@@ -0,0 +1,33 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.UiException.CodeFormatters;
+
+namespace NUnit.UiException.CodeFormatters
+{
+    /// <summary>
+    /// ICodeFormatter is the interface to make the syntax
+    /// coloring of a string for a specific developpment language.
+    /// </summary>
+    public interface ICodeFormatter
+    {
+        /// <summary>
+        /// The language name handled by this formatter.
+        /// Ex: "C#", "Java", "C++" and so on...
+        /// </summary>
+        string Language { get; }
+
+        /// <summary>
+        /// Makes the coloring syntax of the given text.
+        /// </summary>
+        /// <param name="code">The text to be formatted. This
+        /// parameter cannot be null.</param>
+        /// <returns>A FormattedCode instance.</returns>
+        FormattedCode Format(string code);
+    }
+}
diff --git a/src/GuiException/UiException/CodeFormatters/IFormatterCatalog.cs b/src/GuiException/UiException/CodeFormatters/IFormatterCatalog.cs
new file mode 100644
index 0000000..a254205
--- /dev/null
+++ b/src/GuiException/UiException/CodeFormatters/IFormatterCatalog.cs
@@ -0,0 +1,36 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace NUnit.UiException.CodeFormatters
+{
+    /// <summary>
+    /// The interface through which SourceCodeDisplay interacts to guess
+    /// the language from a file extension.
+    /// 
+    /// Direct implementation is:
+    ///     - GeneralCodeFormatter
+    /// </summary>
+    public interface IFormatterCatalog
+    {
+        /// <summary>
+        /// Format the text using the given language formatting.
+        /// </summary>
+        /// <param name="text">A text to be formatted</param>
+        /// <param name="language">The language with which formatting the text</param>
+        /// <returns>A FormatterCode object</returns>
+        FormattedCode Format(string text, string language);
+
+        /// <summary>
+        /// Gets the language from the given extension.
+        /// </summary>
+        /// <param name="extension">An extension without the dot, like 'cs'</param>
+        /// <returns>A language name, like 'C#'</returns>
+        string LanguageFromExtension(string extension);
+    }
+}
diff --git a/src/GuiException/UiException/CodeFormatters/PlainTextCodeFormatter.cs b/src/GuiException/UiException/CodeFormatters/PlainTextCodeFormatter.cs
new file mode 100644
index 0000000..ab0cc50
--- /dev/null
+++ b/src/GuiException/UiException/CodeFormatters/PlainTextCodeFormatter.cs
@@ -0,0 +1,100 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.UiException.CodeFormatters;
+
+namespace NUnit.UiException.CodeFormatters
+{
+    /// <summary>
+    /// Create a default FormattedCode for any string value.
+    /// This should be used as a last resort when there is not ICodeFormatter
+    /// that fit source code for an ErrorItem.
+    /// </summary>
+    public class PlainTextCodeFormatter :
+        ICodeFormatter
+    {
+        #region ICodeFormatter Membres
+
+        /// <summary>
+        /// Returns "Plain text"
+        /// </summary>
+        public string Language
+        {
+            get { return ("Plain text"); }
+        }
+
+        public FormattedCode Format(string sourceCode)
+        {
+            DefaultTextManager text;
+            byte[] byteArray;
+            int[] strArray;
+            int[] lineArray;
+            int index;
+            int posLineStart;
+            int posChar;
+
+            UiExceptionHelper.CheckNotNull(sourceCode, "sourceCode");
+
+            sourceCode = PreProcess(sourceCode);
+
+            text = new DefaultTextManager();
+            text.Text = sourceCode;
+
+            strArray = new int[text.LineCount];
+            lineArray = new int[text.LineCount];
+
+            index = 0;
+            posLineStart = 0;
+            posChar = 0;
+
+            foreach (char c in sourceCode)
+            {
+                if (c == '\n')
+                {
+                    strArray[index] = posLineStart;
+                    lineArray[index] = index;
+                    posLineStart = posChar + 1;
+                    index++;
+                }
+
+                posChar++;
+            }
+
+            if (index <= text.LineCount - 1)
+            {
+                strArray[index] = posLineStart;
+                lineArray[index] = index;
+            }
+
+            byteArray = new byte[text.LineCount];
+
+            return (new FormattedCode(sourceCode, strArray, byteArray, lineArray));
+        }
+
+        #endregion
+
+        /// <summary>
+        /// Prepare input text for the parsing stage.
+        /// </summary>
+        /// <param name="text">The text to be pre-processed.</param>
+        /// <returns>A string ready to be parsed.</returns>
+        public string PreProcess(string text)
+        {
+            if (text == null)
+                return (null);
+
+            // this replace tabulation by space sequences. The reason is
+            // that the technique used to measure strings at rendering time
+            // fail to measure '\t' correctly and lines of text containing those
+            // characters are badly aligned.
+            //  The simplest thing to fix that is to remove tabs altogether.
+
+            return (text.Replace("\t", "    "));
+        }
+    }
+}
diff --git a/src/GuiException/UiException/Controls/CodeBox.cs b/src/GuiException/UiException/Controls/CodeBox.cs
new file mode 100644
index 0000000..9a7de82
--- /dev/null
+++ b/src/GuiException/UiException/Controls/CodeBox.cs
@@ -0,0 +1,227 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using NUnit.UiException.CodeFormatters;
+using System.Diagnostics;
+
+/// This control could have been replaced by a standard RichTextBox control, but
+/// it turned out that RichTextBox:
+///     - was hard to configure
+///     - was hard to set the viewport
+///     - doesn't use double buffer optimization
+///     - scrolls text one line at a time without be configurable.
+/// 
+/// CodeBox has been written to address these specific issues in order to display
+/// C# source code where exceptions occured.
+
+namespace NUnit.UiException.Controls
+{
+    /// <summary>
+    /// A control that implements ICodeView.
+    /// </summary>
+    public class CodeBox : UserControl, ICodeView
+    {
+        protected CodeRenderingContext _workingContext;
+        protected FormattedCode _formattedCode;
+
+        private IFormatterCatalog _formatter;
+        private ICodeRenderer _renderer;
+        private string _language;
+
+        private bool _showCurrentLine;
+        private int _currentLine;
+        
+        public CodeBox() :
+            this(new GeneralCodeFormatter(), new DefaultCodeRenderer()) { }
+
+        #region ICodeView Members
+
+        public override string Text
+        {
+            get { return (_formattedCode.Text); }
+            set
+            {
+                if (value == null)
+                    value = "";
+
+                SizeF docSize;
+
+                _formattedCode = _formatter.Format(value, _language);
+                docSize = _renderer.GetDocumentSize(
+                    _formattedCode, _workingContext.Graphics, _workingContext.Font);
+                AutoScrollMinSize = new Size((int)docSize.Width, (int)docSize.Height);
+
+                Invalidate();
+
+                return;
+            }
+        }
+
+        public string Language
+        {
+            get { return (_language); }
+            set
+            {
+                if (value == null)
+                    value = "";
+                if (_language == value)
+                    return;
+
+                _language = value;
+                Text = Text;
+            }
+        }
+
+        public int CurrentLine
+        {
+            get { return (_currentLine); }
+            set
+            {
+                float y = _renderer.LineIndexToYCoordinate(value,
+                    _workingContext.Graphics, _workingContext.Font);
+
+                y -= Height / 2;
+
+                _currentLine = value;
+                AutoScrollPosition = new Point(0, (int)y);
+
+                Invalidate();
+            }
+        }
+
+        public IFormatterCatalog Formatter
+        {
+            get { return (_formatter); }
+        }
+
+        #endregion
+
+        /// <summary>
+        /// Gets or sets a value telling whether or not displaying a special
+        /// feature for the current line at drawing time.
+        /// </summary>        
+        public bool ShowCurrentLine
+        {
+            get { return (_showCurrentLine); }
+            set { _showCurrentLine = value; }
+        }
+
+        /// <summary>
+        /// If ShowCurrentLine is set, this set the current line's background color.
+        /// </summary>
+        public Color CurrentLineBackColor
+        {
+            get { return (_workingContext.CurrentLineBackColor); }
+            set { 
+                _workingContext.CurrentLineBackColor = value;
+                Invalidate();
+            }
+        }
+
+        /// <summary>
+        /// If ShowCurrentLine is set, this set current line's foreground color.
+        /// </summary>
+        public Color CurrentLineForeColor
+        {
+            get { return (_workingContext.CurrentLineForeColor); }
+            set { 
+                _workingContext.CurrentLineForeColor = value;
+                Invalidate();
+            }
+        }
+       
+        protected CodeBox(IFormatterCatalog formatter, ICodeRenderer renderer)
+        {
+            SetStyle(ControlStyles.AllPaintingInWmPaint, true);
+            SetStyle(ControlStyles.UserPaint, true);
+            DoubleBuffered = true;
+
+            _formatter = formatter;
+            _formattedCode = FormattedCode.Empty;
+
+            _renderer = renderer;
+
+            _currentLine = -1;
+            _showCurrentLine = false;
+
+            _language = "";
+
+            this.Font = new Font(FontFamily.GenericMonospace, 8);
+            this.BackColor = Color.White;
+
+            createGraphics();
+            AutoScroll = true;
+
+            return;
+        }
+
+        protected override void OnMouseHover(EventArgs e)
+        {
+            base.OnMouseHover(e);
+            Focus();
+        }
+
+        protected override void OnPaint(PaintEventArgs e)
+        {
+            Graphics backup;
+
+            base.OnPaint(e);
+
+            backup = _workingContext.Graphics;
+            _workingContext.Graphics = e.Graphics;
+            _workingContext.CurrentLine = (_showCurrentLine ? _currentLine : -1);
+
+            _renderer.DrawToGraphics(_formattedCode, _workingContext,
+                new Rectangle(-AutoScrollPosition.X, -AutoScrollPosition.Y, Width, Height));
+
+            _workingContext.Graphics = backup;
+
+            return;
+        }
+
+        protected override void OnFontChanged(EventArgs e)
+        {
+            base.OnFontChanged(e);
+
+            if (_workingContext != null)
+            {
+                _workingContext.Font = Font;
+                Text = Text;
+            }
+
+            return;
+        }
+
+        private void createGraphics()
+        {
+            Graphics gCurrent = CreateGraphics();
+            Image img = new Bitmap(10, 10, gCurrent);
+            Graphics gImg = Graphics.FromImage(img);
+
+            gCurrent.Dispose();
+
+            _workingContext = new CodeRenderingContext();
+            _workingContext.Graphics = gImg;
+            _workingContext.Font = Font;
+
+            _workingContext.CurrentLine = -1;
+            _workingContext.BackgroundColor = Color.White;
+            _workingContext.CurrentLineBackColor = Color.Red;
+            _workingContext.CurrentLineForeColor = Color.White;
+            _workingContext.CodeColor = Color.Black;
+            _workingContext.CommentColor = Color.Green;
+            _workingContext.KeywordColor = Color.Blue;
+            _workingContext.StringColor = Color.Red;
+
+            return;
+        }
+    }    
+}
diff --git a/src/GuiException/UiException/Controls/CodeRenderingContext.cs b/src/GuiException/UiException/Controls/CodeRenderingContext.cs
new file mode 100644
index 0000000..cf6d5d7
--- /dev/null
+++ b/src/GuiException/UiException/Controls/CodeRenderingContext.cs
@@ -0,0 +1,226 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+using NUnit.UiException.CodeFormatters;
+
+namespace NUnit.UiException.Controls
+{
+    /// <summary>
+    /// Encapsulates basic colors settings to format a text according a language.
+    /// </summary>
+    public class CodeRenderingContext
+    {
+        private static readonly int INDEX_CODE = 0;
+        private static readonly int INDEX_KEYWORD = 1;
+        private static readonly int INDEX_COMMENT = 2;
+        private static readonly int INDEX_STRING = 3;
+        private static readonly int INDEX_BACKGROUND = 4;
+        private static readonly int INDEX_CURRBACK = 5;
+        private static readonly int INDEX_CURRFORE = 6;
+
+        private Graphics _graphics;
+        private Font _font;
+
+        private int _currentLine;
+
+        private ColorMaterial[] _colors;
+
+        public CodeRenderingContext()
+        {
+            _colors = new ColorMaterial[] 
+            {
+                new ColorMaterial(Color.Black),        // code color
+                new ColorMaterial(Color.Blue),         // keyword color
+                new ColorMaterial(Color.Green),        // comment color
+                new ColorMaterial(Color.Red),          // string color
+
+                new ColorMaterial(Color.White),        // background
+                new ColorMaterial(Color.Red),          // current line back color
+                new ColorMaterial(Color.White),        // current line fore color                
+            };
+
+            return;
+        }
+
+        public Graphics Graphics {
+            get { return (_graphics); }
+            set { _graphics = value; }
+        }       
+
+        public Font Font {
+            get { return (_font); }
+            set { _font = value; }
+        }
+
+        public int CurrentLine {
+            get { return (_currentLine); }
+            set { _currentLine = value; }
+        }
+
+        public Color BackgroundColor {
+            get { return (_colors[INDEX_BACKGROUND].Color); }
+            set
+            {
+                _colors[INDEX_BACKGROUND].Dispose();
+                _colors[INDEX_BACKGROUND] = new ColorMaterial(value);
+            }
+        }
+
+        public Color CurrentLineBackColor {
+            get { return (_colors[INDEX_CURRBACK].Color); }
+            set {
+                _colors[INDEX_CURRBACK].Dispose();
+                _colors[INDEX_CURRBACK] = new ColorMaterial(value);
+            }
+        }
+
+        public Color CurrentLineForeColor {
+            get { return (_colors[INDEX_CURRFORE].Color); }
+            set {
+                _colors[INDEX_CURRFORE].Dispose();
+                _colors[INDEX_CURRFORE] = new ColorMaterial(value);
+            }
+        }
+
+        public Color KeywordColor {
+            get { return (_colors[INDEX_KEYWORD].Color); }
+            set {
+                _colors[INDEX_KEYWORD].Dispose();
+                _colors[INDEX_KEYWORD] = new ColorMaterial(value);
+            }
+        }
+
+        public Color CommentColor {
+            get { return (_colors[INDEX_COMMENT].Color); }
+            set {
+                _colors[INDEX_COMMENT].Dispose();
+                _colors[INDEX_COMMENT] = new ColorMaterial(value);
+            }
+        }
+
+        public Color CodeColor {
+            get { return (_colors[INDEX_CODE].Color); }
+            set {
+                _colors[INDEX_CODE].Dispose();
+                _colors[INDEX_CODE] = new ColorMaterial(value);
+            }
+        }
+
+        public Color StringColor {
+            get { return (_colors[INDEX_STRING].Color); }
+            set {
+                _colors[INDEX_STRING].Dispose();
+                _colors[INDEX_STRING] = new ColorMaterial(value);
+            }
+        }
+
+        public Color this[ClassificationTag tag]
+        {
+            get
+            {
+                int idx = (int)tag;
+                return (_colors[idx].Color);
+            }
+        }    
+
+        public Brush GetBrush(ClassificationTag tag) {
+            return (_colors[(int)tag].Brush);
+        }
+      
+        public Pen GetPen(ClassificationTag tag) {
+            return (_colors[(int)tag].Pen);
+        }
+
+        #region Brushes
+
+        public Brush BackgroundBrush {
+            get { return (_colors[INDEX_BACKGROUND].Brush); }
+        }
+
+        public Brush CurrentLineBackBrush {
+            get { return (_colors[INDEX_CURRBACK].Brush); }
+        }
+
+        public Brush CurrentLineForeBrush {
+            get { return (_colors[INDEX_CURRFORE].Brush); }
+        }
+
+        public Brush KeywordBrush {
+            get { return (_colors[INDEX_KEYWORD].Brush); }
+        }
+
+        public Brush CommentBrush {
+            get { return (_colors[INDEX_COMMENT].Brush); }
+        }
+
+        public Brush CodeBrush {
+            get { return (_colors[INDEX_CODE].Brush); }
+        }
+
+        public Brush StringBrush {
+            get { return (_colors[INDEX_STRING].Brush); }
+        }
+
+        #endregion
+
+        #region Pens
+
+        public Pen BackgroundPen {
+            get { return (_colors[INDEX_BACKGROUND].Pen); }
+        }
+
+        public Pen CurrentLineBackPen {
+            get { return (_colors[INDEX_CURRBACK].Pen); }
+        }
+
+        public Pen CurrentLineForePen {
+            get { return (_colors[INDEX_CURRFORE].Pen); }
+        }
+
+        public Pen KeywordPen {
+            get { return (_colors[INDEX_KEYWORD].Pen); }
+        }
+
+        public Pen CommentPen {
+            get { return (_colors[INDEX_COMMENT].Pen); }
+        }
+
+        public Pen CodePen {
+            get { return (_colors[INDEX_CODE].Pen); }
+        }
+
+        public Pen StringPen {
+            get { return (_colors[INDEX_STRING].Pen); }
+        }
+
+        #endregion
+
+        class ColorMaterial
+        {
+            public Color Color;
+            public Brush Brush;
+            public Pen Pen;
+
+            public ColorMaterial(Color color)
+            {
+                this.Color = color;
+                this.Brush = new SolidBrush(color);
+                this.Pen = new Pen(color);
+
+                return;
+            }
+
+            public void Dispose()
+            {
+                this.Brush.Dispose();
+                this.Pen.Dispose();
+            }
+        }
+    }
+}
diff --git a/src/GuiException/UiException/Controls/DefaultCodeRenderer.cs b/src/GuiException/UiException/Controls/DefaultCodeRenderer.cs
new file mode 100644
index 0000000..4b313ef
--- /dev/null
+++ b/src/GuiException/UiException/Controls/DefaultCodeRenderer.cs
@@ -0,0 +1,199 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.UiException.CodeFormatters;
+using System.Drawing;
+using System.Diagnostics;
+
+namespace NUnit.UiException.Controls
+{
+    public class DefaultCodeRenderer :
+        ICodeRenderer
+    {
+        /// <summary>
+        /// These constants below address an issue at measure text time
+        /// that sometimes can cause big lines of text to be misaligned.
+        /// </summary>
+        private readonly static float MEASURECHAR_BIG_WIDTH = 5000f;
+        private readonly static float MEASURECHAR_BIG_HEIGHT = 100f;
+
+        public PaintLineLocation[] ViewportLines(FormattedCode code, RectangleF viewport, float fontHeight)
+        {
+            List<PaintLineLocation> list = new List<PaintLineLocation>();
+            int visibles = CountVisibleLines(viewport.Height, fontHeight);
+//            int topIndex = YCoordinateToLineIndex(viewport.Top, fontHeight);
+            int lineIndex = YCoordinateToLineIndex(viewport.Top, fontHeight);
+            int i;
+
+            for (i = 0; i < visibles; ++i, lineIndex++)
+            {
+                if (lineIndex < 0)
+                    continue;
+
+                if (lineIndex >= code.LineCount)
+                    break;
+
+                list.Add(
+                    new PaintLineLocation(lineIndex, code.GetTextAt(lineIndex),
+                    new PointF(-viewport.Left,
+                        LineIndexToYCoordinate(lineIndex, fontHeight) -
+                        viewport.Top)));
+            }
+
+            return (list.ToArray());
+        }
+
+        #region ICodeRenderer Membres
+
+        public void DrawToGraphics(FormattedCode code, CodeRenderingContext args, Rectangle viewport)
+        {
+            UiExceptionHelper.CheckNotNull(code, "code");
+            UiExceptionHelper.CheckNotNull(args, "args");
+
+            ClassifiedTokenCollection line;
+            PaintLineLocation[] lines;
+            ClassifiedToken token;
+            float fontHeight;
+            string text;
+            float tk_width;
+            int i;
+            float x;
+
+            fontHeight = LineIndexToYCoordinate(1, args.Graphics, args.Font);
+            lines = ViewportLines(code, viewport, fontHeight);
+
+            foreach (PaintLineLocation paintLine in lines)
+            {
+                // All lines that differ from CurrentLine are displayed
+                // in using different styles of Brush to make a distinction
+                // between code, keyword, comments.
+                if (paintLine.LineIndex != args.CurrentLine)
+                {
+                    line = code[paintLine.LineIndex];
+                    x = 0;
+                    text = line.Text;
+
+                    for (i = 0; i < line.Count; ++i)
+                    {
+                        token = line[i];
+
+                        args.Graphics.DrawString(token.Text, args.Font, args.GetBrush(token.Tag),
+                            paintLine.Location.X + x, paintLine.Location.Y);
+
+                        tk_width = measureStringWidth(args.Graphics, args.Font, text,
+                            token.IndexStart, token.Text.Length);
+
+                        x += tk_width;
+                    }
+
+                    continue;
+                }
+
+                // The current line is emphasized by using a 
+                // specific couples of Background & Foreground colors
+
+                args.Graphics.FillRectangle(
+                    args.CurrentLineBackBrush,
+                    0, paintLine.Location.Y,
+                    viewport.Width, fontHeight);
+
+                args.Graphics.DrawString(
+                    paintLine.Text, args.Font,
+                    args.CurrentLineForeBrush,
+                    paintLine.Location.X, paintLine.Location.Y);
+            }
+
+            return;
+        }
+
+        public SizeF GetDocumentSize(FormattedCode code, Graphics g, Font font)
+        {
+            UiExceptionHelper.CheckNotNull(code, "code");
+            UiExceptionHelper.CheckNotNull(g, "g");
+            UiExceptionHelper.CheckNotNull(font, "font");
+
+            StringBuilder sample;
+            SizeF measure;
+            int i;
+
+            sample = new StringBuilder();
+            for (i = code.MaxLength; i > 0; --i)
+                sample.Append("m");
+
+            measure = g.MeasureString(sample.ToString(), font);
+
+            return (new SizeF(measure.Width, measure.Height * code.LineCount));
+        }
+
+        public float LineIndexToYCoordinate(int lineIndex, Graphics g, Font font)
+        {
+            UiExceptionHelper.CheckNotNull(g, "g");
+            UiExceptionHelper.CheckNotNull(font, "font");
+
+            SizeF sz = g.MeasureString("m", font);
+            return (lineIndex * sz.Height);
+        }
+
+        #endregion                
+
+        /// <summary>
+        /// Utility method that measures a region of text in the given string.
+        /// </summary>
+        /// <param name="g">The graphics instance used to render this text.</param>
+        /// <param name="font">The font instance used to render this text.</param>
+        /// <param name="text">The text that contains the region to be rendered.</param>
+        /// <param name="indexStart">Starting startingPosition of this region.</param>
+        /// <param name="length">Length of this region.</param>
+        /// <returns>The width of this region of text.</returns>
+        private float measureStringWidth(Graphics g, Font font, string text, int indexStart, int length)
+        {
+            CharacterRange[] ranges;
+            StringFormat sf;
+            Region[] regions;
+
+            if (length == 0)
+                return (0);
+
+            length = Math.Min(length, text.Length);
+
+            ranges = new CharacterRange[] { new CharacterRange(indexStart, length) };
+            sf = new StringFormat();
+
+            // the string of text may contains white spaces that need to
+            // be measured correctly.
+
+            sf.FormatFlags = StringFormatFlags.MeasureTrailingSpaces;
+
+            sf.SetMeasurableCharacterRanges(ranges);
+
+            // here : giving a layout too small can cause returned measure
+            // to be wrong.
+
+            regions = g.MeasureCharacterRanges(
+                text, font, new RectangleF(
+                    0, 0, MEASURECHAR_BIG_WIDTH, MEASURECHAR_BIG_HEIGHT), sf);
+
+            return (regions[0].GetBounds(g).Width);
+        }
+
+        int CountVisibleLines(float viewportHeight, float fontHeight)
+        {
+            return ((int)(viewportHeight / fontHeight) + 1);
+        }
+
+        int YCoordinateToLineIndex(float y, float fontHeight)
+        {
+            return (int)(y / fontHeight);
+        }
+
+        float LineIndexToYCoordinate(int index, float fontHeight)
+        {
+            return (index * fontHeight);
+        }        
+    }
+}
diff --git a/src/GuiException/UiException/Controls/DefaultErrorListRenderer.cs b/src/GuiException/UiException/Controls/DefaultErrorListRenderer.cs
new file mode 100644
index 0000000..3b5b8d2
--- /dev/null
+++ b/src/GuiException/UiException/Controls/DefaultErrorListRenderer.cs
@@ -0,0 +1,337 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+using NUnit.UiException.Properties;
+using System.Diagnostics;
+
+namespace NUnit.UiException.Controls
+{
+    /// <summary>
+    /// Implements IErrorListRenderer.
+    /// </summary>
+    public class DefaultErrorListRenderer :
+        IErrorListRenderer
+    {
+        //private static readonly int ITEM_HEIGHT = 54;
+        private static readonly int TEXT_MARGIN_X = 16;
+
+        private Font _font;
+        private Font _fontUnderlined;
+        private int _itemHeight;
+        private Brush _brushBlue;
+        private Brush _brushGray;
+        private float _offsetLine;
+        
+        private Rectangle _rectListShadow;
+        private Rectangle _rectListBackground;
+        private Rectangle _rectItemGray;
+        private Rectangle _rectItemWhite;
+        private Rectangle _rectSelectionMiddle;
+        private Rectangle _rectIconDll;
+        private Rectangle _rectIconCSharp;
+        private Rectangle _rectIconArrow;
+//        private Rectangle _rectShadow;
+
+        private PaintData _paintData;
+
+        public DefaultErrorListRenderer()
+        {
+            this.Font = new Font(FontFamily.GenericSansSerif, 8.25f);
+            //_fontUnderlined = new Font(_font, FontStyle.Underline);
+            //_itemHeight = _font.Height * 4 + 6;
+
+            _brushBlue = new SolidBrush(Color.FromArgb(0, 43, 114));
+            _brushGray = new SolidBrush(Color.FromArgb(64, 64, 64));
+
+            _rectListShadow = new Rectangle(0, 0, 48, 9);
+            _rectListBackground = new Rectangle(0, 10, 48, 48);
+            _rectItemGray = new Rectangle(71, 0, 9, 54);
+            _rectItemWhite = new Rectangle(60, 0, 9, 54);
+            _rectSelectionMiddle = new Rectangle(49, 0, 9, 54);
+            _rectIconDll = new Rectangle(1, 59, 16, 15);
+            _rectIconCSharp = new Rectangle(18, 59, 14, 15);
+            _rectIconArrow = new Rectangle(35, 60, 9, 5);
+//            _rectShadow = new Rectangle(49, 60, 4, 8);
+
+            _paintData = new PaintData();
+
+            return;
+        }
+
+        public Font Font
+        {
+            get { return (_font); }
+            set 
+            { 
+                _fontUnderlined = _font = value;
+                if (_font.FontFamily.IsStyleAvailable(FontStyle.Underline))
+                    _fontUnderlined = new Font(_font, FontStyle.Underline);
+                _itemHeight = _font.Height * 4 + 6;
+            }
+        }
+
+        #region IErrorListRenderer Membres
+
+        public void DrawToGraphics(ErrorItemCollection items,
+            ErrorItem selected, Graphics g, Rectangle viewport)
+        {
+            SizeF sizeLineSource;
+            int last;
+            int i;
+
+            UiExceptionHelper.CheckNotNull(items, "items");
+            UiExceptionHelper.CheckNotNull(g, "g");
+
+            if (!_paintData.Equals(items, selected, viewport))
+            {
+                _paintData.Dispose();
+                _paintData = new PaintData(items, selected, viewport, g);
+
+                PaintBackground(Resources.ImageErrorList, _paintData.WorkingGraphics,
+                    _rectListBackground, viewport);
+
+                sizeLineSource = g.MeasureString("Line 9999", _font);
+                _offsetLine = viewport.Width - sizeLineSource.Width;
+
+                last = LastIndexVisible(items.Count, viewport);
+                for (i = FirstIndexVisible(items.Count, viewport); i <= last; ++i)
+                    DrawItem(items[i], i, selected == items[i], i == items.Count - 1, false, 
+                        _paintData.WorkingGraphics, viewport);
+
+                //_paintData.WorkingGraphics.DrawImage(Resources.ErrorList,
+                //new Rectangle(0, 0, viewport.Width, _rectShadow.Height),
+                //_rectShadow, GraphicsUnit.Pixel);
+            }
+            
+            _paintData.PaintTo(g);           
+
+            return;
+        }
+
+        public void DrawItem(ErrorItem item, int index, bool hovered, bool selected, Graphics g, Rectangle viewport)
+        {
+            DrawItem(item, index, selected, false, hovered, g, viewport);
+        }
+
+        public Size GetDocumentSize(ErrorItemCollection items, Graphics g)
+        {
+            SizeF current;
+            float w;
+
+            _paintData = new PaintData();
+
+            if (items.Count == 0)
+                return (new Size());
+
+            w = 0;
+            foreach (ErrorItem item in items)
+            {
+                current = MeasureItem(g, item);
+                w = Math.Max(w, current.Width);
+            }            
+
+            return (new Size((int)w, items.Count * _itemHeight));
+        }
+
+        public ErrorItem ItemAt(ErrorItemCollection items, Graphics g, Point point)
+        {
+            int idx = point.Y / _itemHeight;
+
+            if (items == null || point.Y < 0 || idx >= items.Count)
+                return (null);
+
+            return (items[idx]);
+        }
+
+        #endregion
+
+        protected bool IsDirty(ErrorItemCollection items, ErrorItem selection, Rectangle viewport)
+        {
+            return (!_paintData.Equals(items, selection, viewport));
+        }
+
+        protected SizeF MeasureItem(Graphics g, ErrorItem item)
+        {
+            SizeF sizeMethod;
+            SizeF sizeClass;
+            SizeF sizeFile;
+
+            UiExceptionHelper.CheckNotNull(g, "g");
+            UiExceptionHelper.CheckNotNull(item, "item");
+
+            sizeClass = g.MeasureString(item.ClassName, _font);
+            sizeMethod = g.MeasureString(item.MethodName, _font);
+            sizeFile = g.MeasureString(item.FileName, _font);
+
+            return (new SizeF(
+                Math.Max(sizeClass.Width, Math.Max(sizeMethod.Width, sizeFile.Width)) + TEXT_MARGIN_X,
+                _itemHeight));
+        }
+
+        private void DrawItem(ErrorItem item, int index, bool selected, bool last, bool hover, Graphics g, Rectangle viewport)
+        {
+            Rectangle src;
+            Font font;
+
+            int x = -viewport.X;
+            int y = _itemHeight * index - viewport.Y;
+
+            src = (index % 2 == 0) ? _rectItemWhite : _rectItemGray ;
+            font = (hover == true) ? _fontUnderlined : _font;
+
+            g.DrawImage(Resources.ImageErrorList,
+                new Rectangle(0, y, viewport.Width, _itemHeight), src,
+                GraphicsUnit.Pixel);
+
+            if (selected)
+            {
+                g.DrawImage(Resources.ImageErrorList,
+                    new Rectangle(0, y + 1, viewport.Width, _itemHeight ),
+                    _rectSelectionMiddle, GraphicsUnit.Pixel);
+            }
+
+            if (item.HasSourceAttachment)
+            {
+                g.DrawImage(Resources.ImageErrorList, new Rectangle(x + 1, y + 2 + font.Height, 14, 15),
+                   _rectIconCSharp, GraphicsUnit.Pixel);
+                g.DrawImage(Resources.ImageErrorList, 
+                    new Rectangle(TEXT_MARGIN_X - 3 + x, y + 5 + 2 * font.Height, 9, 5),
+                    _rectIconArrow, GraphicsUnit.Pixel);
+
+                g.DrawString(String.Format("Line {0}", item.LineNumber),
+                    font, _brushGray, _offsetLine, y + 2);
+                g.DrawString(item.ClassName, font, _brushBlue, x + TEXT_MARGIN_X, y + 2 + font.Height);
+                g.DrawString(item.BaseMethodName + "()", font, _brushBlue,
+                    x + TEXT_MARGIN_X + 5, y + 2 + 2 * font.Height);
+                g.DrawString(item.FileName, font, _brushGray,
+                    x + TEXT_MARGIN_X, y + 2 + 3 * _font.Height);
+            }
+            else
+            {
+                g.DrawImage(Resources.ImageErrorList, new Rectangle(x + 1, y + 2 + font.Height, 16, 15),
+                   _rectIconDll, GraphicsUnit.Pixel);
+
+                g.DrawString("N/A", font, _brushGray, _offsetLine, y + 2);
+                g.DrawString(item.ClassName, font, _brushGray, 
+                    x + TEXT_MARGIN_X, y + 2 + font.Height);
+                g.DrawString(item.BaseMethodName + "()", font, _brushGray,
+                    x + TEXT_MARGIN_X, y + 2 + 2 * font.Height);                
+            }
+
+            if (!last)
+                return;
+
+            PaintTile(Resources.ImageErrorList, g, _rectListShadow,
+                new Rectangle(0, y + _itemHeight, viewport.Width, 9));
+
+            return;
+        }
+
+        private static void PaintBackground(Image img, Graphics g, Rectangle bkg, Rectangle viewport)
+        {
+            Rectangle destTile;
+            int x;
+            int y;
+            int startY;
+            int startX;
+
+            startY = -viewport.Y % viewport.Height;
+            startX = -viewport.X % viewport.Width;
+
+            for (y = startY; y < viewport.Height; y += bkg.Height)
+                for (x = startX; x < viewport.Width; x += bkg.Width)
+                {
+                    destTile = new Rectangle(x, y, bkg.Width, bkg.Height);
+                    g.DrawImage(img, destTile, bkg, GraphicsUnit.Pixel);
+                }
+
+            return;
+        }
+
+        private static void PaintTile(Image tile, Graphics g, Rectangle src, Rectangle dst)
+        {
+            Rectangle destTile;
+            int x;
+            int y;
+
+            for (y = dst.Top; y < dst.Bottom; y += src.Height)
+                for (x = dst.Left; x < dst.Right; x += src.Width)
+                {
+                    destTile = new Rectangle(x, y, src.Width, src.Height);
+                    g.DrawImage(tile, destTile, src, GraphicsUnit.Pixel);
+                }
+
+            return;
+        }
+
+        private int FirstIndexVisible(int count, Rectangle viewport)
+        {
+            return (Math.Max(0, viewport.Y / _itemHeight));
+        }
+
+        private int LastIndexVisible(int count, Rectangle viewport)
+        {
+            return (Math.Min(count - 1,
+                FirstIndexVisible(count, viewport) + 1 + viewport.Height / _itemHeight));
+        }
+
+        class PaintData
+        {
+            public Graphics WorkingGraphics;
+
+            private ErrorItem _firstItem;
+            private ErrorItem selection;
+            private Rectangle viewport;
+            private Image _workingImage;
+
+            public PaintData() { }
+
+            public PaintData(ErrorItemCollection items, ErrorItem item, Rectangle rectangle, Graphics g)
+            {
+                if (item == null)
+                    item = new ErrorItem();
+                selection = item;
+
+                _firstItem = ((items.Count > 0) ? items[0] : null);
+
+                viewport = rectangle;
+
+                _workingImage = new Bitmap(rectangle.Width, rectangle.Height, g);
+                WorkingGraphics = Graphics.FromImage(_workingImage);
+
+                return;
+            }
+
+            public void Dispose()
+            {
+                if (_workingImage != null)
+                {
+                    _workingImage.Dispose();
+                    WorkingGraphics.Dispose();
+                }
+
+                return;
+            }
+
+            public void PaintTo(Graphics g)
+            {
+                g.DrawImage(_workingImage, 0, 0);
+            }
+
+            public bool Equals(ErrorItemCollection items, ErrorItem item, Rectangle rectangle)
+            {               
+                ErrorItem first = ((items.Count > 0) ? items[0] : null);
+
+                return (viewport.Equals(rectangle) &&
+                        object.ReferenceEquals(item, selection) &&
+                        object.ReferenceEquals(first, _firstItem));
+            }
+        }
+    }
+}
diff --git a/src/GuiException/UiException/Controls/ErrorBrowser.cs b/src/GuiException/UiException/Controls/ErrorBrowser.cs
new file mode 100644
index 0000000..d9829be
--- /dev/null
+++ b/src/GuiException/UiException/Controls/ErrorBrowser.cs
@@ -0,0 +1,158 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+
+namespace NUnit.UiException.Controls
+{
+    /// <summary>
+    /// A control that encapsulates a collection of IErrorDisplay instances
+    /// and which shows relevant information about failures & errors after
+    /// a test suite run.
+    ///     By default, ErrorBrowser is empty and should be populated with
+    /// IErrorDisplay instances at loading time. The example below shows how
+    /// to achieve this:
+    /// <code>
+    /// ErrorBrowser errorBrowser = new ErrorBrowser();
+    /// 
+    /// // configure and register a SourceCodeDisplay
+    /// // that will display source code context on failure
+    /// 
+    /// SourceCodeDisplay sourceCode = new SourceCodeDisplay();
+    /// sourceCode.AutoSelectFirstItem = true;
+    /// sourceCode.ListOrderPolicy = ErrorListOrderPolicy.ReverseOrder;
+    /// sourceCode.SplitOrientation = Orientation.Vertical;
+    /// sourceCode.SplitterDistance = 0.3f;
+    ///
+    /// errorBrowser.RegisterDisplay(sourceCode);
+    /// 
+    /// // configure and register a StackTraceDisplay
+    /// // that will display the stack trace details on failure
+    /// 
+    /// errorBrowser.RegisterDisplay(new StackTraceDisplay());
+    /// [...]
+    /// // set the stack trace information
+    /// errorBrowser.StackTraceSource = [a stack trace here]
+    /// </code>
+    /// </summary>
+    public class ErrorBrowser : UserControl
+    {
+        public event EventHandler StackTraceSourceChanged;
+        public event EventHandler StackTraceDisplayChanged;
+        private ErrorPanelLayout _layout;
+
+        private string _stackStace;
+
+        /// <summary>
+        /// Builds a new instance of ErrorBrowser.
+        /// </summary>
+        public ErrorBrowser()
+        {            
+            _layout = new ErrorPanelLayout();
+            _layout.Toolbar = new ErrorToolbar();            
+            Toolbar.SelectedRendererChanged += new EventHandler(Toolbar_SelectedRendererChanged);
+
+            Controls.Add(_layout);
+            _layout.Left = 0;
+            _layout.Top = 0;
+            _layout.Width = Width;
+            _layout.Height = Height;
+
+            _layout.Anchor = AnchorStyles.Top |
+                             AnchorStyles.Left |
+                             AnchorStyles.Bottom |
+                             AnchorStyles.Right;
+
+            return;
+        }        
+
+        /// <summary>
+        /// Use this property to get or set the new stack trace details.
+        /// The changes are repercuted on the registered displays.
+        /// </summary>
+        public string StackTraceSource
+        {
+            get { return (_stackStace); }
+            set {
+                if (_stackStace == value)
+                    return;
+
+                _stackStace = value;
+
+                foreach (IErrorDisplay item in Toolbar)
+                    item.OnStackTraceChanged(value);
+
+                if (StackTraceSourceChanged != null)
+                    StackTraceSourceChanged(this, new EventArgs());
+
+                return;
+            }
+        }
+
+        /// <summary>
+        /// Gets the selected display.
+        /// </summary>
+        public IErrorDisplay SelectedDisplay
+        {
+            get { return (Toolbar.SelectedDisplay); }
+            set { Toolbar.SelectedDisplay = value; }
+        }
+
+        /// <summary>
+        /// Populates ErrorBrowser with the new display passed in parameter.
+        /// If ErrorBrowser is empty, the display becomes automatically the
+        /// new selected display.
+        /// </summary>
+        /// <param name="display"></param>
+        public void RegisterDisplay(IErrorDisplay display)
+        {
+            UiExceptionHelper.CheckNotNull(display, "display");
+
+            Toolbar.Register(display);
+            display.OnStackTraceChanged(_stackStace);
+
+            if (Toolbar.SelectedDisplay == null)
+                Toolbar.SelectedDisplay = display;
+
+            return;
+        }
+
+        /// <summary>
+        /// Removes all display from ErrorBrowser.
+        /// </summary>
+        public void ClearAll()
+        {
+            Toolbar.Clear();
+
+            LayoutPanel.Option = null;
+            LayoutPanel.Content = null;
+
+            return;
+        }
+
+        void Toolbar_SelectedRendererChanged(object sender, EventArgs e)
+        {
+            LayoutPanel.Content = Toolbar.SelectedDisplay.Content;
+
+            if (StackTraceDisplayChanged != null)
+                StackTraceDisplayChanged(this, EventArgs.Empty);
+
+            return;
+        }
+
+        protected ErrorPanelLayout LayoutPanel
+        {
+            get { return (_layout); }
+        }
+
+        protected ErrorToolbar Toolbar
+        {
+            get { return ((ErrorToolbar)_layout.Toolbar); }
+        }
+    }
+}
diff --git a/src/GuiException/UiException/Controls/ErrorList.cs b/src/GuiException/UiException/Controls/ErrorList.cs
new file mode 100644
index 0000000..2a16221
--- /dev/null
+++ b/src/GuiException/UiException/Controls/ErrorList.cs
@@ -0,0 +1,263 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using System.Drawing;
+using System.Diagnostics;
+
+namespace NUnit.UiException.Controls
+{
+    /// <summary>
+    /// Displays a control which implements IStackTraceView.
+    /// </summary>
+    public class ErrorList :
+        UserControl,
+        IStackTraceView
+    {
+        public event EventHandler SelectedItemChanged;
+
+        private ErrorListOrderPolicy _listOrder;
+        private ErrorItemCollection _items;
+        private ErrorItem _selection;
+        private string _stackTrace;
+        protected IErrorListRenderer _renderer;
+        protected Graphics _workingGraphics;
+        protected int _hoveredIndex;
+
+        private Point _mouse;
+        private bool _autoSelectFirstItem;
+
+        /// <summary>
+        /// Builds a new instance of ErrorList.
+        /// </summary>
+        public ErrorList() :
+            this(new DefaultErrorListRenderer())
+        {
+        }
+
+        /// <summary>
+        /// Gives access to the item collection.
+        /// </summary>
+        public ErrorItemCollection Items
+        {
+            get { return (_items); }
+        }
+
+        #region IStackTraceView Members
+
+        public bool AutoSelectFirstItem
+        {
+            get { return (_autoSelectFirstItem); }
+            set { _autoSelectFirstItem = value; }
+        }
+
+        public string StackTrace
+        {
+            get { return (_stackTrace); }
+            set
+            {
+                ErrorItem candidate;
+
+                candidate = PopulateList(value);
+
+                if (!String.IsNullOrEmpty(value) &&
+                    _items.Count == 0)
+                    _items.Add(new ErrorItem(null, "Fail to parse stack trace", -1));
+
+                AutoScrollMinSize = _renderer.GetDocumentSize(_items, _workingGraphics);
+
+                _hoveredIndex = -1;
+                SelectedItem = (AutoSelectFirstItem ? candidate : null);
+                Invalidate();
+
+                return;
+            }
+        }
+
+        public ErrorItem SelectedItem
+        {
+            get { return (_selection); }
+            set
+            {
+                bool fireEvent;
+
+                if (value != null &&
+                    (!_items.Contains(value) || !value.HasSourceAttachment))
+                    return;
+
+                fireEvent = (_selection != value);
+                _selection = value;
+
+                if (fireEvent && SelectedItemChanged != null)
+                    SelectedItemChanged(this, new EventArgs());
+
+                Invalidate();
+            }
+        }
+
+        public ErrorListOrderPolicy ListOrderPolicy
+        {
+            get { return (_listOrder); }
+            set
+            {
+                if (_listOrder == value)
+                    return;
+                _listOrder = value;
+                _items.Reverse();
+                Invalidate();
+            }
+        }
+
+        #endregion
+
+        protected ErrorList(IErrorListRenderer renderer)
+        {
+            UiExceptionHelper.CheckNotNull(renderer, "display");
+
+            SetStyle(ControlStyles.UserPaint, true);
+            SetStyle(ControlStyles.AllPaintingInWmPaint, true);
+            DoubleBuffered = true;
+
+            _renderer = renderer;
+            _items = new ErrorItemCollection();
+            _stackTrace = null;
+            _selection = null;
+            _workingGraphics = CreateGraphics();
+            _hoveredIndex = -1;
+
+            _autoSelectFirstItem = false;
+            _listOrder = ErrorListOrderPolicy.InitialOrder;
+
+            return;
+        }
+
+        protected virtual void ItemEntered(int index)
+        {
+            Cursor = Cursors.Hand;
+        }
+
+        protected virtual void ItemLeaved(int index)
+        {
+            Cursor = Cursors.Default;
+        }
+
+        protected override void OnPaint(PaintEventArgs e)
+        {
+            Rectangle viewport;
+
+            base.OnPaint(e);
+
+            viewport = new Rectangle(-AutoScrollPosition.X, -AutoScrollPosition.Y, 
+                ClientRectangle.Width, ClientRectangle.Height);
+            _renderer.DrawToGraphics(_items, _selection, e.Graphics, viewport);
+
+            if (_hoveredIndex != -1)
+                _renderer.DrawItem(_items[_hoveredIndex], _hoveredIndex, true,
+                    _items[_hoveredIndex] == _selection, e.Graphics, viewport);
+
+            return;
+        }
+
+        protected override void OnMouseHover(EventArgs e)
+        {
+            base.OnMouseHover(e);
+            Focus();
+        }
+       
+        protected override void OnMouseDown(MouseEventArgs e)
+        {
+            base.OnMouseDown(e);
+            _mouse = new Point(e.X, e.Y - AutoScrollPosition.Y);
+        }
+
+        protected override void OnMouseMove(MouseEventArgs e)
+        {
+            ErrorItem item;
+            int itemIndex;
+
+            base.OnMouseMove(e);
+
+            item = _renderer.ItemAt(_items, _workingGraphics, new Point(e.X, e.Y - AutoScrollPosition.Y));
+
+            itemIndex = -1;
+            for (int i = 0; i < _items.Count; ++i)
+                if (Object.ReferenceEquals(_items[i], item))
+                {
+                    itemIndex = i;
+                    break;
+                }            
+
+            if (itemIndex != _hoveredIndex)
+            {
+                if (_hoveredIndex != -1)
+                    ItemLeaved(_hoveredIndex);
+
+                if (itemIndex != -1 && _items[itemIndex].HasSourceAttachment)
+                {
+                    ItemEntered(itemIndex);
+                    _hoveredIndex = itemIndex;
+                }
+                else
+                    _hoveredIndex = -1;
+                Invalidate();
+            }
+
+            return;
+        }
+
+        protected override void OnClick(EventArgs e)
+        {
+            base.OnClick(e);
+            OnClick(_mouse);
+
+            return;
+        }
+
+        protected override void OnFontChanged(EventArgs e)
+        {
+            this._renderer.Font = this.Font;
+
+            base.OnFontChanged(e);
+        }
+
+        protected void OnClick(Point point)
+        {
+            SelectedItem = _renderer.ItemAt(_items, _workingGraphics, point);
+
+            return;
+        }
+
+        protected override void OnSizeChanged(EventArgs e)
+        {
+            base.OnSizeChanged(e);
+            Invalidate();
+        }
+
+        private ErrorItem PopulateList(string stackTrace)
+        {
+            StackTraceParser parser = new StackTraceParser();
+            ErrorItem candidate;
+
+            _stackTrace = stackTrace;
+            parser.Parse(stackTrace);
+            if (_listOrder == ErrorListOrderPolicy.ReverseOrder)
+                parser.Items.Reverse();
+
+            candidate = null;
+            _items.Clear();
+            foreach (ErrorItem item in parser.Items)
+            {
+                if (candidate == null && item.HasSourceAttachment)
+                    candidate = item;
+                _items.Add(item);
+            }
+
+            return (candidate);
+        }
+    }
+}
diff --git a/src/GuiException/UiException/Controls/ErrorPanelLayout.cs b/src/GuiException/UiException/Controls/ErrorPanelLayout.cs
new file mode 100644
index 0000000..091636e
--- /dev/null
+++ b/src/GuiException/UiException/Controls/ErrorPanelLayout.cs
@@ -0,0 +1,222 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using System.Drawing;
+using NUnit.UiException.Properties;
+
+namespace NUnit.UiException.Controls
+{
+    /// <summary>
+    /// Provides the panels and layout of ErrorBrowser as
+    /// shown below:
+    /// 
+    /// +--------------------------------------------+
+    /// |                  Toolbar                   |
+    /// +--------------------------------------------+
+    /// |                                            |
+    /// |                                            |
+    /// |                  Content                   |
+    /// |                                            |
+    /// |                                            |
+    /// +--------------------------------------------+
+    /// 
+    /// Toolbar: the control which shows buttons
+    ///          to alternate between the StackTraceDisplay
+    ///          and BrowserDisplay back and forth.
+    ///          The control collection of this control
+    ///          never changes.
+    ///               
+    /// Option:  a free place holder to show subfeature
+    ///          for a specific display (e.g: StackTraceDisplay
+    ///          or BrowserDisplay). This control's
+    ///          collection changes in relation with the
+    ///          selected display.
+    ///               
+    /// Content: the place where to put the main content
+    ///          for the current display. This control's 
+    ///          collection changes in regard of the
+    ///          selected display.
+    /// </summary>
+    public class ErrorPanelLayout : 
+        UserControl
+    {
+        private static readonly int PANEL_LEFT = 0;
+        private static readonly int PANEL_RIGHT = 1;
+        public static readonly int TOOLBAR_HEIGHT = 26;
+
+        private InternalSplitter _header;
+        private Panel _contentDefault;
+        private Control _contentCurrent;
+
+        public ErrorPanelLayout()
+        {
+            _header = new InternalSplitter();
+            _contentDefault = new Panel();
+            _contentCurrent = _contentDefault;
+
+            Controls.Add(_header[PANEL_LEFT]);
+            //Controls.Add(_header[PANEL_RIGHT]);
+            Controls.Add(_contentDefault);
+
+            //_header[PANEL_LEFT].BackColor = Color.Yellow;
+            //_header[PANEL_RIGHT].BackColor = Color.Violet;
+            //_contentDefault.BackColor = Color.Green;
+
+            SizeChanged += new EventHandler(ErrorPanelLayout_SizeChanged);
+
+            _header[PANEL_RIGHT].ControlAdded += new ControlEventHandler(ErrorPanelLayout_ControlAddedOrRemoved);
+
+            _header[PANEL_RIGHT].ControlRemoved += new ControlEventHandler(ErrorPanelLayout_ControlAddedOrRemoved);
+
+            Width = 200;
+            Height = 200;
+
+            return;
+        }
+
+        void ErrorPanelLayout_ControlAddedOrRemoved(object sender, ControlEventArgs e)
+        {
+            doLayout();
+        }
+
+        void ErrorPanelLayout_SizeChanged(object sender, EventArgs e)
+        {
+            doLayout();
+        }
+
+        /// <summary>
+        /// Gets or sets the control to be placed in Toolbar location.
+        /// Pass null to reset Toolbar to its default state.
+        /// 
+        /// When setting a control, the control's hierarchy of
+        /// ErrorPanelLayout is automatically updated with the
+        /// passed component. Besides, the passed component is
+        /// automatically positionned to the right coordinates.
+        /// </summary>
+        public Control Toolbar
+        {
+            get { return (_header[PANEL_LEFT]); }
+            set {                                
+                Controls.Remove(_header[PANEL_LEFT]);
+                _header[PANEL_LEFT] = value;
+                Controls.Add(_header[PANEL_LEFT]);
+                doLayout();
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the control to be placed in Option location.
+        /// Pass null to reset Option to its default state.
+        /// 
+        /// When setting a control, the control's hierarchy of
+        /// ErrorPanelLayout is automatically updated with the
+        /// passed component. Besides, the passed component is
+        /// automatically positionned to the right coordinates.
+        /// </summary>
+        public Control Option
+        {
+            get { return (_header[PANEL_RIGHT]); }
+            set {
+                Controls.Remove(_header[PANEL_RIGHT]);
+                _header[PANEL_RIGHT] = value;
+                Controls.Add(_header[PANEL_RIGHT]);
+                doLayout();
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the control to be placed in Content location.
+        /// Pass null to reset content to its default state.
+        /// 
+        /// When setting a control, the control's hierarchy of
+        /// ErrorPanelLayout is automatically updated with the
+        /// passed component. Besides, the passed component is
+        /// automatically positionned to the right coordinates.
+        /// </summary>
+        public Control Content
+        {
+            get { return (_contentCurrent); }
+            set {
+                if (value == null)
+                    value = _contentDefault;
+                Controls.Remove(_contentCurrent);
+                _contentCurrent = value;
+                Controls.Add(_contentCurrent);
+                doLayout();
+            }
+        }
+
+        //protected override void OnPaint(PaintEventArgs e)
+        //{
+        //    e.Graphics.DrawImage(Resources.ErrorBrowserHeader,
+        //        new Rectangle(0, 0, Width, TOOLBAR_HEIGHT),
+        //        new Rectangle(0, 0, Resources.ErrorBrowserHeader.Width - 1,
+        //            Resources.ErrorBrowserHeader.Height),
+        //        GraphicsUnit.Pixel);
+
+        //    return;
+        //}
+
+        private void doLayout()
+        {
+//            int widthLeft;
+            int widthRight;
+
+            widthRight = _header.WidthAt(PANEL_RIGHT);
+//            widthLeft = _header.WidthAt(PANEL_LEFT);
+
+            _header[PANEL_LEFT].Width = Math.Max(0, Width - widthRight);
+            _contentCurrent.Width = Width;
+
+            _header[PANEL_LEFT].Height = TOOLBAR_HEIGHT;
+            _header[PANEL_RIGHT].Height = Math.Min(TOOLBAR_HEIGHT, _header[PANEL_RIGHT].Height);
+            _header[PANEL_RIGHT].Width = widthRight;
+            _header[PANEL_RIGHT].Left = _header[PANEL_LEFT].Width;
+
+            _contentCurrent.Height = Height - TOOLBAR_HEIGHT;
+            _contentCurrent.Top = TOOLBAR_HEIGHT;
+
+            return;
+        }
+
+        class InternalSplitter : UserControl
+        {
+            private Panel[] _panels;
+            private Control[] _currents;
+
+            public InternalSplitter()
+            {
+                _panels = new Panel[] { new Panel(), new Panel() };
+                _currents = new Control[] { _panels[0], _panels[1] };
+
+                _panels[0].Width = 0;
+                _panels[1].Width = 0;
+
+                return;
+            }
+
+            public Control this[int index]
+            {
+                get { return (_currents[index]); }
+                set {
+                    if (value == null)
+                        value = _panels[index];
+                    _currents[index] = value; 
+                }
+            }
+
+            public int WidthAt(int index)
+            {
+                if (_currents[index] == _panels[index])
+                    return (0);
+                return (_currents[index].Width);
+            }
+        }
+    }
+}
diff --git a/src/GuiException/UiException/Controls/ErrorToolbar.cs b/src/GuiException/UiException/Controls/ErrorToolbar.cs
new file mode 100644
index 0000000..fd521bd
--- /dev/null
+++ b/src/GuiException/UiException/Controls/ErrorToolbar.cs
@@ -0,0 +1,232 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using System.Collections;
+using System.Drawing;
+using System.Diagnostics;
+using NUnit.UiException.Properties;
+
+namespace NUnit.UiException.Controls
+{
+    /// <summary>
+    /// A specialization of a ToolStrip to show instances of IErrorDisplay.
+    /// </summary>
+    public class ErrorToolbar :
+        ToolStrip,
+        IEnumerable
+    {
+        public event EventHandler SelectedRendererChanged;
+
+        private List<IErrorDisplay> _displays;
+
+        private ToolStripItem _separator;
+        private int _selection;
+
+        public ErrorToolbar()
+        {
+            _displays = new List<IErrorDisplay>();
+
+            _separator = CreateDefaultItem("-", null, null);
+            Items.Add(_separator);
+
+            _selection = -1;
+            
+            BackgroundImage = Resources.ImageErrorBrowserHeader;
+            BackgroundImageLayout = ImageLayout.Tile;
+
+            return;
+        }
+
+        /// <summary>
+        /// Create and configure a ToolStripButton.
+        /// </summary>
+        public static ToolStripButton NewStripButton(
+            bool canCheck, string text, Image image, EventHandler onClick)
+        {
+            ToolStripButton button;
+
+            button = new ToolStripButton(text, image, onClick);
+            button.CheckOnClick = canCheck;
+            button.Image = image;
+            button.ImageScaling = ToolStripItemImageScaling.None;
+            button.TextImageRelation = TextImageRelation.ImageBeforeText;
+            button.DisplayStyle = ToolStripItemDisplayStyle.Image;
+
+            return (button);
+        }
+
+        /// <summary>
+        /// Gets the count of IErrorDisplay instances.
+        /// </summary>
+        public int Count
+        {
+            get { return (_displays.Count); }
+        }
+
+        /// <summary>
+        /// Gets the display at the given index.
+        /// </summary>
+        public IErrorDisplay this[int index]
+        {
+            get { return (_displays[index]); }
+        }
+
+        /// <summary>
+        /// Gets or sets the IErrorDisplay to be selected.
+        /// </summary>
+        public IErrorDisplay SelectedDisplay
+        {
+            get {
+                if (_selection == -1)
+                    return (null);
+                return ((IErrorDisplay)Items[_selection].Tag); 
+            }
+            set
+            {
+                int index = IndexOf(value);
+
+                UiExceptionHelper.CheckFalse(index == -1 && value != null,
+                    "Cannot select unregistered display.", "SelectedDisplay");
+
+                if (index == _selection)
+                    return;
+
+                _selection = index;
+                SetOrUnsetCheckedFlag(_selection);
+                ShowOrHideOptionItems(_selection);
+                
+                if (SelectedRendererChanged != null)
+                    SelectedRendererChanged(this, new EventArgs());
+
+                return;
+            }
+        }
+
+        /// <summary>
+        /// Register a new IErrorDisplay in the toolbar.
+        /// </summary>
+        public void Register(IErrorDisplay display)
+        {
+            ToolStripItem item;
+            int sepIndex;
+
+            UiExceptionHelper.CheckNotNull(display, "display");
+            UiExceptionHelper.CheckNotNull(display.PluginItem, "display.PluginItem");
+
+            item = display.PluginItem;
+            item.Tag = display;
+            item.Click += new EventHandler(item_Click);
+
+            _displays.Add(display);
+            sepIndex = Items.IndexOf(_separator);
+            Items.Insert(sepIndex, item);
+
+            if (display.OptionItems != null)
+            {
+                ToolStripItem[] array = display.OptionItems;
+                foreach (ToolStripItem value in array)
+                {
+                    value.Visible = false;
+                    Items.Add(value);
+                }
+            }
+
+            if (_displays.Count == 1)
+                SelectedDisplay = display;
+
+            return;
+        }
+
+        /// <summary>
+        /// Clears all IErrorDisplay in the toolbar.
+        /// </summary>
+        public void Clear()
+        {
+            _displays.Clear();
+            Items.Clear();
+            Items.Add(_separator);
+
+            return;
+        }        
+
+        private void ShowOrHideOptionItems(int selectedIndex)
+        {
+            int index;
+
+            foreach (IErrorDisplay item in _displays)
+            {
+                if ((index = IndexOf(item)) == -1)                     
+                    continue;
+
+                if (item.OptionItems == null)
+                    continue;
+
+                foreach (ToolStripItem stripItem in item.OptionItems)
+                    stripItem.Visible = (index == selectedIndex);
+            }
+
+            return;
+        }
+
+        private void SetOrUnsetCheckedFlag(int selectedIndex)
+        {
+            int index;
+
+            foreach (IErrorDisplay item in _displays)
+            {
+                index = IndexOf(item);
+                if (index == -1)
+                    continue;
+                item.PluginItem.Checked = (index == selectedIndex);
+            }
+
+            return;
+        }
+
+        private int IndexOf(IErrorDisplay renderer)
+        {
+            int i;
+
+            if (renderer == null)
+                return (-1);
+
+            for (i = 0; i < Items.Count; ++i)
+                if (object.ReferenceEquals(Items[i].Tag, renderer))
+                    return (i);
+
+            return (-1);
+        }       
+
+        private void item_Click(object sender, EventArgs e)
+        {
+            ToolStripItem item = sender as ToolStripItem;
+            IErrorDisplay renderer;
+
+            if (item == null || item.Tag == null)
+                return;
+
+            renderer = item.Tag as IErrorDisplay;
+            if (renderer == null)
+                return;
+
+            SelectedDisplay = renderer;
+
+            return;
+        }                
+
+        #region IEnumerable Membres
+
+        public IEnumerator GetEnumerator()
+        {
+            return (_displays.GetEnumerator());
+        }
+
+        #endregion
+    }      
+}
diff --git a/src/GuiException/UiException/Controls/ICodeRenderer.cs b/src/GuiException/UiException/Controls/ICodeRenderer.cs
new file mode 100644
index 0000000..e8c20fc
--- /dev/null
+++ b/src/GuiException/UiException/Controls/ICodeRenderer.cs
@@ -0,0 +1,48 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.UiException.CodeFormatters;
+using System.Drawing;
+
+namespace NUnit.UiException.Controls
+{   
+    /// <summary>
+    /// The interface through which CodeBox interacts with a display to display itself.
+    /// 
+    /// Direct implementation is:
+    ///     - DefaultCodeRenderer
+    /// </summary>
+    public interface ICodeRenderer
+    {
+        /// <summary>
+        /// Draw the given code to be displayed in the actual viewport.
+        /// </summary>
+        /// <param name="code">The code to draw</param>
+        /// <param name="args">Encapsulate graphic information about how to display the code</param>
+        /// <param name="viewport">The portion of interest</param>
+        void DrawToGraphics(FormattedCode code, CodeRenderingContext args, Rectangle viewport);
+
+        /// <summary>
+        /// Measures the code size in pixels.
+        /// </summary>
+        /// <param name="code">The code to measure</param>
+        /// <param name="g">The target graphics object</param>
+        /// <param name="font">The font with which displaying the code</param>
+        /// <returns>The size in pixels</returns>
+        SizeF GetDocumentSize(FormattedCode code, Graphics g, Font font);
+
+        /// <summary>
+        /// Converts a line index to its matching Y client coordinate.
+        /// </summary>
+        /// <param name="lineIndex">The line index to convert</param>
+        /// <param name="g">The target graphics object</param>
+        /// <param name="font">The font with which displaying the code</param>
+        /// <returns>The Y client coordinate</returns>
+        float LineIndexToYCoordinate(int lineIndex, Graphics g, Font font);
+    }
+}
diff --git a/src/GuiException/UiException/Controls/ICodeView.cs b/src/GuiException/UiException/Controls/ICodeView.cs
new file mode 100644
index 0000000..ff6ac19
--- /dev/null
+++ b/src/GuiException/UiException/Controls/ICodeView.cs
@@ -0,0 +1,42 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.UiException.CodeFormatters;
+using System.Windows.Forms;
+
+namespace NUnit.UiException.Controls
+{
+    /// <summary>
+    /// The interface through which SourceCodeDisplay interacts with the code display.
+    /// 
+    /// Direct implementation is:
+    ///     - CodeBox
+    /// </summary>
+    public interface ICodeView
+    {
+        /// <summary>
+        /// Gets or sets a text to display in the code display.
+        /// </summary>
+        string Text { get; set; }
+
+        /// <summary>
+        /// Gets or sets the language formatting of the code display.
+        /// </summary>
+        string Language { get; set; }
+
+        /// <summary>
+        /// Gets or sets the viewport location from a 0 based line index
+        /// </summary>
+        int CurrentLine { get; set; }
+
+        /// <summary>
+        /// Gives access to the underlying IFormatterCatalog.
+        /// </summary>
+        IFormatterCatalog Formatter { get; }
+    }
+}
diff --git a/src/GuiException/UiException/Controls/IErrorDisplay.cs b/src/GuiException/UiException/Controls/IErrorDisplay.cs
new file mode 100644
index 0000000..d39f5d3
--- /dev/null
+++ b/src/GuiException/UiException/Controls/IErrorDisplay.cs
@@ -0,0 +1,51 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace NUnit.UiException.Controls
+{
+    /// <summary>
+    /// This interface describes a feature that can be added to the ErrorWindow
+    /// in order to show relevant information about failures/errors after a
+    /// test suite run.
+    ///     Clients who wants to add their own display should implement this
+    /// interface and register their instance to ErrorBrowser at run-time.
+    /// 
+    /// Direct known implementations are:
+    ///     StackTraceDisplay
+    ///     SourceCodeDisplay
+    /// </summary>
+    public interface IErrorDisplay
+    {
+        /// <summary>
+        /// Gives access to the ToolStripButton that enables this display.
+        /// </summary>
+        ToolStripButton PluginItem { get; }
+
+        /// <summary>
+        /// Gives access to a possibly null collection of option controls that will
+        /// be shown when this display has the focus.
+        /// </summary>
+        ToolStripItem[] OptionItems { get; }
+
+        /// <summary>
+        /// Gives access to the content control of this display.
+        /// </summary>
+        Control Content { get; }
+
+        /// <summary>
+        /// Called whenever the user changes the error selection in the detail list.
+        /// This method is called to allow the display to update its content according
+        /// the given stack trace.
+        /// </summary>
+        /// <param name="stackTrace"></param>
+        void OnStackTraceChanged(string stackTrace);
+    }
+}
diff --git a/src/GuiException/UiException/Controls/IErrorListRenderer.cs b/src/GuiException/UiException/Controls/IErrorListRenderer.cs
new file mode 100644
index 0000000..9cb48d3
--- /dev/null
+++ b/src/GuiException/UiException/Controls/IErrorListRenderer.cs
@@ -0,0 +1,64 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+
+namespace NUnit.UiException.Controls
+{
+    /// <summary>
+    /// The interface through which ErrorList interacts with a painter to paint itself.
+    /// 
+    /// Direct implementation is:
+    ///     - DefaultErrorListRenderer
+    /// </summary>
+    public interface IErrorListRenderer
+    {
+        /// <summary>
+        /// Draws the list on the given graphics.
+        /// </summary>
+        /// <param name="items">The item collection to paint on the graphics object</param>
+        /// <param name="selected">The item to paint with selection feature</param>
+        /// <param name="g">The target graphics object</param>
+        /// <param name="viewport">The viewport location</param>
+        void DrawToGraphics(ErrorItemCollection items, ErrorItem selected, Graphics g, Rectangle viewport);
+
+        /// <summary>
+        /// Draw the given item on the given graphics object.
+        /// </summary>
+        /// <param name="item">The item to be painted</param>
+        /// <param name="index">The item's index</param>
+        /// <param name="hovered">If true, this item can display hover feature</param>
+        /// <param name="selected">If true, this item can display selection feature</param>
+        /// <param name="g">The target graphics object</param>
+        /// <param name="viewport">The current viewport</param>
+        void DrawItem(ErrorItem item, int index, bool hovered, bool selected, Graphics g, Rectangle viewport);
+
+        /// <summary>
+        /// Given a collection of items and a graphics object, this method
+        /// measures in pixels the size of the collection.
+        /// </summary>
+        /// <param name="items">The collection</param>
+        /// <param name="g">The target graphics object</param>
+        /// <returns>The size in pixels of the collection</returns>
+        Size GetDocumentSize(ErrorItemCollection items, Graphics g);
+
+        /// <summary>
+        /// Gets the Item right under point.
+        /// </summary>
+        /// <param name="items">A collection of items</param>
+        /// <param name="g">The target graphics object</param>
+        /// <param name="point">Some client coordinate values</param>
+        /// <returns>One item in the collection or null the location doesn't match any item</returns>
+        ErrorItem ItemAt(ErrorItemCollection items, Graphics g, Point point);
+
+        /// <summary>
+        /// Gets and sets the font for this renderer
+        /// </summary>
+        Font Font { get; set; }
+    }
+}
diff --git a/src/GuiException/UiException/Controls/IStackTraceView.cs b/src/GuiException/UiException/Controls/IStackTraceView.cs
new file mode 100644
index 0000000..f7777bc
--- /dev/null
+++ b/src/GuiException/UiException/Controls/IStackTraceView.cs
@@ -0,0 +1,49 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+
+namespace NUnit.UiException.Controls
+{
+    /// <summary>
+    /// This enum defines indicators telling how instances of IStackTraceView
+    /// should deal with item order in their list.
+    /// </summary>
+    public enum ErrorListOrderPolicy
+    {
+        /// <summary>
+        /// Tells IStackTraceView to order items in the list in the same
+        /// order they appear in the stack trace.
+        /// </summary>
+        InitialOrder,
+
+        /// <summary>
+        /// Tells IStackTraceView to order items in the list in the reverse
+        /// order they appear in the stack trace. At Test Driven Development time
+        /// this value is useful to point out the location where a test is expected
+        /// to fail.
+        /// </summary>
+        ReverseOrder,
+    }
+
+    /// <summary>
+    /// The interface through which SourceCodeDisplay interacts with the error list.
+    /// 
+    /// Direct implementations are:
+    ///     - ErrorList
+    /// </summary>
+    public interface IStackTraceView
+    {
+        event EventHandler SelectedItemChanged;
+
+        string StackTrace { get; set; }
+        ErrorItem SelectedItem { get; }
+        bool AutoSelectFirstItem { get; set; }
+        ErrorListOrderPolicy ListOrderPolicy { get; set; }        
+    }
+}
diff --git a/src/GuiException/UiException/Controls/PaintLineLocation.cs b/src/GuiException/UiException/Controls/PaintLineLocation.cs
new file mode 100644
index 0000000..c9a32d3
--- /dev/null
+++ b/src/GuiException/UiException/Controls/PaintLineLocation.cs
@@ -0,0 +1,117 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+
+namespace NUnit.UiException.Controls
+{
+    /// <summary>
+    /// Encapsulate data to draw a line of text.
+    /// </summary>
+    public class PaintLineLocation
+    {
+        /// <summary>
+        /// Index of the current line.
+        /// </summary>
+        private int _lineIndex;
+
+        /// <summary>
+        /// The string value at this line.
+        /// </summary>
+        private string _text;
+
+        /// <summary>
+        /// A client coordinate from where beginning the drawing.
+        /// </summary>
+        private PointF _location;        
+
+        /// <summary>
+        /// Build a new instance of this object given some data.
+        /// </summary>
+        /// <param name="lineIndex">Index of the current line.</param>
+        /// <param name="text">String value at this line.</param>
+        /// <param name="location">Client coordinate where beginning the drawing.</param>
+        public PaintLineLocation(int lineIndex, string text, PointF location)
+        {
+            SetLine(lineIndex);
+            SetText(text);
+            SetLocation(location);
+
+            return;
+        }
+
+        /// <summary>
+        /// Index of the current line.
+        /// </summary>
+        public int LineIndex
+        {
+            get { return (_lineIndex); }
+        }
+
+        /// <summary>
+        /// String value at this line.
+        /// </summary>
+        public string Text
+        {
+            get { return (_text); }
+        }
+
+        /// <summary>
+        /// Client coordinate where to beginning the drawing.
+        /// </summary>
+        public PointF Location
+        {
+            get { return (_location); }
+        }
+       
+        public override bool Equals(object obj)
+        {
+            PaintLineLocation line;
+
+            if (obj == null ||
+                !(obj is PaintLineLocation))
+                return (false);
+
+            line = obj as PaintLineLocation;
+
+            return (line.LineIndex == LineIndex &&
+                line.Text == Text &&
+                line.Location == Location);
+        }
+
+        public override int GetHashCode() {
+            return base.GetHashCode();
+        }
+
+        public override string ToString() {
+            return ("PaintLineLocation: {" + LineIndex + ":[" + Text + "]:(" +
+                     Location.X + ", " + Location.Y + ")}");
+        }
+
+        #region private definitions
+
+        protected void SetLine(int lineIndex)
+        {
+            _lineIndex = lineIndex;
+
+            return;
+        }
+
+        protected void SetText(string text) 
+        {
+            UiExceptionHelper.CheckNotNull(text, "text");
+            _text = text;
+        }
+
+        protected void SetLocation(PointF location) {
+            _location = location;
+        }
+
+        #endregion
+    }
+}
diff --git a/src/GuiException/UiException/Controls/SourceCodeDisplay.cs b/src/GuiException/UiException/Controls/SourceCodeDisplay.cs
new file mode 100644
index 0000000..98547e5
--- /dev/null
+++ b/src/GuiException/UiException/Controls/SourceCodeDisplay.cs
@@ -0,0 +1,194 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+using System.Windows.Forms;
+using NUnit.UiException.Properties;
+using NUnit.UiException.CodeFormatters;
+
+namespace NUnit.UiException.Controls
+{
+    /// <summary>
+    /// Implements IErrorDisplay and displays data about failures and error
+    /// after a test suite run. SourceCodeDisplay is a control composed of two
+    /// views. 
+    /// 
+    /// The first view displays the stack trace in an ordered list of items
+    /// where each item contains the context about a specific failure (file, class
+    /// method, line number).
+    /// 
+    /// The second view displays a CodeBox control and shows the source code
+    /// of one element in this list when the localization is available.
+    /// </summary>
+    public class SourceCodeDisplay :
+        IErrorDisplay
+    {
+        protected IStackTraceView _stacktraceView;
+        protected ICodeView _codeView;
+        protected SplitterBox _splitter;
+        private CodeBox _codeBox;
+
+        private ToolStripButton _btnPlugin;
+        private ToolStripButton _btnSwap;
+
+        public event EventHandler SplitOrientationChanged;
+        public event EventHandler SplitterDistanceChanged;
+
+        /// <summary>
+        /// Builds a new instance of SourceCodeDisplay.
+        /// </summary>
+        public SourceCodeDisplay()
+        {
+            ErrorList errorList = new ErrorList();
+            _codeBox = new CodeBox();
+
+            _stacktraceView = errorList;
+            _stacktraceView.AutoSelectFirstItem = true;
+            _stacktraceView.SelectedItemChanged += new EventHandler(SelectedItemChanged);
+            _codeView = _codeBox;
+
+            _btnPlugin = ErrorToolbar.NewStripButton(true, "Display source code context", Resources.ImageSourceCodeDisplay, null);
+            _btnSwap = ErrorToolbar.NewStripButton(false, "ReverseOrder item order", Resources.ImageReverseItemOrder, OnClick);
+
+            SplitterBox splitter = new SplitterBox();
+            _splitter = splitter;
+            _splitter.SplitterDistanceChanged += new EventHandler(_splitter_DistanceChanged);
+            _splitter.OrientationChanged += new EventHandler(_splitter_OrientationChanged);
+
+            splitter.Control1 = errorList;
+            splitter.Control2 = _codeBox;
+
+            _codeBox.ShowCurrentLine = true;
+
+            return;
+        }
+
+        void _splitter_DistanceChanged(object sender, EventArgs e)
+        {
+            if (SplitterDistanceChanged != null)
+                SplitterDistanceChanged(sender, e);
+        }
+
+        void _splitter_OrientationChanged(object sender, EventArgs e)
+        {
+            if (SplitOrientationChanged != null)
+                SplitOrientationChanged(sender, e);
+        }
+
+        public Font CodeDisplayFont
+        {
+            get { return _codeBox.Font; }
+            set { _codeBox.Font = value; }
+        }
+
+        /// <summary>
+        /// Gets or sets a value telling whether or not to select automatically
+        /// the first localizable item each time the stack trace changes.
+        ///   When set to true, the first localizable item will be selected 
+        /// and the source code context for this item displayed automatically.
+        /// Default is True.
+        /// </summary>
+        public bool AutoSelectFirstItem
+        {
+            get { return (_stacktraceView.AutoSelectFirstItem); }
+            set { _stacktraceView.AutoSelectFirstItem = value; }
+        }
+
+        /// <summary>
+        /// Gets or sets a value defining the order of the item in the error list.
+        /// </summary>
+        public ErrorListOrderPolicy ListOrderPolicy
+        {
+            get { return (_stacktraceView.ListOrderPolicy); }
+            set { _stacktraceView.ListOrderPolicy = value; }
+        }
+
+        /// <summary>
+        /// Gets or sets the splitter orientation in the SourceCodeDisplay.
+        /// </summary>
+        public Orientation SplitOrientation
+        {
+            get { return (_splitter.Orientation); }
+            set { _splitter.Orientation = value; }
+        }
+
+        /// <summary>
+        /// Gets or sets the splitter distance in the SourceCodeDisplay.
+        /// </summary>
+        public float SplitterDistance
+        {
+            get { return (_splitter.SplitterDistance); }
+            set { _splitter.SplitterDistance = value; }
+        }
+
+        private void OnClick(object sender, EventArgs e)
+        {
+            ListOrderPolicy = ListOrderPolicy == ErrorListOrderPolicy.InitialOrder ?
+                ErrorListOrderPolicy.ReverseOrder :
+                ErrorListOrderPolicy.InitialOrder;
+
+            return;
+        }
+
+        protected void SelectedItemChanged(object sender, EventArgs e)
+        {
+            ErrorItem item;
+            IFormatterCatalog formatter;
+
+            item = _stacktraceView.SelectedItem;
+
+            if (item == null)
+            {
+                _codeView.Text = null;
+                return;
+            }
+
+            formatter = _codeView.Formatter;
+            _codeView.Language = formatter.LanguageFromExtension(item.FileExtension);
+
+            try
+            {
+                _codeView.Text = item.ReadFile();
+            }
+            catch (Exception ex)
+            {
+                _codeView.Text = String.Format(
+                    "Cannot open file: '{0}'\r\nError: '{1}'\r\n",
+                    item.Path, ex.Message);
+            }
+
+            _codeView.CurrentLine = item.LineNumber - 1;
+
+            return;
+        }
+
+        #region IErrorDisplay Membres
+
+        public ToolStripButton PluginItem
+        {
+            get { return (_btnPlugin); }
+        }
+
+        public ToolStripItem[] OptionItems
+        {
+            get { return (new ToolStripItem[] { _btnSwap }); }
+        }             
+
+        public Control Content
+        {
+            get { return (_splitter); }
+        }
+
+        public void OnStackTraceChanged(string stackTrace)
+        {
+            _stacktraceView.StackTrace = stackTrace;
+        }
+
+        #endregion        
+    }
+}
diff --git a/src/GuiException/UiException/Controls/SplitterBox.cs b/src/GuiException/UiException/Controls/SplitterBox.cs
new file mode 100644
index 0000000..ce3036c
--- /dev/null
+++ b/src/GuiException/UiException/Controls/SplitterBox.cs
@@ -0,0 +1,517 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using System.Drawing;
+using NUnit.UiException.Properties;
+using System.Diagnostics;
+
+//
+// This re-implements SplitContainer. Why re-inventing the wheel?
+// Well... I faced some strange behaviors in SplitContainer in particular
+// when I started to provide a custom paint method. It seems to me
+// that there is a kind of defect that affects how the Invalidate or
+// paint event is called. In some situations I faced a SplitContainer
+// that didn't redraw itself while having some parts of its window
+// dirty. I didn't found out the cause of the problem.
+//
+// Another feature that is quite annoying is the unability to change
+// the mouse cursor while hovering some special areas of the splitter
+// bar. Maybe there is a trick or something but the normal way doesn't
+// look like to work.
+//
+
+namespace NUnit.UiException.Controls
+{
+    /// <summary>
+    /// Implements a place holder that can be splitted either horizontally or vertically.
+    /// The SplitterBox is layouted with two place holders, respectively named Control1
+    /// and Control2 where clients can put their controls.
+    /// 
+    /// Unlike SplitContainer, the place holders in SplitterBox are the client controls
+    /// itself. The direct consequence is the layout policy will be to dock the client
+    /// controls in filling the maximum possible space.
+    /// 
+    /// SplitterBox also add three buttons on the splitter bar that to change the split
+    /// orientation and collapse either Control1 or Control2. The example below shows
+    /// how to intialize and set up SplitterBox with two controls.
+    /// <code>
+    /// // creates a new SplitterBox, with a vertical split
+    /// // and position splitter to appear in the middle of the window
+    /// SplitterBox splitter = new SplitterBox();
+    /// splitter.Orientation = Orientation.Vertical;
+    /// splitter.SplitterDistance = 0.5f;
+    /// splitter.Control1 = oneControl;
+    /// splitter.Control2 = anotherControl;
+    /// </code>
+    /// </summary>
+    public class SplitterBox : Control
+    {
+        public static readonly int SPLITTER_SIZE = 9;
+        public static readonly int SPLITTER_HALFSIZE = SPLITTER_SIZE / 2;
+        public static readonly int BUTTON_SIZE = 13;
+        
+        private Control _emptyControl1;
+        private Control _emptyControl2;
+
+        private Control _control1;
+        private Control _control2;
+
+        private Orientation _orientation;        
+        private float _x;
+        private float _y;
+
+        private Rectangle _splitterRectangle;
+        private Rectangle _collapse1Rectangle;
+        private Rectangle _collapse2Rectangle;
+        private Rectangle _directionRectangle;
+
+        private bool _movingSplitter;
+
+        private Brush _brush;
+        private Pen _pen;
+
+        private Rectangle _rVerticalCollapse1;
+        private Rectangle _rVerticalDirection;
+        private Rectangle _rVerticalCollapse2;
+
+        private Rectangle _rHorizontalCollapse1;
+        private Rectangle _rHorizontalDirection;
+        private Rectangle _rHorizontalCollapse2;
+
+        public event EventHandler OrientationChanged;
+        public event EventHandler SplitterDistanceChanged;
+
+        /// <summary>
+        /// Creates a new SplitterBox.
+        /// </summary>
+        public SplitterBox()
+        {
+            _brush = new SolidBrush(Color.FromArgb(146, 180, 224));
+            _pen = new Pen(Color.FromArgb(103, 136, 190));
+
+            _rVerticalCollapse1 = new Rectangle(0, 0, 9, 13);
+            _rVerticalDirection = new Rectangle(10, 0, 9, 13);
+            _rVerticalCollapse2 = new Rectangle(20, 0, 9, 13);
+
+            _rHorizontalCollapse1 = new Rectangle(0, 24, 13, 9);
+            _rHorizontalDirection = new Rectangle(14, 14, 13, 9);
+            _rHorizontalCollapse2 = new Rectangle(0, 14, 13, 9);     
+
+            _emptyControl1 = new Control();
+            _emptyControl2 = new Control();
+
+            Width = 150;
+            Height = 150;
+
+            _control1 = _emptyControl1;
+            _control2 = _emptyControl2;
+
+            Controls.Add(_control1);
+            Controls.Add(_control2);
+
+            _x = _y = 0.5f;
+
+            Orientation = Orientation.Vertical;
+
+            DoLayout();
+
+            return;
+        }
+
+        /// <summary>
+        /// Gets or sets the orientation of the splitter in the SplitterBox.
+        /// </summary>
+        public Orientation Orientation
+        {
+            get { return (_orientation); }
+            set { 
+                _orientation = value;
+                DoLayout();
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the splitter distance expressed as a float number in the
+        /// range [0 - 1]. A value of 0 collapses Control1 and makes Control2 take
+        /// the whole space in the window. A value of 1 collapses Control2 and makes
+        /// Control1 take the whole space in the window. A value of 0.5 makes the
+        /// splitter appear in the middle of the window.
+        /// 
+        /// Values that don't fall in [0 - 1] are automatically clipped to this range.
+        /// </summary>
+        public float SplitterDistance
+        {
+            get { return (_orientation == Orientation.Vertical ? _x : _y); }
+            set {
+                value = Math.Max(0, Math.Min(1, value));
+                if (_orientation == Orientation.Vertical)
+                    _x = value;
+                else
+                    _y = value;
+                DoLayout();
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the "first" control to be shown. This control will appear
+        /// either at the top or on the left when the orientation is respectively
+        /// vertical or horizontal.
+        ///   If the value is not null, the control will automatically be added
+        /// to the SplitterBox's hierarchy of controls.
+        ///   If the value is null, the former control is removed and replaced
+        /// by a default and empty area.
+        /// </summary>
+        public Control Control1
+        {
+            get { return (_control1); }
+            set 
+            {
+                if (_control1 == value)
+                    return;
+
+                Controls.Remove(_control1);
+                if (value == null)
+                    value = _emptyControl1;
+                _control1 = value;
+                Controls.Add(value);
+                DoLayout();
+
+                return;
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the "second" control to be shown. This control will appear
+        /// either at the bottom or on the right when the orientation is respectively
+        /// vertical or horizontal.
+        ///   If the value is not null, the control will automatically be added
+        /// to the SplitterBox's hierarchy of controls.
+        ///   If the value is null, the former control is removed and replaced
+        /// by a default and empty area.
+        /// </summary>
+        public Control Control2
+        {
+            get { return (_control2); }
+            set 
+            {
+                if (_control2 == value)
+                    return;
+
+                if (value == null)
+                    value = _emptyControl2;
+
+                Controls.Remove(_control2);
+                _control2 = value;
+                Controls.Add(value);
+                DoLayout();
+
+                return;
+            }
+        }
+
+        /// <summary>
+        /// Gets the rectangle occupied with the splitter.
+        /// </summary>
+        public Rectangle SplitterRectangle
+        {
+            get { return (_splitterRectangle); }            
+        }
+
+        /// <summary>
+        /// Sets a new location for the splitter expressed as client coordinate.
+        /// </summary>
+        /// <param name="x">The new location in pixels when orientation is set to Vertical.</param>
+        /// <param name="y">The new location in pixels when orientation is set to Horizontal.</param>
+        public void PointToSplit(int x, int y)
+        {
+            if (_orientation == Orientation.Vertical)
+            {
+                x = Math.Max(0, Math.Min(Width, x));
+                _x = (float)x / (float)Width;
+            }
+            else
+            {
+                y = Math.Max(0, Math.Min(Height, y));
+                _y = (float)y / (float)Height;
+            }
+
+            DoLayout();
+
+            return;
+        }
+
+        /// <summary>
+        /// Collapses Control1.
+        /// </summary>
+        public void CollapseControl1()
+        {
+            PointToSplit(0, 0);
+        }
+
+        /// <summary>
+        /// Collapses Control2.
+        /// </summary>
+        public void CollapseControl2()
+        {
+            PointToSplit(Width, Height);
+        }
+
+        protected Rectangle Collapse1Rectangle
+        {
+            get { return (_collapse1Rectangle); }
+        }
+
+        protected Rectangle Collapse2Rectangle
+        {
+            get { return (_collapse2Rectangle); }
+        }
+
+        protected Rectangle DirectionRectangle
+        {
+            get { return (_directionRectangle); }
+        }        
+
+        private void HorizontalLayout()
+        {
+            int x = (Width - 41) / 2;
+            int y;
+            int top;
+
+            top = (int)Math.Max(0, _y * Height - SPLITTER_HALFSIZE);
+            top = Math.Min(top, Height - SPLITTER_SIZE);
+
+            _splitterRectangle = new Rectangle(0, top, Width, SPLITTER_SIZE);
+
+            y = _splitterRectangle.Top;
+
+            _collapse1Rectangle = new Rectangle(x, y, BUTTON_SIZE, SPLITTER_SIZE);
+            _directionRectangle = new Rectangle(_collapse1Rectangle.Right + 2, y, BUTTON_SIZE, SPLITTER_SIZE);
+            _collapse2Rectangle = new Rectangle(_directionRectangle.Right + 2, y, BUTTON_SIZE, SPLITTER_SIZE);
+
+            _control1.SetBounds(0, 0, Width, _splitterRectangle.Top);
+            _control2.SetBounds(0, _splitterRectangle.Bottom, Width, Height - _splitterRectangle.Bottom);
+
+            return;
+        }
+
+        private void VerticalLayout()
+        {
+            int y = (Height - 41) / 2;
+            int left;
+            int x;
+
+            left = (int)Math.Max(0, _x * Width - SPLITTER_HALFSIZE);
+            left = Math.Min(left, Width - SPLITTER_SIZE);
+
+            _splitterRectangle = new Rectangle(left, 0, SPLITTER_SIZE, Height);
+
+            x = _splitterRectangle.Left;
+
+            _collapse1Rectangle = new Rectangle(x, y, SPLITTER_SIZE, BUTTON_SIZE);
+            _directionRectangle = new Rectangle(x, _collapse1Rectangle.Bottom + 2, SPLITTER_SIZE, BUTTON_SIZE);
+            _collapse2Rectangle = new Rectangle(x, _directionRectangle.Bottom + 2, SPLITTER_SIZE, BUTTON_SIZE);
+
+            _control1.SetBounds(0, 0, _splitterRectangle.Left, Height);
+            _control2.SetBounds(_splitterRectangle.Right, 0, Width - _splitterRectangle.Right, Height);
+
+            return;
+        }
+
+        private void DoLayout()
+        {
+            if (_orientation == Orientation.Vertical)
+                VerticalLayout();
+            else
+                HorizontalLayout();
+
+            Invalidate();
+
+            return;
+        }
+
+        protected override void OnSizeChanged(EventArgs e)
+        {
+            if (_control1 != null)
+                DoLayout();
+            base.OnSizeChanged(e);
+        }
+
+        protected override void OnMouseLeave(EventArgs e)
+        {
+            Cursor = Cursors.Default;
+            base.OnMouseLeave(e);
+        }
+
+        protected override void OnMouseDown(MouseEventArgs e)
+        {
+            UpdateCursor(e.X, e.Y);
+
+            if (_splitterRectangle.Contains(e.X, e.Y))
+            {
+                if (HoveringButtons(e.X, e.Y))
+                    return;
+
+                _movingSplitter = true;
+            }
+
+            base.OnMouseDown(e);
+
+            return;
+        }
+
+        protected override void OnMouseMove(MouseEventArgs e)
+        {
+            UpdateCursor(e.X, e.Y);
+
+            if (_movingSplitter == true)
+            {                
+                PointToSplit(e.X, e.Y);
+                Invalidate();
+            }
+
+            base.OnMouseMove(e);
+
+            return;
+        }
+
+        protected override void OnMouseUp(MouseEventArgs e)
+        {
+            bool wasMovingSplitter;
+
+            UpdateCursor(e.X, e.Y);
+
+            wasMovingSplitter = _movingSplitter;
+            _movingSplitter = false;
+
+            if (wasMovingSplitter)
+                FireSplitterDistanceChanged();
+            else
+            {
+                if (_collapse1Rectangle.Contains(e.X, e.Y))
+                {
+                    CollapseControl1();
+                    FireSplitterDistanceChanged();
+                    return;
+                }
+
+                if (_collapse2Rectangle.Contains(e.X, e.Y))
+                {
+                    CollapseControl2();
+                    FireSplitterDistanceChanged();
+                    return;
+                }
+
+                if (_directionRectangle.Contains(e.X, e.Y))
+                {
+                    Orientation = (_orientation == Orientation.Vertical) ?
+                            Orientation.Horizontal :
+                            Orientation.Vertical;
+
+                    FireOrientationChanged();
+
+                    return;
+                }
+            }
+
+            base.OnMouseUp(e);
+
+            return;
+        }
+
+        private void FireOrientationChanged()
+        {
+            if (OrientationChanged != null)
+                OrientationChanged(this, EventArgs.Empty);
+        }
+
+        private void FireSplitterDistanceChanged()
+        {
+            if (SplitterDistanceChanged != null)
+                SplitterDistanceChanged(this, EventArgs.Empty);
+        }
+
+        protected override void OnPaint(PaintEventArgs e)
+        {
+            e.Graphics.FillRectangle(_brush, _splitterRectangle);
+
+            if (Orientation == Orientation.Vertical)
+            {
+                e.Graphics.DrawLine(_pen, _splitterRectangle.Left, 0,
+                    SplitterRectangle.Left, _splitterRectangle.Height);
+                e.Graphics.DrawLine(_pen, _splitterRectangle.Right - 1, 0,
+                    SplitterRectangle.Right - 1, _splitterRectangle.Height);
+
+                e.Graphics.DrawImage(Resources.ImageSplitterBox,
+                    _collapse1Rectangle,
+                    _rVerticalCollapse1,
+                    GraphicsUnit.Pixel);
+
+                e.Graphics.DrawImage(Resources.ImageSplitterBox,
+                    _directionRectangle,
+                    _rVerticalDirection,
+                    GraphicsUnit.Pixel);
+
+                e.Graphics.DrawImage(Resources.ImageSplitterBox,
+                    _collapse2Rectangle,
+                    _rVerticalCollapse2,
+                    GraphicsUnit.Pixel);
+            }
+            else
+            {
+                e.Graphics.DrawLine(_pen, 0, _splitterRectangle.Top,
+                    Width, _splitterRectangle.Top);
+                e.Graphics.DrawLine(_pen, 0, _splitterRectangle.Bottom - 1,
+                    Width, _splitterRectangle.Bottom - 1);
+
+                e.Graphics.DrawImage(Resources.ImageSplitterBox,
+                    _collapse1Rectangle,
+                    _rHorizontalCollapse1,
+                    GraphicsUnit.Pixel);
+
+                e.Graphics.DrawImage(Resources.ImageSplitterBox,
+                    _directionRectangle,
+                    _rHorizontalDirection,
+                    GraphicsUnit.Pixel);
+
+                e.Graphics.DrawImage(Resources.ImageSplitterBox,
+                    _collapse2Rectangle,
+                    _rHorizontalCollapse2,
+                    GraphicsUnit.Pixel);
+            }
+
+            base.OnPaint(e);
+
+            return;
+        }
+
+        private bool HoveringButtons(int x, int y)
+        {
+            if (!SplitterRectangle.Contains(x, y))
+                return (false);
+
+            return (_collapse1Rectangle.Contains(x, y) ||
+                    _collapse2Rectangle.Contains(x, y) ||
+                    _directionRectangle.Contains(x, y));
+        }
+
+        private void UpdateCursor(int x, int y)
+        {
+            if (!SplitterRectangle.Contains(x, y) ||
+                HoveringButtons(x, y))
+            {
+                Cursor = Cursors.Default;
+                return;
+            }
+
+            Cursor = (Orientation == Orientation.Vertical ? Cursors.VSplit : Cursors.HSplit);
+
+            return;
+        }
+    }
+}
diff --git a/src/GuiException/UiException/Controls/StackTraceDisplay.cs b/src/GuiException/UiException/Controls/StackTraceDisplay.cs
new file mode 100644
index 0000000..e40a5d6
--- /dev/null
+++ b/src/GuiException/UiException/Controls/StackTraceDisplay.cs
@@ -0,0 +1,94 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using System.Drawing;
+using NUnit.UiException.Properties;
+
+namespace NUnit.UiException.Controls
+{
+    /// <summary>
+    /// Implements IErrorDisplay to show the actual stack trace in a TextBox control.
+    /// </summary>
+    public class StackTraceDisplay :
+        UserControl,
+        IErrorDisplay
+    {
+        private TextBox _textContent;
+        private ToolStripButton _btnPlugin;
+        private ToolStripButton _btnCopy;
+
+        /// <summary>
+        /// Builds a new instance of StackTraceDisplay.
+        /// </summary>
+        public StackTraceDisplay()
+        {
+            _btnPlugin = ErrorToolbar.NewStripButton(true, "Display actual stack trace", Resources.ImageStackTraceDisplay, null);
+            _btnCopy = ErrorToolbar.NewStripButton(false, "Copy stack trace to clipboard", Resources.ImageCopyToClipboard, OnClick);
+
+            _textContent = new TextBox();
+            _textContent.ReadOnly = true;
+            _textContent.Multiline = true;
+            _textContent.ScrollBars = ScrollBars.Both;
+
+           return;
+        }
+
+        protected override void OnFontChanged(EventArgs e)
+        {
+            _textContent.Font = this.Font;
+
+            base.OnFontChanged(e);
+        }
+
+        /// <summary>
+        /// Copies the actual stack trace to the clipboard.
+        /// </summary>
+        public void CopyToClipBoard()
+        {
+            if (String.IsNullOrEmpty(_textContent.Text))
+            {
+                Clipboard.Clear();
+                return;
+            }
+
+            Clipboard.SetText(_textContent.Text);
+
+            return;
+        }
+
+        #region IErrorDisplay Membres
+
+        public ToolStripButton PluginItem
+        {
+            get { return (_btnPlugin); }
+        }
+
+        public ToolStripItem[] OptionItems
+        {
+            get { return (new ToolStripItem[] { _btnCopy }); }
+        }
+        
+        public Control Content
+        {
+            get { return (_textContent); }
+        }
+
+        public void OnStackTraceChanged(string stackTrace)
+        {
+            _textContent.Text = stackTrace;
+        }
+
+        #endregion
+
+        private void OnClick(object sender, EventArgs args)
+        {
+            CopyToClipBoard();
+        }
+    }
+}
diff --git a/src/GuiException/UiException/DefaultTextManager.cs b/src/GuiException/UiException/DefaultTextManager.cs
new file mode 100644
index 0000000..74e529b
--- /dev/null
+++ b/src/GuiException/UiException/DefaultTextManager.cs
@@ -0,0 +1,141 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Collections;
+
+namespace NUnit.UiException
+{
+    /// <summary>
+    /// This is a default implementation of ITextManager interface.
+    /// </summary>
+    public class DefaultTextManager :
+        IEnumerable,
+        ITextManager
+    {
+        /// <summary>
+        /// Hold the text to be managed by this instance.
+        /// </summary>
+        private string _text;
+
+        /// <summary>
+        /// Array of strings where each string is a line in this text.
+        /// </summary>
+        private List<string> _lines;
+
+        /// <summary>
+        /// Stores the character count of the longest line in this text.
+        /// </summary>
+        private int _maxLength;
+
+        /// <summary>
+        /// Builds a new instance of TextManager.
+        /// </summary>
+        public DefaultTextManager()
+        {
+            _lines = new List<string>();
+            Text = "";
+
+            return;
+        }
+
+        /// <summary>
+        /// Gets the number of lines in the text.
+        /// </summary>
+        public int LineCount
+        {
+            get { return (_lines.Count); }
+        }
+
+        /// <summary>
+        /// Gets or sets the text to be managed by this object.
+        /// </summary>
+        public string Text
+        {
+            get { return (_text); }
+            set
+            {
+                if (value == null)
+                    value = "";
+
+                _text = value;
+                _populateLineCollection(value);
+            }
+        }
+
+        /// <summary>
+        /// Gets the line of text at the specified startingPosition.
+        /// (zero based startingPosition).
+        /// </summary>
+        /// <param name="lineIndex">The startingPosition of the line to get.</param>
+        /// <returns>A string that represents the content of the specified line without
+        /// the trailing characters.</returns>
+        public string GetTextAt(int lineIndex)
+        {
+            return (_lines[lineIndex]);
+        }
+
+        /// <summary>
+        /// Gets the character count of the longest line in this text.
+        /// </summary>
+        public int MaxLength
+        {
+            get { return (_maxLength); }
+        }
+
+        #region private definitions
+
+        /// <summary>
+        /// setup member data with the input text.
+        /// </summary>
+        private void _populateLineCollection(string text)
+        {
+            string line;
+            int textIndex;
+            int newIndex;
+
+            textIndex = 0;
+
+            _lines.Clear();
+            _maxLength = 0;
+
+            while ((newIndex = text.IndexOf("\n", textIndex, StringComparison.Ordinal)) > textIndex)
+            {
+                line = text.Substring(textIndex, newIndex - textIndex).TrimEnd();
+                _maxLength = Math.Max(_maxLength, line.Length);
+
+                _lines.Add(line);
+                textIndex = newIndex + 1;
+            }
+
+            if (textIndex < text.Length)
+            {
+                line = text.Substring(textIndex).TrimEnd();
+                _maxLength = Math.Max(_maxLength, line.Length);
+                _lines.Add(line);
+            }
+
+            return;
+        }
+
+        #endregion
+
+        #region IEnumerable Membres
+
+        /// <summary>
+        /// Gets an IEnumerator that iterate through each line of the
+        /// current text. 
+        /// </summary>
+        /// <returns>An IEnumerator that iterate through each line of this text.</returns>
+        public IEnumerator GetEnumerator()
+        {
+            return (_lines.GetEnumerator());
+        }
+
+        #endregion      
+    }
+}
diff --git a/src/GuiException/UiException/ExceptionItem.cs b/src/GuiException/UiException/ExceptionItem.cs
new file mode 100644
index 0000000..4b772a0
--- /dev/null
+++ b/src/GuiException/UiException/ExceptionItem.cs
@@ -0,0 +1,252 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.IO;
+
+namespace NUnit.UiException
+{    
+    /// <summary>
+    /// (Formerly named ExceptionItem)
+    /// 
+    /// This is the output analysis of one error line coming from
+    /// a stack trace that still gathers the same data but in more
+    /// convenient way to be read from.
+    ///   An ErrorItem represents one error with possible location
+    /// informations such as:
+    ///   - filename where the error has occured
+    ///   - file's line number
+    ///   - method name
+    /// </summary>
+    public class ErrorItem
+    {
+        /// <summary>
+        /// An access path to the source file referred by this item.
+        /// </summary>
+        private string _path;
+
+        /// <summary>
+        /// The full qualified name of the member method referred by this item.
+        /// </summary>
+        private string _fullyQualifiedMethodName;
+
+        /// <summary>
+        /// The line index where the exception occured.
+        /// </summary>
+        private int _line;
+
+        /// <summary>
+        /// Store the content of the file pointed by _path.
+        /// </summary>
+        private string _text;
+      
+        /// <summary>
+        /// Create an instance of ErrorItem that
+        /// has source code attachments.
+        /// </summary>
+        public ErrorItem(string path, int lineNumber)
+        {
+            UiExceptionHelper.CheckNotNull(path, "path");
+
+            _path = path;
+            _line = lineNumber;
+
+            return;
+        }
+
+        /// <summary>
+        /// Create a new exception item.
+        /// </summary>
+        /// <param name="path">An absolute path to the source code file.</param>
+        /// <param name="fullMethodName">A full qualified name of a member method.</param>
+        /// <param name="lineNumber">A line index where the exception occured.</param>
+        public ErrorItem(string path, string fullMethodName, int lineNumber)
+        {
+            _path = path;
+            _fullyQualifiedMethodName = fullMethodName;
+            _line = lineNumber;
+
+            return;
+        }
+
+        /// <summary>
+        /// Create an instance of ErrorItem that doesn't have
+        /// any source code attachments.
+        /// </summary>
+        public ErrorItem()
+        {
+            // nothing to do
+        }
+
+        /// <summary>
+        /// Reads and returns the part of Path that contains the filename
+        /// of the source code file.
+        /// </summary>
+        public string FileName 
+        {
+            get { return (System.IO.Path.GetFileName(_path)); }
+        }
+
+        /// <summary>
+        /// Gets the absolute path to the source code file.
+        /// </summary>
+        public string Path 
+        {
+            get { return (_path); }
+        }
+
+        /// <summary>
+        /// Returns the file language - e.g.: the string after
+        /// the last dot or null -
+        /// </summary>
+        public string FileExtension
+        {
+            get 
+            {
+                int dotIndex;
+
+                if (_path == null)
+                    return (null);
+
+                dotIndex = _path.LastIndexOf(".", StringComparison.Ordinal);
+                if (dotIndex > -1 && dotIndex < _path.Length - 1)
+                    return (_path.Substring(dotIndex + 1));
+
+                return (null); 
+            }
+        }
+
+        /// <summary>
+        /// Gets the full qualified name of the member method.
+        /// </summary>
+        public string FullyQualifiedMethodName
+        {
+            get { return (_fullyQualifiedMethodName); }
+        }
+
+        /// <summary>
+        /// Reads and return the method part from the FullyQualifiedMethodName.
+        /// The value contains the signature of the method.
+        /// </summary>
+        public string MethodName
+        {
+            get
+            {
+                int index;
+
+                if (FullyQualifiedMethodName == null)
+                    return ("");
+
+                if ((index = FullyQualifiedMethodName.LastIndexOf(".", 
+                            StringComparison.Ordinal)) == -1)
+                    return (FullyQualifiedMethodName);
+
+                return (FullyQualifiedMethodName.Substring(index + 1));
+            }
+        }
+
+        /// <summary>
+        /// Gets the method name without the argument list.
+        /// </summary>
+        public string BaseMethodName
+        {
+            get
+            {
+                string method = MethodName;
+                int index = method.IndexOf("(", StringComparison.Ordinal);
+
+                if (index > 0)
+                    return (method.Substring(0, index));
+
+                return (method);
+            }
+        }
+
+        /// <summary>
+        /// Reads and returns the class part from the FullyQualifiedMethodName.
+        /// </summary>
+        public string ClassName
+        {
+            get
+            {
+                int end_index;
+                int start_index;
+
+                if (FullyQualifiedMethodName == null)
+                    return ("");
+
+                if ((end_index = FullyQualifiedMethodName.LastIndexOf(".", 
+                                StringComparison.Ordinal)) == -1)
+                    return ("");
+
+                start_index = end_index - 1;
+                while (start_index > 0 && FullyQualifiedMethodName[start_index] != '.')
+                    start_index--;
+
+                if (start_index >= 0 && FullyQualifiedMethodName[start_index] == '.')
+                    start_index++;
+
+                return (FullyQualifiedMethodName.Substring(start_index, end_index - start_index));
+            }
+        }
+
+        /// <summary>
+        /// Gets the line number where the exception occured.
+        /// </summary>
+        public int LineNumber 
+        {
+            get { return (_line); }
+        }
+
+        /// <summary>
+        /// Gets a boolean that says whether this item has source
+        /// code localization attachments.
+        /// </summary>
+        public bool HasSourceAttachment {
+            get { return (_path != null); }
+        }
+
+        /// <summary>
+        /// Read and return the content of the underlying file. If the file
+        /// cannot be found or read an exception is raised.
+        /// </summary>
+        public string ReadFile()
+        {
+            if (!System.IO.File.Exists(_path))
+                throw new FileNotFoundException("File does not exist. File: " + _path);
+
+            if (_text == null)
+            {
+                StreamReader rder = new StreamReader(_path);
+                _text = rder.ReadToEnd();
+                rder.Close();
+            }
+
+            return (_text);
+        }
+
+        public override string ToString() {
+            return ("TraceItem: {'" + _path + "', " + _fullyQualifiedMethodName + ", " + _line + "}");
+        }
+
+        public override bool Equals(object obj)
+        {
+            ErrorItem item = obj as ErrorItem;
+
+            if (item == null)
+                return (false);
+
+            return (_path == item._path &&
+                    _fullyQualifiedMethodName == item._fullyQualifiedMethodName &&
+                    _line == item._line);
+        }
+
+        public override int GetHashCode() {
+            return base.GetHashCode();
+        }
+    }
+}
diff --git a/src/GuiException/UiException/ExceptionItemCollection.cs b/src/GuiException/UiException/ExceptionItemCollection.cs
new file mode 100644
index 0000000..3b56463
--- /dev/null
+++ b/src/GuiException/UiException/ExceptionItemCollection.cs
@@ -0,0 +1,108 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Collections;
+
+namespace NUnit.UiException
+{
+    /// <summary>
+    /// (formerly named ExceptionItemCollection)
+    /// 
+    /// Manages an ordered set of ErrorItem.
+    /// </summary>
+    public class ErrorItemCollection :
+        IEnumerable
+    {
+        /// <summary>
+        /// The underlying item list.
+        /// </summary>
+        List<ErrorItem> _items;
+
+        /// <summary>
+        /// Build a new ErrorItemCollection.
+        /// </summary>
+        public ErrorItemCollection()
+        {
+            _items = new List<ErrorItem>();
+
+            return;
+        }
+
+        /// <summary>
+        /// Gets the number of item in this collection.
+        /// </summary>
+        public int Count {
+            get { return (_items.Count); }
+        }
+
+        /// <summary>
+        /// Gets the ErrorItem at the specified index.
+        /// </summary>
+        /// <param name="index">The index of the wanted ErrorItem.</param>
+        /// <returns>The ErrorItem.</returns>
+        public ErrorItem this[int index] {
+            get { return (_items[index]); }
+        }
+
+        /// <summary>
+        /// Appends the given item to the end of the collection.
+        /// </summary>
+        /// <param name="item">The ErrorItem to be added to the collection.</param>
+        public void Add(ErrorItem item)
+        {
+            UiExceptionHelper.CheckNotNull(item, "item");
+            _items.Add(item);
+
+            return;
+        }
+
+        /// <summary>
+        /// Clears all items from this collection.
+        /// </summary>
+        public void Clear()
+        {
+            if (_items.Count == 0)
+                return;
+
+            _items.Clear();
+
+            return;
+        }
+
+        /// <summary>
+        /// Checks whether the given item belongs to this collection.
+        /// </summary>
+        /// <param name="item">The item to be checked.</param>
+        /// <returns>True if the item belongs to this collection.</returns>
+        public bool Contains(ErrorItem item) {
+            return (_items.Contains(item));
+        }        
+
+        /// <summary>
+        /// Reverses the sequence order of this collection.
+        /// </summary>
+        public void Reverse()
+        {
+            _items.Reverse();
+        }
+
+        #region IEnumerable Membres
+
+        /// <summary>
+        /// Gets an IEnumerator able to iterate through all ExceptionItems
+        /// managed by this collection.
+        /// </summary>
+        /// <returns>An iterator to be used to iterator through all items
+        /// in this collection.</returns>
+        public IEnumerator GetEnumerator() {
+            return (_items.GetEnumerator());
+        }
+
+        #endregion
+    }
+}
diff --git a/src/GuiException/UiException/ITextManager.cs b/src/GuiException/UiException/ITextManager.cs
new file mode 100644
index 0000000..acfca6f
--- /dev/null
+++ b/src/GuiException/UiException/ITextManager.cs
@@ -0,0 +1,42 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace NUnit.UiException
+{
+    /// <summary>
+    /// Provides an abstract way to manipulate a text as a whole and as separate
+    /// sequences that can randomly be accessed one line at a time.
+    /// </summary>
+    public interface ITextManager
+    {
+        /// <summary>
+        /// Gets the number of line in text managed by this object.
+        /// </summary>
+        int LineCount { get; }
+
+        /// <summary>
+        /// Gets the character count of the longest line in the text managed
+        /// by this object.
+        /// </summary>
+        int MaxLength { get; }
+
+        /// <summary>
+        /// Gets the complete text managed by this object.
+        /// </summary>
+        string Text { get; }
+
+        /// <summary>
+        /// Gets a string filled with all characters in the line
+        /// at the specified startingPosition without the trailing '\r\n' characters.
+        /// </summary>
+        /// <param name="lineIndex"></param>
+        /// <returns></returns>
+        string GetTextAt(int lineIndex);
+    }
+}
diff --git a/src/GuiException/UiException/Properties/Resources.Designer.cs b/src/GuiException/UiException/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..13acf1b
--- /dev/null
+++ b/src/GuiException/UiException/Properties/Resources.Designer.cs
@@ -0,0 +1,112 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     Ce code a été généré par un outil.
+//     Version du runtime :2.0.50727.1434
+//
+//     Les modifications apportées à ce fichier peuvent provoquer un comportement incorrect et seront perdues si
+//     le code est régénéré.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace NUnit.UiException.Properties {
+    using System;
+    
+    
+    /// <summary>
+    ///   Une classe de ressource fortement typée destinée, entre autres, à la consultation des chaînes localisées.
+    /// </summary>
+    // Cette classe a été générée automatiquement par la classe StronglyTypedResourceBuilder
+    // à l'aide d'un outil, tel que ResGen ou Visual Studio.
+    // Pour ajouter ou supprimer un membre, modifiez votre fichier .ResX, puis réexécutez ResGen
+    // avec l'option /str ou régénérez votre projet VS.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources() {
+        }
+        
+        /// <summary>
+        ///   Retourne l'instance ResourceManager mise en cache utilisée par cette classe.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("NUnit.UiException.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Remplace la propriété CurrentUICulture du thread actuel pour toutes
+        ///   les recherches de ressources à l'aide de cette classe de ressource fortement typée.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        internal static System.Drawing.Bitmap ImageCopyToClipboard {
+            get {
+                object obj = ResourceManager.GetObject("ImageCopyToClipboard", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap ImageErrorBrowserHeader {
+            get {
+                object obj = ResourceManager.GetObject("ImageErrorBrowserHeader", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap ImageErrorList {
+            get {
+                object obj = ResourceManager.GetObject("ImageErrorList", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap ImageReverseItemOrder {
+            get {
+                object obj = ResourceManager.GetObject("ImageReverseItemOrder", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap ImageSourceCodeDisplay {
+            get {
+                object obj = ResourceManager.GetObject("ImageSourceCodeDisplay", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap ImageSplitterBox {
+            get {
+                object obj = ResourceManager.GetObject("ImageSplitterBox", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap ImageStackTraceDisplay {
+            get {
+                object obj = ResourceManager.GetObject("ImageStackTraceDisplay", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+    }
+}
diff --git a/src/GuiException/UiException/Properties/Resources.resx b/src/GuiException/UiException/Properties/Resources.resx
new file mode 100644
index 0000000..ec1d525
--- /dev/null
+++ b/src/GuiException/UiException/Properties/Resources.resx
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="ImageCopyToClipboard" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>../../../../src/GuiException/UiException/Resources/ImageCopyToClipboard.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="ImageErrorBrowserHeader" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>../../../../src/GuiException/UiException/Resources/ImageErrorBrowserHeader.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="ImageErrorList" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>../../../../src/GuiException/UiException/Resources/ImageErrorList.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="ImageReverseItemOrder" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>../../../../src/GuiException/UiException/Resources/ImageReverseItemOrder.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="ImageSourceCodeDisplay" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>../../../../src/GuiException/UiException/Resources/ImageSourceCodeDisplay.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="ImageSplitterBox" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>../../../../src/GuiException/UiException/Resources/ImageSplitterBox.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="ImageStackTraceDisplay" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>../../../../src/GuiException/UiException/Resources/ImageStackTraceDisplay.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+</root>
diff --git a/src/GuiException/UiException/Resources/ImageCopyToClipboard.png b/src/GuiException/UiException/Resources/ImageCopyToClipboard.png
new file mode 100644
index 0000000..29ca766
Binary files /dev/null and b/src/GuiException/UiException/Resources/ImageCopyToClipboard.png differ
diff --git a/src/GuiException/UiException/Resources/ImageErrorBrowserHeader.png b/src/GuiException/UiException/Resources/ImageErrorBrowserHeader.png
new file mode 100644
index 0000000..dea17b8
Binary files /dev/null and b/src/GuiException/UiException/Resources/ImageErrorBrowserHeader.png differ
diff --git a/src/GuiException/UiException/Resources/ImageErrorList.png b/src/GuiException/UiException/Resources/ImageErrorList.png
new file mode 100644
index 0000000..e73de79
Binary files /dev/null and b/src/GuiException/UiException/Resources/ImageErrorList.png differ
diff --git a/src/GuiException/UiException/Resources/ImageReverseItemOrder.png b/src/GuiException/UiException/Resources/ImageReverseItemOrder.png
new file mode 100644
index 0000000..83f1ba9
Binary files /dev/null and b/src/GuiException/UiException/Resources/ImageReverseItemOrder.png differ
diff --git a/src/GuiException/UiException/Resources/ImageSourceCodeDisplay.png b/src/GuiException/UiException/Resources/ImageSourceCodeDisplay.png
new file mode 100644
index 0000000..0d61454
Binary files /dev/null and b/src/GuiException/UiException/Resources/ImageSourceCodeDisplay.png differ
diff --git a/src/GuiException/UiException/Resources/ImageSplitterBox.png b/src/GuiException/UiException/Resources/ImageSplitterBox.png
new file mode 100644
index 0000000..909efe0
Binary files /dev/null and b/src/GuiException/UiException/Resources/ImageSplitterBox.png differ
diff --git a/src/GuiException/UiException/Resources/ImageStackTraceDisplay.png b/src/GuiException/UiException/Resources/ImageStackTraceDisplay.png
new file mode 100644
index 0000000..e98b771
Binary files /dev/null and b/src/GuiException/UiException/Resources/ImageStackTraceDisplay.png differ
diff --git a/src/GuiException/UiException/StackTraceAnalysers/FunctionParser.cs b/src/GuiException/UiException/StackTraceAnalysers/FunctionParser.cs
new file mode 100644
index 0000000..24016c6
--- /dev/null
+++ b/src/GuiException/UiException/StackTraceAnalysers/FunctionParser.cs
@@ -0,0 +1,92 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.UiException.StackTraceAnalyzers;
+
+namespace NUnit.UiException.StackTraceAnalysers
+{
+    /// <summary>
+    /// This class is responsible for locating and initializing
+    /// RawError.Function property with the function name as it
+    /// is mentioned in the stack trace line.
+    ///   To work correclty, the class makes some
+    /// assumptions concerning the function format.
+    ///   A function name is made of two parts: [name][args]
+    /// where [name] refers to a string of characters that doesn't
+    /// contain ' ' and [args] refers to a string delimited by
+    /// '(' and ')'.
+    /// </summary>
+    public class FunctionParser :
+        IErrorParser
+    {
+        #region IErrorParser Membres
+
+        /// <summary>
+        /// Try to match a function name by reading RawError.Input.
+        /// If a match is found, the method outputs the result into
+        /// RawError.Function and returns true.
+        /// </summary>
+        /// <param name="parser">An instance of parser, this parameter
+        /// cannot be null.</param>
+        /// <param name="args">An instance of RawError. This parameter
+        /// cannot be null.</param>
+        /// <returns>True if a match occurs, false otherwise.</returns>
+        public bool TryParse(StackTraceParser parser, RawError args)
+        {
+            int posEndingParenthesis;
+            int posOpeningParenthesis;
+            int posName;
+            int endName;
+            string res;
+            int i;
+
+            UiExceptionHelper.CheckNotNull(parser, "parser");
+            UiExceptionHelper.CheckNotNull(args, "args");
+
+            posEndingParenthesis = args.Input.LastIndexOf(")");
+            posOpeningParenthesis = args.Input.LastIndexOf("(");
+
+            if (posEndingParenthesis == -1 || posOpeningParenthesis == -1 ||
+                posOpeningParenthesis > posEndingParenthesis)
+                return (false);
+
+            endName = posOpeningParenthesis;
+            for (i = posOpeningParenthesis - 1; i >= 0; i--)
+            {
+                if (args.Input[i] != ' ')
+                    break;
+
+                endName = i;
+            }
+
+            posName = -1;
+            for (i = endName - 1; i >= 0; i--)
+            {
+                if (args.Input[i] == ' ')
+                    break;
+
+                posName = i;
+            }
+
+            // Added this test to allow for odd case where we would
+            // otherwise include the leading "at" or "à" in name.
+            if (posName == 0)
+                return false;
+
+            if (posName == -1)
+                return (false);
+
+            res = args.Input.Substring(posName, posEndingParenthesis - posName + 1);
+            args.Function = res;
+            
+            return (true);
+        }       
+
+        #endregion
+    }
+}
diff --git a/src/GuiException/UiException/StackTraceAnalysers/IErrorParser.cs b/src/GuiException/UiException/StackTraceAnalysers/IErrorParser.cs
new file mode 100644
index 0000000..5f8dba8
--- /dev/null
+++ b/src/GuiException/UiException/StackTraceAnalysers/IErrorParser.cs
@@ -0,0 +1,65 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace NUnit.UiException.StackTraceAnalyzers
+{
+    public class RawError
+    {
+        private string _function;
+        private string _path;
+        private int _line;
+        private string _input;
+
+        public RawError(string input)
+        {
+            UiExceptionHelper.CheckNotNull(input, "input");
+            _input = input;
+
+            return;
+        }
+
+        public string Input
+        {
+            get { return (_input); }
+        }
+
+        public string Function
+        {
+            get { return (_function); }
+            set { _function = value; }
+        }
+
+        public string Path
+        {
+            get { return (_path); }
+            set { _path = value; }
+        }
+
+        public int Line
+        {
+            get { return (_line); }
+            set { _line = value; }
+        }
+
+        public ErrorItem ToErrorItem()
+        {
+            UiExceptionHelper.CheckTrue(
+                _function != null,
+                "Cannot create instance of ErrorItem without a valid value in Function",
+                "Function");
+
+            return (new ErrorItem(_path, _function, _line));
+        }
+    }
+
+    public interface IErrorParser
+    {
+        bool TryParse(StackTraceParser parser, RawError args);
+    }
+}
diff --git a/src/GuiException/UiException/StackTraceAnalysers/LineNumberParser.cs b/src/GuiException/UiException/StackTraceAnalysers/LineNumberParser.cs
new file mode 100644
index 0000000..6711c79
--- /dev/null
+++ b/src/GuiException/UiException/StackTraceAnalysers/LineNumberParser.cs
@@ -0,0 +1,101 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.UiException.StackTraceAnalyzers;
+
+namespace NUnit.UiException.StackTraceAnalysers
+{
+    /// <summary>
+    /// LineNumberParser tries to match a line number information
+    /// given in a stack trace line. It relies on the following
+    /// assumptions:
+    ///     - the line number is located after the last ':' character,
+    ///     - the line number is not part of a word,
+    ///     - there cannot be more than one line number after the last ':'
+    ///     - the line number must be > 0
+    /// </summary>
+    public class LineNumberParser :
+        IErrorParser
+    {
+        #region IErrorParser Membres
+
+        /// <summary>
+        /// Reads args.Input and try to locate a line number information.
+        /// If a match occurs the method fills args.Line with the identified
+        /// integer.
+        /// </summary>
+        /// <param name="parser">The StackTraceParser instance. The
+        /// parameter cannot be null.</param>
+        /// <param name="args">The RawError instance from where read and
+        /// write Input and Line properties. The parameter cannot be null.</param>
+        /// <returns>True if a match occurs, false otherwise.</returns>
+        public bool TryParse(StackTraceParser parser, RawError args)
+        {
+            int posTrailingColon;
+            int line;
+
+            UiExceptionHelper.CheckNotNull(parser, "parser");
+            UiExceptionHelper.CheckNotNull(args, "args");
+
+            if ((posTrailingColon = args.Input.LastIndexOf(":")) == -1)
+                return (false);
+
+            if ((line = lookForLastInteger(args.Input, posTrailingColon)) <= 0)                
+                return (false);
+
+            args.Line = line;
+
+            return (true);
+        }
+
+        #endregion
+
+        private int lookForLastInteger(string error, int startIndex)
+        {
+            int res;
+            int workPos;
+
+            for (; startIndex < error.Length; ++startIndex)
+                if (error[startIndex] >= '0' && error[startIndex] <= '9')
+                {
+                    // the integer we are looking for
+                    // is following either a ' ' or ':' character.
+                    // ex: "line 42" or ":42"
+                    // but rejects values like: "line42"
+
+                    if (startIndex > 0 &&
+                        error[startIndex - 1] != ' ' &&
+                        error[startIndex - 1] != ':')
+                        return (-1);
+
+                    break;
+                }
+
+            if (startIndex >= error.Length)
+                return (-1);
+
+            // it is assumes that only one line number information will be
+            // present on a line (if any). If two integers are found (should
+            // never happen) we cannot distinguish which one refers to the
+            // line number. In this case we prefer returning -1.
+            // The next loop checks this point by moving the cursor to a
+            // place after the current number and expects the inner call
+            // to return -1
+
+            for (workPos = startIndex; workPos < error.Length; ++workPos)
+                if (error[workPos] < '0' || error[workPos] > '9')
+                    break;
+            if (lookForLastInteger(error, workPos) != -1)
+                return (-1);
+
+            Int32.TryParse(error.Substring(startIndex, workPos-startIndex), out res);
+
+            return (res);
+        }
+    }
+}
diff --git a/src/GuiException/UiException/StackTraceAnalysers/PathCompositeParser.cs b/src/GuiException/UiException/StackTraceAnalysers/PathCompositeParser.cs
new file mode 100644
index 0000000..01beaa0
--- /dev/null
+++ b/src/GuiException/UiException/StackTraceAnalysers/PathCompositeParser.cs
@@ -0,0 +1,102 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.UiException.StackTraceAnalyzers;
+
+namespace NUnit.UiException.StackTraceAnalysers
+{
+    /// <summary>
+    /// Encapsulates a set of algorithms that try to match and locate
+    /// a path value coming from a raw stack trace line.
+    /// </summary>
+    public class PathCompositeParser :
+        IErrorParser
+    {
+        /// <summary>
+        /// This array encapsulates a list of classes that inherit from
+        /// IErrorParser. Each instance is made for handling a path from
+        /// a specific file system such as: Windows or UNIX.
+        /// </summary>
+        private IErrorParser[] _array;
+
+        /// <summary>
+        /// Build a new instance of PathParser.
+        /// </summary>
+        public PathCompositeParser()
+        {
+            // setup this array with a couple of algorithms
+            // that handle respectively Windows and Unix like paths.
+            
+            _array = new IErrorParser[] { 
+                new WindowsPathParser(),
+                new UnixPathParser()
+
+                // add your own parser here
+            };
+
+            return;
+        }
+
+        /// <summary>
+        /// Gives access to the IErrorParser instance that handles
+        /// Windows like path values.
+        /// </summary>
+        public IErrorParser WindowsPathParser
+        {
+            get { return (_array[0]); }
+        }
+
+        /// <summary>
+        /// Gives access to the IErrorParser instance that handles
+        /// Unix like path values.
+        /// </summary>
+        public IErrorParser UnixPathParser
+        {
+            get { return (_array[1]); }
+        }
+
+        #region IErrorParser Membres
+
+        /// <summary>
+        /// Try to read from a stack trace line a path value given either
+        /// under the form of a Windows path or a UNIX path. If a match occurs
+        /// the method fills args.Function with the identified data.
+        /// </summary>
+        /// <param name="parser">The instance of StackTraceParser, this parameter
+        /// cannot be null.</param>
+        /// <param name="args">The instance of RawError from where read and write
+        /// RawError.Input and RawError.Function properties. This parameter
+        /// cannot be null.</param>
+        /// <returns>True if a match occurs, false otherwise.</returns>
+        public bool TryParse(StackTraceParser parser, RawError args)
+        {
+            foreach (IErrorParser item in _array)
+                if (item.TryParse(parser, args))
+                    return (true);
+
+            return (false);
+        }
+
+        #endregion
+
+        /// <summary>
+        /// Helper method that locate the trailing ':' in a stack trace row.
+        /// </summary>
+        /// <returns>The index position of ':' in the string or -1 if not found.</returns>
+        public static int IndexOfTrailingColon(string error, int startIndex)
+        {
+            int i;
+
+            for (i = startIndex; i < error.Length; ++i)
+                if (error[i] == ':')
+                    return (i);
+
+            return (-1);
+        }                                
+    }
+}
diff --git a/src/GuiException/UiException/StackTraceAnalysers/UnixPathParser.cs b/src/GuiException/UiException/StackTraceAnalysers/UnixPathParser.cs
new file mode 100644
index 0000000..29f2b1a
--- /dev/null
+++ b/src/GuiException/UiException/StackTraceAnalysers/UnixPathParser.cs
@@ -0,0 +1,79 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.UiException.StackTraceAnalyzers;
+
+namespace NUnit.UiException.StackTraceAnalysers
+{
+    /// <summary>
+    /// This class is responsible for extracting a Unix like path value
+    /// from a line of the given stack trace. This class bases its work
+    /// on the following assumptions:
+    /// - paths are supposed to be absolute,
+    /// - paths are supposed to be made of two parts: [/][path]
+    /// Where [/] refers to the Unix mount point 
+    /// and [path] a non empty string of characters that extends to the
+    /// trailing ':' (as given in stack trace).
+    /// </summary>
+    class UnixPathParser :
+        IErrorParser
+    {
+        #region IErrorParser Membres
+
+        /// <summary>
+        /// Locates and fills RawError.Path property with the first
+        /// Unix path values found from RawError.Input property.
+        /// </summary>
+        /// <param name="parser">The stack trace parser. This parameter
+        /// must not be null.</param>
+        /// <param name="args">The RawError from which retrieving and
+        /// filling Input and Path properties. This parameter cannot not
+        /// be null.</param>
+        /// <returns>True if a match occured, false otherwise.</returns>
+        public bool TryParse(StackTraceParser parser, RawError args)
+        {
+            int posSlash;
+            int posColon;
+            string path;
+
+            UiExceptionHelper.CheckNotNull(parser, "parser");
+            UiExceptionHelper.CheckNotNull(args, "args");
+
+            if ((posSlash = indexOfFirstSlash(args.Input, 0)) == -1)
+                return (false);
+
+            if ((posColon = PathCompositeParser.IndexOfTrailingColon(args.Input, posSlash + 1)) == -1)
+                return (false);
+
+            path = args.Input.Substring(posSlash, posColon - posSlash);
+            path = path.Trim();
+
+            if (path.Length <= 1)
+                return (false);
+
+            args.Path = path;
+
+            return (true);
+        }
+
+        #endregion
+
+        private int indexOfFirstSlash(string error, int startIndex)
+        {
+            for (; startIndex < error.Length; startIndex++)
+                if (error[startIndex] == '/')
+                {
+                    if (startIndex == 0 ||
+                        startIndex > 0 && error[startIndex - 1] == ' ')
+                        return (startIndex);
+                }
+
+            return (-1);
+        }
+    }
+}
diff --git a/src/GuiException/UiException/StackTraceAnalysers/WindowsPathParser.cs b/src/GuiException/UiException/StackTraceAnalysers/WindowsPathParser.cs
new file mode 100644
index 0000000..6eac791
--- /dev/null
+++ b/src/GuiException/UiException/StackTraceAnalysers/WindowsPathParser.cs
@@ -0,0 +1,84 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.UiException.StackTraceAnalyzers;
+
+namespace NUnit.UiException.StackTraceAnalysers
+{
+    /// <summary>
+    /// This class is responsible for extracting a Windows like path value
+    /// from a line of the given stack trace. This class bases its work
+    /// on the following assumptions:
+    /// - paths are supposed to be absolute,
+    /// - paths are supposed to be made of two parts: [drive][path]
+    /// Where [drive] refers to a sequence like: "C:\\"
+    /// and [path] a non empty string of characters that extends to the
+    /// trailing ':' (as given in stack trace).
+    /// </summary>
+    public class WindowsPathParser :
+        IErrorParser
+    {
+        #region IErrorParser Membres
+
+        /// <summary>
+        /// Locates and fills RawError.Path property with the first
+        /// Windows path values found from RawError.Input property.
+        /// </summary>
+        /// <param name="parser">The stack trace parser. This parameter
+        /// must not be null.</param>
+        /// <param name="args">The RawError from which retrieving and
+        /// filling Input and Path properties. This parameter cannot not
+        /// be null.</param>
+        /// <returns>True if a match occured, false otherwise.</returns>
+        public bool TryParse(StackTraceParser parser, RawError args)
+        {
+            int posDriveLetter;
+            int posTrailingColon;
+            string path;
+
+            UiExceptionHelper.CheckNotNull(parser, "parser");
+            UiExceptionHelper.CheckNotNull(args, "args");
+
+            posDriveLetter = lookForDriveLetter(args.Input, 0);
+            if (posDriveLetter == -1)
+                return (false);
+
+            posTrailingColon = PathCompositeParser.IndexOfTrailingColon(args.Input, posDriveLetter + 3);
+            if (posTrailingColon == -1)
+                return (false);
+
+            path = args.Input.Substring(posDriveLetter, posTrailingColon - posDriveLetter);
+            path = path.Trim();
+
+            if (path.Length <= 3)
+                return (false);
+
+            args.Path = path;
+
+            return (true);
+        }
+
+        #endregion
+
+        private int lookForDriveLetter(string error, int startIndex)
+        {
+            int i;
+
+            for (i = startIndex; i < error.Length - 2; ++i)
+            {
+                if (((error[i] >= 'a' && error[i] <= 'z') ||
+                    (error[i] >= 'A' && error[i] <= 'Z')) &&
+                    error[i + 1] == ':' &&
+                    error[i + 2] == '\\')
+                    return (i);
+            }
+
+            return (-1);
+        }   
+    }
+}
diff --git a/src/GuiException/UiException/StackTraceParser.cs b/src/GuiException/UiException/StackTraceParser.cs
new file mode 100644
index 0000000..1090b06
--- /dev/null
+++ b/src/GuiException/UiException/StackTraceParser.cs
@@ -0,0 +1,106 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.UiException.StackTraceAnalyzers;
+using NUnit.UiException.StackTraceAnalysers;
+
+namespace NUnit.UiException
+{
+    /// <summary>
+    /// StackTraceParser is the entry class for analyzing and converting a stack
+    /// trace - as given by .NET - into a manageable and ordered set of ErrorItem
+    /// instances.
+    ///   StackTraceParser contains internaly a set of autonom, independent and
+    /// interchangeable algorithms that makes the analysis of the stack robust and
+    /// opened to changes. Its architecture is designed to abstract callers from
+    /// secondary details such as the type of culture or file system that can
+    /// both affect the format of the final stack as provided by .NET.
+    ///   In the future, this class could easily be extended by exposing a
+    /// kind of register() method that would allow client code to append
+    /// new algorithms of analysis in its internal list.
+    /// </summary>
+    public class StackTraceParser
+    {
+        /// <summary>
+        /// Output list build from the StackTrace analyze .
+        /// </summary>
+        private ErrorItemCollection _items;
+
+        /// <summary>
+        /// One or more algorithms designed to locate function names
+        /// inside a stack trace line.
+        /// </summary>
+        private IErrorParser _functionParsers;
+
+        /// <summary>
+        /// One or more algorithms designed to locate path names
+        /// inside a stack strace line.
+        /// </summary>
+        private IErrorParser _pathParsers;
+
+        /// <summary>
+        /// One or more algorithms designed to locate line number
+        /// information inside a stack strace line.
+        /// </summary>
+        private IErrorParser _lineNumberParsers;
+
+        /// <summary>
+        /// Build a new instance of StackTraceParser.
+        /// </summary>
+        public StackTraceParser()            
+        {
+            _items = new ErrorItemCollection();
+            
+            _functionParsers = new FunctionParser();
+            _pathParsers = new PathCompositeParser();
+            _lineNumberParsers = new LineNumberParser();
+
+            return;
+        }
+               
+        /// <summary>
+        /// Gives access to the collection of ErrorItem
+        /// build during the analyze of the StackTrace.
+        /// </summary>
+        public ErrorItemCollection Items
+        {
+            get { return (_items); }
+        }
+
+        /// <summary>
+        /// Reads and transforms the given stack trace into a manageable and ordered
+        /// set of ErrorItem instances. The resulting set is stored into Items property.
+        /// </summary>
+        /// <param name="stackTrace">A string value that should contain a .Net stack trace.</param>
+        public void Parse(string stackTrace)
+        {
+            DefaultTextManager lines;
+            RawError rawError;
+
+            _items.Clear();
+
+            lines = new DefaultTextManager();
+            lines.Text = stackTrace;
+
+            foreach (string line in lines)
+            {
+                rawError = new RawError(line);
+
+                if (!_functionParsers.TryParse(this, rawError))
+                    continue;
+
+                _pathParsers.TryParse(this, rawError);
+                _lineNumberParsers.TryParse(this, rawError);
+
+                _items.Add(rawError.ToErrorItem());
+            }
+
+            return;
+        }                                        
+    }
+}
diff --git a/src/GuiException/UiException/TraceExceptionHelper.cs b/src/GuiException/UiException/TraceExceptionHelper.cs
new file mode 100644
index 0000000..13df1b4
--- /dev/null
+++ b/src/GuiException/UiException/TraceExceptionHelper.cs
@@ -0,0 +1,76 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Diagnostics;
+
+namespace NUnit.UiException
+{
+    /// <summary>
+    /// (formerly named TraceExceptionHelper)
+    /// 
+    /// Exposes static methods to assert predicates and throw exceptions
+    /// as needed.
+    /// </summary>
+    public class UiExceptionHelper
+    {
+        /// <summary>
+        /// Asserts that reference is not null; otherwise throws an
+        /// ArgumentNullException.
+        /// </summary>
+        /// <param name="value">The reference to be tested.</param>
+        /// <param name="paramName">The name of this reference</param>
+        [DebuggerStepThrough]
+        public static void CheckNotNull(object value, string paramName)
+        {
+            if (value == null)
+                throw new ArgumentNullException(paramName);
+
+            return;
+        }
+
+        /// <summary>
+        /// Asserts that 'test' is true or throws an ArgumentException.
+        /// </summary>
+        /// <param name="test">The boolean to be tested.</param>
+        /// <param name="message">The error message.</param>
+        /// <param name="paramName">The parameter name to be passed to ArgumentException.</param>
+        [DebuggerStepThrough]
+        public static void CheckTrue(bool test, string message, string paramName)
+        {
+            if (!test)
+                throw new ArgumentException(message, paramName);
+
+            return;
+        }
+
+        /// <summary>
+        /// Asserts that 'test' is false or throws an ArgumentException.
+        /// </summary>
+        /// <param name="test">The boolean to be tested.</param>
+        /// <param name="message">The error message.</param>
+        /// <param name="paramName">The parameter name to be passed to ArgumentException.</param>
+        [DebuggerStepThrough]
+        public static void CheckFalse(bool test, string message, string paramName)
+        {
+            if (test)
+                throw new ArgumentException(message, paramName);
+
+            return;
+        }
+
+        /// <summary>
+        /// Throws an ApplicationException with the given message.
+        /// </summary>
+        /// <param name="message">The error message.</param>
+        [DebuggerStepThrough]
+        public static void Fail(string message)
+        {
+            throw new ApplicationException(message);
+        }        
+    }
+}
diff --git a/src/GuiException/UiException/nunit.uiexception.build b/src/GuiException/UiException/nunit.uiexception.build
new file mode 100644
index 0000000..11bab99
--- /dev/null
+++ b/src/GuiException/UiException/nunit.uiexception.build
@@ -0,0 +1,95 @@
+<?xml version="1.0"?>
+<project name="NUnitUiException" default="build" basedir=".">
+
+  <patternset id="source-files">
+    <include name="Properties/Resources.Designer.cs"/>
+    <include name="CodeFormatters/CodeFormatterCollection.cs"/>
+    <include name="CodeFormatters/GeneralCodeFormatter.cs"/>
+    <include name="CodeFormatters/ICodeFormatter.cs"/>
+    <include name="CodeFormatters/IFormatterCatalog.cs"/>
+    <include name="CodeFormatters/PlainTextCodeFormatter.cs"/>
+    <include name="Controls/CodeBox.cs"/>
+    <include name="Controls/CodeRenderingContext.cs"/>
+    <include name="Controls/DefaultCodeRenderer.cs"/>
+    <include name="Controls/DefaultErrorListRenderer.cs"/>
+    <include name="Controls/ErrorBrowser.cs"/>
+    <include name="Controls/ErrorList.cs"/>
+    <include name="Controls/ErrorPanelLayout.cs"/>
+    <include name="Controls/ErrorToolbar.cs"/>
+    <include name="Controls/ICodeRenderer.cs"/>
+    <include name="Controls/ICodeView.cs"/>
+    <include name="Controls/IErrorDisplay.cs"/>
+    <include name="Controls/IErrorListRenderer.cs"/>
+    <include name="Controls/IStackTraceView.cs"/>
+    <include name="Controls/PaintLineLocation.cs"/>
+    <include name="Controls/SourceCodeDisplay.cs"/>
+    <include name="Controls/SplitterBox.cs"/>
+    <include name="Controls/StackTraceDisplay.cs"/>
+    <include name="CSharpParser/CSCode.cs"/>
+    <include name="CSharpParser/CSParser.cs"/>
+    <include name="CSharpParser/CSToken.cs"/>
+    <include name="CSharpParser/CSTokenCollection.cs"/>
+    <include name="CSharpParser/Lexer.cs"/>
+    <include name="CSharpParser/LexToken.cs"/>
+    <include name="CSharpParser/TokenClassifier.cs"/>
+    <include name="CSharpParser/TokenDictionary.cs"/>
+    <include name="StackTraceAnalysers/FunctionParser.cs"/>
+    <include name="StackTraceAnalysers/IErrorParser.cs"/>
+    <include name="StackTraceAnalysers/LineNumberParser.cs"/>
+    <include name="StackTraceAnalysers/PathCompositeParser.cs"/>
+    <include name="StackTraceAnalysers/UnixPathParser.cs"/>
+    <include name="StackTraceAnalysers/WindowsPathParser.cs"/>
+    <include name="AssemblyInfo.cs"/>
+    <include name="DefaultTextManager.cs"/>
+    <include name="ExceptionItem.cs"/>
+    <include name="ExceptionItemCollection.cs"/>
+    <include name="ITextManager.cs"/>
+    <include name="StackTraceParser.cs"/>
+    <include name="TraceExceptionHelper.cs"/>
+  </patternset>
+
+  <patternset id="resource-files">
+    <include name="Properties/Resources.resx"/>
+  </patternset>
+
+  <patternset id="content-files">
+    <include name="Resources/*.png"/>
+  </patternset>
+
+  <target name="build">
+    <csc target="library" 
+    output="${current.lib.dir}/nunit.uiexception.dll"
+    debug="${build.debug}" define="${build.defines}"
+    if="${runtime.version >= '2.0'}">
+      <sources>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
+      </sources>
+      <nowarn>
+        <warning number="1699"/>
+      </nowarn>
+      <resources prefix="NUnit.UiException" dynamicprefix="true">
+        <patternset refid="resource-files"/>
+      </resources>
+      <references basedir="${current.lib.dir}">
+        <include name="System.dll"/>
+        <include name="System.Windows.Forms.dll"/>
+        <include name="System.Drawing.dll"/>
+      </references>
+    </csc>
+
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/GuiException/UiException">
+      <fileset>
+        <patternset refid="source-files"/>
+        <patternset refid="resource-files"/>
+        <patternset refid="content-files"/>
+        <include name="nunit.uiexception.dll.csproj"/>
+        <include name="nunit.uiexception.build"/>
+      </fileset>
+    </copy>
+  </target>
+
+</project>
diff --git a/src/GuiException/UiException/nunit.uiexception.dll.csproj b/src/GuiException/UiException/nunit.uiexception.dll.csproj
new file mode 100644
index 0000000..0f48448
--- /dev/null
+++ b/src/GuiException/UiException/nunit.uiexception.dll.csproj
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{3E87A106-EB20-4147-84C8-95B0BB43A1D4}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>NUnit.UiException</RootNamespace>
+    <AssemblyName>nunit.uiexception</AssemblyName>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <AssemblyOriginatorKeyFile>..\..\..\..\src\GuiException\UiException\stackSgKey.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\bin\Debug\lib\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>1699</NoWarn>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\bin\Release\lib\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>1699</NoWarn>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="AssemblyInfo.cs" />
+    <Compile Include="CodeFormatters\CodeFormatterCollection.cs" />
+    <Compile Include="CodeFormatters\GeneralCodeFormatter.cs" />
+    <Compile Include="CodeFormatters\ICodeFormatter.cs" />
+    <Compile Include="CodeFormatters\IFormatterCatalog.cs" />
+    <Compile Include="CodeFormatters\PlainTextCodeFormatter.cs" />
+    <Compile Include="Controls\CodeBox.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Controls\CodeRenderingContext.cs" />
+    <Compile Include="Controls\DefaultCodeRenderer.cs" />
+    <Compile Include="Controls\DefaultErrorListRenderer.cs" />
+    <Compile Include="Controls\ErrorBrowser.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Controls\ErrorList.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Controls\ErrorPanelLayout.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Controls\ErrorToolbar.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Controls\ICodeRenderer.cs" />
+    <Compile Include="Controls\ICodeView.cs" />
+    <Compile Include="Controls\IErrorDisplay.cs" />
+    <Compile Include="Controls\IErrorListRenderer.cs" />
+    <Compile Include="Controls\IStackTraceView.cs" />
+    <Compile Include="Controls\PaintLineLocation.cs" />
+    <Compile Include="Controls\SourceCodeDisplay.cs" />
+    <Compile Include="Controls\SplitterBox.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Controls\StackTraceDisplay.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="CSharpParser\CSCode.cs" />
+    <Compile Include="CSharpParser\CSParser.cs" />
+    <Compile Include="CSharpParser\CSToken.cs" />
+    <Compile Include="CSharpParser\CSTokenCollection.cs" />
+    <Compile Include="CSharpParser\Lexer.cs" />
+    <Compile Include="CSharpParser\LexToken.cs" />
+    <Compile Include="CSharpParser\TokenClassifier.cs" />
+    <Compile Include="CSharpParser\TokenDictionary.cs" />
+    <Compile Include="DefaultTextManager.cs" />
+    <Compile Include="ExceptionItem.cs" />
+    <Compile Include="ExceptionItemCollection.cs" />
+    <Compile Include="ITextManager.cs" />
+    <Compile Include="Properties\Resources.Designer.cs" />
+    <Compile Include="StackTraceAnalysers\FunctionParser.cs" />
+    <Compile Include="StackTraceAnalysers\IErrorParser.cs" />
+    <Compile Include="StackTraceAnalysers\LineNumberParser.cs" />
+    <Compile Include="StackTraceAnalysers\PathCompositeParser.cs" />
+    <Compile Include="StackTraceAnalysers\UnixPathParser.cs" />
+    <Compile Include="StackTraceAnalysers\WindowsPathParser.cs" />
+    <Compile Include="StackTraceParser.cs" />
+    <Compile Include="TraceExceptionHelper.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit.uiexception.build" />
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="data\" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
diff --git a/src/GuiException/tests/CSharpParser/TestCSCode.cs b/src/GuiException/tests/CSharpParser/TestCSCode.cs
new file mode 100644
index 0000000..2a394bd
--- /dev/null
+++ b/src/GuiException/tests/CSharpParser/TestCSCode.cs
@@ -0,0 +1,249 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using NUnit.UiException.CodeFormatters;
+using System.Collections;
+using NUnit.UiException;
+
+namespace NUnit.UiException.Tests.CodeFormatters
+{
+    [TestFixture]
+    public class TestFormattedCode
+    {
+        private FormattedCode _code;       
+
+        [Test]
+        public void Test_SimpleCollection()
+        {
+            _code = new TestingCSCode(
+                "line 1\n  line 2\nline 3\n",
+                new int[] { 0, 7, 16 },
+                new byte[] { 0, 0,  0 },
+                new int[] { 0, 1, 2 }
+                );
+
+            Assert.That(_code.Text, Is.EqualTo("line 1\n  line 2\nline 3\n"));
+            Assert.That(_code.LineCount, Is.EqualTo(3));
+
+            Assert.That(_code[0], Is.Not.Null);
+            Assert.That(_code[0].Text, Is.EqualTo("line 1"));
+
+            Assert.That(_code[1], Is.Not.Null);
+            Assert.That(_code[1].Text, Is.EqualTo("  line 2"));
+
+            Assert.That(_code[2], Is.Not.Null);
+            Assert.That(_code[2].Text, Is.EqualTo("line 3"));
+
+            // check internal data
+
+            Assert.That(_code[0].Count, Is.EqualTo(1));
+            Assert.That(_code[0][0].Text, Is.EqualTo("line 1"));
+            Assert.That(_code[0][0].Tag, Is.EqualTo(ClassificationTag.Code));
+
+            Assert.That(_code[1].Count, Is.EqualTo(1));
+            Assert.That(_code[1][0].Text, Is.EqualTo("  line 2"));
+            Assert.That(_code[1][0].Tag, Is.EqualTo(ClassificationTag.Code));
+
+            Assert.That(_code[2].Count, Is.EqualTo(1));
+            Assert.That(_code[2][0].Text, Is.EqualTo("line 3"));
+            Assert.That(_code[2][0].Tag, Is.EqualTo(ClassificationTag.Code));
+
+            return;
+        }
+
+        [Test]
+        public void Empty()
+        {
+            Assert.NotNull(FormattedCode.Empty);
+            Assert.That(FormattedCode.Empty, Is.EqualTo(new FormattedCode()));
+        }
+
+        [Test]
+        public void Test_ComplexCollection()
+        {
+            _code = new TestingCSCode(
+                "int i; //comment\n" +
+                "char c='a';\n",
+                new int[] { 0, 4, 7, 17, 22, 24, 27 },
+                new byte[] { 1, 0, 2,  1,  0,  3,  0 },
+                new int[] { 0, 3 }
+            );
+
+            Assert.That(_code.Text, Is.EqualTo("int i; //comment\nchar c='a';\n"));
+            Assert.That(_code.LineCount, Is.EqualTo(2));
+
+            Assert.That(_code[0], Is.Not.Null);
+            Assert.That(_code[0].Text, Is.EqualTo("int i; //comment"));
+
+            Assert.That(_code[1], Is.Not.Null);
+            Assert.That(_code[1].Text, Is.EqualTo("char c='a';"));
+
+            // check internal data
+
+            Assert.That(_code[0].Count, Is.EqualTo(3));
+            Assert.That(_code[0][0].Text, Is.EqualTo("int "));
+            Assert.That(_code[0][0].Tag, Is.EqualTo(ClassificationTag.Keyword));
+            Assert.That(_code[0][1].Text, Is.EqualTo("i; "));
+            Assert.That(_code[0][1].Tag, Is.EqualTo(ClassificationTag.Code));
+            Assert.That(_code[0][2].Text, Is.EqualTo("//comment"));
+            Assert.That(_code[0][2].Tag, Is.EqualTo(ClassificationTag.Comment));
+
+            Assert.That(_code[1].Count, Is.EqualTo(4));
+            Assert.That(_code[1][0].Text, Is.EqualTo("char "));
+            Assert.That(_code[1][0].Tag, Is.EqualTo(ClassificationTag.Keyword));
+            Assert.That(_code[1][1].Text, Is.EqualTo("c="));
+            Assert.That(_code[1][1].Tag, Is.EqualTo(ClassificationTag.Code));
+            Assert.That(_code[1][2].Text, Is.EqualTo("'a'"));
+            Assert.That(_code[1][2].Tag, Is.EqualTo(ClassificationTag.String));
+            Assert.That(_code[1][3].Text, Is.EqualTo(";"));
+            Assert.That(_code[1][3].Tag, Is.EqualTo(ClassificationTag.Code));
+
+            return;
+        }
+
+        [Test]
+        public void Test_MaxLength()
+        {
+            _code = new TestingCSCode(
+                "", new int[] { }, new byte[] { }, new int[] { });
+            Assert.That(_code.MaxLength, Is.EqualTo(0));
+
+            _code = new TestingCSCode(
+                "a\r\nabc\r\nab",
+                new int[] { 0, 3, 8 },
+                new byte[] { 0, 0, 0 },
+                new int[] { 0, 1, 2 });
+            Assert.That(_code.MaxLength, Is.EqualTo(3));
+
+            _code = new TestingCSCode(
+                "a\r\nab\r\nabc",
+                new int[] { 0, 3, 7 },
+                new byte[] { 0, 0, 0 },
+                new int[] { 0, 1, 2 });
+            Assert.That(_code.MaxLength, Is.EqualTo(3));
+
+            return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void CheckData_Can_Throw_NullDataException()
+        {
+            FormattedCode.CheckData(null); // throws exception
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentException),
+            ExpectedMessage = "IndexArray.Count and TagArray.Count must match.",
+            MatchType = MessageMatch.Contains)]
+        public void CheckData_IndexArray_And_TagArray_Count_Must_Match()
+        {
+            FormattedCode.CheckData(
+                new FormattedCode("hello", new int[] { 0 }, new byte[0], new int[] { 0 })); // throws exception
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentException),
+            ExpectedMessage = "Bad LineArray value at index 0, value was: 1, expected to be in: [0-1[.",
+            MatchType = MessageMatch.Contains)]
+        public void CheckData_LineArray_Values_Must_Be_In_IndexArray_Count()
+        {
+            FormattedCode.CheckData(
+                new FormattedCode("hi there!", new int[] { 0 }, new byte[] { 0 }, new int[] { 1 })); // throws exception
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentException),
+            ExpectedMessage = "Bad LineArray[1], value was: 0, expected to be > than LineArray[0]=0.",
+            MatchType = MessageMatch.Contains)]
+        public void CheckData_LineArray_Values_Must_Always_Grow_Up()
+        {
+            FormattedCode.CheckData(
+                new FormattedCode("hi\r\nthere\r\n",
+                    new int[] { 0, 3 },
+                    new byte[] { 0, 0 },
+                    new int[] { 0, 0 })); // throws exception
+        }
+
+        [Test]
+        public void Test_Equals()
+        {
+            _code = new TestingCSCode(
+               "line",
+               new int[] { 0 },
+               new byte[] { 0 },
+               new int[] { 0 }
+               );
+
+            // Tests to fail
+
+            Assert.That(_code.Equals(null), Is.False);
+            Assert.That(_code.Equals("hello"), Is.False);
+            Assert.That(_code.Equals(
+                new TestingCSCode("a", new int[] { 0 }, new byte[] { 0 }, new int[] { 0 })),
+                Is.False);
+            Assert.That(_code.Equals(
+                new TestingCSCode("line", new int[] { 1 }, new byte[] { 0 }, new int[] { 0 })),
+                Is.False);
+            Assert.That(_code.Equals(
+                new TestingCSCode("line", new int[] { 0 }, new byte[] { 1 }, new int[] { 0 })),
+                Is.False);
+            Assert.That(_code.Equals(
+                new TestingCSCode("line", new int[] { 0 }, new byte[] { 0 }, new int[] { 1 })),
+                Is.False);
+
+            Assert.That(_code.Equals(
+                new TestingCSCode("line", new int[] { 0, 0 }, new byte[] { 0 }, new int[] { 0 })),
+                Is.False);
+            Assert.That(_code.Equals(
+                new TestingCSCode("line", new int[] { 0 }, new byte[] { 0, 0 }, new int[] { 0 })),
+                Is.False);
+            Assert.That(_code.Equals(
+                new TestingCSCode("line", new int[] { 0 }, new byte[] { 0 }, new int[] { 0, 0 })),
+                Is.False);
+
+            // NUnit.UiException.Tests to pass
+
+            Assert.That(_code.Equals(
+                new TestingCSCode("line", new int[] { 0 }, new byte[] { 0 }, new int[] { 0 })),
+                Is.True);
+
+            return;
+        }
+
+        #region TestingCSCode
+
+        class TestingCSCode :
+            FormattedCode
+        {
+            public TestingCSCode(string csharpText, int[] strIndexes, byte[] tagValues, int[] lineIndexes)
+            {
+                _codeInfo = new CodeInfo();
+
+                _codeInfo.Text = csharpText;
+
+                _codeInfo.IndexArray = new List<int>();
+                foreach (int index in strIndexes)
+                    _codeInfo.IndexArray.Add(index);
+
+                _codeInfo.TagArray = new List<byte>();
+                foreach (byte tag in tagValues)
+                    _codeInfo.TagArray.Add(tag);
+
+                _codeInfo.LineArray = new List<int>();
+                foreach (int line in lineIndexes)
+                    _codeInfo.LineArray.Add(line);
+
+                return;
+            }         
+        }
+
+        #endregion
+    }
+}
diff --git a/src/GuiException/tests/CSharpParser/TestCSParser.cs b/src/GuiException/tests/CSharpParser/TestCSParser.cs
new file mode 100644
index 0000000..c2b1bbb
--- /dev/null
+++ b/src/GuiException/tests/CSharpParser/TestCSParser.cs
@@ -0,0 +1,177 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using NUnit.UiException.CodeFormatters;
+
+namespace NUnit.UiException.Tests.CodeFormatters
+{
+    [TestFixture]
+    public class TestCSharpCodeFormatter
+    {
+        private TestingCSharpCodeFormatter _parser;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _parser = new TestingCSharpCodeFormatter();
+
+            return;
+        }
+
+        [Test]
+        public void Test_Default()
+        {
+            Assert.That(_parser.CSCode, Is.Not.Null);
+            Assert.That(_parser.CSCode.Text, Is.EqualTo(""));
+            Assert.That(_parser.CSCode.LineCount, Is.EqualTo(0));
+
+            Assert.That(_parser.Language, Is.EqualTo("C#"));
+
+            return;
+        }        
+
+        [Test]
+        public void Test_PreProcess()
+        {
+            // PreProcess is expected to remove '\t' sequences.
+            // This test expects that normal strings are left untouched.
+
+            Assert.That(_parser.PreProcess("hello world"), Is.EqualTo("hello world"));
+
+            // This test expects to see differences
+            Assert.That(_parser.PreProcess("hello\tworld"), Is.EqualTo("hello    world"));
+
+            // test to fail: passing null has no effect.
+            Assert.That(_parser.PreProcess(null), Is.Null);
+
+            return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void Format_Can_Throw_CSharpNullException()
+        {
+            _parser.Format(null); // throws exception
+        }
+
+        [Test]
+        public void Test_Format()
+        {
+            FormattedCode exp;
+            FormattedCode res;
+
+            res = _parser.Format("line 1\n  line 2\nline 3\n");
+
+            exp = new FormattedCode(
+                "line 1\n  line 2\nline 3\n",
+                new int[] { 0, 7, 16 },
+                new byte[] { 0, 0, 0 },
+                new int[] { 0, 1, 2 }
+                );
+
+            Assert.That(res, Is.EqualTo(exp));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Format_2()
+        {
+            FormattedCode exp;
+            FormattedCode res;
+
+            res = _parser.Format(
+                "int i; //comment\n" +
+                "char c='a';\n");
+
+            exp = new FormattedCode(
+                "int i; //comment\n" +
+                "char c='a';\n",
+                new int[] { 0, 3, 7, 16, 17, 21, 24, 27 },
+                new byte[] { 1, 0, 2, 0, 1, 0, 3, 0 },
+                new int[] { 0, 4 }
+            );
+
+            Assert.That(res, Is.EqualTo(exp));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Format_3()
+        {
+            FormattedCode exp;
+            FormattedCode res;
+
+            // Ensure that escaping sequences are
+            // handled correctly
+            //                    0  2           14   17    21        
+            res = _parser.Format("s=\"<font class=\\\"cls\\\">hi, there!</font>");
+
+            exp = new FormattedCode(
+                "s=\"<font class=\\\"cls\\\">hi, there!</font>",
+                new int[] { 0, 2 },
+                new byte[] { 0, 3 },
+                new int[] { 0 });
+
+            Assert.That(res, Is.EqualTo(exp));
+
+            _parser = new TestingCSharpCodeFormatter();
+
+            //                   0  2              
+            res = _parser.Format("s=\"<font class=\\\\\"cls\\\">hi, there!</font>");
+            exp = new FormattedCode(
+                "s=\"<font class=\\\\\"cls\\\">hi, there!</font>",
+                new int[] { 0, 2, 18, 22 },
+                new byte[] { 0, 3, 0, 3 },
+                new int[] { 0 });
+
+            Assert.That(res, Is.EqualTo(exp));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Conserve_Intermediary_Spaces()
+        {
+            FormattedCode res;
+
+            res = _parser.Format(
+                         "{\r\n" + 
+                         "    class A { }\r\n" +
+                         "}\r\n");
+
+            Assert.That(res.LineCount, Is.EqualTo(3));
+            Assert.That(res[0].Text, Is.EqualTo("{"));
+            Assert.That(res[1].Text, Is.EqualTo("    class A { }"));
+            Assert.That(res[2].Text, Is.EqualTo("}"));
+
+            Assert.That(res[0][0].Text, Is.EqualTo("{"));
+            Assert.That(res[1][0].Text, Is.EqualTo("    "));
+            Assert.That(res[1][1].Text, Is.EqualTo("class"));
+            Assert.That(res[1][2].Text, Is.EqualTo(" A { }"));
+            Assert.That(res[2][0].Text, Is.EqualTo("}"));
+
+            return;
+        }
+
+        #region TestingCSharpCodeFormatter
+
+        class TestingCSharpCodeFormatter :
+            CSharpCodeFormatter
+        {
+            public new string PreProcess(string text)
+            {
+                return (base.PreProcess(text));
+            }
+        }
+
+        #endregion
+    }
+}
diff --git a/src/GuiException/tests/CSharpParser/TestLexer.cs b/src/GuiException/tests/CSharpParser/TestLexer.cs
new file mode 100644
index 0000000..073fd42
--- /dev/null
+++ b/src/GuiException/tests/CSharpParser/TestLexer.cs
@@ -0,0 +1,395 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using NUnit.UiException;
+using NUnit.UiException.CodeFormatters;
+
+namespace NUnit.UiException.Tests.CodeFormatters
+{
+    [TestFixture]
+    public class TestLexer
+    {
+        private TestingLexer _lexer;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _lexer = new TestingLexer();
+
+            return;
+        }
+
+        [Test]
+        public void Test_Default()
+        {
+            Assert.That(_lexer.CurrentToken, Is.Null);
+            Assert.That(_lexer.HasNext(), Is.False);
+            Assert.That(_lexer.Next(), Is.False);
+
+            return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void Test_SetText_Throws_NullArgumentException()
+        {
+            _lexer.Parse(null); // throws exception
+        }
+
+        private void _checkOutput(string sequence, LexToken[] expected)
+        {
+            Lexer lexer;
+            StringBuilder recognized;
+            string error;
+            int i;
+            int j;
+
+            lexer = new Lexer();
+            lexer.Parse(sequence);
+
+            recognized = new StringBuilder();
+
+            i = 0;
+            while (lexer.Next())
+            {
+                recognized.Append(lexer.CurrentToken.Text);
+
+                error = String.Format("Token [{0}] was expected, but lexer returned [{1}] instead, near: [{2}].",
+                    expected[i],
+                    lexer.CurrentToken,
+                    recognized.ToString());
+
+                Assert.That(lexer.CurrentToken, Is.EqualTo(expected[i]), error);
+
+                i++;
+            }
+
+            Assert.That(lexer.Next(), Is.False, "Error, there are unvisited tokens left.");
+
+            error = "missing ";
+            j = i;
+            while (j < expected.Length)
+            {
+                error += expected[j].ToString();
+                error += ", ";
+                ++j;
+            }
+
+            Assert.That(i == expected.Length, "Error, more tokens were expected. {0}", error);
+
+            return;
+        }
+
+        [Test]
+        public void Test_Split_Words()
+        {
+            _checkOutput("one two three\r\n'",
+                new LexToken[] {
+                    new TestingToken("one", 0, LexerTag.Text),
+                    new TestingToken(" ", 3, LexerTag.Separator),
+                    new TestingToken("two", 4, LexerTag.Text),
+                    new TestingToken(" ", 7, LexerTag.Separator),
+                    new TestingToken("three", 8, LexerTag.Text),
+                    new TestingToken("\r", 13, LexerTag.Separator),
+                    new TestingToken("\n", 14, LexerTag.EndOfLine),
+                    new TestingToken("'", 15, LexerTag.SingleQuote)
+                });
+
+            return;
+        }
+
+        [Test]
+        public void Test_Split_SingleQuote()
+        {
+            _checkOutput("'hello'",
+                new LexToken[] {
+                    new TestingToken("'", 0, LexerTag.SingleQuote),
+                    new TestingToken("hello", 1, LexerTag.Text),
+                    new TestingToken("'", 6, LexerTag.SingleQuote)
+                });
+
+            return;
+        }
+
+        [Test]
+        public void Test_Split_DoubleQuote()
+        {
+            _checkOutput("\"hello\"",
+                new LexToken[] {
+                    new TestingToken("\"", 0, LexerTag.DoubleQuote),
+                    new TestingToken("hello", 1, LexerTag.Text),
+                    new TestingToken("\"", 6, LexerTag.DoubleQuote)
+                });
+
+            // test to fail
+            // lexer should not be confused by escapment character \"
+            // expecting:
+            //  - \"
+            //  - \\\"
+            //  - hello
+            //  - \\\"
+            //  - \"
+
+            _checkOutput("\"\"hello\"\"",
+                new LexToken[] {
+                    new TestingToken("\"", 0, LexerTag.DoubleQuote),
+                    new TestingToken("\"", 1, LexerTag.DoubleQuote),
+                    new TestingToken("hello", 2, LexerTag.Text),
+                    new TestingToken("\"", 7, LexerTag.DoubleQuote),
+                    new TestingToken("\"", 8, LexerTag.DoubleQuote)
+                });
+
+            // test to fail
+            // lexer should not be confused by escapment character \'
+            // expecting:
+            //  - \"
+            //  - \\\'
+            //  - A
+            //  - \\\'
+            //  - \"
+
+            _checkOutput("\"\'A\'\"",
+                new LexToken[] {
+                    new TestingToken("\"", 0, LexerTag.DoubleQuote),
+                    new TestingToken("\'", 1, LexerTag.SingleQuote),
+                    new TestingToken("A", 2, LexerTag.Text),
+                    new TestingToken("\'", 3, LexerTag.SingleQuote),
+                    new TestingToken("\"", 4, LexerTag.DoubleQuote)
+                });
+
+            return;
+        }
+
+        [Test]
+        public void Test_Split_NumberSign()
+        {
+            _checkOutput("#hello#",
+                new LexToken[] {
+                    new TestingToken("#", 0, LexerTag.Separator),
+                    new TestingToken("hello", 1, LexerTag.Text),
+                    new TestingToken("#", 6, LexerTag.Separator)
+                });
+
+            return;
+        }
+
+        [Test]
+        public void Test_Dot_Character()
+        {
+            _checkOutput("this.Something",
+                new LexToken[] {
+                    new TestingToken("this", 0, LexerTag.Text),
+                    new TestingToken(".", 4, LexerTag.Separator),
+                    new TestingToken("Something", 5, LexerTag.Text)
+                });
+
+            return;
+        }
+
+        [Test]
+        public void Test_Split_ColonCharacter()
+        {
+            _checkOutput(":a:",
+                new LexToken[] {
+                    new TestingToken(":", 0, LexerTag.Separator),
+                    new TestingToken("a", 1, LexerTag.Text),
+                    new TestingToken(":", 2, LexerTag.Separator)
+                });
+
+            _checkOutput("<a<",
+                new LexToken[] {
+                    new TestingToken("<", 0, LexerTag.Separator),
+                    new TestingToken("a", 1, LexerTag.Text),
+                    new TestingToken("<", 2, LexerTag.Separator)
+                });
+
+            _checkOutput(">a>",
+                new LexToken[] {
+                    new TestingToken(">", 0, LexerTag.Separator),
+                    new TestingToken("a", 1, LexerTag.Text),
+                    new TestingToken(">", 2, LexerTag.Separator)
+                });
+
+            _checkOutput(",a,",
+                new LexToken[] {
+                    new TestingToken(",", 0, LexerTag.Separator),
+                    new TestingToken("a", 1, LexerTag.Text),
+                    new TestingToken(",", 2, LexerTag.Separator)
+                });
+
+            return;
+        }
+
+        [Test]
+        public void Test_Split_Equals()
+        {
+            _checkOutput("=a=",
+                new LexToken[] {
+                    new TestingToken("=", 0, LexerTag.Separator),
+                    new TestingToken("a", 1, LexerTag.Text),
+                    new TestingToken("=", 2, LexerTag.Separator)
+                });
+
+            return;
+        }
+
+        [Test]
+        public void Test_Split_New_Line()
+        {
+            _checkOutput("\none\n",
+                new LexToken[] {
+                    new TestingToken("\n", 0, LexerTag.EndOfLine),
+                    new TestingToken("one", 1, LexerTag.Text),
+                    new TestingToken("\n", 4, LexerTag.EndOfLine)
+                });
+
+            return;
+        }
+
+        [Test]
+        public void Test_Split_WhiteSpaces()
+        {
+            // test with space
+
+            _checkOutput(" hello ",
+                new LexToken[] {
+                    new TestingToken(" ", 0, LexerTag.Separator),
+                    new TestingToken("hello", 1, LexerTag.Text),
+                    new TestingToken(" ", 6, LexerTag.Separator)
+                });
+
+            /// test with '\r'
+
+            _checkOutput("\rhello\r",
+                new LexToken[] {
+                    new TestingToken("\r", 0, LexerTag.Separator),
+                    new TestingToken("hello", 1, LexerTag.Text),
+                    new TestingToken("\r", 6, LexerTag.Separator)
+            });
+
+            // test with ';'
+
+            _checkOutput(";hello;",
+                new LexToken[] {
+                    new TestingToken(";", 0, LexerTag.Separator),
+                    new TestingToken("hello", 1, LexerTag.Text),
+                    new TestingToken(";", 6, LexerTag.Separator)
+                });
+
+            // test with '['
+
+            _checkOutput("[hello[",
+                new LexToken[] {
+                    new TestingToken("[", 0, LexerTag.Separator),
+                    new TestingToken("hello", 1, LexerTag.Text),
+                    new TestingToken("[", 6, LexerTag.Separator)
+                });
+
+            // test with ']'
+
+            _checkOutput("]hello]",
+                new LexToken[] {
+                    new TestingToken("]", 0, LexerTag.Separator),
+                    new TestingToken("hello", 1, LexerTag.Text),
+                    new TestingToken("]", 6, LexerTag.Separator)
+                });
+
+            // test with '('
+
+            _checkOutput("(hello(",
+                new LexToken[] {
+                    new TestingToken("(", 0, LexerTag.Separator),
+                    new TestingToken("hello", 1, LexerTag.Text),
+                    new TestingToken("(", 6, LexerTag.Separator)
+                });
+
+            // test with ')'
+
+            _checkOutput(")hello)",
+                new LexToken[] {
+                    new TestingToken(")", 0, LexerTag.Separator),
+                    new TestingToken("hello", 1, LexerTag.Text),
+                    new TestingToken(")", 6, LexerTag.Separator)
+                });
+
+            return;
+        }
+
+        [Test]
+        public void Test_Split_CommentC()
+        {
+            _checkOutput("/*plop/*",
+                new LexToken[] {
+                    new TestingToken("/*", 0, LexerTag.CommentC_Open),
+                    new TestingToken("plop", 2, LexerTag.Text),
+                    new TestingToken("/*", 6, LexerTag.CommentC_Open)
+                });
+
+            // test with */
+            _checkOutput("*/plop*/",
+                new LexToken[] {
+                new TestingToken("*/", 0, LexerTag.CommentC_Close),
+                new TestingToken("plop", 2, LexerTag.Text),
+                new TestingToken("*/", 6, LexerTag.CommentC_Close)
+                });
+
+            return;
+        }
+
+        [Test]
+        public void Test_Split_CommentCpp()
+        {
+            _checkOutput("//plop//",
+                new LexToken[] {
+                    new TestingToken("//", 0, LexerTag.CommentCpp),
+                    new TestingToken("plop", 2, LexerTag.Text),
+                    new TestingToken("//", 6, LexerTag.CommentCpp)
+                });
+
+            return;
+        }
+
+        #region TestingLexer
+
+        /// <summary>
+        /// Subclasses Lexer to access and test internal methods.
+        /// </summary>
+        class TestingLexer :
+            Lexer
+        {
+            public TestingLexer()
+            {
+            }
+
+            public new void Clear()
+            {
+                base.Clear();
+            }
+        }
+
+        #endregion
+
+        #region TestingToken
+
+        class TestingToken :
+            LexToken
+        {
+            public TestingToken(string text, int index, LexerTag tag)
+            {
+                _text = text;
+                _start = index;
+                _tag = tag;
+
+                return;
+            }
+        }
+
+        #endregion
+    }
+}
diff --git a/src/GuiException/tests/CSharpParser/TestToken.cs b/src/GuiException/tests/CSharpParser/TestToken.cs
new file mode 100644
index 0000000..633509d
--- /dev/null
+++ b/src/GuiException/tests/CSharpParser/TestToken.cs
@@ -0,0 +1,52 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using NUnit.UiException;
+using NUnit.UiException.CodeFormatters;
+
+namespace NUnit.UiException.Tests.CodeFormatters
+{
+    [TestFixture]
+    public class TestToken
+    {
+        [Test]
+        public void Test_Equals()
+        {
+            Assert.That(new TestingToken("text", 0, LexerTag.Text).Equals(null), Is.False);
+            Assert.That(new TestingToken("text", 1, LexerTag.Text).Equals("text"), Is.False);
+            Assert.That(new TestingToken("text", 0, LexerTag.Text).Equals(
+                new TestingToken("", 0, LexerTag.Text)), Is.False);
+            Assert.That(new TestingToken("text", 0, LexerTag.Text).Equals(
+                new TestingToken("text", 1, LexerTag.Text)), Is.False);
+            Assert.That(new TestingToken("text", 0, LexerTag.Text).Equals(
+                new TestingToken("text", 0, LexerTag.SingleQuote)), Is.False);
+            Assert.That(new TestingToken("text", 0, LexerTag.Text).Equals(
+                new TestingToken("text", 0, LexerTag.Text)), Is.True);
+
+            return;
+        }
+
+        #region TestingToken
+
+        class TestingToken :
+            LexToken
+        {
+            public TestingToken(string text, int start, LexerTag attr)
+            {
+                _text = text;
+                _start = start;
+                _tag = attr;
+
+                return;
+            }
+        }
+
+        #endregion
+    }
+}
diff --git a/src/GuiException/tests/CSharpParser/TestTokenClassifier.cs b/src/GuiException/tests/CSharpParser/TestTokenClassifier.cs
new file mode 100644
index 0000000..de748a0
--- /dev/null
+++ b/src/GuiException/tests/CSharpParser/TestTokenClassifier.cs
@@ -0,0 +1,634 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using NUnit.UiException;
+using NUnit.UiException.CodeFormatters;
+
+namespace NUnit.UiException.Tests.CodeFormatters
+{
+    [TestFixture]
+    public class TestTokenClassifier
+    {
+        private TestingClassifier _classifier;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _classifier = new TestingClassifier();
+
+            return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void Test_Classify_Can_Throw_ArgumentNullException()
+        {
+            _classifier.Classify(null); // throws exception
+        }
+
+        [Test]
+        public void Test_NewState()
+        {
+            // STATE_CODE
+
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CODE, LexerTag.EndOfLine),
+                Is.EqualTo(TokenClassifier.SMSTATE_CODE));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CODE, LexerTag.Separator),
+                Is.EqualTo(TokenClassifier.SMSTATE_CODE));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CODE, LexerTag.Text),
+                Is.EqualTo(TokenClassifier.SMSTATE_CODE));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CODE, LexerTag.CommentC_Open),
+                Is.EqualTo(TokenClassifier.SMSTATE_CCOMMENT));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CODE, LexerTag.CommentC_Close),
+                Is.EqualTo(TokenClassifier.SMSTATE_CODE));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CODE, LexerTag.CommentCpp),
+                Is.EqualTo(TokenClassifier.SMSTATE_CPPCOMMENT));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CODE, LexerTag.SingleQuote),
+                Is.EqualTo(TokenClassifier.SMSTATE_CHAR));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CODE, LexerTag.DoubleQuote),
+                Is.EqualTo(TokenClassifier.SMSTATE_STRING));
+
+            // STATE_COMMENT_C
+
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CCOMMENT, LexerTag.EndOfLine),
+                Is.EqualTo(TokenClassifier.SMSTATE_CCOMMENT));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CCOMMENT, LexerTag.Separator),
+                Is.EqualTo(TokenClassifier.SMSTATE_CCOMMENT));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CCOMMENT, LexerTag.Text),
+                Is.EqualTo(TokenClassifier.SMSTATE_CCOMMENT));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CCOMMENT, LexerTag.CommentC_Open),
+                Is.EqualTo(TokenClassifier.SMSTATE_CCOMMENT));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CCOMMENT, LexerTag.CommentC_Close),
+                Is.EqualTo(TokenClassifier.SMSTATE_CODE));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CCOMMENT, LexerTag.CommentCpp),
+                Is.EqualTo(TokenClassifier.SMSTATE_CCOMMENT));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CCOMMENT, LexerTag.SingleQuote),
+                Is.EqualTo(TokenClassifier.SMSTATE_CCOMMENT));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CCOMMENT, LexerTag.DoubleQuote),
+                Is.EqualTo(TokenClassifier.SMSTATE_CCOMMENT));
+
+            // STATE_COMMENT_CPP
+
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CPPCOMMENT, LexerTag.EndOfLine),
+                Is.EqualTo(TokenClassifier.SMSTATE_CODE));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CPPCOMMENT, LexerTag.Separator),
+                Is.EqualTo(TokenClassifier.SMSTATE_CPPCOMMENT));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CPPCOMMENT, LexerTag.Text),
+                Is.EqualTo(TokenClassifier.SMSTATE_CPPCOMMENT));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CPPCOMMENT, LexerTag.CommentC_Open),
+                Is.EqualTo(TokenClassifier.SMSTATE_CPPCOMMENT));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CPPCOMMENT, LexerTag.CommentC_Close),
+                Is.EqualTo(TokenClassifier.SMSTATE_CPPCOMMENT));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CPPCOMMENT, LexerTag.CommentCpp),
+                Is.EqualTo(TokenClassifier.SMSTATE_CPPCOMMENT));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CPPCOMMENT, LexerTag.SingleQuote),
+                Is.EqualTo(TokenClassifier.SMSTATE_CPPCOMMENT));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CPPCOMMENT, LexerTag.DoubleQuote),
+                Is.EqualTo(TokenClassifier.SMSTATE_CPPCOMMENT));
+
+            // SMSTATE_CHAR
+
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CHAR, LexerTag.EndOfLine),
+                Is.EqualTo(TokenClassifier.SMSTATE_CHAR));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CHAR, LexerTag.Separator),
+                Is.EqualTo(TokenClassifier.SMSTATE_CHAR));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CHAR, LexerTag.Text),
+                Is.EqualTo(TokenClassifier.SMSTATE_CHAR));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CHAR, LexerTag.CommentC_Open),
+                Is.EqualTo(TokenClassifier.SMSTATE_CHAR));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CHAR, LexerTag.CommentC_Close),
+                Is.EqualTo(TokenClassifier.SMSTATE_CHAR));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CHAR, LexerTag.CommentCpp),
+                Is.EqualTo(TokenClassifier.SMSTATE_CHAR));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CHAR, LexerTag.SingleQuote),
+                Is.EqualTo(TokenClassifier.SMSTATE_CODE));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CHAR, LexerTag.DoubleQuote),
+                Is.EqualTo(TokenClassifier.SMSTATE_CHAR));
+
+            // SMSTATE_STRING
+
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_STRING, LexerTag.EndOfLine),
+                Is.EqualTo(TokenClassifier.SMSTATE_STRING));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_STRING, LexerTag.Separator),
+                Is.EqualTo(TokenClassifier.SMSTATE_STRING));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_STRING, LexerTag.Text),
+                Is.EqualTo(TokenClassifier.SMSTATE_STRING));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_STRING, LexerTag.CommentC_Open),
+                Is.EqualTo(TokenClassifier.SMSTATE_STRING));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_STRING, LexerTag.CommentC_Close),
+                Is.EqualTo(TokenClassifier.SMSTATE_STRING));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_STRING, LexerTag.CommentCpp),
+                Is.EqualTo(TokenClassifier.SMSTATE_STRING));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_STRING, LexerTag.SingleQuote),
+                Is.EqualTo(TokenClassifier.SMSTATE_STRING));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_STRING, LexerTag.DoubleQuote),
+                Is.EqualTo(TokenClassifier.SMSTATE_CODE));
+
+            return;
+        }
+
+        [Test]
+        public void test_AcceptToken()
+        {
+            _checkTag(
+                "\ncode/*comment*/\nint i;//comment2\nchar c='i';string s=\"test\";",
+                new Couple[] {
+                    new Couple(TokenClassifier.SMSTATE_CODE,            "\n"),
+                    new Couple(TokenClassifier.SMSTATE_CODE,            "code"),
+                    new Couple(TokenClassifier.SMSTATE_CCOMMENT,        "/*"),
+                    new Couple(TokenClassifier.SMSTATE_CCOMMENT,        "comment"),
+                    new Couple(TokenClassifier.SMSTATE_CCOMMENT,        "*/"),
+                    new Couple(TokenClassifier.SMSTATE_CODE,            "\n"),
+                    new Couple(TokenClassifier.SMSTATE_CODE,            "int"),
+                    new Couple(TokenClassifier.SMSTATE_CODE,             " "),
+                    new Couple(TokenClassifier.SMSTATE_CODE,             "i"),
+                    new Couple(TokenClassifier.SMSTATE_CODE,             ";"),
+
+                    new Couple(TokenClassifier.SMSTATE_CPPCOMMENT,       "//"),
+                    new Couple(TokenClassifier.SMSTATE_CPPCOMMENT,       "comment2"),
+                    new Couple(TokenClassifier.SMSTATE_CODE,             "\n"),
+                    new Couple(TokenClassifier.SMSTATE_CODE,             "char"),
+                    new Couple(TokenClassifier.SMSTATE_CODE,             " "),
+                    new Couple(TokenClassifier.SMSTATE_CODE,             "c"),
+                    new Couple(TokenClassifier.SMSTATE_CODE,             "="),
+                    new Couple(TokenClassifier.SMSTATE_CHAR,             "'"),
+                    new Couple(TokenClassifier.SMSTATE_CHAR,             "i"),
+                    new Couple(TokenClassifier.SMSTATE_CHAR,             "'"),
+
+                    new Couple(TokenClassifier.SMSTATE_CODE,             ";"),
+                    new Couple(TokenClassifier.SMSTATE_CODE,             "string"),
+                    new Couple(TokenClassifier.SMSTATE_CODE,             " "),
+                    new Couple(TokenClassifier.SMSTATE_CODE,             "s"),
+                    new Couple(TokenClassifier.SMSTATE_CODE,             "="),
+                    new Couple(TokenClassifier.SMSTATE_STRING,           "\""),
+                    new Couple(TokenClassifier.SMSTATE_STRING,           "test"),
+                    new Couple(TokenClassifier.SMSTATE_STRING,           "\""),
+
+                    new Couple(TokenClassifier.SMSTATE_CODE,             ";")
+                });
+
+            return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void Test_Classify_Throw_NullArgException()
+        {
+            _classifier.Classify(null); // throws exception
+        }
+
+        [Test]
+        public void Test_Classify()
+        {
+            _checkClassification(
+                "\ncode/*comment*/\nint i;//comment2\nchar c='i';string s=\"test\";",
+                new Couple[] {
+                new Couple(ClassificationTag.Code,         "\n"),
+                new Couple(ClassificationTag.Code,         "code"),
+                new Couple(ClassificationTag.Comment,      "/*"),
+                new Couple(ClassificationTag.Comment,      "comment"),
+                new Couple(ClassificationTag.Comment,      "*/"),
+                new Couple(ClassificationTag.Code,         "\n"),
+                new Couple(ClassificationTag.Keyword,      "int"),
+                new Couple(ClassificationTag.Code,         " "),
+                new Couple(ClassificationTag.Code,         "i"),
+                new Couple(ClassificationTag.Code,         ";"),
+
+                new Couple(ClassificationTag.Comment,      "//"),
+                new Couple(ClassificationTag.Comment,      "comment2"),
+                new Couple(ClassificationTag.Code,         "\n"),
+                new Couple(ClassificationTag.Keyword,      "char"),
+                new Couple(ClassificationTag.Code,         " "),
+                new Couple(ClassificationTag.Code,         "c"),
+                new Couple(ClassificationTag.Code,         "="),
+                new Couple(ClassificationTag.String,       "'"),
+                new Couple(ClassificationTag.String,       "i"),
+                new Couple(ClassificationTag.String,       "'"),
+
+                new Couple(ClassificationTag.Code,         ";"),
+                new Couple(ClassificationTag.Keyword,      "string"),
+                new Couple(ClassificationTag.Code,         " "),
+                new Couple(ClassificationTag.Code,         "s"),
+                new Couple(ClassificationTag.Code,         "="),
+                new Couple(ClassificationTag.String,       "\""),
+                new Couple(ClassificationTag.String,       "test"),
+                new Couple(ClassificationTag.String,       "\""),
+
+                new Couple(ClassificationTag.Code,         ";")
+            });
+
+            return;
+        }
+
+        [Test]
+        public void Test_Classification_Cases()
+        {
+            _checkClassification("default:",
+                new Couple[] {
+                    new Couple(ClassificationTag.Keyword, "default"),
+                    new Couple(ClassificationTag.Code, ":")
+                });
+
+            _checkClassification("List<string>",
+                new Couple[]{
+                    new Couple(ClassificationTag.Code, "List"),
+                    new Couple(ClassificationTag.Code, "<"),
+                    new Couple(ClassificationTag.Keyword, "string"),
+                    new Couple(ClassificationTag.Code, ">")
+                });
+
+            _checkClassification("Dictionary<string, int>",
+                new Couple[] {
+                    new Couple(ClassificationTag.Code, "Dictionary"),
+                    new Couple(ClassificationTag.Code, "<"),
+                    new Couple(ClassificationTag.Keyword, "string"),
+                    new Couple(ClassificationTag.Code, ","),
+                    new Couple(ClassificationTag.Code, " "),
+                    new Couple(ClassificationTag.Keyword, "int"),
+                    new Couple(ClassificationTag.Code, ">")
+                });
+
+            return;
+        }
+
+
+        [Test]
+        public void Test_Classify_As_Keyword()
+        {
+            TokenClassifier classifier;
+            ClassificationTag result;
+            string error;
+            Lexer lexer;
+
+            lexer = new Lexer();
+            lexer.Parse(
+                "abstract event new struct as explicit null switch " +
+                "base extern object this bool false operator throw " +
+                "break finally out true byte fixed override try case " +
+                "float params typeof catch for private uint char " +
+                "foreach protected ulong checked goto public unchecked " +
+                "class if readonly unsafe const implicit ref ushort " +
+                "continue in return using decimal int sbyte virtual " +
+                "default interface sealed volatile delegate internal " +
+                "short void do is sizeof while double lock stackalloc " +
+                "else long static enum namespace string get set region " +
+                "endregion ");
+
+            classifier = new TokenClassifier();
+
+            while (lexer.Next())
+            {
+                if (lexer.CurrentToken.Text.Trim() == "")
+                    continue;
+
+                result = classifier.Classify(lexer.CurrentToken);
+
+                error = String.Format("Classification: [{0}] was expected for token [{1}] but [{2}] was returned.",
+                    ClassificationTag.Keyword,
+                    lexer.CurrentToken,
+                    result);
+
+                Assert.That(
+                    result,
+                    Is.EqualTo(ClassificationTag.Keyword),
+                    error);
+            }
+
+            return;
+        }
+
+        [Test]
+        public void Test_Reset()
+        {
+            Lexer lexer;
+
+            lexer = new Lexer();
+            lexer.Parse("/*int");
+
+            lexer.Next();
+            _classifier.Classify(lexer.CurrentToken);
+
+            _classifier.Reset();
+            lexer.Next();
+            Assert.That(_classifier.Classify(lexer.CurrentToken), Is.EqualTo(ClassificationTag.Keyword));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Escaping_sequence()
+        {
+            Lexer _lexer;
+
+            _lexer = new Lexer();
+
+            // this ensure that escaping can be set in string context only
+
+            _lexer.Parse("\\\\");
+            _classifier.Reset();
+            Assert.That(_lexer.Next(), Is.True);
+            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\\"));
+            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.Code));
+            Assert.That(_classifier.Escaping, Is.False);
+            Assert.That(_lexer.Next(), Is.True);
+            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\\"));
+            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.Code));
+            Assert.That(_classifier.Escaping, Is.False);
+
+
+            // this ensure that parsing "\\\\" two times
+            // set and unset Escaping flag correctly
+
+            _lexer.Parse("\"\\\\\"");
+
+            Assert.That(_lexer.Next(), Is.True);
+            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\""));
+            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
+
+            Assert.That(_classifier.Escaping, Is.False);
+            Assert.That(_lexer.Next(), Is.True);
+            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\\"));
+            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
+            Assert.That(_classifier.Escaping, Is.True);
+
+            Assert.That(_lexer.Next(), Is.True);
+            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\\"));
+            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
+            Assert.That(_classifier.Escaping, Is.False);
+
+            Assert.That(_lexer.Next(), Is.True);
+            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\""));
+            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
+            Assert.That(_classifier.Escaping, Is.False);
+
+
+            // this ensure that first 'a' is considered as string, second as code
+
+            _lexer.Parse("\"\\\"a\"a");
+            _classifier.Reset();
+
+            Assert.That(_lexer.Next(), Is.True);
+            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\""));
+            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
+
+            Assert.That(_lexer.Next(), Is.True);
+            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\\"));
+            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
+            Assert.That(_classifier.Escaping, Is.True);
+
+            Assert.That(_lexer.Next(), Is.True);
+            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\""));
+            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
+            Assert.That(_classifier.Escaping, Is.False);
+
+            Assert.That(_lexer.Next(), Is.True);
+            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("a"));
+            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
+
+            Assert.That(_lexer.Next(), Is.True);
+            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\""));
+            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
+
+            Assert.That(_lexer.Next(), Is.True);
+            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("a"));
+            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.Code));
+
+
+            // another test, this time 'a' should be considered as code
+
+            _lexer.Parse("\"\\\\\"a\"");
+            _classifier.Reset();
+
+            Assert.That(_lexer.Next(), Is.True);
+            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\""));
+            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
+
+            Assert.That(_lexer.Next(), Is.True);
+            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\\"));
+            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
+
+            Assert.That(_lexer.Next(), Is.True);
+            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\\"));
+            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
+
+            Assert.That(_lexer.Next(), Is.True);
+            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\""));
+            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
+
+            Assert.That(_lexer.Next(), Is.True);
+            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("a"));
+            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.Code));
+
+
+            // this ensure that Reset() reset escaping to false
+
+            _lexer.Parse("\"\\");
+            _lexer.Next();
+            _classifier.Classify(_lexer.CurrentToken);
+            _lexer.Next();
+            _classifier.Classify(_lexer.CurrentToken);
+            Assert.That(_classifier.Escaping, Is.True);
+            _classifier.Reset();
+            Assert.That(_classifier.Escaping, Is.False);
+
+            return;
+        }
+
+        #region utility methods
+
+        private void _checkTag(string sequence, Couple[] expected)
+        {
+            Lexer lexer;
+            int returned_tag;
+            TestingClassifier classifier;
+            StringBuilder recognized;
+            string error;
+
+            int i;
+
+            classifier = new TestingClassifier();
+            lexer = new Lexer();
+            lexer.Parse(sequence);
+
+            recognized = new StringBuilder();
+
+            i = 0;
+            while (lexer.Next())
+            {
+                recognized.Append(lexer.CurrentToken.Text);
+
+                error = String.Format(
+                    "Token [{0}] was expected, but [{1}] was returned instead, near: [{2}].",
+                    expected[i].Text,
+                    lexer.CurrentToken.Text,
+                    recognized.ToString());
+                Assert.That(lexer.CurrentToken.Text, Is.EqualTo(expected[i].Text), error);
+
+                returned_tag = classifier.AcceptLexToken(lexer.CurrentToken);
+
+                error = String.Format(
+                    "Tag [{0}] was expected, but [{1}] was returned instead, near: [{2}].",
+                    expected[i].Value,
+                    returned_tag,
+                    recognized.ToString());
+                Assert.That(returned_tag, Is.EqualTo(expected[i].Value), error);
+
+                i++;
+            }
+
+            Assert.That(lexer.Next(), Is.False, "Error, there are unvisited tokens left.");
+            Assert.That(i == expected.Length, "Error, more tokens were expected.");
+
+            return;
+        }
+
+        private void _checkClassification(string sequence, Couple[] expected)
+        {
+            Lexer lexer;
+            ClassificationTag returned_tag;
+            TestingClassifier classifier;
+            StringBuilder recognized;
+            string error;
+
+            int i;
+
+            classifier = new TestingClassifier();
+            lexer = new Lexer();
+            lexer.Parse(sequence);
+
+            recognized = new StringBuilder();
+
+            i = 0;
+            while (lexer.Next())
+            {
+                recognized.Append(lexer.CurrentToken.Text);
+
+                error = String.Format(
+                    "Token [{0}] was expected, but [{1}] was returned instead, near: [{2}].",
+                    expected[i].Text,
+                    lexer.CurrentToken.Text,
+                    recognized.ToString());
+                Assert.That(lexer.CurrentToken.Text, Is.EqualTo(expected[i].Text), error);
+
+                returned_tag = classifier.Classify(lexer.CurrentToken);
+
+                error = String.Format(
+                    "ClassificationTag [{0}] was expected, but [{1}] was returned instead, near: [{2}].",
+                    expected[i].Value,
+                    returned_tag,
+                    recognized.ToString());
+                Assert.That(returned_tag, Is.EqualTo(expected[i].Value), error);
+
+                i++;
+            }
+
+            Assert.That(lexer.Next(), Is.False, "Error, there are unvisited tokens left.");
+            Assert.That(i == expected.Length, "Error, more tokens were expected.");
+
+            return;
+        }
+
+        #endregion
+
+        #region TestingClassifier
+
+        class TestingClassifier :
+            TokenClassifier
+        {
+            public static string ClassString(int code)
+            {
+                switch (code)
+                {
+                    case TokenClassifier.SMSTATE_CODE:
+                        return ("STATE_CODE");
+                    case TokenClassifier.SMSTATE_CCOMMENT:
+                        return ("STATE_COMMENT_C");
+                    case TokenClassifier.SMSTATE_CPPCOMMENT:
+                        return ("STATE_COMMENT_CPP");
+                    case TokenClassifier.SMSTATE_CHAR:
+                        return ("SMSTATE_CHAR");
+                    case TokenClassifier.SMSTATE_STRING:
+                        return ("SMSTATE_STRING");
+                    default:
+                        break;
+                }
+
+                return ("unknown code=" + code);
+            }
+
+            public new int AcceptLexToken(LexToken token)
+            {
+                return (base.AcceptLexToken(token));
+            }
+
+            public new int GetSMSTATE(int stateCode, LexerTag transition)
+            {
+                return (base.GetSMSTATE(stateCode, transition));
+            }
+        }
+
+        #endregion
+
+        #region Couple
+
+        class Couple
+        {
+            public object Value;
+            public string Text;
+
+            public Couple(object value, string text)
+            {
+                Value = value;
+                Text = text;
+            }
+        }
+
+        #endregion
+    }
+}
diff --git a/src/GuiException/tests/CSharpParser/TestTokenDictionary.cs b/src/GuiException/tests/CSharpParser/TestTokenDictionary.cs
new file mode 100644
index 0000000..c7b9da6
--- /dev/null
+++ b/src/GuiException/tests/CSharpParser/TestTokenDictionary.cs
@@ -0,0 +1,290 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using NUnit.UiException.CodeFormatters;
+
+namespace NUnit.UiException.Tests.CodeFormatters
+{
+    [TestFixture]
+    public class TestTokenDictionary
+    {
+        private TestingTokenDictionary _emptyDictionary;
+        private TokenDictionary _filledDictionary;
+
+        [SetUp]
+        public void SetUp()
+        {
+            Lexer lexer;
+
+            _emptyDictionary = new TestingTokenDictionary();
+
+            lexer = new Lexer();
+            _filledDictionary = lexer.Dictionary;
+            Assert.That(_filledDictionary, Is.Not.Null);
+            Assert.That(_filledDictionary.Count, Is.GreaterThan(0));
+
+            return;
+        }
+
+        [Test]
+        public void test_default()
+        {
+            Assert.That(_emptyDictionary.Count, Is.EqualTo(0));
+
+            return;
+        }
+
+        [Test]
+        public void add_token()
+        {
+            _emptyDictionary.Add("=", LexerTag.Separator);
+
+            Assert.That(_emptyDictionary.Count, Is.EqualTo(1));
+
+            return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void Add_can_throw_NullValueException()
+        {
+            _emptyDictionary.Add(null, LexerTag.Separator); // throws exception
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentException),
+            ExpectedMessage = "Token 'one' is already defined.",
+            MatchType = MessageMatch.Contains)]
+        public void Add_can_throw_AlreadyDefinedException()
+        {
+            _emptyDictionary.Add("one", LexerTag.Text);
+            _emptyDictionary.Add("one", LexerTag.Text); // throws exception
+
+            return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentException),
+            ExpectedMessage = "Token value must not be empty.",
+            MatchType = MessageMatch.Contains)]
+        public void Add_can_throw_EmptySequenceException()
+        {
+            _emptyDictionary.Add("", LexerTag.Text); // throws exception
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentException),
+            ExpectedMessage = "Tokens must be inserted from the longest to the shortest value.",
+            MatchType = MessageMatch.Contains)]
+        public void Add_can_throw_InvalidSortException()
+        {
+            _emptyDictionary.Add("one", LexerTag.CommentC_Close);
+            _emptyDictionary.Add("to", LexerTag.CommentC_Close);
+            _emptyDictionary.Add("four", LexerTag.CommentC_Close); // throws exception
+
+            return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void PopulateTokenStartingWith_can_throw_NullStarterException()
+        {
+            _emptyDictionary.PopulateTokenStartingWith(
+                null, new List<LexToken>()); // throws exception
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void PopulateTokenStartingWith_can_throw_NullOutputException()
+        {
+            LexToken token;
+
+            _emptyDictionary.Add("=", LexerTag.Separator);
+            token = _emptyDictionary[0];
+
+            _emptyDictionary.PopulateTokenStartingWith(token, null); // throws exception
+
+            return;
+        }
+
+        [Test]
+        public void PopulateTokenStartingWith()
+        {
+            List<LexToken> list;
+            LexToken token_0;
+            LexToken token_1;
+            LexToken token_2;
+            LexToken token_3;
+            LexToken token_4;
+
+            _emptyDictionary.Add("==", LexerTag.Separator);
+            _emptyDictionary.Add("<=", LexerTag.Separator);
+            _emptyDictionary.Add("=", LexerTag.Separator);
+            _emptyDictionary.Add("<", LexerTag.Separator);
+            _emptyDictionary.Add(";", LexerTag.Separator);
+
+            token_0 = _emptyDictionary[0]; // ==
+            token_1 = _emptyDictionary[1]; // <=
+            token_2 = _emptyDictionary[2]; // =
+            token_3 = _emptyDictionary[3]; // <
+            token_4 = _emptyDictionary[4]; // ;
+
+            list = new List<LexToken>();
+
+            // there is only one token starting with text: "=="
+
+            list.Clear();
+            _emptyDictionary.PopulateTokenStartingWith(token_0, list);
+            Assert.That(list.Count, Is.EqualTo(1));
+            Assert.That(list[0], Is.EqualTo(token_0));
+
+            // there is only one token starting with text: "<="
+
+            list.Clear();
+            _emptyDictionary.PopulateTokenStartingWith(token_1, list);
+            Assert.That(list.Count, Is.EqualTo(1));
+            Assert.That(list[0], Is.EqualTo(token_1));
+
+            // but, two tokens start with: "="
+
+            list.Clear();
+            _emptyDictionary.PopulateTokenStartingWith(token_2, list);
+            Assert.That(list.Count, Is.EqualTo(2));
+            Assert.That(list[0], Is.EqualTo(token_2));
+            Assert.That(list[1], Is.EqualTo(token_0));
+
+            // two tokens start with: "<"
+
+            list.Clear();
+            _emptyDictionary.PopulateTokenStartingWith(token_3, list);
+            Assert.That(list.Count, Is.EqualTo(2));
+            Assert.That(list[0], Is.EqualTo(token_3));
+            Assert.That(list[1], Is.EqualTo(token_1));
+
+            // only one token starts with: ";"
+
+            list.Clear();
+            _emptyDictionary.PopulateTokenStartingWith(token_4, list);
+            Assert.That(list.Count, Is.EqualTo(1));
+            Assert.That(list[0], Is.EqualTo(token_4));
+
+            return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void TryMatch_can_throw_NullTextException()
+        {
+            _emptyDictionary.TryMatch(null, ""); // throws exception
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void TryMatch_can_throw_NullPredictionException()
+        {
+            _emptyDictionary.TryMatch("", null); // throws exception
+        }
+
+        [Test]
+        public void TryMatch_no_prediction()
+        {
+            LexToken match;
+            string[] tab;
+
+            tab = new string[] {
+                "\\\"", "\\\'", "/*", "*/", "//", "\\", " ", "\t", "\r", 
+                ".", ";", "[", "]", "(", ")", "#", ":", "<", ">", "=", 
+                ",", "\n", "'", "\""};
+
+            foreach (string item in tab)
+                _emptyDictionary.Add(item, LexerTag.Separator);
+
+            // this test checks that TryMatch() doesn't fail
+            // to identify tokens when they are passed to the method
+            // as they are declared
+
+            foreach (string item in tab)
+            {
+                match = _emptyDictionary.TryMatch(item, "");
+                Assert.That(match, Is.Not.Null);
+                Assert.That(match.Text, Is.EqualTo(item));
+                Assert.That(match.Tag, Is.EqualTo(LexerTag.Separator));
+            }
+
+            foreach (string item in tab)
+            {
+                match = _emptyDictionary.TryMatch("123" + item, "");
+                Assert.That(match, Is.Not.Null);
+                Assert.That(match.Text, Is.EqualTo("123"));
+                Assert.That(match.Tag, Is.EqualTo(LexerTag.Text));
+            }
+
+            return;
+        }
+
+        [Test]
+        public void TryMatch_prediction()
+        {
+            LexToken match;
+
+            _emptyDictionary.Add("===", LexerTag.Separator);
+            _emptyDictionary.Add("=", LexerTag.Separator);
+
+            // Use TryMatch as it would be by Lexer when analyzing "a=a" sequence.
+
+            Assert.That(_emptyDictionary.TryMatch("a", "=a"), Is.Null);
+
+            match = _emptyDictionary.TryMatch("a=", "a");      // the first 'a' should be consummed
+            Assert.That(match, Is.Not.Null);
+            Assert.That(match.Text, Is.EqualTo("a"));
+            Assert.That(match.Tag, Is.EqualTo(LexerTag.Text));
+
+            match = _emptyDictionary.TryMatch("=", "a");       // this should consume '='
+            Assert.That(match, Is.Not.Null);
+            Assert.That(match.Text, Is.EqualTo("="));
+            Assert.That(match.Tag, Is.EqualTo(LexerTag.Separator));
+
+            match = _emptyDictionary.TryMatch("a", "");       // this should consume last 'a'
+            Assert.That(match, Is.Not.Null);
+            Assert.That(match.Text, Is.EqualTo("a"));
+            Assert.That(match.Tag, Is.EqualTo(LexerTag.Text));
+
+            // Use TryMatch as it would be by Lexer when analyzing "a===a" sequence
+
+            Assert.That(_emptyDictionary.TryMatch("a", "==="), Is.Null);
+
+            match = _emptyDictionary.TryMatch("a=", "==a");  // this should consume 'a'
+            Assert.That(match, Is.Not.Null);
+            Assert.That(match.Text, Is.EqualTo("a"));
+
+            match = _emptyDictionary.TryMatch("=", "==a");
+            Assert.That(match, Is.Not.Null);
+            Assert.That(match.Text, Is.EqualTo("==="));
+
+            match = _emptyDictionary.TryMatch("a", "");
+            Assert.That(match, Is.Not.Null);
+            Assert.That(match.Text, Is.EqualTo("a"));       // this should consume last 'a'
+
+            return;
+        }
+
+        #region TestingTokenDictionary
+
+        class TestingTokenDictionary :
+            TokenDictionary
+        {
+            public new void PopulateTokenStartingWith(LexToken starter, List<LexToken> output)
+            {
+                base.PopulateTokenStartingWith(starter, output);
+            }
+        }
+
+        #endregion
+    }
+}
diff --git a/src/GuiException/tests/CodeFormatters/TestCodeFormatterCollection.cs b/src/GuiException/tests/CodeFormatters/TestCodeFormatterCollection.cs
new file mode 100644
index 0000000..5fb93da
--- /dev/null
+++ b/src/GuiException/tests/CodeFormatters/TestCodeFormatterCollection.cs
@@ -0,0 +1,193 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using NUnit.UiException.CodeFormatters;
+
+namespace NUnit.UiException.Tests.CodeFormatters
+{
+    [TestFixture]
+    public class TestCodeFormatterCollection
+    {
+        private CodeFormatterCollection _empty;
+        private CodeFormatterCollection _filled;
+        private ICodeFormatter _csFormatter;
+        private ICodeFormatter _defaultFormatter;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _empty = new CodeFormatterCollection();
+
+            _csFormatter = new CSharpCodeFormatter();
+            _defaultFormatter = new PlainTextCodeFormatter();
+            _filled = new CodeFormatterCollection();
+            _filled.Register(_csFormatter, "cs");
+            _filled.Register(_defaultFormatter, "txt");
+
+            return;
+        }
+
+        [Test]
+        public void Test_Default()
+        {
+            List<string> extensions;
+//            ErrorItem errorCS;
+//            ErrorItem errorCS_Upper;
+//            ErrorItem errorTxt;
+
+//            errorCS = new ErrorItem("C:\\dir\\file.cs", 1);
+//            errorCS_Upper = new ErrorItem("C:\\dir\\file.CS", 1);
+//            errorTxt = new ErrorItem("C:\\dir\\file.txt", 1);
+
+            Assert.That(_empty.Count, Is.EqualTo(0));
+            Assert.That(_empty.HasExtension("cs"), Is.False);
+            Assert.That(_empty.HasLanguage("C#"), Is.False);
+            Assert.That(_empty, Is.EquivalentTo(new List<string>()));                
+                
+            Assert.That(_filled.Count, Is.EqualTo(2));
+
+            Assert.That(_filled["C#"], Is.EqualTo(_csFormatter));
+            Assert.That(_filled["Plain text"], Is.EqualTo(_defaultFormatter));
+
+            Assert.That(_filled.HasExtension("cs"), Is.True);
+            Assert.That(_filled.HasLanguage("C#"), Is.True);
+
+            extensions = new List<string>();
+            extensions.Add("cs");
+            extensions.Add("txt");
+            Assert.That(_filled.Extensions, Is.EquivalentTo(extensions));
+
+            return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException),
+            ExpectedMessage = "formatter",
+            MatchType = MessageMatch.Contains)]
+        public void Register_Can_Throw_NullFormatterException()
+        {
+            _empty.Register(null, "cs"); // throws exception
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException),
+            ExpectedMessage = "language",
+            MatchType = MessageMatch.Contains)]
+        public void Register_Can_Throw_NullExtensionException()
+        {
+            _empty.Register(_csFormatter, null); // throws exception
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentException),
+            ExpectedMessage = "language cannot be empty",
+            MatchType = MessageMatch.Contains)]
+        public void Register_Check_Extension_Is_Not_Empty()
+        {
+            _empty.Register(_csFormatter, ""); // throws exception
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentException),
+            ExpectedMessage = "language cannot contain '.'",
+            MatchType = MessageMatch.Contains)]
+        public void Register_Check_Extension_Not_Contain_Dot_Character()
+        {
+            _empty.Register(_csFormatter, ".cs"); // throws exception
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentException),
+            ExpectedMessage = "language 'cs' has already an handler. Remove handler first.",
+            MatchType = MessageMatch.Contains)]
+        public void Register_Check_Multiple_Extension_Definition()
+        {
+            _empty.Register(_csFormatter, "cs"); // OK
+            _empty.Register(_defaultFormatter, "cs"); // throws exception
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentException),
+            ExpectedMessage = "language 'cs' has already an handler. Remove handler first.",
+            MatchType = MessageMatch.Contains)]
+        public void Register_Check_Extension_Case()
+        {
+            _empty.Register(_csFormatter, "cs"); // OK
+            _empty.Register(_csFormatter, "CS"); // throws exception
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void StringIndexer_Can_Throw_NullExtensionException()
+        {
+            if (_empty[(string)null] == null) // throws exception
+				return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void ItemIndexer_Can_Throw_NullExtensionException()
+        {
+            if (_empty[null] == null) // throws exception
+				return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentException),
+            ExpectedMessage = "unknown language: 'unk'",
+            MatchType = MessageMatch.Contains)]
+        public void Indexer_Can_Throw_UnknownExtensionException()
+        {
+            if (_empty["unk"] == null) // throws exception
+				return;
+        }
+
+        [Test]
+        public void Remove()
+        {
+            _filled.Remove("cs");
+            Assert.That(_filled.Count, Is.EqualTo(1));
+            Assert.That(_filled.HasExtension("cs"), Is.False);
+
+            _filled.Remove("txt");
+            Assert.That(_filled.Count, Is.EqualTo(0));
+            Assert.That(_filled, Is.EquivalentTo(new List<string>()));
+
+            // should not fail
+            _filled.Remove(null);
+            _filled.Remove("unknown");
+
+            return;
+        }
+
+        [Test]
+        public void Remove_Is_Not_Case_Sensitive()
+        {
+            _filled.Remove("CS");
+            _filled.Remove("TxT");
+            Assert.That(_filled.Count, Is.EqualTo(0));
+
+            return;
+        }
+
+
+        [Test]
+        public void Clear()
+        {
+            _filled.Clear();
+            Assert.That(_filled.Count, Is.EqualTo(0));
+        }
+
+        [Test]
+        public void ContainsFormatterFromExtension()
+        {
+            Assert.That(_filled.HasExtension((string)null), Is.False);
+        }
+    }
+}
diff --git a/src/GuiException/tests/CodeFormatters/TestGeneralCodeFormatter.cs b/src/GuiException/tests/CodeFormatters/TestGeneralCodeFormatter.cs
new file mode 100644
index 0000000..d3c1ee4
--- /dev/null
+++ b/src/GuiException/tests/CodeFormatters/TestGeneralCodeFormatter.cs
@@ -0,0 +1,312 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using NUnit.UiException.CodeFormatters;
+using NUnit.UiException.Tests.data;
+
+namespace NUnit.UiException.Tests.CodeFormatters
+{
+    [TestFixture]
+    public class TestGeneralCodeFormatter
+    {
+        private GeneralCodeFormatter _formatter;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _formatter = new GeneralCodeFormatter();
+
+            return;
+        }
+
+        [Test]
+        public void Test_Default()
+        {
+            Assert.That(_formatter.DefaultFormatter, Is.Not.Null);
+
+            Assert.That(_formatter.Formatters, Is.Not.Null);
+            Assert.That(_formatter.Formatters.Extensions, Is.EquivalentTo(new string[] { "cs" }));
+
+            return;
+        }
+
+        [Test]
+        public void LanguageFromExtension()
+        {
+            Assert.That(_formatter.LanguageFromExtension("cs"), Is.EqualTo("C#"));
+            Assert.That(_formatter.LanguageFromExtension(""), Is.EqualTo("Plain text"));
+            Assert.That(_formatter.LanguageFromExtension(null), Is.EqualTo("Plain text"));
+
+            return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void DefaultFormatter_Can_Throw_FormatterNullException()
+        {
+            _formatter.DefaultFormatter = null; // throws exception
+        }
+
+        [Test]
+        public void DefaultFormatter()
+        {
+            CSharpCodeFormatter csFormatter;
+
+            csFormatter = new CSharpCodeFormatter();
+            _formatter.DefaultFormatter = csFormatter;
+            Assert.That(_formatter.DefaultFormatter, Is.EqualTo(csFormatter));
+
+            return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void GetFormatterFromExtension_Can_Throw_ExtensionNullException()
+        {
+            _formatter.GetFormatterFromExtension(null); // throws exception
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void GetFormatterFromLanguage_Can_Throw_LanguageNullException()
+        {
+            _formatter.GetFormatterFromLanguage(null); // throws exception
+        }
+
+        [Test]
+        public void GetFormatterFroms()
+        {
+            // using extension first
+
+            Assert.That(_formatter.GetFormatterFromExtension("cs"), Is.EqualTo(_formatter.Formatters["C#"]));
+            Assert.That(_formatter.GetFormatterFromExtension("txt"), Is.EqualTo(_formatter.DefaultFormatter));
+
+            // using language name
+
+            Assert.That(_formatter.GetFormatterFromLanguage("C#"), Is.EqualTo(_formatter.Formatters["C#"]));
+            Assert.That(_formatter.GetFormatterFromLanguage("txt"), Is.EqualTo(_formatter.DefaultFormatter));
+
+            return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException),
+            ExpectedMessage = "code",
+            MatchType = MessageMatch.Contains)]
+        public void FormatFromExtension_Can_Throw_CodeNullException()
+        {
+            _formatter.FormatFromExtension(null, "cs"); // throws exception
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException),
+            ExpectedMessage = "extension",
+            MatchType = MessageMatch.Contains)]
+        public void FormatFromExtension_Can_Throw_ExtensionNullException()
+        {
+            _formatter.FormatFromExtension("test", null); // throws exception
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException),
+            ExpectedMessage = "code",
+            MatchType = MessageMatch.Contains)]
+        public void Format_Can_Throw_CodeNullException()
+        {
+            _formatter.Format(null, "C#"); // throws exception
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException),
+            ExpectedMessage = "language",
+            MatchType = MessageMatch.Contains)]
+        public void Format_Can_Throw_LanguageNameNullException()
+        {
+            _formatter.Format("test", null); // throws exception
+        }
+
+        public void FormatResource(TestResource res)
+        {
+            ErrorItem error;
+            FormattedCode code;
+            List<ICodeFormatter> array = GetAllFormatters();
+
+            foreach (ICodeFormatter item in array)
+            {
+                error = new ErrorItem(res.Path, 1);
+                code = item.Format(error.ReadFile());
+
+                Assert.That(code, Is.Not.Null,
+                    "Formatter: " + item + " failed to format resource.");
+
+                try
+                {
+                    FormattedCode.CheckData(code);
+                }
+                catch (Exception e)
+                {
+                    Assert.Fail("Formatter: " + item + " has created an ill-formed data. Error: " + e.Message);
+                }
+            }
+
+            return;
+        }
+
+        /// <summary>
+        /// Returns a list containing all formatters in GeneralCodeFormatter
+        /// and the one in DefaultFormatter.
+        /// </summary>
+        /// <returns></returns>
+        private List<ICodeFormatter> GetAllFormatters()
+        {
+            List<ICodeFormatter> array;
+
+            array = new List<ICodeFormatter>();
+            foreach (ICodeFormatter item in _formatter.Formatters)
+                array.Add(item);
+            array.Add(_formatter.DefaultFormatter);
+
+            return (array);
+        }
+
+        [Test]
+        public void All_Formatters_Have_Unique_Language_Value()
+        {
+            List<ICodeFormatter> formatters;
+            List<string> languages;
+
+            formatters = GetAllFormatters();
+            languages = new List<string>();
+
+            foreach (ICodeFormatter item in formatters)
+                languages.Add(item.Language);
+
+            Assert.That(languages, Is.All.Not.Null);
+            Assert.That(languages, Is.Unique);
+
+            return;
+        }
+
+        [Test]
+        public void All_Formatters_Should_PreProcess_Tab_Character()
+        {
+            List<ICodeFormatter> formatters;
+            FormattedCode res;
+
+            // We don't have reliable way to measure '\t' at drawing time,
+            // hence, each textFormatter should replace '\t' by one or more white spaces.
+
+            formatters = GetAllFormatters();
+            foreach (ICodeFormatter formatter in formatters)
+            {
+                res = formatter.Format("hi\tthere!");
+
+                Assert.That(
+                    res.Text.IndexOf("\t") == -1,
+                    "Formatter: " + formatter + " failed to remove initial '\\t' characters.");
+            }
+
+            return;
+        }
+
+        [Test]
+        public void All_Formatters_Should_Have_Overwrite_Behavior()
+        {
+            List<ICodeFormatter> formatters;
+            FormattedCode res;
+
+            // check that formatters reset their state before
+            // processing new data. So new data overwrite former one.
+
+            formatters = GetAllFormatters();
+            foreach (ICodeFormatter formatter in formatters)
+            {
+                // process this text first
+                formatter.Format("line 1\r\nline 2\r\nline 3");
+
+                // after processing "hi", we expect res to contain
+                // just one line of text.
+                res = formatter.Format("hi");
+                Assert.That(
+                    res.CopyInfo().LineArray.Count,
+                    Is.EqualTo(1),
+                    "Formatter: " + formatter + " failed to reset its state.");
+            }
+
+            return;
+        }
+
+        [Test]
+        public void Any_Formatter_Should_Format_Any_Text()
+        {
+            TestResource res;
+
+            using (res = new TestResource("HelloWorld.txt"))
+            {
+                FormatResource(res);
+            }
+
+            using (res = new TestResource("Basic.cs"))
+            {
+                FormatResource(res);
+            }
+
+            using (res = new TestResource("TextCode.txt"))
+            {
+                FormatResource(res);
+            }
+
+
+            return;
+        }
+
+        [Test]
+        public void Format()
+        {
+            Assert.That(_formatter.Format("test", "C#"), Is.Not.Null);
+            Assert.That(_formatter.Format("test", "txt"), Is.Not.Null);
+
+            return;
+        }
+
+        [Test]
+        public void Format_Pick_Best_Formatter()
+        {
+            ErrorItem itemHelloTxt;
+            ErrorItem itemBasicCs;
+            ICodeFormatter txtFormatter;
+            ICodeFormatter csFormatter;
+            FormattedCode exp;
+
+            using (new TestResource("HelloWorld.txt"))
+            {
+                itemHelloTxt = new ErrorItem("HelloWorld.txt", 1);
+                txtFormatter = new PlainTextCodeFormatter();
+                exp = txtFormatter.Format(itemHelloTxt.ReadFile());
+                Assert.That(
+                    _formatter.FormatFromExtension(itemHelloTxt.ReadFile(), itemHelloTxt.FileExtension),
+                    Is.EqualTo(exp));
+                FormattedCode.CheckData(exp);
+            }
+
+            using (new TestResource("Basic.cs"))
+            {
+                itemBasicCs = new ErrorItem("Basic.cs", 1);
+                csFormatter = new CSharpCodeFormatter();
+                exp = csFormatter.Format(itemBasicCs.ReadFile());
+                Assert.That(
+                    _formatter.FormatFromExtension(itemBasicCs.ReadFile(), itemBasicCs.FileExtension),
+                    Is.EqualTo(exp));
+                FormattedCode.CheckData(exp);
+            }
+
+            return;
+        }
+    }    
+}
diff --git a/src/GuiException/tests/CodeFormatters/TestPlainTextCodeFormatter.cs b/src/GuiException/tests/CodeFormatters/TestPlainTextCodeFormatter.cs
new file mode 100644
index 0000000..efd3ebb
--- /dev/null
+++ b/src/GuiException/tests/CodeFormatters/TestPlainTextCodeFormatter.cs
@@ -0,0 +1,98 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using NUnit.UiException.CodeFormatters;
+
+namespace NUnit.UiException.Tests.CodeFormatters
+{
+    [TestFixture]
+    public class TestPlainTextCodeFormatter
+    {
+        private PlainTextCodeFormatter _formatter;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _formatter = new PlainTextCodeFormatter();
+
+            return;
+        }
+
+        [Test]
+        public void Test_Language()
+        {
+            Assert.That(_formatter.Language, Is.EqualTo("Plain text"));
+        }
+
+        [Test]
+        public void Test_PreProcess()
+        {
+            // PreProcess is expected to remove '\t' sequences.
+            // This test expects that normal strings are left untouched.
+
+            Assert.That(_formatter.PreProcess("hello world"), Is.EqualTo("hello world"));
+
+            // This test expects to see differences
+            Assert.That(_formatter.PreProcess("hello\tworld"), Is.EqualTo("hello    world"));
+
+            // test to fail: passing null has no effect.
+            Assert.That(_formatter.PreProcess(null), Is.Null);
+
+            return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void Format_Can_Throw_CodeNullException()
+        {
+            _formatter.Format(null); // throws exception
+        }
+
+        [Test]
+        public void Format_HelloWorld()
+        {
+            FormattedCode res;
+            FormattedCode exp;
+            
+            res = _formatter.Format("Hello world!");
+
+            exp = new FormattedCode(
+                "Hello world!",
+                new int[] { 0 },
+                new byte[] { 0 },
+                new int[] { 0 });
+
+            Assert.That(res, Is.EqualTo(exp));
+
+            return;
+        }
+
+        [Test]
+        public void Format_Lines()
+        {
+            FormattedCode res;
+            FormattedCode exp;
+
+            res = _formatter.Format(
+                "line 1\r\n" +
+                "line 2\r\n" +
+                "line 3\r\n");
+
+            exp = new FormattedCode(
+                res.Text,
+                new int[] { 0, 8, 16 },
+                new byte[] { 0, 0, 0 },
+                new int[] { 0, 1, 2 });
+
+            Assert.That(res, Is.EqualTo(exp));
+
+            return;
+        }
+    }    
+}
diff --git a/src/GuiException/tests/Controls/TestCodeBox.cs b/src/GuiException/tests/Controls/TestCodeBox.cs
new file mode 100644
index 0000000..7ab8ff7
--- /dev/null
+++ b/src/GuiException/tests/Controls/TestCodeBox.cs
@@ -0,0 +1,593 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using NUnit.UiException;
+using System.Drawing;
+using NUnit.UiException.Controls;
+using NUnit.UiException.CodeFormatters;
+using NUnit.Mocks;
+using System.Windows.Forms;
+
+namespace NUnit.UiException.Tests.Controls
+{
+    [TestFixture]
+    public class TestCodeBox
+    {
+        private TestingCodeBox _box;
+
+//        private FormattedCode _emptyText;
+        private FormattedCode _someText;
+        private FormattedCode _someCode;
+
+        private DynamicMock _mockFormatter;
+        private DynamicMock _mockRenderer;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _mockFormatter = new DynamicMock(typeof(IFormatterCatalog));
+            _mockRenderer = new DynamicMock(typeof(ICodeRenderer));
+
+            _box = new TestingCodeBox((IFormatterCatalog)_mockFormatter.MockInstance,
+                                (ICodeRenderer)_mockRenderer.MockInstance);
+            _box.Width = 150;
+            _box.Height = 150;
+
+//            _emptyText = Format("", "");
+            _someText = Format("some C# code", "");
+            _someCode = Format("some C# code", "C#");
+
+            return;
+        }
+
+        FormattedCode Format(string text, string language)
+        {
+            ICodeFormatter formatter;
+
+            if (language == "C#")
+                formatter = new CSharpCodeFormatter();
+            else
+                formatter = new PlainTextCodeFormatter();
+
+            return (formatter.Format(text));
+        }
+
+        TestingCodeBox SetupCodeBox(FormattedCode code, SizeF size)
+        {
+            TestingCodeBox box;
+
+            box = new TestingCodeBox(
+                (IFormatterCatalog)_mockFormatter.MockInstance,
+                (ICodeRenderer)_mockRenderer.MockInstance);
+
+            _mockFormatter.ExpectAndReturn("Format", code, new object[] { code.Text, "" });
+
+            _mockRenderer.ExpectAndReturn("GetDocumentSize", size,
+                new object[] { code, box.RenderingContext.Graphics, box.RenderingContext.Font });
+
+            box.Text = code.Text;
+            Assert.That(box.Text, Is.EqualTo(code.Text));
+
+            _mockFormatter.Verify();
+            _mockRenderer.Verify();
+
+            return (box);
+        }
+
+        [Test]
+        public void DefaultState()
+        {
+            CodeBox box = new CodeBox();
+
+            Assert.That(box.Text, Is.EqualTo(""));
+
+            Assert.That(box.Language, Is.EqualTo(""));
+
+            Assert.True(box.AutoScroll);
+            Assert.That(box.AutoScrollPosition, Is.EqualTo(new Point(0, 0)));
+            Assert.That(box.AutoScrollMinSize, Is.EqualTo(new Size(0, 0)));
+
+            Assert.False(box.ShowCurrentLine);
+            Assert.That(box.CurrentLine, Is.EqualTo(-1));
+            Assert.That(box.CurrentLineBackColor, Is.EqualTo(Color.Red));
+            Assert.That(box.CurrentLineForeColor, Is.EqualTo(Color.White));
+
+            Assert.That(box.BackColor, Is.EqualTo(Color.White));
+            Assert.That(box.Font.Size, Is.EqualTo(8));
+
+            return;
+        }
+
+        [Test]
+        public void Format_Text_With_Language()
+        {
+            // when setting a text, the underlying textFormatter should be called
+            // to format data in the current language mode.
+            // The result should be assigned to the underlying display.
+
+            _mockFormatter.ExpectAndReturn("Format", _someText, new object[] { _someText.Text, "" });
+
+            _mockRenderer.ExpectAndReturn("GetDocumentSize", new SizeF(100, 100),
+                new object[] { _someText, _box.RenderingContext.Graphics, _box.RenderingContext.Font });
+
+            _box.Text = _someText.Text;
+            _mockFormatter.Verify();
+            _mockRenderer.Verify();
+
+            Assert.That(_box.Text, Is.EqualTo(_someText.Text));
+            Assert.That(_box.AutoScrollMinSize, Is.EqualTo(new Size(100, 100)));
+
+            // passing null to Text as same effect than passing ""
+
+            _mockFormatter.ExpectAndReturn("Format", FormattedCode.Empty,
+                new object[] { "", "" });
+
+            _mockRenderer.ExpectAndReturn("GetDocumentSize", new SizeF(0, 0),
+                new object[] { FormattedCode.Empty, _box.RenderingContext.Graphics, _box.RenderingContext.Font });
+
+            _box.Text = null;
+            _mockFormatter.Verify();
+            _mockRenderer.Verify();
+
+            Assert.That(_box.Text, Is.EqualTo(""));           
+
+            return;
+        }
+
+        [Test]
+        public void OnPaint()
+        {
+            TestingCodeBox box = SetupCodeBox(_someText, new SizeF(300, 400));
+
+            box.Width = 150;
+            box.Height = 150;
+
+            _mockRenderer.Expect("DrawToGraphics",
+                new object[] { _someText, box.RenderingContext, new Rectangle(0, 0, 150, 150) });
+
+            box.FireOnPaint();
+            _mockRenderer.Verify();
+
+            return;
+        }
+
+        [Test]
+        public void Changing_Language_Causes_Reformatting()
+        {
+            _box = SetupCodeBox(_someCode, new SizeF(200, 400));
+
+            _mockFormatter.ExpectAndReturn("Format", _someCode, new object[] { _someCode.Text, "C#" });
+            _mockRenderer.ExpectAndReturn("GetDocumentSize", new SizeF(200, 400),
+                new object[] { _someCode, _box.RenderingContext.Graphics, _box.RenderingContext.Font });
+
+            _box.Language = "C#";
+            Assert.That(_box.Language, Is.EqualTo("C#"));
+
+            _mockFormatter.Verify();
+            _mockRenderer.Verify();
+
+            // setting null in language is same as setting "" or "Plain text"
+
+            _mockFormatter.ExpectAndReturn("Format", _someText, new object[] { _someCode.Text, "" });
+            _mockRenderer.ExpectAndReturn("GetDocumentSize", new SizeF(100, 100),
+                new object[] { _box.FormattedCode, _box.RenderingContext.Graphics, _box.RenderingContext.Font });
+
+            _box.Language = null;
+            Assert.That(_box.Language, Is.EqualTo(""));
+
+            return;
+        }
+
+        [Test]
+        public void Changing_Font_Causes_Reformatting()
+        {
+            Font courier14 = new Font("Courier New", 14);
+
+            _box = SetupCodeBox(_someCode, new SizeF(200, 400));
+
+            _mockFormatter.ExpectAndReturn("Format", _someCode, new object[] { _someCode.Text, "" });
+            _mockRenderer.ExpectAndReturn("GetDocumentSize", new SizeF(200, 400),
+                new object[] { _someCode, _box.RenderingContext.Graphics, courier14 });
+
+            _box.Font = courier14;
+
+            _mockFormatter.Verify();
+            _mockRenderer.Verify();
+
+            Assert.That(_box.RenderingContext.Font, Is.SameAs(_box.Font));
+
+            return;
+        }
+       
+        [Test]
+        public void CurrentLine()
+        {
+            FormattedCode data = Format(
+                "line 0\r\nline 1\r\nline 2\r\nline 3\r\nline 4\r\nline 5\r\nline 6\r\nline 7\r\n", "");
+
+            _box = SetupCodeBox(data, new SizeF(200, 400));
+            _box.Height = 30;
+
+            // CurrentLine: 0
+
+            _mockRenderer.ExpectAndReturn("LineIndexToYCoordinate", 0f,
+                new object[] { 0, _box.RenderingContext.Graphics, _box.RenderingContext.Font });
+
+            _box.CurrentLine = 0;
+            _mockRenderer.Verify();
+
+            Assert.That(_box.CurrentLine, Is.EqualTo(0));
+            Assert.That(_box.AutoScrollPosition, Is.EqualTo(new Point(0, 0)));
+
+            // CurrentLine: 7
+
+            _mockRenderer.ExpectAndReturn("LineIndexToYCoordinate", 390f,
+                new object[] { 7, _box.RenderingContext.Graphics, _box.RenderingContext.Font });
+
+            _box.CurrentLine = 7;
+            _mockRenderer.Verify();
+
+            Assert.That(_box.CurrentLine, Is.EqualTo(7));
+            Assert.That(_box.AutoScrollPosition, Is.EqualTo(new Point(0, -375)));
+
+            return;
+        }
+
+        [Test]
+        public void Can_Disable_ShowCurrentLine()
+        {
+            TestingRenderer renderer = new TestingRenderer();
+
+            _box = new TestingCodeBox(new GeneralCodeFormatter(), renderer);
+            _box.Text = "line 1\r\nline 2\r\nline 3\r\n";
+            _box.ShowCurrentLine = true;
+            
+            _box.CurrentLine = 1;
+            _box.FireOnPaint();
+            Assert.That(renderer.CURRENTLINE_INDEX, Is.EqualTo(1));            
+
+            _box.ShowCurrentLine = false;
+            _box.FireOnPaint();
+            Assert.That(renderer.CURRENTLINE_INDEX, Is.EqualTo(-1));
+
+            _box.ShowCurrentLine = true;
+            _box.FireOnPaint();
+            Assert.That(renderer.CURRENTLINE_INDEX, Is.EqualTo(1));
+
+            return;
+        }
+
+        [Test]
+        public void Can_Set_Back_And_Fore_Colors()
+        {
+            CodeBox box;
+
+            box = new CodeBox();
+            box.Text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.";
+
+            box.CurrentLineBackColor = Color.Black;
+            Assert.That(box.CurrentLineBackColor, Is.EqualTo(Color.Black));
+
+            box.CurrentLineForeColor = Color.Blue;
+            Assert.That(box.CurrentLineForeColor, Is.EqualTo(Color.Blue));
+
+            return;
+        }
+
+        class TestingCodeBox : CodeBox
+        {
+            public TestingCodeBox()
+            {
+            }
+
+            public TestingCodeBox(IFormatterCatalog formatter, ICodeRenderer renderer) :
+                base(formatter, renderer) { }
+
+            public CodeRenderingContext RenderingContext {
+                get { return (_workingContext); }
+            }
+
+            public FormattedCode FormattedCode {
+                get { return (_formattedCode); }
+            }
+
+            public new void OnScroll(ScrollEventArgs args)
+            {
+                base.OnScroll(args);
+            }                        
+
+            public void FireOnPaint()
+            {
+                OnPaint(new PaintEventArgs(_workingContext.Graphics,
+                    new Rectangle(0, 0, Width, Height)));
+
+                return;
+            }
+        }
+
+        class TestingRenderer : ICodeRenderer
+        {
+            public int CURRENTLINE_INDEX;            
+
+            #region ICodeRenderer Membres
+
+            public void DrawToGraphics(FormattedCode code, CodeRenderingContext args, Rectangle viewport)
+            {
+                CURRENTLINE_INDEX = args.CurrentLine;
+            }
+
+            public SizeF GetDocumentSize(FormattedCode code, Graphics g, Font font)
+            {
+                return (new SizeF(200, 400));
+            }
+
+            public float LineIndexToYCoordinate(int lineIndex, Graphics g, Font font)
+            {
+                return (0);   
+            }
+
+            #endregion
+        }
+    }
+
+/*    [TestFixture]
+    public class TestCodeBox
+    {
+        private InternalCodeBox _empty;
+        private InternalCodeBox _filled;
+
+        private int _repaintNotification;
+        private int _textChangedNotification;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _empty = new InternalCodeBox();
+
+            _filled = new InternalCodeBox();
+            _filled.Text = "111\r\n" +
+                           "222\r\n" +
+                           "333\r\n";
+            _filled.HighlightedLine = 1;
+
+            _filled.Repainted += new RepaintEventArgs(_filled_Repainted);
+            _filled.TextChanged += new EventHandler(_filled_TextChanged);
+
+            _repaintNotification = 0;            
+
+            return;
+        }
+
+        void _filled_TextChanged(object sender, EventArgs e)
+        {
+            _textChangedNotification++;
+        }
+
+        void _filled_Repainted(object sender, EventArgs e)
+        {
+            _repaintNotification++;
+        }
+
+        [Test]
+        public void Test_Default()
+        {
+            Assert.That(_empty.Text, Is.EqualTo(""));
+            Assert.That(_empty.HighlightedLine, Is.EqualTo(0));
+            Assert.That(_empty.Viewport, Is.Not.Null);
+            Assert.That(_empty.FirstLine, Is.EqualTo(""));
+            Assert.That(_empty.CurrentLineNumber, Is.EqualTo(1));
+            Assert.That(_empty.MouseWheelDistance, Is.EqualTo(OLD_CodeBox.DEFAULT_MOUSEWHEEL_DISTANCE));
+
+            Assert.That(_empty.Viewport.CharHeight, Is.GreaterThan(1));
+            Assert.That(_empty.Viewport.CharWidth, Is.GreaterThan(1));
+            Assert.That(_empty.Viewport.Width, Is.GreaterThan(1));
+            Assert.That(_empty.Viewport.Height, Is.GreaterThan(1));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Filled()
+        {
+            Assert.That(_filled.Text, Is.EqualTo("111\r\n222\r\n333\r\n"));
+            Assert.That(_filled.HighlightedLine, Is.EqualTo(1));
+            Assert.That(_filled.FirstLine, Is.EqualTo("111"));
+            Assert.That(_filled.CurrentLineNumber, Is.EqualTo(1));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Setting_MouseWheelDistance()
+        {
+            _filled.MouseWheelDistance = 4;
+            Assert.That(_filled.MouseWheelDistance, Is.EqualTo(4));
+
+            _filled.MouseWheelDistance = 6;
+            Assert.That(_filled.MouseWheelDistance, Is.EqualTo(6));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Setting_Text()
+        {
+            _textChangedNotification = 0;
+
+            _filled.Text = "hello world";
+            Assert.That(_repaintNotification, Is.EqualTo(1));
+            Assert.That(_textChangedNotification, Is.EqualTo(1));
+
+            // test to fail
+            _filled.Text = null;
+            Assert.That(_filled.Text, Is.EqualTo(""));
+
+            return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void SetFormattedCode_Can_Throw_FormatNullException()
+        {
+            _filled.SetFormattedCode(null); // throws exception
+        }
+
+        [Test]
+        public void Test_Setting_FormattedCode()
+        {
+            CSharpCodeFormatter textFormatter;
+            FormattedCode format;
+
+            textFormatter = new CSharpCodeFormatter();
+            format = textFormatter.Format("namespace test { class MyClass { } }\r\n");
+
+            _filled.SetFormattedCode(format);
+            Assert.That(_filled.Text, Is.EqualTo("namespace test { class MyClass { } }\r\n"));           
+
+            return;
+        }
+
+        [Test]
+        public void Test_Setting_Size_Invalidate_Box()
+        {
+            _filled.Width = 200;
+            Assert.That(_repaintNotification, Is.EqualTo(1));
+
+            _filled.Height = 400;
+            Assert.That(_repaintNotification, Is.EqualTo(2));
+
+            Assert.That(_filled.Viewport.Width, Is.EqualTo(200));
+            Assert.That(_filled.Viewport.Height, Is.EqualTo(400));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Setting_HighlighedLine_Invalidate_Box()
+        {
+            _filled.HighlightedLine = 2;
+            Assert.That(_repaintNotification, Is.EqualTo(1));
+        }
+
+        [Test]
+        public void Test_Changing_Location_Invalidate_Box()
+        {
+            _filled.Viewport.Location = new PointF(0, 1);
+            Assert.That(_repaintNotification, Is.EqualTo(1));
+        }
+
+        [Test]
+        public void Test_TranslateView()
+        {
+            _filled.Text = "******\r\n******\r\n******\r\n******\r\n******\r\n";
+            _filled.Viewport.SetCharSize(1, 1);
+            _filled.Viewport.SetViewport(1, 1);
+
+            _filled.TranslateView(0, 0);
+            Assert.That(_filled.Viewport.Location, Is.EqualTo(new PointF(0, 0)));
+
+            _filled.TranslateView(2, 1);
+            Assert.That(_filled.Viewport.Location, Is.EqualTo(new PointF(2, 1)));
+
+            _filled.TranslateView(3, 1);
+            Assert.That(_filled.Viewport.Location, Is.EqualTo(new PointF(5, 2)));
+
+            return;
+        }
+
+        [Test]
+        public void Test_CurrentLineNumber()
+        {
+            _filled.Viewport.SetViewport(1, 1);
+            _filled.Viewport.SetCharSize(1, 1);
+
+            Assert.That(_filled.CurrentLineNumber, Is.EqualTo(1));
+
+            _filled.TranslateView(0, 1000);
+
+            Assert.That(_filled.CurrentLineNumber,
+                Is.EqualTo(_filled.Viewport.TextSource.LineCount));
+
+            _filled.TranslateView(0, -2000);
+            Assert.That(_filled.CurrentLineNumber, Is.EqualTo(1));
+
+            return;
+        }
+
+        [Test]
+        public void Test_MouseWheel_Up()
+        {
+            _filled.Viewport.SetViewport(1, 1);
+            _filled.Viewport.SetCharSize(1, 1);
+
+            _filled.Viewport.SetPosition(0, 2);
+
+            _filled.MouseWheelDistance = 1;           
+
+            _filled.HandleMouseWheelUp();
+            Assert.That(_filled.Viewport.Location, Is.EqualTo(new PointF(0, 1)));
+
+            _filled.HandleMouseWheelUp();
+            Assert.That(_filled.Viewport.Location, Is.EqualTo(new PointF(0, 0)));
+
+            return;
+        }
+
+        [Test]
+        public void Test_MouseWheel_Down()
+        {
+            _filled.Viewport.SetViewport(1, 1);
+            _filled.Viewport.SetCharSize(1, 1);
+
+            _filled.Viewport.SetPosition(0, 0);
+
+            _filled.MouseWheelDistance = 1;
+
+            _filled.HandleMouseWheelDown();
+            Assert.That(_filled.Viewport.Location, Is.EqualTo(new PointF(0, 1)));
+
+            _filled.HandleMouseWheelDown();
+            Assert.That(_filled.Viewport.Location, Is.EqualTo(new PointF(0, 2)));
+
+            return;
+        }
+
+        #region InternalCodeBox
+
+        delegate void RepaintEventArgs(object sender, EventArgs e);
+
+        class InternalCodeBox :
+            OLD_CodeBox
+        {
+            public event RepaintEventArgs Repainted;
+
+            protected override void Repaint()
+            {
+                base.Repaint();
+
+                if (Repainted != null)
+                    Repainted(this, new EventArgs());
+
+                return;
+            }
+
+            public new void HandleMouseWheelUp()
+            {
+                base.HandleMouseWheelUp();
+            }
+
+            public new void HandleMouseWheelDown()
+            {
+                base.HandleMouseWheelDown();
+            }
+        }
+
+        #endregion
+    } */
+}
diff --git a/src/GuiException/tests/Controls/TestCodeRenderingContext.cs b/src/GuiException/tests/Controls/TestCodeRenderingContext.cs
new file mode 100644
index 0000000..a13165c
--- /dev/null
+++ b/src/GuiException/tests/Controls/TestCodeRenderingContext.cs
@@ -0,0 +1,170 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using NUnit.UiException.Controls;
+using System.Drawing;
+using NUnit.UiException.CodeFormatters;
+
+namespace NUnit.UiException.Tests.Controls
+{
+    [TestFixture]
+    public class TestCodeRenderingContext
+    {
+        private CodeRenderingContext _context;
+
+        [SetUp]
+        public void SetUp()
+        {
+            TestingCodeBox box = new TestingCodeBox();
+            _context = box.RenderingContext;
+        }
+
+        [Test]
+        public void DefaultState()
+        {
+            Assert.NotNull(_context);
+            Assert.NotNull(_context.Graphics);
+            Assert.NotNull(_context.Font);
+            Assert.That(_context.Font.Size, Is.EqualTo(8));
+
+            Assert.That(_context.CurrentLine, Is.EqualTo(-1));
+
+            Assert.That(_context.BackgroundColor, Is.EqualTo(Color.White));
+            Assert.That(_context.CurrentLineBackColor, Is.EqualTo(Color.Red));
+            Assert.That(_context.CurrentLineForeColor, Is.EqualTo(Color.White));
+            Assert.That(_context.KeywordColor, Is.EqualTo(Color.Blue));
+            Assert.That(_context.CommentColor, Is.EqualTo(Color.Green));
+            Assert.That(_context.CodeColor, Is.EqualTo(Color.Black));
+            Assert.That(_context.StringColor, Is.EqualTo(Color.Red));
+
+            Assert.That(_context[ClassificationTag.Code], Is.EqualTo(_context.CodeColor));
+            Assert.That(_context[ClassificationTag.Comment], Is.EqualTo(_context.CommentColor));
+            Assert.That(_context[ClassificationTag.Keyword], Is.EqualTo(_context.KeywordColor));
+            Assert.That(_context[ClassificationTag.String], Is.EqualTo(_context.StringColor));
+
+            CheckBrushes(_context);
+            CheckPens(_context);
+
+            return;
+        }
+
+        void CheckBrushes(CodeRenderingContext context)
+        {
+            Assert.NotNull(_context.BackgroundBrush);
+            Assert.NotNull(_context.CurrentLineBackBrush);
+            Assert.NotNull(_context.CurrentLineForeBrush);
+            Assert.NotNull(_context.KeywordBrush);
+            Assert.NotNull(_context.CommentBrush);
+            Assert.NotNull(_context.CodeBrush);
+            Assert.NotNull(_context.StringBrush);
+
+            Assert.That(_context.GetBrush(ClassificationTag.Code),
+                Is.SameAs(_context.CodeBrush));
+            Assert.That(_context.GetBrush(ClassificationTag.Comment),
+                Is.SameAs(_context.CommentBrush));
+            Assert.That(_context.GetBrush(ClassificationTag.Keyword),
+                Is.SameAs(_context.KeywordBrush));
+            Assert.That(_context.GetBrush(ClassificationTag.String),
+                Is.SameAs(_context.StringBrush));
+
+            return;
+        }
+
+        void CheckPens(CodeRenderingContext context)
+        {
+            Assert.NotNull(_context.BackgroundPen);
+            Assert.NotNull(_context.CurrentLineBackPen);
+            Assert.NotNull(_context.CurrentLineForePen);
+            Assert.NotNull(_context.KeywordPen);
+            Assert.NotNull(_context.CommentPen);
+            Assert.NotNull(_context.CodePen);
+            Assert.NotNull(_context.StringPen);
+
+            Assert.That(_context.GetPen(ClassificationTag.Code),
+               Is.SameAs(_context.CodePen));
+            Assert.That(_context.GetPen(ClassificationTag.Comment),
+                Is.SameAs(_context.CommentPen));
+            Assert.That(_context.GetPen(ClassificationTag.Keyword),
+                Is.SameAs(_context.KeywordPen));
+            Assert.That(_context.GetPen(ClassificationTag.String),
+                Is.SameAs(_context.StringPen));
+
+            return;
+        }
+
+        [Test]
+        public void Can_Change_Colors()
+        {
+            Brush formerBrush;
+            Pen formerPen;
+
+            formerBrush = _context.BackgroundBrush;
+            formerPen = _context.BackgroundPen;
+            _context.BackgroundColor = Color.Pink;
+            Assert.That(_context.BackgroundColor, Is.EqualTo(Color.Pink));
+            Assert.That(_context.BackgroundPen, Is.Not.SameAs(formerPen));
+            Assert.That(_context.BackgroundBrush, Is.Not.SameAs(formerBrush));
+
+            formerBrush = _context.CodeBrush;
+            formerPen = _context.CodePen;
+            _context.CodeColor = Color.Pink;
+            Assert.That(_context.CodeColor, Is.EqualTo(Color.Pink));
+            Assert.That(_context.CodePen, Is.Not.SameAs(formerPen));
+            Assert.That(_context.CodeBrush, Is.Not.SameAs(formerBrush));
+
+            formerBrush = _context.CommentBrush;
+            formerPen = _context.CommentPen;
+            _context.CommentColor = Color.Pink;
+            Assert.That(_context.CommentColor, Is.EqualTo(Color.Pink));
+            Assert.That(_context.CommentPen, Is.Not.SameAs(formerPen));
+            Assert.That(_context.CommentBrush, Is.Not.SameAs(formerBrush));
+
+            formerBrush = _context.CurrentLineBackBrush;
+            formerPen = _context.CurrentLineBackPen;
+            _context.CurrentLineBackColor = Color.Pink;
+            Assert.That(_context.CurrentLineBackColor, Is.EqualTo(Color.Pink));
+            Assert.That(_context.CurrentLineBackPen, Is.Not.SameAs(formerPen));
+            Assert.That(_context.CurrentLineBackBrush, Is.Not.SameAs(formerBrush));
+
+            formerBrush = _context.CurrentLineForeBrush;
+            formerPen = _context.CurrentLineForePen;
+            _context.CurrentLineForeColor = Color.Pink;
+            Assert.That(_context.CurrentLineForeColor, Is.EqualTo(Color.Pink));
+            Assert.That(_context.CurrentLineForePen, Is.Not.SameAs(formerPen));
+            Assert.That(_context.CurrentLineForeBrush, Is.Not.SameAs(formerBrush));
+
+            formerBrush = _context.KeywordBrush;
+            formerPen = _context.KeywordPen;
+            _context.KeywordColor = Color.Pink;
+            Assert.That(_context.KeywordColor, Is.EqualTo(Color.Pink));
+            Assert.That(_context.KeywordPen, Is.Not.SameAs(formerPen));
+            Assert.That(_context.KeywordBrush, Is.Not.SameAs(formerBrush));
+
+            formerBrush = _context.StringBrush;
+            formerPen = _context.StringPen;
+            _context.StringColor = Color.Pink;
+            Assert.That(_context.StringColor, Is.EqualTo(Color.Pink));
+            Assert.That(_context.StringPen, Is.Not.SameAs(formerPen));
+            Assert.That(_context.StringBrush, Is.Not.SameAs(formerBrush));
+
+            CheckPens(_context);
+            CheckBrushes(_context);
+
+            return;
+        }
+
+        class TestingCodeBox : CodeBox
+        {
+            public CodeRenderingContext RenderingContext
+            {
+                get { return (_workingContext); }
+            }
+        }
+    }
+}
diff --git a/src/GuiException/tests/Controls/TestDefaultCodeRenderer.cs b/src/GuiException/tests/Controls/TestDefaultCodeRenderer.cs
new file mode 100644
index 0000000..7091556
--- /dev/null
+++ b/src/GuiException/tests/Controls/TestDefaultCodeRenderer.cs
@@ -0,0 +1,266 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using NUnit.UiException.Controls;
+using NUnit.UiException.CodeFormatters;
+using System.Drawing;
+
+namespace NUnit.UiException.Tests.Controls
+{
+    [TestFixture]
+    public class TestDefaultCodeRenderer
+    {
+        private ICodeRenderer _renderer;
+        private FormattedCode _empty;
+//        private FormattedCode _code;
+        private FormattedCode _loremIpsum;
+        private FormattedCode _text3x7;
+        private CodeRenderingContext _args;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _renderer = new DefaultCodeRenderer();
+
+            ICodeFormatter formatter = new PlainTextCodeFormatter();
+
+            _empty = formatter.Format("");
+
+//            _code = formatter.Format(
+//                "line 1\r\n" +
+//                "line 2\r\n" +
+//                "line 3\r\n" +
+//                "line 4\r\n");
+
+            _text3x7 = formatter.Format(
+                    "111\r\n" +
+                    "222\r\n" +
+                    "333\r\n" +
+                    "444\r\n" +
+                    "555\r\n" +
+                    "666\r\n" +
+                    "777\r\n");
+
+            _loremIpsum = formatter.Format(
+                "Lorem ipsum dolor sit\r\n" +
+                "amet, consectetur adipiscing elit.\r\n" +
+                "Maecenas a nisi. In imperdiet, orci in\r\n" +
+                "porta facilisis,\r\n" +
+                "odio purus iaculis est, non varius urna turpis in mi.\r\n" + // longest line
+                "Nullam dictum. Ut iaculis dignissim nulla.\r\n" +
+                "Nullam condimentum porttitor leo.\r\n" +
+                "Integer a odio et\r\n" +
+                "velit suscipit pulvinar.");
+
+            Image img = new Bitmap(100, 100);
+            _args = new CodeRenderingContext();
+            _args.Graphics = Graphics.FromImage(img);
+            _args.Font = new Font("Courier New", 12);
+
+            return;
+        }
+
+        [Test]
+        public void DrawToGraphics_Can_Raise_ArgumentNullException()
+        {
+            try {
+                _renderer.DrawToGraphics(null, _args, new Rectangle()); // throws exception
+                Assert.Fail();
+            }
+            catch (Exception e) {
+                Assert.True(e.Message.Contains("code"));
+            }
+
+            try {
+                _renderer.DrawToGraphics(_loremIpsum, null, new Rectangle()); // throws exception
+                Assert.Fail();
+            }
+            catch (Exception e) {
+                Assert.True(e.Message.Contains("g"));
+            }            
+
+            return;
+        }
+
+        [Test]
+        public void GetDocumentSize_Can_Raise_ArgumentNullException()
+        {
+            try {
+                _renderer.GetDocumentSize(null, _args.Graphics, _args.Font); // throws exception
+                Assert.Fail();
+            }
+            catch (Exception e) {
+                Assert.True(e.Message.Contains("code"));
+            }
+
+            try {
+                _renderer.GetDocumentSize(_loremIpsum, null, _args.Font); // throws exception
+                Assert.Fail();
+            }
+            catch (Exception e) {
+                Assert.True(e.Message.Contains("g"));
+            }
+
+            try {
+                _renderer.GetDocumentSize(_loremIpsum, _args.Graphics, null); // throws exception
+                Assert.Fail();
+            }
+            catch (Exception e) {
+                Assert.True(e.Message.Contains("font"));
+            }
+           
+            return;
+        }
+
+        [Test]
+        public void LineIndexToYCoordinate_Can_Raise_ArgumentNullException()
+        {
+            try {
+                _renderer.LineIndexToYCoordinate(0, null, _args.Font); // throws exception
+                Assert.Fail();
+            }
+            catch (Exception e) {
+                Assert.True(e.Message.Contains("g"));
+            }
+
+            try {
+                _renderer.LineIndexToYCoordinate(0, _args.Graphics, null); // throws exception
+                Assert.Fail();
+            }
+            catch (Exception e) {
+                Assert.True(e.Message.Contains("font"));
+            }
+        }
+       
+        [Test]
+        public void LineIndexToYCoordinate()
+        {
+            SizeF sz = _args.Graphics.MeasureString("m", _args.Font);
+
+            Assert.That(_renderer.LineIndexToYCoordinate(0, _args.Graphics, _args.Font),
+                Is.EqualTo(0));
+
+            Assert.That(_renderer.LineIndexToYCoordinate(1, _args.Graphics, _args.Font),
+                Is.EqualTo(sz.Height));
+
+            Assert.That(_renderer.LineIndexToYCoordinate(2, _args.Graphics, _args.Font),
+                Is.EqualTo(sz.Height * 2));
+
+            Assert.That(_renderer.LineIndexToYCoordinate(3, _args.Graphics, _args.Font),
+                Is.EqualTo(sz.Height * 3));
+
+            return;
+        }
+
+        [Test]
+        public void GetDocumentSize()
+        {           
+            SizeF expSize;
+            SizeF docSize;
+
+            // measures text3x7's size
+
+            expSize = _args.Graphics.MeasureString("111", _args.Font);
+            docSize = _renderer.GetDocumentSize(_text3x7, _args.Graphics, _args.Font);
+
+            Assert.That(docSize.Width, Is.EqualTo(expSize.Width));
+            Assert.That(docSize.Height, Is.EqualTo(7 * expSize.Height));
+            
+            // measures loremIpsum's size
+
+            expSize = _args.Graphics.MeasureString(
+                "odio purus iaculis est, non varius urna turpis in mi.", _args.Font);
+            docSize = _renderer.GetDocumentSize(_loremIpsum, _args.Graphics, _args.Font);
+
+            Assert.That(docSize.Width, Is.EqualTo(expSize.Width));
+            Assert.That(docSize.Height, Is.EqualTo(9 * expSize.Height));
+
+            return;
+        }
+       
+        [Test]
+        public void ViewportLines()
+        {
+            DefaultCodeRenderer renderer = new DefaultCodeRenderer();
+            PaintLineLocation[] lines;
+            RectangleF viewport = new RectangleF(0, 0, 2, 4);
+            
+            Assert.That(renderer.ViewportLines(_empty, viewport, 1), Is.Not.Null);
+            Assert.That(renderer.ViewportLines(_empty, viewport, 1).Length, Is.EqualTo(0));
+            
+            // Using the given text and viewport
+            //
+            // document   viewport
+            //    1 1 1   * *
+            //    2 2 2   * *
+            //    3 3 3   * *                                
+            //    4 4 4   * *
+            //    5 5 5
+            //    6 6 6
+            //    7 7 7
+            //
+            // Tests below check what area of the document will be seen
+            // through the viewport window. For simplicity issue, we assume
+            // the code is using a Font of docSize 1x1 in pixel.
+
+            lines = renderer.ViewportLines(_text3x7, viewport, 1);
+            Assert.That(lines.Length, Is.EqualTo(5));
+            Assert.That(lines[0], Is.EqualTo(new PaintLineLocation(0, "111", new PointF(0, 0))));
+            Assert.That(lines[1], Is.EqualTo(new PaintLineLocation(1, "222", new PointF(0, 1))));
+            Assert.That(lines[2], Is.EqualTo(new PaintLineLocation(2, "333", new PointF(0, 2))));
+            Assert.That(lines[3], Is.EqualTo(new PaintLineLocation(3, "444", new PointF(0, 3))));
+            Assert.That(lines[4], Is.EqualTo(new PaintLineLocation(4, "555", new PointF(0, 4))));
+
+            viewport = new RectangleF(2, 0, 2, 4);
+            lines = renderer.ViewportLines(_text3x7, viewport, 1);
+            Assert.That(lines.Length, Is.EqualTo(5));
+            Assert.That(lines[0], Is.EqualTo(new PaintLineLocation(0, "111", new PointF(-2, 0))));
+            Assert.That(lines[1], Is.EqualTo(new PaintLineLocation(1, "222", new PointF(-2, 1))));
+            Assert.That(lines[2], Is.EqualTo(new PaintLineLocation(2, "333", new PointF(-2, 2))));
+            Assert.That(lines[3], Is.EqualTo(new PaintLineLocation(3, "444", new PointF(-2, 3))));
+            Assert.That(lines[4], Is.EqualTo(new PaintLineLocation(4, "555", new PointF(-2, 4))));
+
+            viewport = new RectangleF(0, -3, 2, 4);
+            lines = renderer.ViewportLines(_text3x7, viewport, 1);
+            Assert.That(lines.Length, Is.EqualTo(2));
+            Assert.That(lines[0], Is.EqualTo(new PaintLineLocation(0, "111", new PointF(0, 3))));
+            Assert.That(lines[1], Is.EqualTo(new PaintLineLocation(1, "222", new PointF(0, 4))));
+
+            viewport = new RectangleF(1, 5, 2, 4);
+            lines = renderer.ViewportLines(_text3x7, viewport, 1);
+            Assert.That(lines.Length, Is.EqualTo(2));
+            Assert.That(lines[0], Is.EqualTo(new PaintLineLocation(5, "666", new PointF(-1, 0))));
+            Assert.That(lines[1], Is.EqualTo(new PaintLineLocation(6, "777", new PointF(-1, 1))));
+
+            // using float values for location
+
+            viewport = new RectangleF(1.5f, 2.5f, 2, 4);
+            lines = renderer.ViewportLines(_text3x7, viewport, 1);
+            Assert.That(lines.Length, Is.EqualTo(5));
+            Assert.That(lines[0], Is.EqualTo(new PaintLineLocation(2, "333", new PointF(-1.5f, -0.5f))));
+            Assert.That(lines[1], Is.EqualTo(new PaintLineLocation(3, "444", new PointF(-1.5f, 0.5f))));
+            Assert.That(lines[2], Is.EqualTo(new PaintLineLocation(4, "555", new PointF(-1.5f, 1.5f))));
+            Assert.That(lines[3], Is.EqualTo(new PaintLineLocation(5, "666", new PointF(-1.5f, 2.5f))));
+            Assert.That(lines[4], Is.EqualTo(new PaintLineLocation(6, "777", new PointF(-1.5f, 3.5f))));
+
+            // using a font sized as 8x15
+
+            viewport = new RectangleF(1.5f * 8, 2.5f * 15, 2 * 8, 4 * 15);
+            lines = renderer.ViewportLines(_text3x7, viewport, 15);
+            Assert.That(lines.Length, Is.EqualTo(5));
+            Assert.That(lines[0], Is.EqualTo(new PaintLineLocation(2, "333", new PointF(-1.5f * 8, -7.5f))));
+            Assert.That(lines[1], Is.EqualTo(new PaintLineLocation(3, "444", new PointF(-1.5f * 8, 7.5f))));
+            Assert.That(lines[2], Is.EqualTo(new PaintLineLocation(4, "555", new PointF(-1.5f * 8, 22.5f))));
+            Assert.That(lines[3], Is.EqualTo(new PaintLineLocation(5, "666", new PointF(-1.5f * 8, 37.5f))));
+            Assert.That(lines[4], Is.EqualTo(new PaintLineLocation(6, "777", new PointF(-1.5f * 8, 52.5f))));
+
+            return;
+        }        
+    }
+}
diff --git a/src/GuiException/tests/Controls/TestDefaultErrorListRenderer.cs b/src/GuiException/tests/Controls/TestDefaultErrorListRenderer.cs
new file mode 100644
index 0000000..174933a
--- /dev/null
+++ b/src/GuiException/tests/Controls/TestDefaultErrorListRenderer.cs
@@ -0,0 +1,225 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using NUnit.UiException.Controls;
+using System.Drawing;
+
+namespace NUnit.UiException.Tests.Controls
+{
+    [TestFixture]
+    public class TestDefaultErrorListRenderer
+    {
+        private ErrorList _empty;
+        private ErrorList _filled;
+        private DefaultErrorListRenderer _renderer;
+        private Graphics _gr;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _empty = new ErrorList();
+            _filled = new ErrorList();
+            _filled.StackTrace =
+                "à SomeClass.SomeMethod() dans C:\\folder\\file1.cs:ligne 20\r\n" +
+                "à ExternClass.ExternMethod()\r\n" +
+                "à AnotherExternClass.AnotherExternMethod()\r\n" +
+                "à SomeClass2.SomeMethod2() dans C:\\folder\\file2.cs:ligne 42\r\n" +
+                "à SomeClass3.SomeMethod3() dans C:\\folder\\AnotherFile2.cs:ligne 93\r\n";
+
+            _renderer = new DefaultErrorListRenderer();
+
+            Image img = new Bitmap(300, 100);
+            _gr = Graphics.FromImage(img);
+            
+            return;
+        }
+
+        [Test]
+        public void DefaultState()
+        {
+            Assert.NotNull(_renderer.Font);
+            Assert.That(_renderer.Font.Size, Is.EqualTo(8.25f));
+
+            return;
+        }
+
+        [Test]
+        public void MeasureItem()
+        {
+            TestingRenderer renderer = new TestingRenderer();
+            SizeF exp;
+            SizeF actual;
+
+            ErrorItem itemClass = new ErrorItem("/dir/f.cs", "0123456789012.a()", 3);
+            ErrorItem itemMethod = new ErrorItem("/dir/f.cs", "a.0123456789012()", 3);
+            ErrorItem itemFile = new ErrorItem("/dir/0123456789012.cs", "a.b()", 3);
+
+            // measure an item whoose width should be determined
+            // by class field value
+
+            exp = _gr.MeasureString("0123456789012", renderer.Font);
+            actual = renderer.MeasureItem(_gr, itemClass);
+            int itemHeight = renderer.Font.Height * 4 + 6;
+            
+            Assert.That((int)actual.Width, Is.EqualTo((int)exp.Width + 16));
+            Assert.That((int)actual.Height, Is.EqualTo(itemHeight));
+
+            // measure an item whoose width should be determined
+            // by method field value
+
+            exp = _gr.MeasureString("0123456789012()", renderer.Font);
+            actual = renderer.MeasureItem(_gr, itemMethod);
+            Assert.That((int)actual.Width, Is.EqualTo((int)exp.Width + 16));
+            Assert.That((int)actual.Height, Is.EqualTo(itemHeight));
+
+            // measure an item whoose width should be determined
+            // by filename field value
+
+            exp = _gr.MeasureString("0123456789012.cs", renderer.Font);
+            actual = renderer.MeasureItem(_gr, itemFile);
+            Assert.That((int)actual.Width, Is.EqualTo((int)exp.Width + 16));
+            Assert.That((int)actual.Height, Is.EqualTo(itemHeight));
+
+            return;
+        }        
+
+        [Test]
+        public void ItemAt()
+        {
+            ErrorItem item;
+
+            int itemHeight = _renderer.Font.Height * 4 + 6;
+
+            item = _renderer.ItemAt(_filled.Items, _gr, new Point(0, 0));
+            Assert.NotNull(item);
+            Assert.That(item, Is.EqualTo(_filled.Items[0]));
+
+            item = _renderer.ItemAt(_filled.Items, _gr, new Point(0, itemHeight + 1));
+            Assert.NotNull(item);
+            Assert.That(item, Is.EqualTo(_filled.Items[1]));
+
+            Assert.Null(_renderer.ItemAt(_filled.Items, _gr, new Point(0, 480)));
+            Assert.Null(_renderer.ItemAt(_filled.Items, _gr, new Point(0, -1)));
+            Assert.Null(_renderer.ItemAt(null, _gr, new Point(0, 0)));
+
+            return;
+        }
+
+        [Test]
+        public void GetDocumentSize()
+        {
+            TestingRenderer renderer = new TestingRenderer();
+            Size docSize;
+            SizeF maxSize = SizeF.Empty;
+
+            // measuring an empty list returns 0x0
+            
+            docSize = renderer.GetDocumentSize(_empty.Items, _gr);
+            Assert.NotNull(docSize);
+            Assert.That(docSize, Is.EqualTo(new Size(0, 0)));
+
+            // measure for a non empty list relies on the longest item
+            // in that list
+			
+			foreach(ErrorItem item in _filled.Items)
+			{
+				SizeF sz = renderer.MeasureItem(_gr, item);
+				if (sz.Width > maxSize.Width)
+					maxSize = sz;
+			}
+
+            docSize = renderer.GetDocumentSize(_filled.Items, _gr);
+            Assert.NotNull(docSize);
+            Assert.That(docSize.Width, Is.EqualTo((int)maxSize.Width));
+            int itemHeight = renderer.Font.Height * 4 + 6;
+            Assert.That(docSize.Height, Is.EqualTo(_filled.Items.Count * itemHeight));
+
+            return;
+        }
+
+        [Test]
+        public void DrawToGraphics_Can_Throw_ArgumentNullException()
+        {
+            try {
+                _renderer.DrawToGraphics(null, null, _gr, new Rectangle()); // throws exception
+                Assert.Fail();
+            }
+            catch (Exception e) {
+                Assert.That(e.Message.Contains("items"));
+            }
+
+            try {
+                _renderer.DrawToGraphics(_filled.Items, null, null, new Rectangle()); // throws exception
+                Assert.Fail();
+            }
+            catch (Exception e) {
+                Assert.That(e.Message.Contains("g"));
+            }
+
+            return;
+        }
+
+        [Test]
+        public void IsDirty()
+        {
+            Rectangle viewport = new Rectangle(0, 0, 200, 200);
+            TestingRenderer renderer = new TestingRenderer();
+
+            // no change - true the second time
+
+            renderer.DrawToGraphics(_filled.Items, _filled.Items[0], _gr, viewport);
+            Assert.False(renderer.IsDirty(_filled.Items, _filled.Items[0], viewport));
+
+            // changing the list set dirty flag
+
+            renderer.DrawToGraphics(_filled.Items, _filled.Items[0], _gr, viewport);
+            Assert.True(renderer.IsDirty(_empty.Items, _filled.Items[0], viewport));
+           
+            // changes selected item
+
+            renderer.DrawToGraphics(_filled.Items, _filled.Items[0], _gr, viewport);
+            Assert.True(renderer.IsDirty(_filled.Items, null, viewport));
+            Assert.True(renderer.IsDirty(_filled.Items,
+                new ErrorItem(_filled.Items[0].Path,
+                              _filled.Items[0].FullyQualifiedMethodName,
+                              _filled.Items[0].LineNumber),
+                    viewport));
+
+            // changes viewport
+
+            renderer.DrawToGraphics(_filled.Items, _filled.Items[0], _gr, viewport);
+            Assert.True(renderer.IsDirty(_filled.Items, _filled.Items[0], new Rectangle()));
+
+            // reversing item order set dirty flag
+
+            renderer.DrawToGraphics(_filled.Items, _filled.Items[0], _gr, viewport);
+            _filled.Items.Reverse();
+            Assert.True(renderer.IsDirty(_filled.Items, _filled.Items[_filled.Items.Count - 1], viewport));
+
+            // Calling GetDocumentSize set dirty flag
+
+            renderer.DrawToGraphics(_filled.Items, _filled.Items[0], _gr, viewport);
+            renderer.GetDocumentSize(_filled.Items, _gr);
+            Assert.True(renderer.IsDirty(_filled.Items, _filled.Items[0], viewport));
+
+            return;
+        }
+
+        class TestingRenderer : DefaultErrorListRenderer
+        {
+            public new SizeF MeasureItem(Graphics g, ErrorItem item) {
+                return (base.MeasureItem(g, item));
+            }
+
+            public new bool IsDirty(ErrorItemCollection items, ErrorItem selection, Rectangle viewport) {
+                return (base.IsDirty(items, selection, viewport));
+            }
+        }
+    }
+}
diff --git a/src/GuiException/tests/Controls/TestErrorBrowser.cs b/src/GuiException/tests/Controls/TestErrorBrowser.cs
new file mode 100644
index 0000000..2d5ea80
--- /dev/null
+++ b/src/GuiException/tests/Controls/TestErrorBrowser.cs
@@ -0,0 +1,213 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using NUnit.UiException.Controls;
+using System.Drawing;
+using System.Windows.Forms;
+using NUnit.Mocks;
+
+namespace NUnit.UiException.Tests.Controls
+{
+    [TestFixture]
+    public class TestErrorBrowser
+    {
+        private TestingErrorBrowser _errorBrowser;
+
+        private DynamicMock _mockStackDisplay;
+        private bool _stackTraceChanged;
+
+        [SetUp]
+        public void Setup()
+        {
+            _errorBrowser = new TestingErrorBrowser();
+
+            _mockStackDisplay = MockHelper.NewMockIErrorRenderer("StackTraceDisplay", 1);
+            _mockStackDisplay.SetReturnValue("Text", "Display actual stack trace");
+
+            _stackTraceChanged = false;
+
+            _errorBrowser.StackTraceSourceChanged += new EventHandler(_errorBrowser_StackTraceSourceChanged);
+
+            return;
+        }
+
+        void _errorBrowser_StackTraceSourceChanged(object sender, EventArgs e)
+        {
+            _stackTraceChanged = true;
+        }
+
+        [Test]
+        public void DefaultState()
+        {
+            Assert.That(_errorBrowser.LayoutPanel, Is.Not.Null);
+            Assert.That(_errorBrowser.Toolbar, Is.Not.Null);
+            Assert.That(_errorBrowser.SelectedDisplay, Is.Null);
+            Assert.That(_errorBrowser.StackTraceSource, Is.Null);
+
+            Assert.That(_errorBrowser.Controls.Contains(_errorBrowser.LayoutPanel), Is.True);
+            Assert.That(_errorBrowser.LayoutPanel.Left, Is.EqualTo(0));
+            Assert.That(_errorBrowser.LayoutPanel.Top, Is.EqualTo(0));
+            Assert.That(_errorBrowser.LayoutPanel.Toolbar.Height, Is.GreaterThan(0));
+
+            Assert.That(_errorBrowser.LayoutPanel.Toolbar, Is.SameAs(_errorBrowser.Toolbar));
+            Assert.That(_errorBrowser.Toolbar.Count, Is.EqualTo(0));
+
+            return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException),
+            ExpectedMessage = "display",
+            MatchType = MessageMatch.Contains)]
+        public void Cannot_Register_Null_Display()
+        {
+            _errorBrowser.RegisterDisplay(null); // throws exception
+        }        
+
+        [Test]
+        public void ErrorDisplay_Plugins_life_cycle_events()
+        {
+            // test #1: Asks ErrorBrowser to register an instance of IErrorDisplay
+            //
+            // - check the process calls successively IErrorDisplay's
+            //   properties & methods.
+            //
+            // - when registering an IErrorDisplay for the first time, ErrorBrowser
+            //   should select the instance automatically.
+
+            DynamicMock mockTraceDisplay = MockHelper.NewMockIErrorRenderer("raw", 1);
+            DynamicMock mockSourceDisplay = MockHelper.NewMockIErrorRenderer("browser", 2);
+
+            ToolStripButton tracePlugin = new ToolStripButton();
+//            ToolStripItem[] traceOptions = new ToolStripItem[] { };
+            Control traceContent = new TextBox();
+            
+            mockTraceDisplay.SetReturnValue("Text", "Displays the actual stack trace");
+
+            // looks like Mock needs a bit enhancements to handle multiple calls
+
+            mockTraceDisplay.ExpectAndReturn("get_PluginItem", tracePlugin);
+            mockTraceDisplay.ExpectAndReturn("get_PluginItem", tracePlugin);
+            mockTraceDisplay.ExpectAndReturn("get_PluginItem", tracePlugin);
+            mockTraceDisplay.ExpectAndReturn("get_Content", traceContent);
+            mockTraceDisplay.Expect("OnStackTraceChanged", new object[] { _errorBrowser.StackTraceSource });
+
+            _errorBrowser.RegisterDisplay((IErrorDisplay)mockTraceDisplay.MockInstance);
+            mockTraceDisplay.Verify();
+
+            Assert.That(_errorBrowser.SelectedDisplay, Is.Not.Null);
+            Assert.That(_errorBrowser.SelectedDisplay, Is.SameAs(mockTraceDisplay.MockInstance));
+            Assert.That(_errorBrowser.LayoutPanel.Content, Is.EqualTo(traceContent));
+
+            // test #2: Asks ErrorBrowser to register another instance of IErrorDisplay
+            //
+            // - Selection should not change
+
+            ToolStripItem sourcePluginItem = new ToolStripButton();
+            Control sourceContent = new Button();
+
+            mockSourceDisplay.SetReturnValue("Text", "Displays source code context");
+            mockSourceDisplay.ExpectAndReturn("get_PluginItem", sourcePluginItem);
+            mockSourceDisplay.ExpectAndReturn("get_PluginItem", sourcePluginItem);
+
+            _errorBrowser.RegisterDisplay((IErrorDisplay)mockSourceDisplay.MockInstance);
+            mockSourceDisplay.Verify();
+
+            Assert.That(_errorBrowser.SelectedDisplay, Is.Not.Null);
+            Assert.That(_errorBrowser.SelectedDisplay, Is.SameAs(mockTraceDisplay.MockInstance));
+
+            // test #3: changes current selection
+
+            mockTraceDisplay.ExpectAndReturn("get_PluginItem", tracePlugin);
+            mockSourceDisplay.ExpectAndReturn("get_PluginItem", sourcePluginItem);            
+            mockSourceDisplay.ExpectAndReturn("get_Content", sourceContent);
+
+            _errorBrowser.Toolbar.SelectedDisplay = (IErrorDisplay)mockSourceDisplay.MockInstance;
+
+            mockSourceDisplay.Verify();
+            mockTraceDisplay.Verify();
+
+            Assert.That(_errorBrowser.Toolbar.SelectedDisplay, Is.SameAs(mockSourceDisplay.MockInstance));
+            Assert.That(_errorBrowser.LayoutPanel.Content, Is.EqualTo(sourceContent));
+
+            // test #4: changing ErrorSource update all renderers
+
+            string stack = "à test() C:\\file.cs:ligne 1";
+
+            mockTraceDisplay.Expect("OnStackTraceChanged", new object[] { stack });
+            mockSourceDisplay.Expect("OnStackTraceChanged", new object[] { stack });
+            _errorBrowser.StackTraceSource = stack;
+            Assert.That(_errorBrowser.LayoutPanel.Content, Is.TypeOf(typeof(Button)));
+            mockSourceDisplay.Verify();
+            mockTraceDisplay.Verify();
+            
+            // clears all renderers
+
+            _errorBrowser.ClearAll();
+            Assert.That(_errorBrowser.Toolbar.Count, Is.EqualTo(0));
+
+            Assert.That(_errorBrowser.LayoutPanel.Option, Is.Not.Null);
+            Assert.That(_errorBrowser.LayoutPanel.Option, Is.TypeOf(typeof(Panel)));
+
+            Assert.That(_errorBrowser.LayoutPanel.Content, Is.Not.Null);
+            Assert.That(_errorBrowser.LayoutPanel.Content, Is.TypeOf(typeof(Panel)));          
+            
+            return;
+        }
+
+        [Test]
+        public void Can_Raise_ErrorSourceChanged()
+        {
+            _errorBrowser.StackTraceSource = "à test() C:\\file.cs:ligne 1";
+            Assert.That(_stackTraceChanged, Is.True);
+
+            _stackTraceChanged = false;
+            _errorBrowser.StackTraceSource = null;
+            Assert.That(_stackTraceChanged, Is.True);
+
+            _stackTraceChanged = false;
+            _errorBrowser.StackTraceSource = null;
+            Assert.That(_stackTraceChanged, Is.False);
+
+            return;
+        }
+
+        [Test]
+        public void LayoutPanel_Auto_Resizes_When_Parent_Sizes_Change()
+        {
+            _errorBrowser.Width = 250;
+            _errorBrowser.Height = 300;
+
+            Assert.That(_errorBrowser.LayoutPanel.Width, Is.EqualTo(_errorBrowser.Width));
+            Assert.That(_errorBrowser.LayoutPanel.Height, Is.EqualTo(_errorBrowser.Height));
+
+            _errorBrowser.Width = 50;
+            _errorBrowser.Height = 70;
+
+            Assert.That(_errorBrowser.LayoutPanel.Width, Is.EqualTo(_errorBrowser.Width));
+            Assert.That(_errorBrowser.LayoutPanel.Height, Is.EqualTo(_errorBrowser.Height));
+
+            return;
+        }
+
+        class TestingErrorBrowser :
+            ErrorBrowser
+        {
+            public new ErrorToolbar Toolbar
+            {
+                get { return (base.Toolbar); }
+            }
+
+            public new ErrorPanelLayout LayoutPanel
+            {
+                get { return (base.LayoutPanel); }
+            }
+        }
+    }
+}
diff --git a/src/GuiException/tests/Controls/TestErrorList.cs b/src/GuiException/tests/Controls/TestErrorList.cs
new file mode 100644
index 0000000..1703c98
--- /dev/null
+++ b/src/GuiException/tests/Controls/TestErrorList.cs
@@ -0,0 +1,429 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using NUnit.UiException.Controls;
+using NUnit.Mocks;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace NUnit.UiException.Tests.Controls
+{
+    [TestFixture]
+    public class TestErrorList
+    {
+        private TestingErrorList _list;        
+        private bool _selectionNotification;
+
+        private string _trace1;
+        private string _trace2;
+
+        private DynamicMock _mock;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _mock = new DynamicMock(typeof(IErrorListRenderer));
+
+            _list = new TestingErrorList((IErrorListRenderer)_mock.MockInstance);
+
+            _trace1 = 
+                "à SomeClass.SomeMethod() dans C:\\folder\\file1.cs:ligne 20\r\n" +
+                "à ExternClass.ExternMethod()\r\n" +
+                "à AnotherExternClass.AnotherExternMethod()\r\n" +
+                "à SomeClass2.SomeMethod2() dans C:\\folder\\file2.cs:ligne 42\r\n" +
+                "à SomeClass3.SomeMethod3() dans C:\\folder\\AnotherFile2.cs:ligne 93\r\n";
+
+            _trace2 =
+                "à SomeClass.SomeMethod() dans C:\\folder\\file1.cs:ligne 20\r\n" +
+                "à ExternClass.ExternMethod()\r\n" +
+                "à AnotherExternClass.AnotherExternMethod()\r\n" +
+                "à SomeClass2.SomeMethod2() dans C:\\folder\\file2.cs:ligne 42\r\n";
+
+            _selectionNotification = false;
+
+            _list.SelectedItemChanged += new EventHandler(_list_SelectedItemChanged);
+
+            return;
+        }
+
+        void _list_SelectedItemChanged(object sender, EventArgs e)
+        {
+            this._selectionNotification = true;
+        }
+
+        [Test]
+        public void DefaultState()
+        {
+            Assert.False(_list.AutoSelectFirstItem);
+            Assert.Null(_list.StackTrace);
+            Assert.NotNull(_list.Items);
+            Assert.That(_list.Items.Count, Is.EqualTo(0));
+            Assert.Null(_list.SelectedItem);
+            Assert.That(_list.HoveredIndex, Is.EqualTo(-1));
+            Assert.That(_list.ListOrderPolicy, Is.EqualTo(ErrorListOrderPolicy.InitialOrder));
+
+            return;
+        }
+
+        [Test]
+        public void AutoSelectFirstItem()
+        {
+            _list.UseDefaultRenderer();
+
+            // Test #1:
+            // Populate StackTrace with one localizable item
+            // When AutoSelectFirstItem is set, we expect the
+            // first item to be automatically selected.
+
+            _list.AutoSelectFirstItem = true;
+            _list.StackTrace = _trace1;
+            Assert.NotNull(_list.SelectedItem);
+            Assert.That(_list.SelectedItem, Is.EqualTo(_list.Items[0]));
+
+            // Test #2:
+            // Populate StackTrace with no localizable item
+            // Though AutoSelectFirstItem is set, selection
+            // should be null
+
+            _list.StackTrace = "à SomeClass.SomeMethod()";
+            Assert.Null(_list.SelectedItem);
+
+            // Test #3
+            // Populate StackTrace with one localizable item.
+            // This time AutoSelectFirstItem is not set. We
+            // expect selection to be null.
+
+            _list.AutoSelectFirstItem = false;
+            _list.StackTrace = "à SomeClass.SomeMethod() dans C:\\folder\\file.cs:ligne 1";
+            Assert.Null(_list.SelectedItem);
+
+            return;
+        }
+
+        [Test]
+        public void Populate_StackTraceSource()
+        {
+            Size docSize = new Size(200, 500);
+
+            _mock.ExpectAndReturn("GetDocumentSize", docSize,
+                new object[] { _list.Items, _list.WorkingGraphics });
+
+            _list.StackTrace = _trace1;
+            _mock.Verify();
+            Assert.That(_list.AutoScrollMinSize, Is.EqualTo(new Size(200, 500)));
+
+            Assert.That(_list.StackTrace, Is.EqualTo(_trace1));
+            Assert.That(_list.Items.Count, Is.EqualTo(5));
+            Assert.That(_list.Items[0].LineNumber, Is.EqualTo(20));
+            Assert.That(_list.Items[3].LineNumber, Is.EqualTo(42));
+            Assert.That(_list.Items[4].LineNumber, Is.EqualTo(93));
+            
+            return;
+        }
+
+        [Test]
+        public void CurrentSelection()
+        {
+            _list.UseDefaultRenderer();
+            _list.StackTrace = _trace1;
+
+            // can select an item with underlying source code
+
+            _selectionNotification = false;
+            _list.SelectedItem = _list.Items[0];
+            Assert.That(_list.SelectedItem, Is.EqualTo(_list.Items[0]));
+            Assert.True(_selectionNotification);
+
+            // attempting to select an item not localizable
+            // has no effect
+
+            _selectionNotification = false;
+            _list.SelectedItem = _list.Items[1];
+            Assert.That(_list.SelectedItem, Is.EqualTo(_list.Items[0]));
+            Assert.False(_selectionNotification);
+
+            // attempting to select an item not in the list
+            // has no effect
+
+            _selectionNotification = false;
+            _list.SelectedItem = new ErrorItem("C:\\folder\\file42.cs", "SomeClass42.SomeMethod42()", 3);
+            Assert.That(_list.SelectedItem, Is.EqualTo(_list.Items[0]));
+            Assert.False(_selectionNotification);
+
+            // can pass null to SelectedItem
+            _list.SelectedItem = null;
+            Assert.Null(_list.SelectedItem);
+            Assert.True(_selectionNotification);
+
+            // select an item an clear StackTrace
+            // selection should be reset to null
+
+            _list.SelectedItem = _list.Items[0];
+            _selectionNotification = false;
+            _list.StackTrace = null;
+            Assert.Null(_list.SelectedItem);
+            Assert.True(_selectionNotification);
+
+            return;
+        }
+
+        [Test]
+        public void ListOrderPolicy()
+        {
+            ErrorList list = new ErrorList();
+
+            // Check ListOrderPolicy behavior when AutoSelectFirstItem is not set
+
+            list.AutoSelectFirstItem = false;
+            list.ListOrderPolicy = ErrorListOrderPolicy.ReverseOrder;
+            Assert.That(list.ListOrderPolicy, Is.EqualTo(ErrorListOrderPolicy.ReverseOrder));
+
+            list.StackTrace = _trace1;
+            Assert.That(list.Items[0].LineNumber, Is.EqualTo(93));
+            Assert.That(list.Items[1].LineNumber, Is.EqualTo(42));
+            Assert.That(list.Items[2].LineNumber, Is.EqualTo(0));
+            Assert.That(list.Items[3].LineNumber, Is.EqualTo(0));
+            Assert.That(list.Items[4].LineNumber, Is.EqualTo(20));
+
+            list.StackTrace = _trace2;
+            Assert.That(list.Items[0].LineNumber, Is.EqualTo(42));
+            Assert.That(list.Items[1].LineNumber, Is.EqualTo(0));
+            Assert.That(list.Items[2].LineNumber, Is.EqualTo(0));
+            Assert.That(list.Items[3].LineNumber, Is.EqualTo(20));
+
+            list.ListOrderPolicy = ErrorListOrderPolicy.InitialOrder;
+            Assert.That(list.ListOrderPolicy, Is.EqualTo(ErrorListOrderPolicy.InitialOrder));
+
+            Assert.That(list.Items[0].LineNumber, Is.EqualTo(20));
+            Assert.That(list.Items[1].LineNumber, Is.EqualTo(0));
+            Assert.That(list.Items[2].LineNumber, Is.EqualTo(0));
+            Assert.That(list.Items[3].LineNumber, Is.EqualTo(42));
+
+            list.StackTrace = _trace1;
+            Assert.That(list.Items[0].LineNumber, Is.EqualTo(20));
+            Assert.That(list.Items[1].LineNumber, Is.EqualTo(0));
+            Assert.That(list.Items[2].LineNumber, Is.EqualTo(0));
+            Assert.That(list.Items[3].LineNumber, Is.EqualTo(42));
+            Assert.That(list.Items[4].LineNumber, Is.EqualTo(93));
+
+            // When the AutoSelectFirstItem flag is set, the selected item
+            // is the one the most on top of the list, with source attachment.
+            // Where the most on top depends whether the order is kept unchanged
+            // or reversed.
+
+            list.AutoSelectFirstItem = true;
+            list.ListOrderPolicy = ErrorListOrderPolicy.InitialOrder;
+            list.StackTrace = _trace1;
+            Assert.That(list.SelectedItem.LineNumber, Is.EqualTo(20));
+
+            list.ListOrderPolicy = ErrorListOrderPolicy.ReverseOrder;
+            list.StackTrace = _trace1;
+            Assert.That(list.SelectedItem.LineNumber, Is.EqualTo(93));      
+
+            return;
+        }
+
+        [Test]
+        public void CanReportInvalidItems()
+        {
+            ErrorList list = new ErrorList();
+
+            // feeding ErrorList with garbage details should make it
+            // fail gracefully.
+
+            list.StackTrace = 
+                "Lorem ipsum dolor sit amet, consectetur adipiscing elit.\r\n" +
+                "Nam at nisi ut neque sollicitudin ultrices. Sed rhoncus\r\n" +
+                "rhoncus arcu. Morbi eu elit ut augue congue luctus. Nullam\r\n" +
+                "eu eros. Nunc blandit varius orci. Mauris condimentum diam\r\n" +
+                "ac ligula. Nullam ut metus. Maecenas sagittis nibh in nisl.\r\n" +
+                "Phasellus rhoncus diam a nulla. Integer vestibulum.\r\n";
+
+            Assert.That(list.Items.Count, Is.EqualTo(1));
+            Assert.That(list.Items[0].BaseMethodName, Is.EqualTo("Fail to parse stack trace"));            
+            Assert.IsFalse(list.Items[0].HasSourceAttachment);
+
+            return;
+        }
+
+
+        [Test]
+        public void Invoking_DrawToGraphics()
+        {
+            Size docSize = new Size(200, 500);
+
+            _mock.ExpectAndReturn("GetDocumentSize", docSize,
+                new object[] { _list.Items, _list.WorkingGraphics });
+
+            _list.StackTrace = _trace1;
+            _mock.Verify();
+            
+            _mock.Expect("DrawToGraphics",
+                new object[] { _list.Items, _list.SelectedItem, _list.WorkingGraphics, _list.ClientRectangle });
+            _mock.Expect("DrawItem",
+                new object[] { _list.Items[0], 0, true, false, _list.WorkingGraphics, _list.ClientRectangle });
+            _list.HoveredIndex = 0;
+            _list.FireOnPaint();
+            _mock.Verify();            
+
+            return;
+        }        
+
+        [Test]
+        public void Click_Can_Select_Item()
+        {
+            Size docSize = new Size(200, 500);
+            Point point;
+            ErrorItem selection;
+
+            _mock.ExpectAndReturn("GetDocumentSize", docSize,
+                new object[] { _list.Items, _list.WorkingGraphics });
+
+            _list.StackTrace = _trace1;
+            _mock.Verify();
+
+            // simulate a click to 10, 10 - a clickable element
+
+            point = new Point(10, 10);
+            _mock.ExpectAndReturn("ItemAt", _list.Items[0],
+                new object[] { _list.Items, _list.WorkingGraphics, point });
+            _list.FireClick(point);
+            _mock.Verify();
+            Assert.NotNull(_list.SelectedItem);
+            Assert.That(_list.SelectedItem, Is.EqualTo(_list.Items[0]));
+
+            // simulate a click in 10, 110 - this element is not clickable => no source
+
+            selection = _list.SelectedItem;
+            point = new Point(10, 110);
+            _mock.ExpectAndReturn("ItemAt", _list.Items[1],
+                new object[] { _list.Items, _list.WorkingGraphics, point });
+            _list.FireClick(point);
+            _mock.Verify();
+            Assert.NotNull(_list.SelectedItem);
+            Assert.That(_list.SelectedItem, Is.SameAs(selection));
+
+            return;
+        }
+
+        [Test]
+        public void DrawItem()
+        {
+            Size docSize = new Size(200, 500);
+            Point point;
+
+            _mock.ExpectAndReturn("GetDocumentSize", docSize,
+                new object[] { _list.Items, _list.WorkingGraphics });
+
+            _list.StackTrace = _trace1;
+            _mock.Verify();
+
+            // mouse move hover a selectable item
+
+            point = new Point(0, 0);
+            _mock.ExpectAndReturn("ItemAt", _list.Items[0],
+                new object[] { _list.Items, _list.WorkingGraphics, point });
+            _list.FireMouseMove(point);
+            Assert.True(_list.ITEM_ENTERED_NOTIFICATION);
+            Assert.That(_list.HoveredIndex, Is.EqualTo(0));
+            _mock.Verify();
+
+            _list.ResetFlags();
+            point = new Point(0, 50);
+            _mock.ExpectAndReturn("ItemAt", _list.Items[1],
+                new object[] { _list.Items, _list.WorkingGraphics, point });
+            _list.FireMouseMove(point);
+            _mock.Verify();
+            Assert.False(_list.ITEM_ENTERED_NOTIFICATION); // items[1] is not hoverable...
+            Assert.True(_list.ITEM_LEAVED_NOTIFICATION); // has left items[0]            
+            Assert.That(_list.HoveredIndex, Is.EqualTo(-1));
+
+            _list.ResetFlags();
+            point = new Point(0, 100);
+            _mock.ExpectAndReturn("ItemAt", _list.Items[3],
+                new object[] { _list.Items, _list.WorkingGraphics, point });
+            _list.FireMouseMove(point);
+            _mock.Verify();
+            Assert.True(_list.ITEM_ENTERED_NOTIFICATION); // items[3] is hoverable...
+            Assert.False(_list.ITEM_LEAVED_NOTIFICATION); // items[1] was not hoverable
+            Assert.That(_list.HoveredIndex, Is.EqualTo(3));
+
+            // reset of stack trace causes HoverIndex to reset as well
+
+            _mock.ExpectAndReturn("GetDocumentSize", docSize,
+                new object[] { _list.Items, _list.WorkingGraphics });
+            _list.StackTrace = null;
+            Assert.That(_list.HoveredIndex, Is.EqualTo(-1));
+
+            return;
+        }
+
+        class TestingErrorList : ErrorList
+        {
+            public bool ITEM_ENTERED_NOTIFICATION;
+            public bool ITEM_LEAVED_NOTIFICATION;
+
+            public TestingErrorList(IErrorListRenderer renderer) :
+                base(renderer)
+            {
+            }
+
+            public void ResetFlags()
+            {
+                ITEM_ENTERED_NOTIFICATION = false;
+                ITEM_LEAVED_NOTIFICATION = false;
+            }
+
+            public void FireClick(Point point)
+            {
+                OnClick(point);
+            }
+
+            public void FireMouseMove(Point point)
+            {
+                OnMouseMove(new MouseEventArgs(MouseButtons.None, 0, point.X, point.Y, 0));
+            }
+
+            public void UseDefaultRenderer()
+            {
+                _renderer = new DefaultErrorListRenderer();
+            }
+
+            public int HoveredIndex
+            {
+                get { return (_hoveredIndex); }
+                set { _hoveredIndex = value; }
+            }
+
+            public Graphics WorkingGraphics
+            {
+                get { return (_workingGraphics); }
+            }
+
+            public void FireOnPaint()
+            {
+                OnPaint(new PaintEventArgs(WorkingGraphics, ClientRectangle));
+
+                return;
+            }
+
+            protected override void ItemEntered(int index)
+            {
+                base.ItemEntered(index);
+                ITEM_ENTERED_NOTIFICATION = true;
+            }
+
+            protected override void ItemLeaved(int index)
+            {
+                base.ItemLeaved(index);
+                ITEM_LEAVED_NOTIFICATION = true;
+            }
+        }
+    }
+}
diff --git a/src/GuiException/tests/Controls/TestErrorPanelLayout.cs b/src/GuiException/tests/Controls/TestErrorPanelLayout.cs
new file mode 100644
index 0000000..e9f87a5
--- /dev/null
+++ b/src/GuiException/tests/Controls/TestErrorPanelLayout.cs
@@ -0,0 +1,146 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using NUnit.UiException.Controls;
+using System.Windows.Forms;
+
+namespace NUnit.UiException.Tests.Controls
+{
+    [TestFixture]
+    public class TestErrorPanelLayout
+    {
+        private ErrorPanelLayout _panel;
+        private Control _aToolbar;
+        private Control _aContent;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _panel = new ErrorPanelLayout();
+
+            _aToolbar = new Panel();
+            _aContent = new Panel();
+
+            return;
+        }
+
+        public static void CheckLayout(Control control, int left, int top, int width, int height)
+        {
+            Assert.That(control.Left, Is.EqualTo(left), "invalid control.Left value");
+            Assert.That(control.Top, Is.EqualTo(top), "invalid control.Top value");
+            Assert.That(control.Width, Is.EqualTo(width), "invalid control.Width value");
+            Assert.That(control.Height, Is.EqualTo(height), "invalid control.Height value");
+
+            return;
+        }
+
+        [Test]
+        public void DefaultState()
+        {
+            Assert.That(_panel.Toolbar, Is.Not.Null);
+            Assert.That(_panel.Content, Is.Not.Null);
+
+            Assert.That(_panel.Controls.Count, Is.EqualTo(2));
+
+            Assert.That(_panel.Width, Is.EqualTo(200));
+            Assert.That(_panel.Height, Is.EqualTo(200));
+
+            // checks default position and docSize for child panels
+
+            CheckLayout(_panel.Toolbar, 0, 0, 200, ErrorPanelLayout.TOOLBAR_HEIGHT);
+            CheckLayout(_panel.Content, 0, ErrorPanelLayout.TOOLBAR_HEIGHT, 200,
+                200 - ErrorPanelLayout.TOOLBAR_HEIGHT);
+
+            return;
+        }
+
+        [Test]
+        public void Setting_Toolbar()
+        {
+            Control prev;
+
+            prev = _panel.Toolbar;
+
+            // replacing toolbar
+
+            _panel.Toolbar = _aToolbar;
+
+            Assert.That(_panel.Toolbar, Is.EqualTo(_aToolbar));
+            Assert.True(_panel.Controls.Contains(_aToolbar));
+            Assert.False(_panel.Controls.Contains(prev));
+            CheckLayout(_panel.Toolbar, 0, 0, 200, ErrorPanelLayout.TOOLBAR_HEIGHT);
+
+            // restoring default state
+
+            _panel.Toolbar = null; 
+
+            Assert.That(_panel.Toolbar, Is.EqualTo(prev));
+            Assert.False(_panel.Controls.Contains(_aToolbar));
+            Assert.True(_panel.Controls.Contains(prev));
+            CheckLayout(_panel.Toolbar, 0, 0, 200, ErrorPanelLayout.TOOLBAR_HEIGHT);
+
+            return;
+        }        
+
+        [Test]
+        public void Setting_Content()
+        {
+            Control prev;
+
+            // replacing Content
+
+            prev = _panel.Content;
+            _panel.Content = _aContent;
+
+            Assert.That(_panel.Content, Is.EqualTo(_aContent));
+            Assert.True(_panel.Controls.Contains(_aContent));
+            Assert.False(_panel.Controls.Contains(prev));
+            CheckLayout(_panel.Content, 0, ErrorPanelLayout.TOOLBAR_HEIGHT, 200, 
+                200 - ErrorPanelLayout.TOOLBAR_HEIGHT);
+
+            // restoring Content to its default state
+
+            _panel.Content = null; 
+
+            Assert.That(_panel.Content, Is.EqualTo(prev));
+            Assert.False(_panel.Controls.Contains(_aContent));
+            Assert.True(_panel.Controls.Contains(prev));
+            CheckLayout(_panel.Content, 0, ErrorPanelLayout.TOOLBAR_HEIGHT, 200,
+                200 - ErrorPanelLayout.TOOLBAR_HEIGHT);
+
+            _panel.Content = _panel.Content; // should not cause error
+
+            Assert.That(_panel.Content, Is.EqualTo(_panel.Content));
+            Assert.That(_panel.Controls.Contains(_panel.Content));
+            Assert.That(_panel.Controls.Count, Is.EqualTo(2));
+            CheckLayout(_panel.Content, 0, ErrorPanelLayout.TOOLBAR_HEIGHT, 200,
+                200 - ErrorPanelLayout.TOOLBAR_HEIGHT);
+
+            return;
+        }
+
+        [Test]
+        public void Can_Layout_Child_Controls_When_Size_Changed()
+        {
+            _panel.Width = 300;
+
+            CheckLayout(_panel.Toolbar, 0, 0, 300, ErrorPanelLayout.TOOLBAR_HEIGHT);
+            CheckLayout(_panel.Content, 0, ErrorPanelLayout.TOOLBAR_HEIGHT, 300,
+                200 - ErrorPanelLayout.TOOLBAR_HEIGHT);
+
+            _panel.Height = 400;
+
+            CheckLayout(_panel.Toolbar, 0, 0, 300, ErrorPanelLayout.TOOLBAR_HEIGHT);
+            CheckLayout(_panel.Content, 0, ErrorPanelLayout.TOOLBAR_HEIGHT, 300,
+                400 - ErrorPanelLayout.TOOLBAR_HEIGHT);
+
+            return;
+        }        
+    }
+}
diff --git a/src/GuiException/tests/Controls/TestErrorToolbar.cs b/src/GuiException/tests/Controls/TestErrorToolbar.cs
new file mode 100644
index 0000000..45495f8
--- /dev/null
+++ b/src/GuiException/tests/Controls/TestErrorToolbar.cs
@@ -0,0 +1,243 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using NUnit.UiException.Controls;
+using NUnit.Mocks;
+using System.Windows.Forms;
+using System.Drawing;
+
+namespace NUnit.UiException.Tests.Controls
+{
+    [TestFixture]
+    public class TestErrorToolbar
+    {
+        private ErrorToolbar _emptyToolbar;
+        private ErrorToolbar _filledToolbar;
+
+        private DynamicMock _rawMock;
+        private DynamicMock _browserMock;
+        private IErrorDisplay _raw;
+        private IErrorDisplay _browser;
+
+        private bool _rendererChangeNotification;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _emptyToolbar = new ErrorToolbar();
+            _filledToolbar = new ErrorToolbar();
+
+            _rawMock = MockHelper.NewMockIErrorRenderer("raw", 1);
+            _rawMock.SetReturnValue("get_PluginItem", new ToolStripButton());
+            _raw = (IErrorDisplay)_rawMock.MockInstance;
+            
+            _browserMock = MockHelper.NewMockIErrorRenderer("browser", 2);
+            _browserMock.SetReturnValue("get_PluginItem", new ToolStripButton());
+            _browser = (IErrorDisplay)_browserMock.MockInstance;
+
+            _filledToolbar.Register(_raw);
+            _filledToolbar.Register(_browser);
+
+            _rendererChangeNotification = false;
+            _filledToolbar.SelectedRendererChanged += new EventHandler(_filledToolbar_SelectedRendererChanged);
+
+            return;
+        }
+
+        void _filledToolbar_SelectedRendererChanged(object sender, EventArgs e)
+        {
+            _rendererChangeNotification = true;
+        }
+
+        [Test]
+        public void NewStripButton()
+        {
+            Assert.NotNull(ErrorToolbar.NewStripButton(true, "text", new Bitmap(10, 10), null));
+        }
+
+        [Test]
+        public void DefaultState()
+        {
+            Assert.That(_emptyToolbar.Controls.Count, Is.EqualTo(0));
+            Assert.That(_emptyToolbar.Count, Is.EqualTo(0));
+            Assert.That(_emptyToolbar.SelectedDisplay, Is.Null);
+
+            Assert.That(_filledToolbar.Count, Is.EqualTo(2));
+            Assert.That(_filledToolbar[0], Is.Not.Null);
+            Assert.That(_filledToolbar[1], Is.Not.Null);
+            Assert.NotNull(_filledToolbar.SelectedDisplay);
+            Assert.That(_filledToolbar.SelectedDisplay, Is.SameAs(_raw));
+
+            return;
+        }
+
+        [Test]
+        public void Cannot_Register_Null_Display()
+        {
+            try {
+                _emptyToolbar.Register(null); // throws exception
+                Assert.Fail();
+            }
+            catch (Exception e) {
+                Assert.True(e.Message.Contains("display"));
+            }
+
+            try {
+                _rawMock.SetReturnValue("get_PluginItem", null); 
+                _emptyToolbar.Register((IErrorDisplay)_rawMock.MockInstance); // throws exception
+                Assert.Fail();
+            }
+            catch (Exception e) {
+                Assert.True(e.Message.Contains("PluginItem"));
+            }
+
+            return;
+        }
+
+        [Test,
+         ExpectedException(typeof(ArgumentException),
+             ExpectedMessage = "Cannot select unregistered display.",
+             MatchType = MessageMatch.Contains)]
+        public void Cannot_Select_UnRegistered_Display()
+        {
+            DynamicMock unknown = new DynamicMock(typeof(IErrorDisplay));
+
+            _rawMock.SetReturnValue("Equals", false);
+            _browserMock.SetReturnValue("Equals", false);
+
+            _filledToolbar.SelectedDisplay = 
+                (IErrorDisplay)unknown.MockInstance; // throws exception
+
+            return;
+        }
+
+        [Test]
+        public void SelectedDisplay()
+        {
+            // clear selection if any
+
+            _filledToolbar.SelectedDisplay = null;
+
+            // check ability to select raw display
+            
+            _filledToolbar.SelectedDisplay = _raw;
+            Assert.NotNull(_filledToolbar.SelectedDisplay);
+            Assert.That(_filledToolbar.SelectedDisplay, Is.SameAs(_raw));
+            Assert.True(_rendererChangeNotification);
+
+            // check ability to select browser display
+
+            _rendererChangeNotification = false;
+            _filledToolbar.SelectedDisplay = _browser;
+            Assert.NotNull(_filledToolbar.SelectedDisplay);
+            Assert.That(_filledToolbar.SelectedDisplay, Is.SameAs(_browser));
+            Assert.True(_rendererChangeNotification);
+
+            // check ability to clear selection
+
+            _rendererChangeNotification = false;
+            _filledToolbar.SelectedDisplay = null;
+            Assert.That(_filledToolbar.SelectedDisplay, Is.Null);
+            Assert.True(_rendererChangeNotification);
+
+            // event should be raised when a real
+            // change occurs
+
+            _rendererChangeNotification = false;
+            _filledToolbar.SelectedDisplay = null;
+            Assert.False(_rendererChangeNotification);
+
+            return;
+        }
+
+        [Test]
+        public void Registering_displays_adds_ToolStripItem()
+        {
+            ToolStripButton rawView = new ToolStripButton("raw display");
+            ToolStripButton browserView = new ToolStripButton("code display");
+            ToolStripItem[] btns = new ToolStripItem[] { new ToolStripButton("swap") };
+
+            // add part            
+            _rawMock.ExpectAndReturn("get_PluginItem", rawView);
+            _rawMock.ExpectAndReturn("get_PluginItem", rawView);
+            _rawMock.ExpectAndReturn("get_PluginItem", rawView);
+            _rawMock.ExpectAndReturn("get_OptionItems", null);
+            _rawMock.ExpectAndReturn("get_OptionItems", null);
+            _emptyToolbar.Register(_raw);
+            _rawMock.Verify();
+            Assert.True(_emptyToolbar.Items.Contains(rawView));
+
+            _browserMock.ExpectAndReturn("get_PluginItem", browserView);
+            _browserMock.ExpectAndReturn("get_PluginItem", browserView);
+            _browserMock.ExpectAndReturn("get_OptionItems", btns);
+            _browserMock.ExpectAndReturn("get_OptionItems", btns);
+            _emptyToolbar.Register(_browser);
+            _browserMock.Verify();
+            Assert.True(_emptyToolbar.Items.Contains(rawView));
+            Assert.True(_emptyToolbar.Items.Contains(browserView));
+            Assert.True(_emptyToolbar.Items.Contains(btns[0]));
+
+            // clear part
+
+            _emptyToolbar.Clear();
+            Assert.That(_emptyToolbar.Count, Is.EqualTo(0));
+            Assert.False(_emptyToolbar.Items.Contains(rawView));
+            Assert.False(_emptyToolbar.Items.Contains(browserView));
+            Assert.False(_emptyToolbar.Items.Contains(btns[0]));
+            
+            return;
+        }
+
+        [Test]
+        public void PluginItem_Click_Raises_SelectedRenderedChanged()
+        {
+            ErrorToolbar toolbar = new ErrorToolbar();
+            StackTraceDisplay raw = new StackTraceDisplay();
+            SourceCodeDisplay code = new SourceCodeDisplay();
+
+            toolbar.Register(raw);
+            toolbar.Register(code);
+
+            raw.PluginItem.PerformClick();
+            Assert.NotNull(toolbar.SelectedDisplay);
+            Assert.That(toolbar.SelectedDisplay, Is.EqualTo(raw));
+
+            code.PluginItem.PerformClick();
+            Assert.NotNull(toolbar.SelectedDisplay);
+            Assert.That(toolbar.SelectedDisplay, Is.EqualTo(code));
+
+            return;
+        }
+
+        [Test]
+        public void Set_Or_Unset_Check_Flag_On_Selection()
+        {
+            ErrorToolbar toolbar = new ErrorToolbar();
+            StackTraceDisplay raw = new StackTraceDisplay();
+            SourceCodeDisplay code = new SourceCodeDisplay();
+
+            toolbar.Register(raw);
+            toolbar.Register(code);
+
+            toolbar.SelectedDisplay = raw;
+            Assert.True(((ToolStripButton)raw.PluginItem).Checked);
+            Assert.False(((ToolStripButton)code.PluginItem).Checked);
+
+            toolbar.SelectedDisplay = code;
+            Assert.False(((ToolStripButton)raw.PluginItem).Checked);
+            Assert.True(((ToolStripButton)code.PluginItem).Checked);
+
+            toolbar.SelectedDisplay = null;
+            Assert.False(((ToolStripButton)raw.PluginItem).Checked);
+            Assert.False(((ToolStripButton)code.PluginItem).Checked);
+
+            return;
+        }        
+    }
+}
diff --git a/src/GuiException/tests/Controls/TestSourceCodeDisplay.cs b/src/GuiException/tests/Controls/TestSourceCodeDisplay.cs
new file mode 100644
index 0000000..c71d2bd
--- /dev/null
+++ b/src/GuiException/tests/Controls/TestSourceCodeDisplay.cs
@@ -0,0 +1,200 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using NUnit.UiException.Controls;
+using NUnit.Mocks;
+using System.Windows.Forms;
+using NUnit.UiException.CodeFormatters;
+using NUnit.UiException.Tests.data;
+using System.Drawing;
+
+namespace NUnit.UiException.Tests.Controls
+{
+    [TestFixture]
+    public class TestSourceCodeDisplay
+    {
+        private TestingCode _code;
+        private DynamicMock _mockStack;
+        private DynamicMock _mockCode;
+
+        [SetUp]
+        public void SetUp()
+        {
+            Panel fakeStackControl = new Panel();
+            Panel fakeCodeControl = new Panel();
+
+            _mockStack = new DynamicMock(typeof(IStackTraceView));
+            _mockCode = new DynamicMock(typeof(ICodeView));
+
+            _mockStack.SetReturnValue("ToControl", fakeStackControl);
+            _mockCode.SetReturnValue("ToControl", fakeCodeControl);
+
+            _code = new TestingCode(
+                (IStackTraceView)_mockStack.MockInstance,
+                (ICodeView)_mockCode.MockInstance);
+
+            return;
+        }
+
+        [Test]
+        public void DefaultState()
+        {
+            SourceCodeDisplay code = new SourceCodeDisplay();
+
+            Assert.NotNull(code.PluginItem);
+            Assert.That(code.PluginItem.Text, Is.EqualTo("Display source code context"));
+            Assert.NotNull(code.OptionItems);
+            Assert.That(code.OptionItems.Length, Is.EqualTo(1));
+            Assert.NotNull(code.Content);
+            Assert.That(code.Content, Is.TypeOf(typeof(SplitterBox)));
+
+            SplitterBox splitter = code.Content as SplitterBox;
+            Assert.That(splitter.Controls.Count, Is.EqualTo(2));
+
+            CodeBox codeBox = splitter.Control2 as CodeBox;
+            Assert.NotNull(codeBox);
+            Assert.True(codeBox.ShowCurrentLine);            
+            Assert.That(codeBox.CurrentLineBackColor, Is.EqualTo(Color.Red));
+            Assert.That(codeBox.CurrentLineForeColor, Is.EqualTo(Color.White));
+
+            Assert.True(code.AutoSelectFirstItem);
+            Assert.That(code.ListOrderPolicy, Is.EqualTo(ErrorListOrderPolicy.InitialOrder));
+            Assert.That(code.SplitOrientation, Is.EqualTo(Orientation.Vertical));
+            Assert.That(code.SplitterDistance, Is.EqualTo(0.5f));
+
+            return;
+        }
+
+        [Test]
+        public void SplitOrientation()
+        {
+            _code.SplitOrientation = Orientation.Horizontal;
+            Assert.That(_code.SplitOrientation, Is.EqualTo(Orientation.Horizontal));
+            Assert.That(_code.Splitter.Orientation, Is.EqualTo(Orientation.Horizontal));
+
+            _code.SplitOrientation = Orientation.Vertical;
+            Assert.That(_code.SplitOrientation, Is.EqualTo(Orientation.Vertical));
+            Assert.That(_code.Splitter.Orientation, Is.EqualTo(Orientation.Vertical));
+
+            return;
+        }
+
+        [Test]
+        public void SplitterDistance()
+        {
+            _code.SplitterDistance = 0.1f;
+            Assert.That(_code.Splitter.SplitterDistance, Is.EqualTo(0.1f));
+
+            _code.SplitterDistance = 0.4f;
+            Assert.That(_code.Splitter.SplitterDistance, Is.EqualTo(0.4f));
+
+            return;
+        }
+
+        [Test]
+        public void SelectedItemChanged()
+        {
+            GeneralCodeFormatter formatter = new GeneralCodeFormatter();
+            ErrorItem item;
+
+            // test to pass:
+            //
+            // handle selection changed event when there
+            // is a non null selected item
+
+            using (new TestResource("Basic.cs"))
+            {
+                item = new ErrorItem("Basic.cs", 2);
+                Assert.That(item.ReadFile(), Is.Not.Null);
+
+                _mockStack.ExpectAndReturn("get_SelectedItem", item, null);
+                _mockCode.ExpectAndReturn("get_Formatter", formatter, null);
+                _mockCode.Expect("set_Text", new object[] { item.ReadFile() });
+                _mockCode.Expect("set_Language", new object[] { "C#" });
+
+                // CurrentLine is a based 0 index
+                _mockCode.Expect("set_CurrentLine", new object[] { 1 });
+                
+                _code.RaiseSelectedItemChanged();
+                _mockStack.Verify();
+                _mockCode.Verify();
+            }
+
+            // test to fail:
+            //
+            // should handle selection changed event even
+            // if selection comes to null
+
+            _mockStack.ExpectAndReturn("get_SelectedItem", null, null);
+            _mockCode.Expect("set_Text", new object[] { null });
+
+            _code.RaiseSelectedItemChanged();
+            _mockStack.Verify();
+            _mockCode.Verify();
+
+            return;
+        }
+
+        [Test]
+        public void ListOrderPolicy()
+        {
+            _mockStack.Expect("set_ListOrderPolicy", ErrorListOrderPolicy.ReverseOrder);
+            _code.ListOrderPolicy = ErrorListOrderPolicy.ReverseOrder;
+            _mockStack.Verify();
+
+            _mockStack.ExpectAndReturn("get_ListOrderPolicy", ErrorListOrderPolicy.ReverseOrder);
+            Assert.That(_code.ListOrderPolicy, Is.EqualTo(ErrorListOrderPolicy.ReverseOrder));
+            _mockStack.Verify();
+
+            _mockStack.Expect("set_ListOrderPolicy", ErrorListOrderPolicy.InitialOrder);
+            _code.ListOrderPolicy = ErrorListOrderPolicy.InitialOrder;
+            _mockStack.Verify();
+
+            return;
+        }
+
+        [Test]
+        public void CanReportFileException()
+        {
+            SourceCodeDisplay sourceDisplay = new SourceCodeDisplay();
+
+            sourceDisplay.AutoSelectFirstItem = true;
+
+            sourceDisplay.OnStackTraceChanged(
+                "à SomeClass.SomeMethod() dans C:\\unknownFolder\\unknownFile.cs:ligne 1");
+
+            SplitterBox splitter = sourceDisplay.Content as SplitterBox;
+            CodeBox box = splitter.Control2 as CodeBox;
+
+            Assert.IsTrue(box.Text.Contains("Cannot open file: 'C:\\unknownFolder\\unknownFile.cs'"));
+            Assert.IsTrue(box.Text.Contains("Error:"));
+
+            return;
+        }
+
+        class TestingCode : SourceCodeDisplay
+        {
+            public TestingCode(IStackTraceView stack, ICodeView code)
+            {
+                _stacktraceView = stack;
+                _codeView = code;
+            }
+
+            public void RaiseSelectedItemChanged()
+            {
+                base.SelectedItemChanged(null, null);
+            }
+
+            public SplitterBox Splitter
+            {
+                get { return (_splitter); }
+            }
+        }
+    }
+}
diff --git a/src/GuiException/tests/Controls/TestSplitterBox.cs b/src/GuiException/tests/Controls/TestSplitterBox.cs
new file mode 100644
index 0000000..1df7826
--- /dev/null
+++ b/src/GuiException/tests/Controls/TestSplitterBox.cs
@@ -0,0 +1,416 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using NUnit.UiException.Controls;
+using System.Windows.Forms;
+using System.Drawing;
+
+namespace NUnit.UiException.Tests.Controls
+{
+    [TestFixture]
+    public class TestSplitterBox
+    {
+        private TestingSplitterBox _vertical;
+        private TestingSplitterBox _horizontal;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _vertical = new TestingSplitterBox();
+
+            _horizontal = new TestingSplitterBox();
+            _horizontal.Orientation = Orientation.Horizontal;
+
+            return;
+        }
+
+        [Test]
+        public void DefaultState()
+        {
+            Assert.That(_vertical.Orientation, Is.EqualTo(Orientation.Vertical));
+            Assert.That(_vertical.Width, Is.EqualTo(150));
+            Assert.That(_vertical.Height, Is.EqualTo(150));
+
+            Assert.NotNull(_vertical.Control1);
+            Assert.NotNull(_vertical.Control2);
+
+            Assert.That(_vertical.Controls.Count, Is.EqualTo(2));
+            Assert.That(_vertical.Controls[0], Is.SameAs(_vertical.Control1));
+            Assert.That(_vertical.Controls[1], Is.SameAs(_vertical.Control2));
+
+            Assert.That(_vertical.SplitterDistance, Is.EqualTo(0.5f));
+            Assert.That(_horizontal.SplitterDistance, Is.EqualTo(0.5f));
+
+            CheckVerticalLayout(_vertical, 0.5f);
+            CheckVerticalRectangles(_vertical);
+
+            CheckHorizontalLayout(_horizontal, 0.5f);
+            CheckHorizontalRectangles(_horizontal);
+
+            return;
+        }
+
+        void CheckVerticalLayout(TestingSplitterBox splitter, float x)
+        {
+            int left = (int)Math.Max(0, x * splitter.Width - SplitterBox.SPLITTER_HALFSIZE);
+            left = Math.Min(left, splitter.Width - SplitterBox.SPLITTER_SIZE);
+
+            Assert.That(splitter.Orientation, Is.EqualTo(Orientation.Vertical));
+            Assert.False(splitter.SplitterRectangle.IsEmpty);
+
+            Assert.That(splitter.SplitterRectangle.Left, Is.EqualTo(left));
+            Assert.That(splitter.SplitterRectangle.Top, Is.EqualTo(0));
+            Assert.That(splitter.SplitterRectangle.Width, Is.EqualTo(SplitterBox.SPLITTER_SIZE));
+            Assert.That(splitter.SplitterRectangle.Height, Is.EqualTo(splitter.Height));
+
+            Assert.That(splitter.Control1.Left, Is.EqualTo(0));
+            Assert.That(splitter.Control1.Top, Is.EqualTo(0));
+            Assert.That(splitter.Control1.Right, Is.EqualTo(splitter.SplitterRectangle.Left));
+            Assert.That(splitter.Control1.Height, Is.EqualTo(splitter.Height));
+
+            Assert.That(splitter.Control2.Left, Is.EqualTo(splitter.SplitterRectangle.Right));
+            Assert.That(splitter.Control2.Top, Is.EqualTo(0));
+            Assert.That(splitter.Control2.Right, Is.EqualTo(splitter.Width));
+            Assert.That(splitter.Control2.Height, Is.EqualTo(splitter.Height));
+
+            return;
+        }
+
+        void CheckHorizontalLayout(TestingSplitterBox splitter, float y)
+        {
+            int top = (int)Math.Max(0, y * splitter.Height - SplitterBox.SPLITTER_HALFSIZE);
+            top = Math.Min(top, splitter.Height - SplitterBox.SPLITTER_SIZE);
+
+            Assert.That(splitter.Orientation, Is.EqualTo(Orientation.Horizontal));
+            Assert.False(splitter.SplitterRectangle.IsEmpty);
+            Assert.That(splitter.SplitterRectangle,
+                Is.EqualTo(new Rectangle(0, top, splitter.Width, SplitterBox.SPLITTER_SIZE)));
+
+            Assert.That(splitter.Control1.Left, Is.EqualTo(0));
+            Assert.That(splitter.Control1.Top, Is.EqualTo(0));
+            Assert.That(splitter.Control1.Right, Is.EqualTo(splitter.Width));
+            Assert.That(splitter.Control1.Height, Is.EqualTo(splitter.SplitterRectangle.Top));
+
+            Assert.That(splitter.Control2.Left, Is.EqualTo(0));
+            Assert.That(splitter.Control2.Top, Is.EqualTo(splitter.SplitterRectangle.Bottom));
+            Assert.That(splitter.Control2.Right, Is.EqualTo(splitter.Width));
+            Assert.That(splitter.Control2.Bottom, Is.EqualTo(splitter.Height));
+
+            return;
+        }
+
+        void CheckVerticalRectangles(TestingSplitterBox splitter)
+        {
+            Assert.False(splitter.Collapse1Rectangle.IsEmpty);
+            Assert.False(splitter.DirectionRectangle.IsEmpty);
+            Assert.False(splitter.Collapse2Rectangle.IsEmpty);
+
+            int y = (splitter.Height - 41) / 2;
+
+            Assert.That(splitter.SplitterRectangle.Left, Is.GreaterThanOrEqualTo(0));
+            Assert.That(splitter.SplitterRectangle.Right, Is.LessThanOrEqualTo(150));
+
+            Assert.That(splitter.Collapse1Rectangle,
+                Is.EqualTo(new Rectangle(splitter.SplitterRectangle.Left, y, SplitterBox.SPLITTER_SIZE, SplitterBox.BUTTON_SIZE)));
+
+            Assert.That(splitter.DirectionRectangle,
+                Is.EqualTo(new Rectangle(
+                    splitter.SplitterRectangle.Left,
+                    splitter.Collapse1Rectangle.Bottom + 2, SplitterBox.SPLITTER_SIZE, SplitterBox.BUTTON_SIZE)));
+
+            Assert.That(splitter.Collapse2Rectangle,
+                Is.EqualTo(new Rectangle(
+                    splitter.SplitterRectangle.Left,
+                    splitter.DirectionRectangle.Bottom + 2, SplitterBox.SPLITTER_SIZE, SplitterBox.BUTTON_SIZE)));
+            
+            return;
+        }
+
+        void CheckHorizontalRectangles(TestingSplitterBox splitter)
+        {
+            Assert.False(splitter.Collapse1Rectangle.IsEmpty);
+            Assert.False(splitter.DirectionRectangle.IsEmpty);
+            Assert.False(splitter.Collapse2Rectangle.IsEmpty);
+
+            int x = (splitter.Width - 41) / 2;
+            int y = splitter.SplitterRectangle.Top;
+
+            Assert.That(splitter.SplitterRectangle.Top, Is.GreaterThanOrEqualTo(0));
+            Assert.That(splitter.SplitterRectangle.Bottom, Is.LessThanOrEqualTo(splitter.Height));
+
+            Assert.That(splitter.Collapse1Rectangle,
+                Is.EqualTo(new Rectangle(x, y, SplitterBox.BUTTON_SIZE, SplitterBox.SPLITTER_SIZE)));
+
+            Assert.That(splitter.DirectionRectangle,
+                Is.EqualTo(new Rectangle(splitter.Collapse1Rectangle.Right + 2, y, SplitterBox.BUTTON_SIZE, SplitterBox.SPLITTER_SIZE)));
+
+            Assert.That(splitter.Collapse2Rectangle,
+                Is.EqualTo(new Rectangle(splitter.DirectionRectangle.Right + 2, y, SplitterBox.BUTTON_SIZE, SplitterBox.SPLITTER_SIZE)));
+
+            return;
+        }
+
+        [Test]
+        public void CanChangeDefaultControl1()
+        {
+            Control control1 = _vertical.Control1;
+            Panel panel = new Panel();
+
+            _vertical.Control1 = panel;
+            Assert.False(_vertical.Controls.Contains(control1));
+            Assert.True(_vertical.Controls.Contains(panel));
+            CheckVerticalLayout(_vertical, 0.5f);
+
+            _vertical.Control1 = null;
+            Assert.True(_vertical.Controls.Contains(control1));
+            Assert.False(_vertical.Controls.Contains(panel));
+            CheckVerticalLayout(_vertical, 0.5f);
+
+            _vertical.Control1 = null;
+            Assert.True(_vertical.Controls.Contains(control1));
+            Assert.False(_vertical.Controls.Contains(panel));
+            CheckVerticalLayout(_vertical, 0.5f);
+
+            return;
+        }
+
+        [Test]
+        public void CanChangeDefaultControl2()
+        {
+            Control control2 = _vertical.Control2;
+            Panel panel = new Panel();
+
+            _vertical.Control2 = panel;
+            Assert.False(_vertical.Controls.Contains(control2));
+            Assert.True(_vertical.Controls.Contains(panel));
+            CheckVerticalLayout(_vertical, 0.5f);
+
+            _vertical.Control2 = null;
+            Assert.True(_vertical.Controls.Contains(control2));
+            Assert.False(_vertical.Controls.Contains(panel));
+            CheckVerticalLayout(_vertical, 0.5f);
+
+            _vertical.Control2 = null;
+            Assert.True(_vertical.Controls.Contains(control2));
+            Assert.False(_vertical.Controls.Contains(panel));
+            CheckVerticalLayout(_vertical, 0.5f);
+
+            return;
+        }
+
+        [Test]
+        public void ChangingSizeInvokeDoLayout()
+        {
+            _vertical.Width = 100;
+            CheckVerticalLayout(_vertical, 0.5f);
+
+            _vertical.Height = 200;
+            CheckVerticalLayout(_vertical, 0.5f);
+
+            return;
+        }
+
+        [Test]
+        public void OrientationAffectsLayout()
+        {
+            _vertical.Orientation = Orientation.Horizontal;
+            CheckHorizontalLayout(_vertical, 0.5f);
+
+            _vertical.Orientation = Orientation.Vertical;
+            CheckVerticalLayout(_vertical, 0.5f);
+
+            return;
+        }
+
+        [Test]
+        public void SplitterDistance()
+        {
+            // vertical layout
+
+            _vertical.SplitterDistance = 0.4f;
+            Assert.That(_vertical.SplitterDistance, Is.EqualTo(0.4f));
+            CheckVerticalLayout(_vertical, 0.4f);
+
+            _vertical.SplitterDistance = -1f;
+            Assert.That(_vertical.SplitterDistance, Is.EqualTo(0f));
+            CheckVerticalLayout(_vertical, 0f);
+
+            _vertical.SplitterDistance = 2f;
+            Assert.That(_vertical.SplitterDistance, Is.EqualTo(1f));
+            CheckVerticalLayout(_vertical, 1f);
+
+            // horizontal layout
+
+            _horizontal.SplitterDistance = 0.4f;
+            Assert.That(_horizontal.SplitterDistance, Is.EqualTo(0.4f));
+            CheckHorizontalLayout(_horizontal, 0.4f);
+
+            _horizontal.SplitterDistance = -1;
+            Assert.That(_horizontal.SplitterDistance, Is.EqualTo(0f));
+            CheckHorizontalLayout(_horizontal, 0);
+
+            _horizontal.SplitterDistance = 2f;
+            Assert.That(_horizontal.SplitterDistance, Is.EqualTo(1f));
+            CheckHorizontalLayout(_horizontal, 1);
+
+            return;
+        }
+
+        [Test]
+        public void PointToSplit()
+        {
+            // vertical layout
+
+            _vertical.PointToSplit((int)(_vertical.Width * 0.4f), 0);
+            CheckVerticalLayout(_vertical, 0.4f);            
+
+            _vertical.PointToSplit(-1, 0);
+            CheckVerticalLayout(_vertical, 0f);
+
+            _vertical.PointToSplit(_vertical.Width * 2, 0);
+            CheckVerticalLayout(_vertical, 1f);
+
+            // horizontal layout
+
+            _horizontal.PointToSplit(0, (int)(_horizontal.Height * 0.4f));
+            CheckHorizontalLayout(_horizontal, 0.4f);
+
+            _horizontal.PointToSplit(0, -1);
+            CheckHorizontalLayout(_horizontal, 0);
+
+            _horizontal.PointToSplit(0, _horizontal.Height * 2);
+            CheckHorizontalLayout(_horizontal, 1);
+
+            return;
+        }
+
+        [Test]
+        public void CollapseControl()
+        {
+            // test with vertical layout
+
+            _vertical.CollapseControl1();
+            CheckVerticalRectangles(_vertical);
+            CheckVerticalLayout(_vertical, 0);
+            
+            _vertical.CollapseControl2();
+            CheckVerticalRectangles(_vertical);
+            CheckVerticalLayout(_vertical, 1);
+
+            // test with horizontal layout
+
+            _horizontal.CollapseControl1();
+            CheckHorizontalRectangles(_horizontal);
+            CheckHorizontalLayout(_horizontal, 0);
+
+            _horizontal.CollapseControl2();
+            CheckHorizontalRectangles(_horizontal);
+            CheckHorizontalLayout(_horizontal, 1);
+
+            return;
+        }
+
+        [Test]
+        public void MouseActions()
+        {
+            // test 1: check ability to move splitter
+
+            _vertical = new TestingSplitterBox();
+            _vertical.FireMouseDown(_vertical.SplitterRectangle.Left + 1, 1);
+            _vertical.FireMouseMove(0, 1);
+            _vertical.FireMouseUp(0, 1);
+
+            Assert.That(_vertical.SplitterDistance, Is.EqualTo(0));
+
+            // test 2: splitter doesn't move when mouse down occurs while
+            //         the mouse is hovering Collapse1Rectangle
+
+            _vertical = new TestingSplitterBox();
+            _vertical.FireMouseDown(
+                _vertical.Collapse1Rectangle.Left + 1,
+                _vertical.Collapse1Rectangle.Top + 1);
+            _vertical.FireMouseMove(0, 1);
+            _vertical.FireMouseUp(0, 1);
+
+            Assert.That(_vertical.SplitterDistance, Is.EqualTo(0.5f));            
+
+            // test 3: mouse down occurs on SplitterRectangle area (except the buttons)
+            //         mouse up occurs on Collapse1Rectangle
+            //         CollapseControl1() should not be triggered and splitter
+            //         should be at the last notified mouse position
+
+            _vertical = new TestingSplitterBox();
+            _vertical.FireMouseDown(_vertical.SplitterRectangle.Left + 1, 1);
+            _vertical.FireMouseMove(150, 0);
+            _vertical.FireMouseUp(_vertical.Collapse1Rectangle.Left + 1,
+                _vertical.Collapse1Rectangle.Top + 1);
+            Assert.That(_vertical.SplitterDistance, Is.EqualTo(1));
+         
+            // test 4: mouse down occurs on SplitterRectangle
+            //         mouse up occurs on Collapse2Rectangle
+            //         CollapseControl2 shouldn't be triggered and splitter
+            //         should be at the last notified mouse position
+
+            _vertical = new TestingSplitterBox();
+            _vertical.FireMouseDown(_vertical.SplitterRectangle.Left + 1, 1);
+            _vertical.FireMouseMove(0, 0);
+            _vertical.FireMouseUp(_vertical.Collapse2Rectangle.Left + 1,
+                _vertical.Collapse2Rectangle.Top + 1);
+            Assert.That(_vertical.SplitterDistance, Is.EqualTo(0));
+
+            // test 5: mouse down occurs on SplitterRectangle
+            //         mouse up occurs on DirectionRectangle
+            //         Orientation shouldn't be triggered and splitter
+            //         should be at the last notified mouse position
+
+            _vertical = new TestingSplitterBox();
+            _vertical.FireMouseDown(_vertical.SplitterRectangle.Left + 1, 1);
+            _vertical.FireMouseMove(0, 0);
+            _vertical.FireMouseUp(_vertical.DirectionRectangle.Left + 1,
+                _vertical.DirectionRectangle.Top + 1);
+            Assert.That(_vertical.SplitterDistance, Is.EqualTo(0));
+            Assert.That(_vertical.Orientation, Is.EqualTo(Orientation.Vertical));
+
+            return;
+        }
+
+        class TestingSplitterBox : SplitterBox
+        {
+            public new Rectangle Collapse1Rectangle
+            {
+                get { return (base.Collapse1Rectangle); }
+            }
+
+            public new Rectangle Collapse2Rectangle
+            {
+                get { return (base.Collapse2Rectangle); }
+            }
+
+            public new Rectangle DirectionRectangle
+            {
+                get { return (base.DirectionRectangle); }
+            }
+
+            public void FireMouseDown(int x, int y)
+            {
+                OnMouseDown(new MouseEventArgs(MouseButtons.Left, 1, x, y, 0));
+            }
+
+            public void FireMouseMove(int x, int y)
+            {
+                OnMouseMove(new MouseEventArgs(MouseButtons.None, 0, x, y, 0));
+            }
+
+            public void FireMouseUp(int x, int y)
+            {
+                OnMouseUp(new MouseEventArgs(MouseButtons.Left, 1, x, y, 0));
+            }
+        }
+    }
+}
diff --git a/src/GuiException/tests/Controls/TestStackTraceDisplay.cs b/src/GuiException/tests/Controls/TestStackTraceDisplay.cs
new file mode 100644
index 0000000..5bb0ac2
--- /dev/null
+++ b/src/GuiException/tests/Controls/TestStackTraceDisplay.cs
@@ -0,0 +1,117 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using NUnit.UiException.Controls;
+using System.Windows.Forms;
+
+namespace NUnit.UiException.Tests.Controls
+{
+    [TestFixture]
+    public class TestStackTraceDisplay
+    {
+        private StackTraceDisplay _traceDisplay;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _traceDisplay = new StackTraceDisplay();
+        }
+
+        [Test]
+        public void DefaultState()
+        {
+            Assert.NotNull(_traceDisplay.PluginItem);
+            Assert.That(_traceDisplay.PluginItem.Text, Is.EqualTo("Display actual stack trace"));
+            Assert.NotNull(_traceDisplay.OptionItems);
+            Assert.That(_traceDisplay.OptionItems.Length, Is.EqualTo(1));
+            Assert.That(_traceDisplay.OptionItems[0].Text, Is.EqualTo("Copy stack trace to clipboard"));
+
+            Assert.That(_traceDisplay.Content, Is.Not.Null);
+            Assert.That(_traceDisplay.Content, Is.TypeOf(typeof(TextBox)));
+            TextBox text = _traceDisplay.Content as TextBox;            
+            Assert.That(text.Text, Is.EqualTo(""));
+            Assert.That(text.ReadOnly, Is.True);
+            Assert.That(text.Multiline, Is.True);
+
+            return;
+        }
+
+        [Test]
+        public void OnStackTraceChanged()
+        {
+            string trace_1 = 
+                    "à System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)\r\n" +
+                    "à System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)\r\n" +
+                    "à System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value)\r\n" +
+                    "à NUnit.UiException.Tests.MockHelper.Two_Mocks_In_Dictionary() dans C:\\folder\\file1.cs:ligne 87\r\n";
+
+            string trace_2 = "";
+            TextBox content = _traceDisplay.Content as TextBox;
+
+            _traceDisplay.OnStackTraceChanged(trace_1);
+            Assert.That(content.Text, Is.EqualTo(trace_1));
+
+            _traceDisplay.OnStackTraceChanged(trace_2);
+            Assert.That(content.Text, Is.EqualTo(trace_2));
+
+            // passing null should not cause error
+
+            _traceDisplay.OnStackTraceChanged(null);
+            Assert.That(content.Text, Is.EqualTo(""));
+
+            return;
+        }
+
+        [Test]
+        [STAThread]
+        public void CopyToClipBoard()
+        {
+            Clipboard.Clear();
+
+            _traceDisplay.OnStackTraceChanged("hi, there!");
+            _traceDisplay.CopyToClipBoard();
+
+            Assert.That(Clipboard.ContainsText(), Is.True);
+            Assert.That(Clipboard.GetText(), Is.EqualTo("hi, there!"));
+
+            // calling twice doesn't add twice same content
+
+            _traceDisplay.CopyToClipBoard();
+            _traceDisplay.CopyToClipBoard();
+            Assert.That(Clipboard.GetText(), Is.EqualTo("hi, there!"));
+
+            // test to fail: calling copy to clipboard
+            // with an empty stack trace is valid
+
+            _traceDisplay.OnStackTraceChanged("");
+            _traceDisplay.CopyToClipBoard();
+            Assert.That(Clipboard.GetText(), Is.EqualTo(""));
+
+            return;
+        }
+
+        [Test]
+        public void FeedingDisplayWithGarbageDoesNotMakeItCrash()
+        {
+            _traceDisplay.OnStackTraceChanged(
+                "Lorem ipsum dolor sit amet, consectetur adipiscing elit.\r\n" +
+                "Nam at nisi ut neque sollicitudin ultrices. Sed rhoncus\r\n" +
+                "rhoncus arcu. Morbi eu elit ut augue congue luctus. Nullam\r\n" +
+                "eu eros. Nunc blandit varius orci. Mauris condimentum diam\r\n" +
+                "ac ligula. Nullam ut metus. Maecenas sagittis nibh in nisl.\r\n" +
+                "Phasellus rhoncus diam a nulla. Integer vestibulum.\r\n");
+
+            TextBox text = _traceDisplay.Content as TextBox;
+            Assert.That(text.Text, Is.Not.Null);
+
+            return;
+        }
+
+    }
+}
diff --git a/src/GuiException/tests/MockHelper.cs b/src/GuiException/tests/MockHelper.cs
new file mode 100644
index 0000000..3a12f47
--- /dev/null
+++ b/src/GuiException/tests/MockHelper.cs
@@ -0,0 +1,27 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Mocks;
+using NUnit.UiException.Controls;
+
+namespace NUnit.UiException.Tests
+{
+    public class MockHelper
+    {
+        public static DynamicMock NewMockIErrorRenderer(string name, int hashcode)
+        {
+            DynamicMock res;
+
+            res = new DynamicMock(name, typeof(IErrorDisplay));
+            res.SetReturnValue("Equals", true);
+            res.SetReturnValue("GetHashCode", hashcode);
+
+            return (res);
+        }
+    }
+}
diff --git a/src/GuiException/tests/StackTraceAnalysers/TestFunctionParser.cs b/src/GuiException/tests/StackTraceAnalysers/TestFunctionParser.cs
new file mode 100644
index 0000000..bd88a0f
--- /dev/null
+++ b/src/GuiException/tests/StackTraceAnalysers/TestFunctionParser.cs
@@ -0,0 +1,83 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using NUnit.UiException.StackTraceAnalyzers;
+using NUnit.UiException.StackTraceAnalysers;
+
+namespace NUnit.UiException.Tests.StackTraceAnalyzers
+{
+    [TestFixture]
+    public class TestFunctionParser :
+        TestIErrorParser
+    {
+        private IErrorParser _parser;
+
+        [SetUp]
+        public new void SetUp()
+        {
+            _parser = new FunctionParser();
+
+            return;
+        }
+
+        [Test]
+        public void Test_Ability_To_Parse_Regular_Function_Values()
+        {
+            RawError res;
+
+            // check parse of basic method
+            res = AcceptValue(_parser, "à NUnit.UiException.TraceItem.get_Text() dans C:\\TraceItem.cs:ligne 43");
+            Assert.That(res.Function, Is.EqualTo("NUnit.UiException.TraceItem.get_Text()"));
+
+            // check parse a method with parameters
+            res = AcceptValue(_parser, "à System.String.InternalSubStringWithChecks(Int32 startIndex, Int32 length, Boolean fAlwaysCopy)");
+            Assert.That(res.Function, Is.EqualTo("System.String.InternalSubStringWithChecks(Int32 startIndex, Int32 length, Boolean fAlwaysCopy)"));
+
+            // check it supports C/C++ function as well
+            res = AcceptValue(_parser, "à main(int argc, const char **argv) dans C:\\file1:line1");
+            Assert.That(res.Function, Is.EqualTo("main(int argc, const char **argv)"));
+
+            // check it doesn't rely upon path or line information
+            //res = AcceptValue(_parser, "get_Text()");
+            //Assert.That(res.Function, Is.EqualTo("get_Text()"));
+
+            // a simple function name is not accepted - that is, the leading "at" is required
+            // TODO: try to restore older behavior while still allowing a space before the
+            // opening parenthesis.
+            RejectValue(_parser, "get_Text()");
+
+            return;            
+        }
+
+        [Test]
+        public void Test_Ability_To_Parse_Mono_Stack_Trace()
+        {
+            RawError res;
+
+            // mono adds a space after the name
+            res = AcceptValue(_parser, "à NUnit.UiException.TraceItem.get_Text () dans C:\\TraceItem.cs:ligne 43");
+            Assert.That(res.Function, Is.EqualTo("NUnit.UiException.TraceItem.get_Text ()"));
+        }
+
+        [Test]
+        public void Test_Fail_To_Parse_Odd_Function_Values()
+        {
+            // check parse relies on '(' and ')'
+            RejectValue(_parser, "à get_Text dans C:\\file1:line1");
+            RejectValue(_parser, "à get_Text( dans C:\\file1:line1");
+            RejectValue(_parser, "à get_Text) dans C:\\file1:line1");
+            RejectValue(_parser, "à get_Text)( dans C:\\file1:line1");
+
+            // check function name cannot be empty
+            RejectValue(_parser, "à (int index) dans C:\\file1:line1");
+
+            return;
+        }
+    }
+}
diff --git a/src/GuiException/tests/StackTraceAnalysers/TestIErrorParser.cs b/src/GuiException/tests/StackTraceAnalysers/TestIErrorParser.cs
new file mode 100644
index 0000000..fc7b4fc
--- /dev/null
+++ b/src/GuiException/tests/StackTraceAnalysers/TestIErrorParser.cs
@@ -0,0 +1,112 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.UiException.StackTraceAnalyzers;
+using NUnit.Framework;
+using NUnit.UiException.StackTraceAnalysers;
+
+namespace NUnit.UiException.Tests.StackTraceAnalyzers
+{
+    [TestFixture]
+    public class TestIErrorParser
+    {
+        protected StackTraceParser _stack;
+        protected IErrorParser[] _array;
+
+        public TestIErrorParser()
+        {
+            _stack = new StackTraceParser();
+
+            return;
+        }
+
+        [SetUp]
+        public void SetUp()
+        {
+            PathCompositeParser pathParser;
+
+            pathParser = new PathCompositeParser();
+
+            _array = new IErrorParser[]  {
+                pathParser.UnixPathParser,
+                pathParser.WindowsPathParser,
+                new FunctionParser(),
+                new PathCompositeParser(),
+                new LineNumberParser()
+            };
+
+            return;
+        }
+
+        [Test]
+        public void Test_IErrorParser_Can_Throw_ParserNullException()
+        {
+            bool hasRaisedException;
+
+            foreach (IErrorParser item in _array)
+            {
+                hasRaisedException = false;
+
+                try {
+                    item.TryParse(null, new RawError("test")); // throws exception
+                }
+                catch (Exception e)
+                {
+                    Assert.That(e.Message.Contains("parser"), Is.True);
+                    hasRaisedException = true;
+                }
+
+                Assert.That(hasRaisedException, Is.True,
+                    item.ToString() + " failed to raise exception");
+            }
+
+            return;
+        }
+
+        [Test]
+        public void Test_IErrorParser_Can_Throw_ArgsNullException()
+        {
+            bool hasRaisedException;
+
+            foreach (IErrorParser item in _array)
+            {
+                hasRaisedException = false;
+
+                try
+                {
+                    item.TryParse(_stack, null); // throws exception
+                }
+                catch (Exception e)
+                {
+                    Assert.That(e.Message.Contains("args"), Is.True);
+                    hasRaisedException = true;
+                }
+
+                Assert.That(hasRaisedException, Is.True,
+                    item.ToString() + " failed to raise exception");
+            }
+
+            return;
+        }
+
+        public RawError AcceptValue(IErrorParser parser, string error)
+        {
+            RawError res;
+
+            res = new RawError(error);
+            Assert.That(parser.TryParse(_stack, res), Is.True, "Failed to parse \"{0}\"", error);
+
+            return (res);
+        }
+
+        public void RejectValue(IErrorParser parser, string error)
+        {
+            Assert.That(parser.TryParse(_stack, new RawError(error)), Is.False);
+        }
+    }
+}
diff --git a/src/GuiException/tests/StackTraceAnalysers/TestLineNumberParser.cs b/src/GuiException/tests/StackTraceAnalysers/TestLineNumberParser.cs
new file mode 100644
index 0000000..ef18eb4
--- /dev/null
+++ b/src/GuiException/tests/StackTraceAnalysers/TestLineNumberParser.cs
@@ -0,0 +1,80 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using NUnit.UiException.StackTraceAnalyzers;
+using NUnit.UiException.StackTraceAnalysers;
+
+namespace NUnit.UiException.Tests.StackTraceAnalyzers
+{
+    [TestFixture]
+    public class TestLineNumberParser :
+        TestIErrorParser
+    {
+        private IErrorParser _parser;
+
+        [SetUp]
+        public new void SetUp()
+        {
+            _parser = new LineNumberParser();
+
+            return;
+        }
+
+        [Test]
+        public void Test_Ability_To_Parse_Regular_Line_Number_Values()
+        {
+            RawError res;
+
+            // a basic test
+            res = AcceptValue(_parser, "à get_Text() dans C:\\folder\\file1:line 1");
+            Assert.That(res.Line, Is.EqualTo(1));
+
+            // parser doesn't rely upon the presence of words between
+            // the colon and the number
+            res = AcceptValue(_parser, "à get_Text() dans C:\\folder\\file1:42");
+            Assert.That(res.Line, Is.EqualTo(42));
+
+            // parser doesn't rely on the existence of
+            // a method name or path value
+            res = AcceptValue(_parser, ":43");
+            Assert.That(res.Line, Is.EqualTo(43));
+
+            // Works for German
+            // NOTE: German provides a period at the end of the line
+            res = AcceptValue(_parser, @"bei CT.Business.BusinessObjectXmlSerializer.Deserialize(String serializedObject) in D:\Source\CT5\BASE\CT.Business\BusinessObjectXmlSerializer.cs:Zeile 86.");
+            Assert.That(res.Line, Is.EqualTo(86));
+
+            // Russian works too
+            // в Samples.ExceptionBrowserTest.Worker.DoSomething() в C:\psgdev\Projects\NUnit\Tests\Samples\ExceptionBrowserTest.cs:строка 16
+            // в Samples.ExceptionBrowserTest.Test() в C:\psgdev\Projects\NUnit\Tests\Samples\ExceptionBrowserTest.cs:строка 24
+            res = AcceptValue(_parser, @"в Samples.ExceptionBrowserTest.Worker.DoSomething() в C:\psgdev\Projects\NUnit\Tests\Samples\ExceptionBrowserTest.cs:строка 16");
+            Assert.That(res.Line, Is.EqualTo(16));
+            return;
+        }
+
+        [Test]
+        public void Test_Ability_To_Reject_Odd_Line_Number_Values()
+        {
+            // after the terminal ':' parser expects to have only one integer value            
+            RejectValue(_parser, "à get_Text() dans C:\\folder\\file1 line 42");
+            RejectValue(_parser, "à get_Text() dans C:\\folder\\file42");
+
+            // check it fails to parse int values that are part of a word
+            RejectValue(_parser, "à get_Text() dans C:\\folder\\file1:line43");
+
+            // a line number should not be zero
+            RejectValue(_parser, "à get_Text() dans C:\\folder\\file1:line 0");
+
+            // a line number should not be negative
+            RejectValue(_parser, "à get_Text() dans C:\\folder\\file1:line -42");
+
+            return;
+        }        
+    }
+}
diff --git a/src/GuiException/tests/StackTraceAnalysers/TestPathParser.cs b/src/GuiException/tests/StackTraceAnalysers/TestPathParser.cs
new file mode 100644
index 0000000..b84bde1
--- /dev/null
+++ b/src/GuiException/tests/StackTraceAnalysers/TestPathParser.cs
@@ -0,0 +1,54 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using NUnit.UiException.StackTraceAnalyzers;
+using NUnit.UiException.StackTraceAnalysers;
+
+namespace NUnit.UiException.Tests.StackTraceAnalyzers
+{
+    [TestFixture]
+    public class TestPathParser :
+        TestIErrorParser
+    {
+        private PathCompositeParser _parser;
+
+        [SetUp]
+        public new void SetUp()
+        {
+            _parser = new PathCompositeParser();
+
+            Assert.That(_parser.UnixPathParser, Is.Not.Null);
+            Assert.That(_parser.WindowsPathParser, Is.Not.Null);                
+
+            return;
+        }
+
+        [Test]
+        public void Test_Ability_To_Handle_Windows_Path_Like_Values()
+        {
+            RawError res;
+
+            res = AcceptValue(_parser, "à get_Text() dans C:\\folder\\file1:line 1");
+            Assert.That(res.Path, Is.EqualTo("C:\\folder\\file1"));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Ability_To_Handle_Unix_Path_Like_Values()
+        {
+            RawError res;
+
+            res = AcceptValue(_parser, "à get_Text() dans /home/ihottier/folder/file1:line 1");
+            Assert.That(res.Path, Is.EqualTo("/home/ihottier/folder/file1"));
+
+            return;
+        }
+    }
+}
diff --git a/src/GuiException/tests/StackTraceAnalysers/TestUnixPathParser.cs b/src/GuiException/tests/StackTraceAnalysers/TestUnixPathParser.cs
new file mode 100644
index 0000000..c9e7964
--- /dev/null
+++ b/src/GuiException/tests/StackTraceAnalysers/TestUnixPathParser.cs
@@ -0,0 +1,97 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using NUnit.UiException.StackTraceAnalyzers;
+using NUnit.UiException.StackTraceAnalysers;
+
+namespace NUnit.UiException.Tests.StackTraceAnalyzers
+{
+    [TestFixture]
+    public class TestUnixPathParser :
+        TestIErrorParser
+    {
+        private IErrorParser _parser;
+
+        [SetUp]
+        public new void SetUp()
+        {
+            _parser = new PathCompositeParser().UnixPathParser;
+
+            Assert.That(_parser, Is.Not.Null);
+
+            return;
+        }        
+
+        [Test]
+        public void Test_Ability_To_Parse_Regular_Unix_Like_Path_Values()
+        {
+            RawError res;
+
+            // one basic sample
+            res = AcceptValue(_parser, "à NUnit.UiException.TraceItem.get_Text() dans /home/ihottier/TraceItem.cs:ligne 43");
+            Assert.That(res.Path, Is.EqualTo("/home/ihottier/TraceItem.cs"));
+
+            // check parser is not confused by file with odd extensions
+            res = AcceptValue(_parser, "à get_Text() dans /home/ihottier/TraceItem.cs.cs.cs.cs:ligne 43");
+            Assert.That(res.Path, Is.EqualTo("/home/ihottier/TraceItem.cs.cs.cs.cs"));
+
+            // check it supports white space in path
+            res = AcceptValue(_parser, "à get_Text() dans /home/ihottier/my Document1/my document2 containing space/file.cs:line 1");
+            Assert.That(res.Path, Is.EqualTo("/home/ihottier/my Document1/my document2 containing space/file.cs"));
+
+            // check it supports odd folder names ending like C# file
+            res = AcceptValue(_parser, "à get_Text() dans /home/my doc/my doc2.cs/file.cs:line 1");
+            Assert.That(res.Path, Is.EqualTo("/home/my doc/my doc2.cs/file.cs"));
+
+            // check it doesn't rely on a constant such as "/home"
+            res = AcceptValue(_parser, "à get_Text() dans /root/work/folder 1/file1.cs:line 1");
+            Assert.That(res.Path, Is.EqualTo("/root/work/folder 1/file1.cs"));
+
+            // same with upper case
+            res = AcceptValue(_parser, "à get_Text() dans /ROOT/work/folder 1/file1.cs:line 1");
+            Assert.That(res.Path, Is.EqualTo("/ROOT/work/folder 1/file1.cs"));
+
+            // check it doesn't rely upon a specific file language
+
+            res = AcceptValue(_parser, "à get_Text() dans /home/ihottier/work/folder 1/file1.vb:line 1");
+            Assert.That(res.Path, Is.EqualTo("/home/ihottier/work/folder 1/file1.vb"));
+
+            res = AcceptValue(_parser, "à get_Text() dans /home/ihottier/work/folder 1/file1.cpp: line 1");
+            Assert.That(res.Path, Is.EqualTo("/home/ihottier/work/folder 1/file1.cpp"));
+
+            // check it doesn't rely upon language at all
+
+            res = AcceptValue(_parser, "à get_Text() dans /home/work/folder 1/file1:line 1");
+            Assert.That(res.Path, Is.EqualTo("/home/work/folder 1/file1"));
+
+            // check it doesn't rely upon method or line information
+            res = AcceptValue(_parser, "/home/work/folder/file:");
+            Assert.That(res.Path, Is.EqualTo("/home/work/folder/file"));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Inability_To_Parse_Non_Unix_Like_Path_Values()
+        {
+            // check it fails to parse Windows like path values
+            RejectValue(_parser, "à get_Text() dans C:\\Users\\ihottier\\Work\\file1:line1");
+
+            // check it fails to parse ill-formed Unix path values
+            RejectValue(_parser, "à get_Text() dans /:line1");
+            RejectValue(_parser, "à get_Text() dans / :line1");
+            RejectValue(_parser, "à get_Text() dans home/file1:line1");
+
+            // check it fails to parse missing path value
+            RejectValue(_parser, "à get_Text()");
+
+            return;
+        }
+    }
+}
diff --git a/src/GuiException/tests/StackTraceAnalysers/TestWindowsPathParser.cs b/src/GuiException/tests/StackTraceAnalysers/TestWindowsPathParser.cs
new file mode 100644
index 0000000..7b70207
--- /dev/null
+++ b/src/GuiException/tests/StackTraceAnalysers/TestWindowsPathParser.cs
@@ -0,0 +1,98 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using NUnit.UiException.StackTraceAnalyzers;
+using NUnit.UiException.StackTraceAnalysers;
+
+namespace NUnit.UiException.Tests.StackTraceAnalyzers
+{
+    [TestFixture]
+    public class TestWindowsPathParser :
+        TestIErrorParser
+    {
+        private IErrorParser _parser;
+
+        [SetUp]
+        public new void SetUp()
+        {
+            _parser = new PathCompositeParser().WindowsPathParser;
+
+            Assert.That(_parser, Is.Not.Null);
+
+            return;                
+        }
+        
+        [Test]
+        public void Test_Ability_To_Parse_Regular_Windows_Path()
+        {
+            RawError res;
+
+            // one basic sample
+            res = AcceptValue(_parser, "à NUnit.UiException.TraceItem.get_Text() dans C:\\TraceItem.cs:ligne 43");
+            Assert.That(res.Path, Is.EqualTo("C:\\TraceItem.cs"));
+
+            // check parser is not confused by file with odd extensions
+            res = AcceptValue(_parser, "à get_Text() dans C:\\TraceItem.cs.cs.cs.cs:ligne 43");
+            Assert.That(res.Path, Is.EqualTo("C:\\TraceItem.cs.cs.cs.cs"));
+
+            // check it supports white space in path
+            res = AcceptValue(_parser, "à get_Text() dans C:\\my Document1\\my document2 containing space\\file.cs:line 1");
+            Assert.That(res.Path, Is.EqualTo("C:\\my Document1\\my document2 containing space\\file.cs"));
+
+            // check it supports odd folder names ending like C# file
+            res = AcceptValue(_parser, "à get_Text() dans C:\\my doc\\my doc2.cs\\file.cs:line 1");
+            Assert.That(res.Path, Is.EqualTo("C:\\my doc\\my doc2.cs\\file.cs"));
+
+            // check it supports odd drive letters
+            res = AcceptValue(_parser, "à get_Text() dans Z:\\work\\folder 1\\file1.cs:line 1");
+            Assert.That(res.Path, Is.EqualTo("Z:\\work\\folder 1\\file1.cs"));
+
+            // same with lower case
+            res = AcceptValue(_parser, "à get_Text() dans z:\\work\\folder 1\\file1.cs:line 1");
+            Assert.That(res.Path, Is.EqualTo("z:\\work\\folder 1\\file1.cs"));
+
+            // check it doesn't rely upon a specific file language
+
+            res = AcceptValue(_parser, "à get_Text() dans z:\\work\\folder 1\\file1.vb:line 1");
+            Assert.That(res.Path, Is.EqualTo("z:\\work\\folder 1\\file1.vb"));
+
+            res = AcceptValue(_parser, "à get_Text() dans z:\\work\\folder 1\\file1.cpp: line 1");
+            Assert.That(res.Path, Is.EqualTo("z:\\work\\folder 1\\file1.cpp"));
+
+            // check it doesn't rely upon language at all
+
+            res = AcceptValue(_parser, "à get_Text() dans z:\\work\\folder 1\\file1:line 1");
+            Assert.That(res.Path, Is.EqualTo("z:\\work\\folder 1\\file1"));
+
+            // check it doesn't rely upon method or line number information
+
+            res = AcceptValue(_parser, "z:\\work\\folder\\file:");
+            Assert.That(res.Path, Is.EqualTo("z:\\work\\folder\\file"));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Inability_To_Parse_Non_Windows_Like_Path_Values()
+        {
+            // check it fails to parse Unix like path values
+            RejectValue(_parser, "à get_Text() dans /home/ihottier/work/file1:line1");
+
+            // check it fails to parse ill-formed windows path values
+            RejectValue(_parser, "à get_Text() dans C::line1");
+            RejectValue(_parser, "à get_Text() dans C: :line1");
+            RejectValue(_parser, "à get_Text() dans C:folder 1\\file1:line1");
+
+            // check it fails to parse missing path value
+            RejectValue(_parser, "à get_Text()");
+
+            return;
+        }
+    }
+}
diff --git a/src/GuiException/tests/TestDefaultTextManager.cs b/src/GuiException/tests/TestDefaultTextManager.cs
new file mode 100644
index 0000000..92cb81a
--- /dev/null
+++ b/src/GuiException/tests/TestDefaultTextManager.cs
@@ -0,0 +1,87 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using NUnit.UiException;
+
+namespace NUnit.UiException.Tests
+{
+    [TestFixture]
+    public class TestDefaultTextManager
+    {
+        private DefaultTextManager _textBlocks;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _textBlocks = new DefaultTextManager();            
+        }       
+
+        [Test]
+        public void Test_Default()
+        {
+            Assert.That(_textBlocks.Text, Is.EqualTo(""));
+            Assert.That(_textBlocks.LineCount, Is.EqualTo(0));
+            Assert.That(_textBlocks.MaxLength, Is.EqualTo(0));
+
+            return;
+        }
+
+        [Test]
+        public void Test_CodeBlockCollection()
+        {
+            List<string> lst;
+
+            Assert.That(_textBlocks.LineCount, Is.EqualTo(0));
+
+            _textBlocks.Text = "01\r\n02\r\n03\r\n";
+
+            Assert.That(_textBlocks.Text, Is.EqualTo("01\r\n02\r\n03\r\n"));
+            Assert.That(_textBlocks.LineCount, Is.EqualTo(3));
+            Assert.That(_textBlocks.GetTextAt(0), Is.EqualTo("01"));
+            Assert.That(_textBlocks.GetTextAt(1), Is.EqualTo("02"));
+            Assert.That(_textBlocks.GetTextAt(2), Is.EqualTo("03"));
+
+            _textBlocks.Text = "01";
+            Assert.That(_textBlocks.LineCount, Is.EqualTo(1));
+            Assert.That(_textBlocks.GetTextAt(0), Is.EqualTo("01"));
+
+            _textBlocks.Text = "01\r\n02";
+            Assert.That(_textBlocks.LineCount, Is.EqualTo(2));
+            Assert.That(_textBlocks.GetTextAt(0), Is.EqualTo("01"));
+            Assert.That(_textBlocks.GetTextAt(1), Is.EqualTo("02"));
+
+            lst = new List<string>();
+            foreach (string line in _textBlocks)
+                lst.Add(line);
+            Assert.That(lst.Count, Is.EqualTo(2));
+            Assert.That(lst[0], Is.EqualTo(_textBlocks.GetTextAt(0)));
+            Assert.That(lst[1], Is.EqualTo(_textBlocks.GetTextAt(1)));
+
+            _textBlocks.Text = null;
+            Assert.That(_textBlocks.Text, Is.EqualTo(""));            
+
+            return;
+        }
+
+        [Test]
+        public void Test_MaxLength()
+        {
+            _textBlocks.Text = null;
+            Assert.That(_textBlocks.MaxLength, Is.EqualTo(0));
+
+            _textBlocks.Text = "a\r\nabc\r\nab";
+            Assert.That(_textBlocks.MaxLength, Is.EqualTo(3));
+
+            _textBlocks.Text = "a\r\nab\r\nabc";
+            Assert.That(_textBlocks.MaxLength, Is.EqualTo(3));
+
+            return;
+        }
+    }
+}
diff --git a/src/GuiException/tests/TestExceptionItem.cs b/src/GuiException/tests/TestExceptionItem.cs
new file mode 100644
index 0000000..aaab7a5
--- /dev/null
+++ b/src/GuiException/tests/TestExceptionItem.cs
@@ -0,0 +1,189 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using NUnit.UiException;
+using NUnit.UiException.Tests.data;
+using System.IO;
+
+namespace NUnit.UiException.Tests
+{
+    [TestFixture]
+    public class TestErrorItem
+    {
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException),
+            ExpectedMessage = "path",
+            MatchType = MessageMatch.Contains)]
+        public void Ctor_Throws_NullPathException()
+        {
+           new ErrorItem(null, 1); // throws exception
+        }
+
+        [Test]        
+        public void Ctor_With_Line_0()
+        {
+            new ErrorItem("file.txt", 0);
+        }
+
+        [Test]
+        public void Ctor_2()
+        {
+            ErrorItem item;
+            
+            item = new ErrorItem("Test.cs", "myFunction()", 1);
+
+            Assert.That(item.Path, Is.EqualTo("Test.cs"));
+            Assert.That(item.FullyQualifiedMethodName, Is.EqualTo("myFunction()"));            
+            Assert.That(item.LineNumber, Is.EqualTo(1));
+            Assert.That(item.HasSourceAttachment, Is.True);
+            Assert.That(item.FileExtension, Is.EqualTo("cs"));
+
+            item = new ErrorItem(null, "myFunction()", 1);
+            Assert.That(item.Path, Is.Null);
+            Assert.That(item.FileExtension, Is.Null);
+            Assert.That(item.FullyQualifiedMethodName, Is.EqualTo("myFunction()"));
+            Assert.That(item.LineNumber, Is.EqualTo(1));
+            Assert.That(item.HasSourceAttachment, Is.False);
+
+            return;
+        }
+
+        [Test]
+        public void Test_MethodName()
+        {
+            ErrorItem item;
+
+            // test to pass
+
+            item = new ErrorItem("path", "namespace1.class.fullMethodName(string arg)", 1);
+            Assert.That(item.MethodName, Is.EqualTo("fullMethodName(string arg)"));
+            Assert.That(item.BaseMethodName, Is.EqualTo("fullMethodName"));
+            Assert.That(item.ClassName, Is.EqualTo("class"));
+
+            item = new ErrorItem("path", ".class.fullMethodName(string arg)", 1);
+            Assert.That(item.MethodName, Is.EqualTo("fullMethodName(string arg)"));
+            Assert.That(item.BaseMethodName, Is.EqualTo("fullMethodName"));
+            Assert.That(item.ClassName, Is.EqualTo("class"));
+
+            item = new ErrorItem("path", "0123456789012.a()", 1);
+            Assert.That(item.MethodName, Is.EqualTo("a()"));
+            Assert.That(item.BaseMethodName, Is.EqualTo("a"));
+            Assert.That(item.ClassName, Is.EqualTo("0123456789012"));                
+
+            // test to fail
+
+            item = new ErrorItem("path", "fullMethodName(string arg)", 1);
+            Assert.That(item.MethodName, Is.EqualTo("fullMethodName(string arg)"));
+            Assert.That(item.BaseMethodName, Is.EqualTo("fullMethodName"));
+            Assert.That(item.ClassName, Is.EqualTo(""));
+
+            item = new ErrorItem("path", "", 1);
+            Assert.That(item.MethodName, Is.EqualTo(""));
+            Assert.That(item.BaseMethodName, Is.EqualTo(""));
+            Assert.That(item.ClassName, Is.EqualTo(""));
+
+            return;
+        }
+
+        [Test]
+        public void Can_Set_Properties()
+        {
+            ErrorItem item;
+
+            item = new ErrorItem("/dir/file.txt", 13);
+
+            Assert.That(item.FileName, Is.EqualTo("file.txt"));
+            Assert.That(item.FileExtension, Is.EqualTo("txt"));
+            Assert.That(item.Path, Is.EqualTo("/dir/file.txt"));
+            Assert.That(item.LineNumber, Is.EqualTo(13));
+            Assert.That(item.HasSourceAttachment, Is.True);
+
+            item = new ErrorItem();
+            Assert.That(item.FileName, Is.Null);
+            Assert.That(item.FileExtension, Is.Null);
+            Assert.That(item.Path, Is.Null);
+            Assert.That(item.LineNumber, Is.EqualTo(0));
+            Assert.That(item.HasSourceAttachment, Is.False);
+
+            return;
+        }
+
+        [Test]
+        public void Test_FileExtension()
+        {
+            ErrorItem item;
+
+            item = new ErrorItem("C:\\dir\\file.cs", 1);
+            Assert.That(item.FileExtension, Is.EqualTo("cs"));
+
+            item = new ErrorItem("C:\\dir\\file.cpp", 1);
+            Assert.That(item.FileExtension, Is.EqualTo("cpp"));
+
+            item = new ErrorItem("C:\\dir\\file.cs.cpp.plop", 1);
+            Assert.That(item.FileExtension, Is.EqualTo("plop"));
+
+            item = new ErrorItem("C:\\dir\\file.", 1);
+            Assert.That(item.FileExtension, Is.Null);
+
+            item = new ErrorItem("C:\\dir\\file", 1);
+            Assert.That(item.FileExtension, Is.Null);
+
+            return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(FileNotFoundException),
+            ExpectedMessage = "unknown.txt",
+            MatchType = MessageMatch.Contains)]
+        public void ReadFile_Throws_FileNotExistException()
+        {
+            ErrorItem item = new ErrorItem("C:\\unknown\\unknown.txt", 1);
+            item.ReadFile(); // throws exception
+        }
+
+        [Test]
+        public void ReadFile()
+        {
+            ErrorItem item;
+
+            using (new TestResource("HelloWorld.txt"))
+            {
+                item = new ErrorItem("HelloWorld.txt", 1);
+
+                Assert.That(item.ReadFile(), Is.Not.Null);
+                Assert.That(item.ReadFile(), Is.EqualTo("Hello world!"));
+            }
+
+            return;
+        }        
+
+        [Test]
+        public void Test_Equals()
+        {
+            ErrorItem itemA;
+            ErrorItem itemB;
+            ErrorItem itemC;
+
+            itemA = new ErrorItem("file1.txt", 43);
+            itemB = new ErrorItem("file2.txt", 44);
+            itemC = new ErrorItem("file1.txt", "myFunction()", 43);
+
+            Assert.That(itemA.Equals(null), Is.False);
+            Assert.That(itemA.Equals("hello"), Is.False);
+            Assert.That(itemA.Equals(itemB), Is.False);
+            Assert.That(itemA.Equals(itemC), Is.False);
+            Assert.That(itemA.Equals(itemA), Is.True);
+            Assert.That(itemA.Equals(new ErrorItem("file", 43)), Is.False);
+            Assert.That(itemA.Equals(new ErrorItem("file1.txt", 42)), Is.False);
+            Assert.That(itemA.Equals(new ErrorItem("file1.txt", 43)), Is.True);
+
+            return;
+        }
+    }
+}
diff --git a/src/GuiException/tests/TestExceptionItemCollection.cs b/src/GuiException/tests/TestExceptionItemCollection.cs
new file mode 100644
index 0000000..4c09d21
--- /dev/null
+++ b/src/GuiException/tests/TestExceptionItemCollection.cs
@@ -0,0 +1,127 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.UiException;
+using NUnit.Framework;
+using NUnit.UiException.Tests.data;
+
+namespace NUnit.UiException.Tests
+{
+    [TestFixture]
+    public class TestErrorItemCollection
+    {
+        TestResource _resourceA;
+        TestResource _resourceB;
+
+        private ErrorItemCollection _items;
+        private ErrorItem _itemA;
+        private ErrorItem _itemB;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _items = new InternalTraceItemCollection();
+
+            _resourceA = new TestResource("HelloWorld.txt");
+            _resourceB = new TestResource("TextCode.txt");
+
+            _itemA = new ErrorItem(_resourceA.Path, 1);
+            _itemB = new ErrorItem(_resourceB.Path, 2);
+
+            return;
+        }
+
+        [TearDown]
+        public void TearDown()
+        {
+            if (_resourceA != null)
+            {
+                _resourceA.Dispose();
+                _resourceA = null;
+            }
+
+            if (_resourceB != null)
+            {
+                _resourceB.Dispose();
+                _resourceB = null;
+            }
+        }
+
+        [Test]
+        public void Test_TraceItems()
+        {
+            List<ErrorItem> lst;
+
+            Assert.That(_items.Count, Is.EqualTo(0));
+
+            _items.Add(_itemA);
+            _items.Add(_itemB);
+
+            Assert.That(_items.Count, Is.EqualTo(2));
+
+            Assert.That(_items[0], Is.EqualTo(_itemA));
+            Assert.That(_items[1], Is.EqualTo(_itemB));
+
+            lst = new List<ErrorItem>();
+            foreach (ErrorItem item in _items)
+                lst.Add(item);
+            Assert.That(lst.Count, Is.EqualTo(2));
+            Assert.That(lst[0], Is.EqualTo(_items[0]));
+            Assert.That(lst[1], Is.EqualTo(_items[1]));
+
+            return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException),
+            ExpectedMessage = "item",
+            MatchType = MessageMatch.Contains)]
+        public void Test_Add_Throws_NullItemException()
+        {
+            _items.Add(null); // throws exception
+        }
+
+        [Test]
+        public void Test_Clear()
+        {
+            _items.Add(_itemA);
+
+            Assert.That(_items.Count, Is.EqualTo(1));
+            _items.Clear();
+            Assert.That(_items.Count, Is.EqualTo(0));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Contains()
+        {
+            Assert.That(_items.Contains(null), Is.False);
+            Assert.That(_items.Contains(_itemA), Is.False);
+
+            _items.Add(_itemA);
+
+            Assert.That(_items.Contains(_itemA), Is.True);
+
+            return;
+        }
+
+        #region InternalTraceItemCollection
+
+        class InternalTraceItemCollection :
+            ErrorItemCollection
+        {
+            public InternalTraceItemCollection()
+            {
+                // nothing to do
+            }
+        }
+
+        #endregion
+    }
+}
diff --git a/src/GuiException/tests/TestPaintLineLocation.cs b/src/GuiException/tests/TestPaintLineLocation.cs
new file mode 100644
index 0000000..ea50d07
--- /dev/null
+++ b/src/GuiException/tests/TestPaintLineLocation.cs
@@ -0,0 +1,71 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using NUnit.UiException;
+using System.Drawing;
+using NUnit.UiException.Controls;
+
+namespace NUnit.UiException.Tests
+{
+    [TestFixture]
+    public class TestPaintLineLocation
+    {
+        private PaintLineLocation _line;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _line = new PaintLineLocation(42, "hello world!", new PointF(13, 42));
+        }
+
+        [Test]
+        public void Test_PaintLineLocation()
+        {
+            Assert.That(_line.LineIndex, Is.EqualTo(42));
+            Assert.That(_line.Text, Is.EqualTo("hello world!"));
+            Assert.That(_line.Location, Is.EqualTo(new PointF(13, 42)));
+
+            return;
+        }       
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException),
+            ExpectedMessage = "text",
+            MatchType = MessageMatch.Contains)]
+        public void Test_SetText_Throws_NullTextException()
+        {
+            new PaintLineLocation(0, null, new PointF(0, 0)); // throws exception
+        }
+
+        [Test]
+        public void Test_Equals()
+        {
+            Assert.That(_line.Equals(null), Is.False);
+            Assert.That(_line.Equals("hello"), Is.False);
+            Assert.That(_line.Equals(new PaintLineLocation(0, "", new PointF(0, 0))), Is.False);
+
+            Assert.That(
+                _line.Equals(new PaintLineLocation(_line.LineIndex, _line.Text, new PointF(0, 0))),
+                Is.False);
+            Assert.That(
+                _line.Equals(new PaintLineLocation(_line.LineIndex, "", _line.Location)),
+                Is.False);
+            Assert.That(
+                _line.Equals(new PaintLineLocation(0, _line.Text, _line.Location)),
+                Is.False);
+
+            Assert.That(_line.Equals(_line), Is.True);
+            Assert.That(_line.Equals(
+                new PaintLineLocation(_line.LineIndex, _line.Text, _line.Location)),
+                Is.True);
+
+            return;
+        }
+    }
+}
diff --git a/src/GuiException/tests/TestStackTraceParser.cs b/src/GuiException/tests/TestStackTraceParser.cs
new file mode 100644
index 0000000..b36dfa7
--- /dev/null
+++ b/src/GuiException/tests/TestStackTraceParser.cs
@@ -0,0 +1,265 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using NUnit.UiException;
+
+namespace NUnit.UiException.Tests
+{
+    [TestFixture]
+    public class TestStackTraceParser
+    {
+        private StackTraceParser _parser;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _parser = new StackTraceParser();
+
+            return;
+        }
+
+        [Test]
+        public void Test_Default()
+        {
+            Assert.That(_parser.Items, Is.Not.Null);
+            Assert.That(_parser.Items.Count, Is.EqualTo(0));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Parse()
+        {
+            _parser.Parse("à NUnit.UiException.TraceItem.get_Text() dans C:\\TraceItem.cs:ligne 43");
+
+            Assert.That(_parser.Items.Count, Is.EqualTo(1));
+            Assert.That(_parser.Items[0], 
+                Is.EqualTo(new ErrorItem("C:\\TraceItem.cs", "NUnit.UiException.TraceItem.get_Text()", 43)));
+
+            // TryParse should clear previous textFormatter
+
+            _parser.Parse("");
+            Assert.That(_parser.Items.Count, Is.EqualTo(0));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Parse_MultipleExtension()
+        {
+            _parser.Parse("à get_Text() dans C:\\TraceItem.cs.cs.cs.cs:ligne 43");
+            Assert.That(_parser.Items.Count, Is.EqualTo(1));
+            Assert.That(_parser.Items[0].Path, Is.EqualTo("C:\\TraceItem.cs.cs.cs.cs"));
+
+            _parser.Parse("à get_Text() dans C:\\my Document1\\my document2 containing space\\file.cs:line 1");
+            Assert.That(_parser.Items.Count, Is.EqualTo(1));
+            Assert.That(_parser.Items[0].Path,
+                Is.EqualTo("C:\\my Document1\\my document2 containing space\\file.cs"));
+
+            _parser.Parse("à get_Text() dans C:\\my doc\\my doc2.cs\\file.cs:line 1");
+            Assert.That(_parser.Items.Count, Is.EqualTo(1));
+            Assert.That(_parser.Items[0].Path,
+                Is.EqualTo("C:\\my doc\\my doc2.cs\\file.cs"));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Parse_With_Real_Life_Samples()
+        {
+            // test ability to extract one trace
+
+            _parser.Parse(
+                "à Test.TestTraceItem.Can_Set_Properties() dans " +
+                "C:\\Documents and Settings\\ihottier\\Mes documents\\" +
+                "NUnit_Stacktrace\\Test\\TestTraceItem.cs:ligne 42\r\n");
+
+            Assert.That(_parser.Items.Count, Is.EqualTo(1));
+            Assert.That(_parser.Items[0],
+                Is.EqualTo(new ErrorItem(
+                    "C:\\Documents and Settings\\ihottier\\Mes documents\\" +
+                    "NUnit_Stacktrace\\Test\\TestTraceItem.cs",
+                    "Test.TestTraceItem.Can_Set_Properties()",
+                    42)));
+
+            // test ability to extract two traces
+
+            _parser.Parse(
+                "à NUnit.UiException.TraceItem.get_Text() " +
+                "dans C:\\Documents and Settings\\ihottier\\Mes documents\\" +
+                "NUnit.UiException\\TraceItem.cs:ligne 43\r\n" +
+                "à Test.TestTaggedText.SetUp() dans C:\\Documents and Settings\\" +
+                "ihottier\\Mes documents\\NUnit_Stacktrace\\Test\\TestTaggedText.cs:ligne 30\r\n");
+
+            Assert.That(_parser.Items.Count, Is.EqualTo(2));
+
+            Assert.That(_parser.Items[0],
+                Is.EqualTo(
+                new ErrorItem(
+                    "C:\\Documents and Settings\\ihottier\\Mes documents\\" +
+                    "NUnit.UiException\\TraceItem.cs",
+                    "NUnit.UiException.TraceItem.get_Text()",
+                    43)));
+
+            Assert.That(_parser.Items[1],
+                Is.EqualTo(
+                new ErrorItem(
+                    "C:\\Documents and Settings\\" +
+                    "ihottier\\Mes documents\\NUnit_Stacktrace\\Test\\TestTaggedText.cs",
+                    "Test.TestTaggedText.SetUp()",
+                    30)));
+
+            return;
+        }        
+
+        [Test]
+        public void Test_Trace_When_Missing_File()
+        {
+            //
+            // NUnit.UiException.Tests ability to not be confused
+            // if source code attachment is missing
+            //
+
+            _parser.Parse(
+                "à System.String.InternalSubStringWithChecks(Int32 startIndex, Int32 length, Boolean fAlwaysCopy)\r\n" +
+                "à NUnit.UiException.StackTraceParser.Parse(String stackTrace) dans C:\\StackTraceParser.cs:ligne 55\r\n" +
+                "à Test.TestStackTraceParser.Test_Parse() dans C:\\TestStackTraceParser.cs:ligne 36\r\n"
+                );
+
+            Assert.That(_parser.Items.Count, Is.EqualTo(3));
+
+            Assert.That(_parser.Items[0].HasSourceAttachment, Is.False);
+            Assert.That(_parser.Items[0].FullyQualifiedMethodName,
+                Is.EqualTo("System.String.InternalSubStringWithChecks(Int32 startIndex, Int32 length, Boolean fAlwaysCopy)"));
+
+            Assert.That(_parser.Items[1], 
+                Is.EqualTo(
+                    new ErrorItem(
+                        "C:\\StackTraceParser.cs",
+                        "NUnit.UiException.StackTraceParser.Parse(String stackTrace)",
+                        55)));
+            Assert.That(_parser.Items[2],
+                Is.EqualTo(
+                    new ErrorItem(
+                        "C:\\TestStackTraceParser.cs",
+                        "Test.TestStackTraceParser.Test_Parse()",
+                        36)));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Missing_Line_Number()
+        {
+            //
+            // NUnit.UiException.Tests ability to not be confused
+            // if line number is missing
+            //
+
+            _parser.Parse("à Test.TestStackTraceParser.Test_Parse() dans C:\\TestStackTraceParser.cs:\r\n");
+
+            Assert.That(_parser.Items.Count, Is.EqualTo(1));
+            Assert.That(_parser.Items[0], 
+                Is.EqualTo(new ErrorItem(
+                    "C:\\TestStackTraceParser.cs", 
+                    "Test.TestStackTraceParser.Test_Parse()",
+                    0)));
+
+            return;
+        }
+
+        [Test]
+        public void Test_English_Stack()
+        {
+            //
+            // NUnit.UiException.Tests ability of the parser to not depend
+            // of the language
+            //
+
+            _parser.Parse("at Test.TestStackTraceParser.Test_Parse() in C:\\TestStackTraceParser.cs:line 36\r\n");
+
+            Assert.That(_parser.Items.Count, Is.EqualTo(1));
+            Assert.That(_parser.Items[0], Is.EqualTo(
+                new ErrorItem("C:\\TestStackTraceParser.cs", 
+                    "Test.TestStackTraceParser.Test_Parse()", 36)));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Ability_To_Handle_Different_Path_System_Syntaxes()
+        {
+            //
+            // NUnit.UiException.Tests ability to not depend of one file system
+            //
+
+            // here, an hypothetic stack containing UNIX and Windows like path values...
+           
+            _parser.Parse(
+                "at Test.TestStackTraceParser.Test_Parse() in /home/ihottier/work/stacktrace/test/TestStackTraceParser.cs:line 36\r\n" +
+                "at Test.TestStackTraceParser2.Text_Parse2() in C:\\folder\\file1:line 42"
+                );
+
+            Assert.That(_parser.Items.Count, Is.EqualTo(2));
+            Assert.That(_parser.Items[0], Is.EqualTo(
+                new ErrorItem(
+                    "/home/ihottier/work/stacktrace/test/TestStackTraceParser.cs",
+                    "Test.TestStackTraceParser.Test_Parse()",
+                    36)));
+            Assert.That(_parser.Items[1], Is.EqualTo(
+                new ErrorItem(
+                    "C:\\folder\\file1",
+                    "Test.TestStackTraceParser2.Text_Parse2()",
+                    42)));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Ability_To_Handle_Files_With_Unknown_Extension()
+        {
+            _parser.Parse("à Test.TestStackTraceParser.Test_Parse() in C:\\TestStackTraceParser.vb:line 36");
+
+            Assert.That(_parser.Items.Count, Is.EqualTo(1));
+            Assert.That(_parser.Items[0], Is.EqualTo(
+                new ErrorItem(
+                    "C:\\TestStackTraceParser.vb",
+                    "Test.TestStackTraceParser.Test_Parse()",
+                    36)));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Analysis_Does_Not_Depend_Upon_File_Extension()
+        {
+            //
+            // NUnit.UiException.Tests that Stack Analyzer should not
+            // be not aware of file language.
+            //
+
+            _parser.Parse("à Test.TestStackTraceParser.Test_Parse() in C:\\TestStackTraceParser.vb:line 36");
+
+            Assert.That(_parser.Items.Count, Is.EqualTo(1));
+            Assert.That(_parser.Items[0], Is.EqualTo(
+                new ErrorItem(
+                    "C:\\TestStackTraceParser.vb",
+                    "Test.TestStackTraceParser.Test_Parse()",
+                    36)));
+
+            return;
+        }
+               
+        [Test]
+        public void Test_Parse_Null()
+        {
+            _parser.Parse(null);
+        }
+    }
+}
diff --git a/src/GuiException/tests/data/Basic.cs b/src/GuiException/tests/data/Basic.cs
new file mode 100644
index 0000000..21ede19
--- /dev/null
+++ b/src/GuiException/tests/data/Basic.cs
@@ -0,0 +1,4 @@
+namespace Demo.data
+{
+    class Basic { }
+}
diff --git a/src/GuiException/tests/data/HelloWorld.txt b/src/GuiException/tests/data/HelloWorld.txt
new file mode 100644
index 0000000..d2d010c
--- /dev/null
+++ b/src/GuiException/tests/data/HelloWorld.txt
@@ -0,0 +1 @@
+Hello world!
\ No newline at end of file
diff --git a/src/GuiException/tests/data/TestResource.cs b/src/GuiException/tests/data/TestResource.cs
new file mode 100644
index 0000000..817352d
--- /dev/null
+++ b/src/GuiException/tests/data/TestResource.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace NUnit.UiException.Tests.data
+{
+    public class TestResource : NUnit.TestUtilities.TempResourceFile
+    {
+        public TestResource(string name) 
+            : base(typeof( TestResource ), name) 
+        {
+        }
+    }
+}
diff --git a/src/GuiException/tests/data/TextCode.txt b/src/GuiException/tests/data/TextCode.txt
new file mode 100644
index 0000000..2a47a45
--- /dev/null
+++ b/src/GuiException/tests/data/TextCode.txt
@@ -0,0 +1,59 @@
+01	#include <stdio.h>
+02	#include <stdlib.h>
+03	#include <string.h>
+04	#include <ctype.h>
+05	#include <time.h>
+06	#include <sys/types.h>
+07	#include <sys/stat.h>
+08
+09	/* logic */
+10	#ifndef TRUE
+11	# define TRUE 1
+12	#endif /* TRUE */
+13	#ifndef FALSE
+14	# define FALSE 0
+15	#endif /* FALSE */
+16	#define EOF_OK TRUE
+17	#define EOF_NOT_OK FALSE
+18
+19	/* global limits */
+20	#define RULE_YEAR 2004		/* NOTE: should match the current year */
+21	#define START_DATE "07Jan2004 00:00 UTC" /* first confirmation received */
+22	#define MAX_COL 79		/* max column a line should hit */
+23	#define MAX_BUILD_SIZE 521	/* max how to build size */
+24	#define MAX_PROGRAM_SIZE 4096	/* max program source size */
+25	#define MAX_PROGRAM_SIZE2 2048	/* max program source size not counting
+26					   whitespace and {}; not followed by
+27					   whitespace or EOF */
+28	#define MAX_TITLE_LEN 31	/* max chars in the title */
+29	#define MAX_ENTRY_LEN 1		/* max length in the entry input line */
+30	#define MAX_ENTRY 8		/* max number of entries per person per year */
+31	#define MAX_FILE_LEN 1024	/* max filename length for a info file */
+32
+33	/* where to send entries */
+34	#define ENTRY_USER "e.2004"
+35	#define ENTRY_HOST "ioccc.org"
+36
+37	/* uuencode process - assumes ASCII */
+38	#define UUENCODE(c) ((c) ? encode_str[(int)(c)&0x3f] : '`')
+39	#define UUENCODE_LEN 45		/* max uuencode chunk size */
+40	#define UUINFO_MODE 0444	/* mode of an info file's uuencode file */
+41	#define UUBUILD_MODE 0444	/* mode of the build file's uuencode file */
+42	#define UUBUILD_NAME "build"	/* name for the build file's uuencode file */
+43	#define UUPROG_MODE 0444	/* mode of the program's uuencode file */
+44	#define UUPROG_NAME "prog.c"	/* name for the program's uuencode file */
+45
+46	/* encode_str[(char)val] is the uuencoded character of val */
+47	char encode_str[] = "`!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_";
+48
+49	/* global declarations */
+50	char *program;			/* our name */
+51	long start_time;		/* the startup time */
+52
+53	/* forward declarations */
+54	void parse_args(int argc, char **argv, char **rname,
+55				char **bname, char **pname, char **oname);
+56	void usage(int exitval);
+57	FILE *open_remark(char *filename);
+58	FILE *open_build(char *filename);
+59	FILE *open_program(char *filename);
\ No newline at end of file
diff --git a/src/GuiException/tests/nunit.uiexception.tests.build b/src/GuiException/tests/nunit.uiexception.tests.build
new file mode 100644
index 0000000..557bc51
--- /dev/null
+++ b/src/GuiException/tests/nunit.uiexception.tests.build
@@ -0,0 +1,81 @@
+<?xml version="1.0"?>
+<project name="NUnit.UiException.Tests" default="build" basedir=".">
+
+  <patternset id="source-files">
+    <include name="CodeFormatters/TestGeneralCodeFormatter.cs"/>
+    <include name="CodeFormatters/TestCodeFormatterCollection.cs"/>
+    <include name="CodeFormatters/TestPlainTextCodeFormatter.cs"/>
+    <include name="Controls/TestCodeBox.cs"/>
+    <include name="Controls/TestCodeRenderingContext.cs"/>
+    <include name="Controls/TestDefaultCodeRenderer.cs"/>
+    <include name="Controls/TestDefaultErrorListRenderer.cs"/>
+    <include name="Controls/TestErrorBrowser.cs"/>
+    <include name="Controls/TestErrorList.cs"/>
+    <include name="Controls/TestErrorPanelLayout.cs"/>
+    <include name="Controls/TestErrorToolbar.cs"/>
+    <include name="Controls/TestSourceCodeDisplay.cs"/>
+    <include name="Controls/TestSplitterBox.cs"/>
+    <include name="Controls/TestStackTraceDisplay.cs"/>
+    <include name="CSharpParser/TestCSCode.cs"/>
+    <include name="CSharpParser/TestCSParser.cs"/>
+    <include name="CSharpParser/TestLexer.cs"/>
+    <include name="CSharpParser/TestToken.cs"/>
+    <include name="CSharpParser/TestTokenClassifier.cs"/>
+    <include name="CSharpParser/TestTokenDictionary.cs"/>
+    <include name="data/TestResource.cs"/>
+    <include name="StackTraceAnalysers/TestFunctionParser.cs"/>
+    <include name="StackTraceAnalysers/TestIErrorParser.cs"/>
+    <include name="StackTraceAnalysers/TestLineNumberParser.cs"/>
+    <include name="StackTraceAnalysers/TestPathParser.cs"/>
+    <include name="StackTraceAnalysers/TestUnixPathParser.cs"/>
+    <include name="StackTraceAnalysers/TestWindowsPathParser.cs"/>
+    <include name="MockHelper.cs"/>
+    <include name="TestDefaultTextManager.cs"/>
+    <include name="TestExceptionItem.cs"/>
+    <include name="TestExceptionItemCollection.cs"/>
+    <include name="TestPaintLineLocation.cs"/>
+    <include name="TestStackTraceParser.cs"/>
+  </patternset>
+
+  <patternset id="resource-files">
+    <include name="data/HelloWorld.txt"/>
+    <include name="data/TextCode.txt"/>
+    <include name="data/Basic.cs"/>
+  </patternset>
+
+  <target name="build">
+    <csc target="library" 
+        output="${current.test.dir}/nunit.uiexception.tests.dll" 
+        debug="${build.debug}" define="${build.defines}"
+        if="${runtime.version >= '2.0'}">
+      <sources>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
+      </sources>
+      <resources prefix="NUnit.UiException.Tests.data">
+        <patternset refid="resource-files"/>
+      </resources>
+      <references>
+        <include name="System.dll"/>
+        <include name="System.Drawing.dll"/>
+        <include name="System.Windows.Forms.dll"/>
+        <include name="${current.framework.dir}/nunit.framework.dll"/>
+        <include name="${current.framework.dir}/nunit.mocks.dll"/>
+        <include name="${current.lib.dir}/nunit.uiexception.dll"/>
+        <include name="${current.test.dir}/test-utilities.dll"/>
+      </references>
+    </csc>
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/GuiException/tests">
+      <fileset>
+        <patternset refid="source-files"/>
+        <patternset refid="resource-files"/>
+        <include name="nunit.uiexception.tests.csproj"/>
+        <include name="nunit.uiexception.tests.build"/>
+      </fileset>
+    </copy>
+  </target>
+
+</project>
\ No newline at end of file
diff --git a/src/GuiException/tests/nunit.uiexception.tests.csproj b/src/GuiException/tests/nunit.uiexception.tests.csproj
new file mode 100644
index 0000000..0997e40
--- /dev/null
+++ b/src/GuiException/tests/nunit.uiexception.tests.csproj
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{092486D0-6AB9-4134-932F-0FDA10704455}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.UiException.Tests</RootNamespace>
+    <AssemblyName>nunit.uiexception.tests</AssemblyName>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\bin\Release\tests\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
+      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
+      <Name>nunit.framework.dll</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitMocks\mocks\nunit.mocks.csproj">
+      <Project>{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}</Project>
+      <Name>nunit.mocks</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\tests\test-utilities\test-utilities.csproj">
+      <Project>{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}</Project>
+      <Name>test-utilities</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\UiException\nunit.uiexception.dll.csproj">
+      <Project>{3E87A106-EB20-4147-84C8-95B0BB43A1D4}</Project>
+      <Name>nunit.uiexception.dll</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="CodeFormatters\TestCodeFormatterCollection.cs" />
+    <Compile Include="CodeFormatters\TestGeneralCodeFormatter.cs" />
+    <Compile Include="CodeFormatters\TestPlainTextCodeFormatter.cs" />
+    <Compile Include="Controls\TestCodeBox.cs" />
+    <Compile Include="Controls\TestCodeRenderingContext.cs" />
+    <Compile Include="Controls\TestDefaultCodeRenderer.cs" />
+    <Compile Include="Controls\TestDefaultErrorListRenderer.cs" />
+    <Compile Include="Controls\TestErrorBrowser.cs" />
+    <Compile Include="Controls\TestErrorList.cs" />
+    <Compile Include="Controls\TestErrorPanelLayout.cs" />
+    <Compile Include="Controls\TestErrorToolbar.cs" />
+    <Compile Include="Controls\TestSourceCodeDisplay.cs" />
+    <Compile Include="Controls\TestSplitterBox.cs" />
+    <Compile Include="Controls\TestStackTraceDisplay.cs" />
+    <Compile Include="CSharpParser\TestCSCode.cs" />
+    <Compile Include="CSharpParser\TestCSParser.cs" />
+    <Compile Include="CSharpParser\TestLexer.cs" />
+    <Compile Include="CSharpParser\TestToken.cs" />
+    <Compile Include="CSharpParser\TestTokenClassifier.cs" />
+    <Compile Include="CSharpParser\TestTokenDictionary.cs" />
+    <EmbeddedResource Include="data\Basic.cs" />
+    <Compile Include="data\TestResource.cs" />
+    <Compile Include="MockHelper.cs" />
+    <Compile Include="StackTraceAnalysers\TestFunctionParser.cs" />
+    <Compile Include="StackTraceAnalysers\TestIErrorParser.cs" />
+    <Compile Include="StackTraceAnalysers\TestLineNumberParser.cs" />
+    <Compile Include="StackTraceAnalysers\TestPathParser.cs" />
+    <Compile Include="StackTraceAnalysers\TestUnixPathParser.cs" />
+    <Compile Include="StackTraceAnalysers\TestWindowsPathParser.cs" />
+    <Compile Include="TestDefaultTextManager.cs" />
+    <Compile Include="TestExceptionItem.cs" />
+    <Compile Include="TestExceptionItemCollection.cs" />
+    <Compile Include="TestPaintLineLocation.cs" />
+    <Compile Include="TestStackTraceParser.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="data\HelloWorld.txt" />
+    <EmbeddedResource Include="data\TextCode.txt" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit.uiexception.tests.build" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
diff --git a/src/GuiRunner/nunit-gui-exe/App.config b/src/GuiRunner/nunit-gui-exe/App.config
index f6fa622..6c0320e 100644
--- a/src/GuiRunner/nunit-gui-exe/App.config
+++ b/src/GuiRunner/nunit-gui-exe/App.config
@@ -1,22 +1,10 @@
-<?xml version="1.0" encoding="Windows-1252"?>
+<?xml version="1.0" encoding="utf-8"?>
 <configuration>
-
-    <!-- Do not remove. Sets up configsectionhandler section for log4net -->
-    <configSections>
-        <section name="log4net" type="System.Configuration.IgnoreSectionHandler" />
-    </configSections>
-
-    <!--
+  <!--
      Application settings for NUnit-gui.exe. Do NOT put settings
 	 for use by your tests here.
 	-->
- <appSettings>
-
-	<!--	
-	 Specify the location to be used by .NET for the cache 
-	-->
-    <add key="shadowfiles.path" value="%temp%\nunit20\ShadowCopyCache" />
-    
+  <appSettings>
     <!--
      Uncomment to specify the url to be used for help. If not used, the
      default value is something like
@@ -24,98 +12,72 @@
 	 This setting is provided in case your default browser doesn't
 	 support this format.
 	-->
-	<!-- <add key="helpUrl" value="http://www.nunit.org" /> -->
-
+    <!-- <add key="helpUrl" value="http://www.nunit.org" /> -->
   </appSettings>
-  
 
-    <!-- 
-     The startup section may be used to specify the runtime versions 
-     supported in the order that they will be used if more than one
-     is present. As supplied, this section is commented out, which
-     causes nunit-console to use the version of the framework with
-     which it was built.
-	 
-	 Since .NET 1.0 does not recognize the <supportedRuntime> elements,
-	 a <requiredRuntime> element is used in case it is the only version
-	 of the framework that is installed.
-    -->
-    <!--
-  <startup>
-	  <supportedRuntime version="v2.0.50727" />
-	  <supportedRuntime version="v2.0.50215" />
-	  <supportedRuntime version="v2.0.40607" />
-	  <supportedRuntime version="v1.1.4322" />
-	  <supportedRuntime version="v1.0.3705" />
-	
-	  <requiredRuntime version="v1.0.3705" />
+  <runtime>
+    <!-- We need this so test exceptions don't crash NUnit -->
+    <legacyUnhandledExceptionPolicy enabled="1" />
 
-  </startup>
-	-->
+    <!-- Look for addins in the addins directory for now -->
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+      <probing privatePath="lib;addins" />
+    </assemblyBinding>
 
-   <!--
-    The following <runtime> section allows running nunit under 
+    <!--
+    The following <assemblyBinding> section allows running nunit under 
     .NET 1.0 by redirecting assemblies. The appliesTo attribute
     causes the section to be ignored except under .NET 1.0
     on a machine with only the .NET version 1.0 runtime installed.
     If application and its tests were built for .NET 1.1 you will
-    also need to redirect system assemblies in the test config file
-    just as we do for nunit.tests.dll.
+    also need to redirect system assemblies in the test config file,
+    which controls loading of the tests.
    -->
-  
- <runtime>
-
-   <legacyUnhandledExceptionPolicy enabled="1" />
-
-   <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
-      <probing privatePath="addins"/>
-   </assemblyBinding>
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
+       appliesTo="v1.0.3705">
 
-   <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
-			appliesTo="v1.0.3705">
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System" 
-                          publicKeyToken="b77a5c561934e089" 
+      <dependentAssembly>
+        <assemblyIdentity name="System"
+                          publicKeyToken="b77a5c561934e089"
                           culture="neutral"/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
+        <bindingRedirect  oldVersion="1.0.5000.0"
                           newVersion="1.0.3300.0"/>
       </dependentAssembly>
 
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Data" 
-                          publicKeyToken="b77a5c561934e089" 
+      <dependentAssembly>
+        <assemblyIdentity name="System.Data"
+                          publicKeyToken="b77a5c561934e089"
                           culture="neutral"/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
+        <bindingRedirect  oldVersion="1.0.5000.0"
                           newVersion="1.0.3300.0"/>
       </dependentAssembly>
 
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Drawing" 
-                          publicKeyToken="b03f5f7f11d50a3a" 
+      <dependentAssembly>
+        <assemblyIdentity name="System.Drawing"
+                          publicKeyToken="b03f5f7f11d50a3a"
                           culture="neutral"/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
+        <bindingRedirect  oldVersion="1.0.5000.0"
                           newVersion="1.0.3300.0"/>
       </dependentAssembly>
 
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Windows.Forms" 
-                          publicKeyToken="b77a5c561934e089" 
+      <dependentAssembly>
+        <assemblyIdentity name="System.Windows.Forms"
+                          publicKeyToken="b77a5c561934e089"
                           culture="neutral"/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
+        <bindingRedirect  oldVersion="1.0.5000.0"
                           newVersion="1.0.3300.0"/>
       </dependentAssembly>
 
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Xml" 
-                          publicKeyToken="b77a5c561934e089" 
+      <dependentAssembly>
+        <assemblyIdentity name="System.Xml"
+                          publicKeyToken="b77a5c561934e089"
                           culture="neutral"/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
+        <bindingRedirect  oldVersion="1.0.5000.0"
                           newVersion="1.0.3300.0"/>
       </dependentAssembly>
 
     </assemblyBinding>
-  
+
   </runtime>
-  
+
 </configuration>
\ No newline at end of file
diff --git a/src/GuiRunner/nunit-gui-exe/assemblyinfo.cs b/src/GuiRunner/nunit-gui-exe/AssemblyInfo.cs
similarity index 100%
rename from src/GuiRunner/nunit-gui-exe/assemblyinfo.cs
rename to src/GuiRunner/nunit-gui-exe/AssemblyInfo.cs
diff --git a/src/GuiRunner/nunit-gui-exe/Class1.cs b/src/GuiRunner/nunit-gui-exe/Class1.cs
index 6e454cf..88576c5 100644
--- a/src/GuiRunner/nunit-gui-exe/Class1.cs
+++ b/src/GuiRunner/nunit-gui-exe/Class1.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 
diff --git a/src/GuiRunner/nunit-gui-exe/Ship.config b/src/GuiRunner/nunit-gui-exe/Ship.config
new file mode 100644
index 0000000..6c0320e
--- /dev/null
+++ b/src/GuiRunner/nunit-gui-exe/Ship.config
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+  <!--
+     Application settings for NUnit-gui.exe. Do NOT put settings
+	 for use by your tests here.
+	-->
+  <appSettings>
+    <!--
+     Uncomment to specify the url to be used for help. If not used, the
+     default value is something like
+		file://localhost/C:/Program Files/NUnit 2.2/doc/index.html
+	 This setting is provided in case your default browser doesn't
+	 support this format.
+	-->
+    <!-- <add key="helpUrl" value="http://www.nunit.org" /> -->
+  </appSettings>
+
+  <runtime>
+    <!-- We need this so test exceptions don't crash NUnit -->
+    <legacyUnhandledExceptionPolicy enabled="1" />
+
+    <!-- Look for addins in the addins directory for now -->
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+      <probing privatePath="lib;addins" />
+    </assemblyBinding>
+
+    <!--
+    The following <assemblyBinding> section allows running nunit under 
+    .NET 1.0 by redirecting assemblies. The appliesTo attribute
+    causes the section to be ignored except under .NET 1.0
+    on a machine with only the .NET version 1.0 runtime installed.
+    If application and its tests were built for .NET 1.1 you will
+    also need to redirect system assemblies in the test config file,
+    which controls loading of the tests.
+   -->
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
+       appliesTo="v1.0.3705">
+
+      <dependentAssembly>
+        <assemblyIdentity name="System"
+                          publicKeyToken="b77a5c561934e089"
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0"
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly>
+        <assemblyIdentity name="System.Data"
+                          publicKeyToken="b77a5c561934e089"
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0"
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly>
+        <assemblyIdentity name="System.Drawing"
+                          publicKeyToken="b03f5f7f11d50a3a"
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0"
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly>
+        <assemblyIdentity name="System.Windows.Forms"
+                          publicKeyToken="b77a5c561934e089"
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0"
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly>
+        <assemblyIdentity name="System.Xml"
+                          publicKeyToken="b77a5c561934e089"
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0"
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+    </assemblyBinding>
+
+  </runtime>
+
+</configuration>
\ No newline at end of file
diff --git a/src/GuiRunner/nunit-gui-exe/nunit-gui.exe.build b/src/GuiRunner/nunit-gui-exe/nunit-gui.exe.build
index ebefe59..26bb3fd 100644
--- a/src/GuiRunner/nunit-gui-exe/nunit-gui.exe.build
+++ b/src/GuiRunner/nunit-gui-exe/nunit-gui.exe.build
@@ -1,46 +1,58 @@
 <?xml version="1.0"?>
 <project name="NUnitGuiExe" default="build" basedir=".">
 
+  <patternset id="source-files">
+        <include name="AssemblyInfo.cs"/>
+        <include name="Class1.cs"/>
+  </patternset>
+
   <target name="build">
     <csc target="winexe" 
-        output="${current.build.dir}/${nunit.gui.name}" 
+        output="${current.build.dir}/nunit.exe" 
         win32icon="App.ico" debug="${build.debug}"
         define="${build.defines}">
       <sources>
-        <include name="AssemblyInfo.cs"/>
-        <include name="Class1.cs"/>
-        <include name="../../CommonAssemblyInfo.cs"/>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
       </sources>
-      <references basedir="${current.build.dir}">
+      <references basedir="${current.lib.dir}">
         <include name="nunit-gui-runner.dll"/>
+        <include name="nunit.core.dll"/>
       </references>
     </csc>
 
-    <copy file="App.config"
-      tofile="${current.build.dir}/${nunit.gui.name}.config"/>
+    <copy file="Ship.config"
+      tofile="${current.build.dir}/nunit.exe.config"/>
 
     <csc target="winexe" 
-        output="${current.build.dir}/${nunit.gui.name.x86}" 
+        output="${current.build.dir}/nunit-x86.exe" 
         win32icon="App.ico" debug="${build.debug}"
         define="${build.defines}" platform="x86" 
         if="${build.x86}">
       <sources>
-        <include name="AssemblyInfo.cs"/>
-        <include name="Class1.cs"/>
-        <include name="../../CommonAssemblyInfo.cs"/>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
       </sources>
-      <references basedir="${current.build.dir}">
+      <references basedir="${current.lib.dir}">
         <include name="nunit-gui-runner.dll"/>
+        <include name="nunit.core.dll"/>
       </references>
     </csc>
 
-    <copy file="App.config" if="${build.x86}"
-      tofile="${current.build.dir}/${nunit.gui.name.x86}.config"/>
+    <copy file="Ship.config" if="${build.x86}"
+      tofile="${current.build.dir}/nunit-x86.exe.config"/>
   </target>
 
   <target name="package">
     <copy todir="${package.src.dir}/GuiRunner/nunit-gui-exe">
-      <fileset refid="source-files" />
+      <fileset>
+        <patternset refid="source-files"/>
+        <include name="nunit-gui.exe.csproj"/>
+        <include name="nunit-gui.exe.build"/>
+        <include name="App.ico"/>
+        <include name="App.config"/>
+        <include name="Ship.config"/>
+      </fileset>
     </copy>
   </target>
 
diff --git a/src/GuiRunner/nunit-gui-exe/nunit-gui.exe.csproj b/src/GuiRunner/nunit-gui-exe/nunit-gui.exe.csproj
index 51a2659..71b5f46 100644
--- a/src/GuiRunner/nunit-gui-exe/nunit-gui.exe.csproj
+++ b/src/GuiRunner/nunit-gui-exe/nunit-gui.exe.csproj
@@ -1,130 +1,143 @@
-<VisualStudioProject>
-    <CSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{AAB186A4-FA3D-404D-AD78-7EB5BB861655}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = "App.ico"
-                AssemblyKeyContainerName = ""
-                AssemblyName = "nunit"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "WinExe"
-                PreBuildEvent = ""
-                PostBuildEvent = ""
-                RootNamespace = "NUnit.Gui"
-                RunPostBuildEvent = "OnBuildSuccess"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "true"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-                <Config
-                    Name = "Release"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "false"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "System"
-                    AssemblyName = "System"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.dll"
-                />
-                <Reference
-                    Name = "System.Data"
-                    AssemblyName = "System.Data"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Data.dll"
-                />
-                <Reference
-                    Name = "System.XML"
-                    AssemblyName = "System.Xml"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.XML.dll"
-                />
-                <Reference
-                    Name = "nunit-gui"
-                    Project = "{3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                    Private = "True"
-                />
-                <Reference
-                    Name = "nunit.core.extensions.dll"
-                    Project = "{98B10E98-003C-45A0-9587-119142E39986}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.util.dll"
-                    Project = "{61CE9CE5-943E-44D4-A381-814DC1406767}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-            </References>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "App.config"
-                    BuildAction = "None"
-                />
-                <File
-                    RelPath = "App.ico"
-                    BuildAction = "Content"
-                />
-                <File
-                    RelPath = "assemblyinfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Class1.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CommonAssemblyInfo.cs"
-                    Link = "..\..\CommonAssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-            </Include>
-        </Files>
-    </CSHARP>
-</VisualStudioProject>
-
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{AAB186A4-FA3D-404D-AD78-7EB5BB861655}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>WinExe</OutputType>
+    <RootNamespace>NUnit.Gui</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <PublishUrl>http://localhost/nunit/</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Web</InstallFrom>
+    <UpdateEnabled>true</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>true</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetZone>LocalIntranet</TargetZone>
+    <GenerateManifests>false</GenerateManifests>
+    <NoWin32Manifest>true</NoWin32Manifest>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Configuration" />
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
+      <Name>nunit.util.dll</Name>
+      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\nunit-gui\nunit-gui.csproj">
+      <Name>nunit-gui</Name>
+      <Project>{3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="AssemblyInfo.cs" />
+    <Compile Include="Class1.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
+    <None Include="nunit-gui.exe.build" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="App.ico" />
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="Properties\" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/GuiRunner/nunit-gui-exe/nunit-gui.exe_VS2005.csproj b/src/GuiRunner/nunit-gui-exe/nunit-gui.exe_VS2005.csproj
deleted file mode 100644
index 6c370c6..0000000
--- a/src/GuiRunner/nunit-gui-exe/nunit-gui.exe_VS2005.csproj
+++ /dev/null
@@ -1,83 +0,0 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>8.0.50727</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{AAB186A4-FA3D-404D-AD78-7EB5BB861655}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ApplicationIcon>App.ico</ApplicationIcon>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit</AssemblyName>
-    <AssemblyOriginatorKeyFile>
-    </AssemblyOriginatorKeyFile>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>WinExe</OutputType>
-    <RootNamespace>NUnit.Gui</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <StartupObject>
-    </StartupObject>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release2005|AnyCPU' ">
-    <OutputPath>bin\Release2005\</OutputPath>
-    <DefineConstants>TRACE;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <Optimize>true</Optimize>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug2005|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\Debug2005\</OutputPath>
-    <DefineConstants>TRACE;DEBUG;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="App.config" />
-    <Content Include="App.ico" />
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="Class1.cs">
-      <SubType>Code</SubType>
-    </Compile>
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\GuiComponents\UiKit\nunit.uikit.dll_VS2005.csproj">
-      <Project>{27531BBF-183D-4C3A-935B-D840B9F1A3A4}</Project>
-      <Name>nunit.uikit.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitExtensions\core\nunit.core.extensions.dll_VS2005.csproj">
-      <Project>{98B10E98-003C-45A0-9587-119142E39986}</Project>
-      <Name>nunit.core.extensions.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\nunit-gui\nunit-gui_VS2005.csproj">
-      <Project>{3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}</Project>
-      <Name>nunit-gui_VS2005</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
-</Project>
\ No newline at end of file
diff --git a/src/GuiRunner/nunit-gui/AboutBox.cs b/src/GuiRunner/nunit-gui/AboutBox.cs
index a7bb727..88fe159 100644
--- a/src/GuiRunner/nunit-gui/AboutBox.cs
+++ b/src/GuiRunner/nunit-gui/AboutBox.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -44,17 +44,29 @@ namespace NUnit.Gui
 			// TODO: Add any constructor code after InitializeComponent call
 			//
 			Assembly executingAssembly = Assembly.GetExecutingAssembly();
-			Version version = executingAssembly.GetName().Version;
+			string versionText = executingAssembly.GetName().Version.ToString();
 
-			object[] objectAttrs = executingAssembly.GetCustomAttributes(typeof(AssemblyProductAttribute), false);
+            object [] objectAttrs = executingAssembly.GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false);
+            if ( objectAttrs.Length > 0 )
+				versionText = ((AssemblyInformationalVersionAttribute)objectAttrs[0]).InformationalVersion;
 
+			objectAttrs = executingAssembly.GetCustomAttributes(typeof(AssemblyConfigurationAttribute), false);
+			if ( objectAttrs.Length > 0 )
+			{
+				string configText = ((AssemblyConfigurationAttribute)objectAttrs[0]).Configuration;
+                if ( configText != "" )
+				    versionText += string.Format(" ({0})",configText);
+			}
+			
+			string copyrightText = "Copyright (C) 2002-2009 Charlie Poole.\r\nCopyright (C) 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov.\r\nCopyright (C) 2000-2002 Philip Craig.\r\nAll Rights Reserved.";
 			objectAttrs = executingAssembly.GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false);
-			AssemblyCopyrightAttribute copyrightAttr = (AssemblyCopyrightAttribute)objectAttrs[0];
-			versionLabel.Text = version.ToString(3);
-			dotNetVersionLabel.Text = string.Format( "{0} ( {1} )", Environment.Version, 
-				NUnit.Core.RuntimeFramework.CurrentFramework.GetDisplayName() );
+			if ( objectAttrs.Length > 0 )
+				copyrightText = ((AssemblyCopyrightAttribute)objectAttrs[0]).Copyright;
 
-			copyright.Text = copyrightAttr.Copyright;
+			versionLabel.Text = versionText;
+			copyright.Text = copyrightText;
+			dotNetVersionLabel.Text = string.Format( "{0} ( {1} )", Environment.Version, 
+				NUnit.Core.RuntimeFramework.CurrentFramework.DisplayName );
 		}
 
 		/// <summary>
@@ -107,7 +119,7 @@ namespace NUnit.Gui
 			// 
 			// label1
 			// 
-			this.label1.Location = new System.Drawing.Point(31, 232);
+			this.label1.Location = new System.Drawing.Point(31, 240);
 			this.label1.Name = "label1";
 			this.label1.Size = new System.Drawing.Size(102, 15);
 			this.label1.TabIndex = 1;
@@ -115,7 +127,7 @@ namespace NUnit.Gui
 			// 
 			// versionLabel
 			// 
-			this.versionLabel.Location = new System.Drawing.Point(164, 232);
+			this.versionLabel.Location = new System.Drawing.Point(164, 240);
 			this.versionLabel.Name = "versionLabel";
 			this.versionLabel.Size = new System.Drawing.Size(156, 23);
 			this.versionLabel.TabIndex = 2;
@@ -123,7 +135,7 @@ namespace NUnit.Gui
 			// 
 			// label2
 			// 
-			this.label2.Location = new System.Drawing.Point(31, 120);
+			this.label2.Location = new System.Drawing.Point(31, 144);
 			this.label2.Name = "label2";
 			this.label2.Size = new System.Drawing.Size(102, 29);
 			this.label2.TabIndex = 3;
@@ -131,9 +143,9 @@ namespace NUnit.Gui
 			// 
 			// label3
 			// 
-			this.label3.Location = new System.Drawing.Point(164, 120);
+			this.label3.Location = new System.Drawing.Point(164, 144);
 			this.label3.Name = "label3";
-			this.label3.Size = new System.Drawing.Size(287, 60);
+			this.label3.Size = new System.Drawing.Size(287, 48);
 			this.label3.TabIndex = 4;
 			this.label3.Text = "James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Philip Craig, Ethan Smith," +
 				" Doug de la Torre, Charlie Poole";
@@ -141,7 +153,7 @@ namespace NUnit.Gui
 			// linkLabel1
 			// 
 			this.linkLabel1.LinkArea = new System.Windows.Forms.LinkArea(0, 21);
-			this.linkLabel1.Location = new System.Drawing.Point(164, 88);
+			this.linkLabel1.Location = new System.Drawing.Point(164, 112);
 			this.linkLabel1.Name = "linkLabel1";
 			this.linkLabel1.Size = new System.Drawing.Size(266, 16);
 			this.linkLabel1.TabIndex = 5;
@@ -151,7 +163,7 @@ namespace NUnit.Gui
 			// 
 			// label4
 			// 
-			this.label4.Location = new System.Drawing.Point(31, 88);
+			this.label4.Location = new System.Drawing.Point(31, 112);
 			this.label4.Name = "label4";
 			this.label4.Size = new System.Drawing.Size(102, 16);
 			this.label4.TabIndex = 6;
@@ -159,7 +171,7 @@ namespace NUnit.Gui
 			// 
 			// label5
 			// 
-			this.label5.Location = new System.Drawing.Point(31, 192);
+			this.label5.Location = new System.Drawing.Point(31, 200);
 			this.label5.Name = "label5";
 			this.label5.Size = new System.Drawing.Size(102, 29);
 			this.label5.TabIndex = 7;
@@ -167,7 +179,7 @@ namespace NUnit.Gui
 			// 
 			// label6
 			// 
-			this.label6.Location = new System.Drawing.Point(164, 192);
+			this.label6.Location = new System.Drawing.Point(164, 200);
 			this.label6.Name = "label6";
 			this.label6.Size = new System.Drawing.Size(215, 29);
 			this.label6.TabIndex = 8;
@@ -185,13 +197,13 @@ namespace NUnit.Gui
 			// 
 			this.copyright.Location = new System.Drawing.Point(164, 20);
 			this.copyright.Name = "copyright";
-			this.copyright.Size = new System.Drawing.Size(297, 58);
+			this.copyright.Size = new System.Drawing.Size(297, 84);
 			this.copyright.TabIndex = 10;
 			this.copyright.Text = "label8";
 			// 
 			// clrTypeLabel
 			// 
-			this.clrTypeLabel.Location = new System.Drawing.Point(31, 264);
+			this.clrTypeLabel.Location = new System.Drawing.Point(31, 272);
 			this.clrTypeLabel.Name = "clrTypeLabel";
 			this.clrTypeLabel.Size = new System.Drawing.Size(102, 15);
 			this.clrTypeLabel.TabIndex = 11;
@@ -199,7 +211,7 @@ namespace NUnit.Gui
 			// 
 			// dotNetVersionLabel
 			// 
-			this.dotNetVersionLabel.Location = new System.Drawing.Point(164, 264);
+			this.dotNetVersionLabel.Location = new System.Drawing.Point(164, 272);
 			this.dotNetVersionLabel.Name = "dotNetVersionLabel";
 			this.dotNetVersionLabel.Size = new System.Drawing.Size(284, 23);
 			this.dotNetVersionLabel.TabIndex = 12;
@@ -208,7 +220,6 @@ namespace NUnit.Gui
 			// AboutBox
 			// 
 			this.AcceptButton = this.OkButton;
-			this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);
 			this.CancelButton = this.OkButton;
 			this.ClientSize = new System.Drawing.Size(490, 346);
 			this.Controls.Add(this.dotNetVersionLabel);
diff --git a/src/GuiRunner/nunit-gui/AboutBox.resx b/src/GuiRunner/nunit-gui/AboutBox.resx
index f6ad77a..0ad18e6 100644
--- a/src/GuiRunner/nunit-gui/AboutBox.resx
+++ b/src/GuiRunner/nunit-gui/AboutBox.resx
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="utf-8" ?>
+<?xml version="1.0" encoding="utf-8"?>
 <root>
-	<!-- 
+  <!-- 
     Microsoft ResX Schema 
     
     Version 1.3
@@ -58,195 +58,194 @@
             : using a System.ComponentModel.TypeConverter
             : and then encoded with base64 encoding.
     -->
-	<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-		<xsd:element name="root" msdata:IsDataSet="true">
-			<xsd:complexType>
-				<xsd:choice maxOccurs="unbounded">
-					<xsd:element name="data">
-						<xsd:complexType>
-							<xsd:sequence>
-								<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-								<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-							</xsd:sequence>
-							<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
-							<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-							<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-						</xsd:complexType>
-					</xsd:element>
-					<xsd:element name="resheader">
-						<xsd:complexType>
-							<xsd:sequence>
-								<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-							</xsd:sequence>
-							<xsd:attribute name="name" type="xsd:string" use="required" />
-						</xsd:complexType>
-					</xsd:element>
-				</xsd:choice>
-			</xsd:complexType>
-		</xsd:element>
-	</xsd:schema>
-	<resheader name="resmimetype">
-		<value>text/microsoft-resx</value>
-	</resheader>
-	<resheader name="version">
-		<value>1.3</value>
-	</resheader>
-	<resheader name="reader">
-		<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-	</resheader>
-	<resheader name="writer">
-		<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-	</resheader>
-	<data name="OkButton.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="OkButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="OkButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="label1.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="label1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="label1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="versionLabel.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="versionLabel.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="versionLabel.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="label2.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="label2.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="label2.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="label3.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="label3.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="label3.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="linkLabel1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="linkLabel1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="linkLabel1.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="label4.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="label4.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="label4.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="label5.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="label5.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="label5.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="label6.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="label6.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="label6.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="label7.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="label7.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="label7.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="copyright.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="copyright.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="copyright.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="clrTypeLabel.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="clrTypeLabel.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="clrTypeLabel.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="dotNetVersionLabel.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="dotNetVersionLabel.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="dotNetVersionLabel.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>(Default)</value>
-	</data>
-	<data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-		<value>8, 8</value>
-	</data>
-	<data name="$this.Name">
-		<value>AboutBox</value>
-	</data>
-	<data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>True</value>
-	</data>
-	<data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>80</value>
-	</data>
-	<data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>True</value>
-	</data>
-	<data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
-		mimetype="application/x-microsoft.net.object.bytearray.base64">
-		<value>
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>1.3</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="OkButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="OkButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="OkButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="label1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="versionLabel.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="versionLabel.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="versionLabel.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label2.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="label2.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label2.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label3.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="label3.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label3.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="linkLabel1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="linkLabel1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="linkLabel1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="label4.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="label4.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label4.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label5.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="label5.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label5.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label6.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="label6.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label6.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label7.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="label7.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label7.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="copyright.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="copyright.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="copyright.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="clrTypeLabel.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="clrTypeLabel.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="clrTypeLabel.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="dotNetVersionLabel.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="dotNetVersionLabel.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="dotNetVersionLabel.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>(Default)</value>
+  </data>
+  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.Name">
+    <value>AboutBox</value>
+  </data>
+  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>80</value>
+  </data>
+  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
         AAABAAIAICAQAAAAAADoAgAAJgAAABAQEAAAAAAAKAEAAA4DAAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC
         AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/
         AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@@ -266,5 +265,5 @@
         r6qZn5mf+qqvqv////+qqvqqr///////////////////////////////////////////////AAAAAAAA
         AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
 </value>
-	</data>
+  </data>
 </root>
\ No newline at end of file
diff --git a/src/GuiRunner/nunit-gui/AddinDialog.cs b/src/GuiRunner/nunit-gui/AddinDialog.cs
index 612b840..ca86c7f 100644
--- a/src/GuiRunner/nunit-gui/AddinDialog.cs
+++ b/src/GuiRunner/nunit-gui/AddinDialog.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 using System.Drawing;
@@ -25,8 +25,9 @@ namespace NUnit.Gui
 		private System.Windows.Forms.Button button1;
 		private System.Windows.Forms.ListView addinListView;
 		private System.Windows.Forms.ColumnHeader addinNameColumn;
-		private System.Windows.Forms.ColumnHeader extensionTypeColumn;
 		private System.Windows.Forms.ColumnHeader addinStatusColumn;
+		private System.Windows.Forms.Label label2;
+		private System.Windows.Forms.TextBox messageTextBox;
 		/// <summary>
 		/// Required designer variable.
 		/// </summary>
@@ -69,11 +70,12 @@ namespace NUnit.Gui
 			System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(AddinDialog));
 			this.addinListView = new System.Windows.Forms.ListView();
 			this.addinNameColumn = new System.Windows.Forms.ColumnHeader();
-			this.extensionTypeColumn = new System.Windows.Forms.ColumnHeader();
 			this.addinStatusColumn = new System.Windows.Forms.ColumnHeader();
 			this.descriptionTextBox = new System.Windows.Forms.TextBox();
 			this.label1 = new System.Windows.Forms.Label();
 			this.button1 = new System.Windows.Forms.Button();
+			this.label2 = new System.Windows.Forms.Label();
+			this.messageTextBox = new System.Windows.Forms.TextBox();
 			this.SuspendLayout();
 			// 
 			// addinListView
@@ -83,13 +85,13 @@ namespace NUnit.Gui
 				| System.Windows.Forms.AnchorStyles.Right)));
 			this.addinListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
 																							this.addinNameColumn,
-																							this.extensionTypeColumn,
 																							this.addinStatusColumn});
+			this.addinListView.FullRowSelect = true;
 			this.addinListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
 			this.addinListView.Location = new System.Drawing.Point(8, 8);
 			this.addinListView.MultiSelect = false;
 			this.addinListView.Name = "addinListView";
-			this.addinListView.Size = new System.Drawing.Size(448, 208);
+			this.addinListView.Size = new System.Drawing.Size(448, 136);
 			this.addinListView.TabIndex = 0;
 			this.addinListView.View = System.Windows.Forms.View.Details;
 			this.addinListView.Resize += new System.EventHandler(this.addinListView_Resize);
@@ -98,33 +100,29 @@ namespace NUnit.Gui
 			// addinNameColumn
 			// 
 			this.addinNameColumn.Text = "Addin";
-			this.addinNameColumn.Width = 200;
-			// 
-			// extensionTypeColumn
-			// 
-			this.extensionTypeColumn.Text = "Type";
-			this.extensionTypeColumn.Width = 100;
+			this.addinNameColumn.Width = 352;
 			// 
 			// addinStatusColumn
 			// 
 			this.addinStatusColumn.Text = "Status";
-			this.addinStatusColumn.Width = 100;
+			this.addinStatusColumn.Width = 89;
 			// 
 			// descriptionTextBox
 			// 
 			this.descriptionTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) 
 				| System.Windows.Forms.AnchorStyles.Right)));
-			this.descriptionTextBox.Location = new System.Drawing.Point(8, 240);
+			this.descriptionTextBox.Location = new System.Drawing.Point(8, 184);
 			this.descriptionTextBox.Multiline = true;
 			this.descriptionTextBox.Name = "descriptionTextBox";
-			this.descriptionTextBox.Size = new System.Drawing.Size(448, 72);
+			this.descriptionTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+			this.descriptionTextBox.Size = new System.Drawing.Size(448, 56);
 			this.descriptionTextBox.TabIndex = 1;
 			this.descriptionTextBox.Text = "";
 			// 
 			// label1
 			// 
 			this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-			this.label1.Location = new System.Drawing.Point(8, 224);
+			this.label1.Location = new System.Drawing.Point(8, 160);
 			this.label1.Name = "label1";
 			this.label1.Size = new System.Drawing.Size(304, 16);
 			this.label1.TabIndex = 2;
@@ -132,23 +130,46 @@ namespace NUnit.Gui
 			// 
 			// button1
 			// 
-			this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
-			this.button1.Location = new System.Drawing.Point(368, 320);
+			this.button1.Anchor = System.Windows.Forms.AnchorStyles.Bottom;
+			this.button1.Location = new System.Drawing.Point(192, 344);
 			this.button1.Name = "button1";
 			this.button1.TabIndex = 3;
-			this.button1.Text = "Close";
+			this.button1.Text = "OK";
 			this.button1.Click += new System.EventHandler(this.button1_Click);
 			// 
+			// label2
+			// 
+			this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+			this.label2.Location = new System.Drawing.Point(8, 256);
+			this.label2.Name = "label2";
+			this.label2.Size = new System.Drawing.Size(304, 16);
+			this.label2.TabIndex = 5;
+			this.label2.Text = " Message:";
+			// 
+			// messageTextBox
+			// 
+			this.messageTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) 
+				| System.Windows.Forms.AnchorStyles.Right)));
+			this.messageTextBox.Location = new System.Drawing.Point(8, 280);
+			this.messageTextBox.Multiline = true;
+			this.messageTextBox.Name = "messageTextBox";
+			this.messageTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+			this.messageTextBox.Size = new System.Drawing.Size(448, 56);
+			this.messageTextBox.TabIndex = 4;
+			this.messageTextBox.Text = "";
+			// 
 			// AddinDialog
 			// 
-			this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);
-			this.ClientSize = new System.Drawing.Size(464, 352);
+			this.ClientSize = new System.Drawing.Size(464, 376);
+			this.Controls.Add(this.label2);
+			this.Controls.Add(this.messageTextBox);
 			this.Controls.Add(this.button1);
 			this.Controls.Add(this.label1);
 			this.Controls.Add(this.descriptionTextBox);
 			this.Controls.Add(this.addinListView);
 			this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
 			this.Name = "AddinDialog";
+			this.ShowInTaskbar = false;
 			this.Text = "Registered Addins";
 			this.Load += new System.EventHandler(this.AddinDialog_Load);
 			this.ResumeLayout(false);
@@ -163,7 +184,7 @@ namespace NUnit.Gui
 			foreach( Addin addin in addins )
 			{
 				ListViewItem item = new ListViewItem( 
-					new string[] { addin.Name, addin.ExtensionType.ToString(), addin.Status.ToString() } );
+					new string[] { addin.Name, addin.Status.ToString() } );
 				addinListView.Items.Add( item );
 			}
 
@@ -183,7 +204,9 @@ namespace NUnit.Gui
 			if ( addinListView.SelectedIndices.Count > 0 )
 			{
 				int index = addinListView.SelectedIndices[0];
-				this.descriptionTextBox.Text = ((Addin)addins[index]).Description;
+				Addin addin = (Addin)addins[index];
+				this.descriptionTextBox.Text = addin.Description;
+				this.messageTextBox.Text = addin.Message;
 			}
 		}
 
diff --git a/src/GuiRunner/nunit-gui/AddinDialog.resx b/src/GuiRunner/nunit-gui/AddinDialog.resx
index 02bb2da..967d4c0 100644
--- a/src/GuiRunner/nunit-gui/AddinDialog.resx
+++ b/src/GuiRunner/nunit-gui/AddinDialog.resx
@@ -92,96 +92,108 @@
     <value>1.3</value>
   </resheader>
   <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
   <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
-  <data name="addinListView.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="addinListView.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>False</value>
   </data>
-  <data name="addinListView.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="addinListView.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>Private</value>
   </data>
-  <data name="addinListView.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="addinListView.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>Private</value>
   </data>
-  <data name="addinNameColumn.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="addinNameColumn.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>Private</value>
   </data>
-  <data name="addinNameColumn.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="addinNameColumn.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>Private</value>
   </data>
-  <data name="extensionTypeColumn.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="addinStatusColumn.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>Private</value>
   </data>
-  <data name="extensionTypeColumn.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="addinStatusColumn.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>Private</value>
   </data>
-  <data name="addinStatusColumn.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="descriptionTextBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>Private</value>
   </data>
-  <data name="addinStatusColumn.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
+  <data name="descriptionTextBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
   </data>
-  <data name="descriptionTextBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="descriptionTextBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>Private</value>
   </data>
-  <data name="descriptionTextBox.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="label1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>False</value>
   </data>
-  <data name="descriptionTextBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="label1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>Private</value>
   </data>
-  <data name="label1.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="button1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>False</value>
   </data>
-  <data name="label1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="button1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>Private</value>
   </data>
-  <data name="label1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="button1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>Private</value>
   </data>
-  <data name="button1.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="label2.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label2.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>False</value>
   </data>
-  <data name="button1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="label2.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="messageTextBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>Private</value>
   </data>
-  <data name="button1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="messageTextBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="messageTextBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>Private</value>
   </data>
-  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="$this.Name">
+    <value>AddinDialog</value>
+  </data>
+  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>False</value>
   </data>
-  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>(Default)</value>
   </data>
-  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>False</value>
   </data>
-  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>False</value>
   </data>
-  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>8, 8</value>
   </data>
-  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>True</value>
   </data>
-  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>80</value>
   </data>
-  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>True</value>
   </data>
-  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>Private</value>
   </data>
-  <data name="$this.Name">
-    <value>AddinDialog</value>
-  </data>
-  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         AAABAAIAICAQAAAAAADoAgAAJgAAABAQEAAAAAAAKAEAAA4DAAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC
         AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/
diff --git a/src/GuiRunner/nunit-gui/AppEntry.cs b/src/GuiRunner/nunit-gui/AppEntry.cs
index 3382c9f..67dd216 100644
--- a/src/GuiRunner/nunit-gui/AppEntry.cs
+++ b/src/GuiRunner/nunit-gui/AppEntry.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -18,84 +18,122 @@ using NUnit.Core.Extensibility;
 
 namespace NUnit.Gui
 {
-	/// <summary>
-	/// Class to manage application startup.
-	/// </summary>
-	public class AppEntry
-	{
-		/// <summary>
-		/// The main entry point for the application.
-		/// </summary>
-		[STAThread]
-		public static int Main(string[] args) 
-		{
-			NTrace.Info( "Starting NUnit GUI" );
-
-			GuiOptions guiOptions = new GuiOptions(args);
-
-			GuiAttachedConsole attachedConsole = null;
-			if ( guiOptions.console )
-				attachedConsole = new GuiAttachedConsole();
-
-			if( !guiOptions.Validate() || guiOptions.help) 
-			{
-				string message = guiOptions.GetHelpText();
-				UserMessage.DisplayFailure( message,"Help Syntax" );
-				return 2;
-			}
-
-			if ( guiOptions.cleanup )
-			{
-				DomainManager.DeleteShadowCopyPath();
-				return 0;
-			}
-
-			if(!guiOptions.NoArgs)
-			{
-				if (guiOptions.lang != null)
-					Thread.CurrentThread.CurrentUICulture =
-						new CultureInfo( guiOptions.lang );
-			}
-
-			// Add Standard Services to ServiceManager
-			ServiceManager.Services.AddService( new SettingsService() );
-			ServiceManager.Services.AddService( new DomainManager() );
-			ServiceManager.Services.AddService( new RecentFilesService() );
-			ServiceManager.Services.AddService( new TestLoader( new GuiTestEventDispatcher() ) );
-			ServiceManager.Services.AddService( new AddinRegistry() );
-			ServiceManager.Services.AddService( new AddinManager() );
-			ServiceManager.Services.AddService( new TestAgency() );
-
-			// Initialize Services
-			ServiceManager.Services.InitializeServices();
-
-			// Create container in order to allow ambient properties
-			// to be shared across all top-level forms.
-			AppContainer c = new AppContainer();
-			AmbientProperties ambient = new AmbientProperties();
-			c.Services.AddService( typeof( AmbientProperties ), ambient );
-			NUnitForm form = new NUnitForm( guiOptions );
-			c.Add( form );
-
-			try
-			{
-				Application.Run( form );
-			}
-			finally
-			{
-				ServiceManager.Services.StopAllServices();
-			}
-				
-			if ( attachedConsole != null )
-			{
-				Console.WriteLine( "Press Enter to exit" );
-				Console.ReadLine();
-				attachedConsole.Close();
-			}
-
-			NTrace.Info( "Exiting NUnit GUI" );
-
-			return 0;
-		}
-	}
+    /// <summary>
+    /// Class to manage application startup.
+    /// </summary>
+    public class AppEntry
+    {
+        static Logger log = InternalTrace.GetLogger(typeof(AppEntry));
+
+        /// <summary>
+        /// The main entry point for the application.
+        /// </summary>
+        [STAThread]
+        public static int Main(string[] args)
+        {
+            // Create SettingsService early so we know the trace level right at the start
+            SettingsService settingsService = new SettingsService();
+            InternalTrace.Initialize("nunit-gui_%p.log", (InternalTraceLevel)settingsService.GetSetting("Options.InternalTraceLevel", InternalTraceLevel.Default));
+
+            log.Info("Starting NUnit GUI");
+
+            GuiOptions guiOptions = new GuiOptions(args);
+
+            GuiAttachedConsole attachedConsole = null;
+            if (guiOptions.console)
+            {
+                log.Info("Creating attached console");
+                attachedConsole = new GuiAttachedConsole();
+            }
+
+            if (!guiOptions.Validate() || guiOptions.help)
+            {
+                string message = guiOptions.GetHelpText();
+                UserMessage.DisplayFailure(message, "Help Syntax");
+                log.Error("Command line error: " + message);
+                return 2;
+            }
+
+            if (guiOptions.cleanup)
+            {
+                log.Info("Performing cleanup of shadow copy cache");
+                DomainManager.DeleteShadowCopyPath();
+                return 0;
+            }
+
+            if (!guiOptions.NoArgs)
+            {
+                if (guiOptions.lang != null)
+                {
+                    log.Info("Setting culture to " + guiOptions.lang);
+                    Thread.CurrentThread.CurrentUICulture =
+                        new CultureInfo(guiOptions.lang);
+                }
+            }
+
+            try
+            {
+                // Add Standard Services to ServiceManager
+                log.Info("Adding Services");
+                ServiceManager.Services.AddService(settingsService);
+                ServiceManager.Services.AddService(new DomainManager());
+                ServiceManager.Services.AddService(new RecentFilesService());
+                ServiceManager.Services.AddService(new ProjectService());
+                ServiceManager.Services.AddService(new TestLoader(new GuiTestEventDispatcher()));
+                ServiceManager.Services.AddService(new AddinRegistry());
+                ServiceManager.Services.AddService(new AddinManager());
+                ServiceManager.Services.AddService(new TestAgency());
+
+                // Initialize Services
+                log.Info("Initializing Services");
+                ServiceManager.Services.InitializeServices();
+            }
+            catch (Exception ex)
+            {
+                UserMessage.DisplayFatalError(ex, null, "Unable to Initialize Services");
+                log.Error("Unable to initialize services", ex);
+                return 2;
+            }
+
+            // Create container in order to allow ambient properties
+            // to be shared across all top-level forms.
+            log.Info("Initializing AmbientProperties");
+            AppContainer c = new AppContainer();
+            AmbientProperties ambient = new AmbientProperties();
+            c.Services.AddService(typeof(AmbientProperties), ambient);
+
+            log.Info("Constructing Form");
+            NUnitForm form = new NUnitForm(guiOptions);
+            c.Add(form);
+
+            try
+            {
+                log.Info("Starting Gui Application");
+                Application.Run(form);
+                log.Info("Application Exit");
+            }
+            catch( Exception ex )
+            {
+                log.Error("Gui Application threw an excepion", ex );
+                throw;
+            }
+            finally
+            {
+                log.Info("Stopping Services");
+                ServiceManager.Services.StopAllServices();
+            }
+
+            if (attachedConsole != null)
+            {
+                Console.WriteLine("Press Enter to exit");
+                Console.ReadLine();
+                attachedConsole.Close();
+            }
+
+            log.Info("Exiting NUnit GUI");
+            InternalTrace.Close();
+
+            return 0;
+        }
+    }
 }
diff --git a/src/GuiRunner/nunit-gui/AssemblyInfo.cs b/src/GuiRunner/nunit-gui/AssemblyInfo.cs
index c55a1ba..4835bf6 100644
--- a/src/GuiRunner/nunit-gui/AssemblyInfo.cs
+++ b/src/GuiRunner/nunit-gui/AssemblyInfo.cs
@@ -1,11 +1,11 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System.Reflection;
 
 [assembly: AssemblyDelaySign(false)]
-[assembly: AssemblyKeyFile("../../../../nunit.snk")]
+[assembly: AssemblyKeyFile("../../nunit.snk")]
 [assembly: AssemblyKeyName("")]
diff --git a/src/GuiRunner/nunit-gui/DetailResults.cs b/src/GuiRunner/nunit-gui/DetailResults.cs
index 1c95f91..8f1f237 100644
--- a/src/GuiRunner/nunit-gui/DetailResults.cs
+++ b/src/GuiRunner/nunit-gui/DetailResults.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -14,12 +14,12 @@ namespace NUnit.Gui
 	using NUnit.Util;
 
 	/// <summary>
-	/// Summary description for ResultVisitor.
+	/// Summary description for DetailResults
 	/// </summary>
-	public class DetailResults : ResultVisitor
+	public class DetailResults
 	{
-		private ListBox testDetails;
-		private TreeView notRunTree;
+		private readonly ListBox testDetails;
+		private readonly TreeView notRunTree;
 
 		public DetailResults(ListBox listBox, TreeView notRun)
 		{
@@ -30,44 +30,39 @@ namespace NUnit.Gui
 		public void DisplayResults( TestResult results )
 		{
 			notRunTree.BeginUpdate();
-			results.Accept(this);
+			ProcessResults( results );
 			notRunTree.EndUpdate();
 
 			if( testDetails.Items.Count > 0 )
 				testDetails.SelectedIndex = 0;
 		}
 
-		public void Visit(TestCaseResult result)
+		private void ProcessResults(TestResult result)
 		{
-			if(result.Executed)
+			switch( result.ResultState )
 			{
-				if(result.IsFailure)
-				{
+                case ResultState.Failure:
+                case ResultState.Error:
+                case ResultState.Cancelled:
 					TestResultItem item = new TestResultItem(result);
 					//string resultString = String.Format("{0}:{1}", result.Name, result.Message);
 					testDetails.BeginUpdate();
 					testDetails.Items.Insert(testDetails.Items.Count, item);
 					testDetails.EndUpdate();
-				}
+			        break;
+                case ResultState.Skipped:
+                case ResultState.NotRunnable:
+                case ResultState.Ignored:
+    				notRunTree.Nodes.Add(MakeNotRunNode(result));
+			        break;
 			}
-			else
-			{
-				notRunTree.Nodes.Add(MakeNotRunNode(result));
-			}
-		}
-
-		public void Visit(TestSuiteResult suiteResult)
-		{
-			if(!suiteResult.Executed)
-				notRunTree.Nodes.Add(MakeNotRunNode(suiteResult));
 
-			foreach (TestResult result in suiteResult.Results)
-			{
-				result.Accept(this);
-			}
-		}
+			if ( result.HasResults )
+				foreach (TestResult childResult in result.Results)
+	                ProcessResults( childResult );
+        }
 
-		private TreeNode MakeNotRunNode(TestResult result)
+		private static TreeNode MakeNotRunNode(TestResult result)
 		{
 			TreeNode node = new TreeNode(result.Name);
 
diff --git a/src/GuiRunner/nunit-gui/ExceptionDetailsForm.cs b/src/GuiRunner/nunit-gui/ExceptionDetailsForm.cs
index 533cd7e..aea67e6 100644
--- a/src/GuiRunner/nunit-gui/ExceptionDetailsForm.cs
+++ b/src/GuiRunner/nunit-gui/ExceptionDetailsForm.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 using System.Text;
@@ -99,7 +99,6 @@ namespace NUnit.Gui
 			// 
 			// ExceptionDetailsForm
 			// 
-			this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);
 			this.ClientSize = new System.Drawing.Size(969, 551);
 			this.Controls.Add(this.stackTrace);
 			this.Controls.Add(this.message);
diff --git a/src/GuiRunner/nunit-gui/GuiOptions.cs b/src/GuiRunner/nunit-gui/GuiOptions.cs
index 5de29ae..4318f6a 100644
--- a/src/GuiRunner/nunit-gui/GuiOptions.cs
+++ b/src/GuiRunner/nunit-gui/GuiOptions.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 namespace NUnit.Gui
diff --git a/src/GuiRunner/nunit-gui/NUnitForm.cs b/src/GuiRunner/nunit-gui/NUnitForm.cs
index b072262..bc526bf 100644
--- a/src/GuiRunner/nunit-gui/NUnitForm.cs
+++ b/src/GuiRunner/nunit-gui/NUnitForm.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -10,6 +10,7 @@ using System.Collections;
 using System.Configuration;
 using System.ComponentModel;
 using System.ComponentModel.Design;
+using System.Globalization;
 using System.Windows.Forms;
 using System.IO;
 using System.Reflection;
@@ -83,7 +84,7 @@ namespace NUnit.Gui
 		private System.Windows.Forms.MenuItem projectMenuSeparator2;
 
 		private System.Windows.Forms.MenuItem toolsMenu;
-		private System.Windows.Forms.MenuItem optionsMenuItem;
+		private System.Windows.Forms.MenuItem settingsMenuItem;
 		private System.Windows.Forms.MenuItem saveXmlResultsMenuItem;
 
 		public System.Windows.Forms.MenuItem helpMenuItem;
@@ -124,6 +125,7 @@ namespace NUnit.Gui
 		private System.Windows.Forms.MenuItem menuItem2;
 		private System.Windows.Forms.MenuItem toolsMenuSeparator1;
 		private System.Windows.Forms.MenuItem assemblyDetailsMenuItem;
+        private MenuItem runtimeMenuItem;
 		private System.Windows.Forms.MenuItem addAssemblyMenuItem;
 
 		#endregion
@@ -160,637 +162,643 @@ namespace NUnit.Gui
 		/// </summary>
 		private void InitializeComponent()
 		{
-			this.components = new System.ComponentModel.Container();
-			System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(NUnitForm));
-			this.statusBar = new NUnit.UiKit.StatusBar();
-			this.mainMenu = new System.Windows.Forms.MainMenu();
-			this.fileMenu = new System.Windows.Forms.MenuItem();
-			this.newMenuItem = new System.Windows.Forms.MenuItem();
-			this.openMenuItem = new System.Windows.Forms.MenuItem();
-			this.closeMenuItem = new System.Windows.Forms.MenuItem();
-			this.fileMenuSeparator1 = new System.Windows.Forms.MenuItem();
-			this.saveMenuItem = new System.Windows.Forms.MenuItem();
-			this.saveAsMenuItem = new System.Windows.Forms.MenuItem();
-			this.fileMenuSeparator2 = new System.Windows.Forms.MenuItem();
-			this.reloadProjectMenuItem = new System.Windows.Forms.MenuItem();
-			this.reloadTestsMenuItem = new System.Windows.Forms.MenuItem();
-			this.menuItem2 = new System.Windows.Forms.MenuItem();
-			this.recentProjectsMenu = new System.Windows.Forms.MenuItem();
-			this.fileMenuSeparator4 = new System.Windows.Forms.MenuItem();
-			this.exitMenuItem = new System.Windows.Forms.MenuItem();
-			this.viewMenu = new System.Windows.Forms.MenuItem();
-			this.fullGuiMenuItem = new System.Windows.Forms.MenuItem();
-			this.miniGuiMenuItem = new System.Windows.Forms.MenuItem();
-			this.viewMenuSeparator1 = new System.Windows.Forms.MenuItem();
-			this.viewMenuSeparator2 = new System.Windows.Forms.MenuItem();
-			this.guiFontMenuItem = new System.Windows.Forms.MenuItem();
-			this.increaseFontMenuItem = new System.Windows.Forms.MenuItem();
-			this.decreaseFontMenuItem = new System.Windows.Forms.MenuItem();
-			this.fontMenuSeparator = new System.Windows.Forms.MenuItem();
-			this.fontChangeMenuItem = new System.Windows.Forms.MenuItem();
-			this.defaultFontMenuItem = new System.Windows.Forms.MenuItem();
-			this.fixedFontMenuItem = new System.Windows.Forms.MenuItem();
-			this.increaseFixedFontMenuItem = new System.Windows.Forms.MenuItem();
-			this.decreaseFixedFontMenuItem = new System.Windows.Forms.MenuItem();
-			this.menuItem1 = new System.Windows.Forms.MenuItem();
-			this.restoreFixedFontMenuItem = new System.Windows.Forms.MenuItem();
-			this.viewMenuSeparator3 = new System.Windows.Forms.MenuItem();
-			this.statusBarMenuItem = new System.Windows.Forms.MenuItem();
-			this.projectMenu = new System.Windows.Forms.MenuItem();
-			this.configMenuItem = new System.Windows.Forms.MenuItem();
-			this.projectMenuSeparator1 = new System.Windows.Forms.MenuItem();
-			this.addAssemblyMenuItem = new System.Windows.Forms.MenuItem();
-			this.addVSProjectMenuItem = new System.Windows.Forms.MenuItem();
-			this.projectMenuSeparator2 = new System.Windows.Forms.MenuItem();
-			this.editProjectMenuItem = new System.Windows.Forms.MenuItem();
-			this.testMenu = new System.Windows.Forms.MenuItem();
-			this.runAllMenuItem = new System.Windows.Forms.MenuItem();
-			this.runSelectedMenuItem = new System.Windows.Forms.MenuItem();
-			this.runFailedMenuItem = new System.Windows.Forms.MenuItem();
-			this.testMenuSeparator = new System.Windows.Forms.MenuItem();
-			this.stopRunMenuItem = new System.Windows.Forms.MenuItem();
-			this.toolsMenu = new System.Windows.Forms.MenuItem();
-			this.assemblyDetailsMenuItem = new System.Windows.Forms.MenuItem();
-			this.saveXmlResultsMenuItem = new System.Windows.Forms.MenuItem();
-			this.exceptionDetailsMenuItem = new System.Windows.Forms.MenuItem();
-			this.toolsMenuSeparator1 = new System.Windows.Forms.MenuItem();
-			this.optionsMenuItem = new System.Windows.Forms.MenuItem();
-			this.toolsMenuSeparator2 = new System.Windows.Forms.MenuItem();
-			this.addinInfoMenuItem = new System.Windows.Forms.MenuItem();
-			this.helpItem = new System.Windows.Forms.MenuItem();
-			this.helpMenuItem = new System.Windows.Forms.MenuItem();
-			this.helpMenuSeparator1 = new System.Windows.Forms.MenuItem();
-			this.aboutMenuItem = new System.Windows.Forms.MenuItem();
-			this.treeSplitter = new System.Windows.Forms.Splitter();
-			this.rightPanel = new System.Windows.Forms.Panel();
-			this.groupBox1 = new System.Windows.Forms.GroupBox();
-			this.runCount = new System.Windows.Forms.Label();
-			this.stopButton = new System.Windows.Forms.Button();
-			this.runButton = new System.Windows.Forms.Button();
-			this.suiteName = new System.Windows.Forms.Label();
-			this.progressBar = new NUnit.UiKit.TestProgressBar();
-			this.resultTabs = new NUnit.UiKit.ResultTabs();
-			this.toolTip = new System.Windows.Forms.ToolTip(this.components);
-			this.testTree = new NUnit.UiKit.TestTree();
-			this.leftPanel = new System.Windows.Forms.Panel();
-			this.rightPanel.SuspendLayout();
-			this.groupBox1.SuspendLayout();
-			this.leftPanel.SuspendLayout();
-			this.SuspendLayout();
-			// 
-			// statusBar
-			// 
-			this.statusBar.DisplayTestProgress = true;
-			this.statusBar.Location = new System.Drawing.Point(0, 407);
-			this.statusBar.Name = "statusBar";
-			this.statusBar.ShowPanels = true;
-			this.statusBar.Size = new System.Drawing.Size(744, 24);
-			this.statusBar.TabIndex = 0;
-			this.statusBar.Text = "Status";
-			// 
-			// mainMenu
-			// 
-			this.mainMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
-																					 this.fileMenu,
-																					 this.viewMenu,
-																					 this.projectMenu,
-																					 this.testMenu,
-																					 this.toolsMenu,
-																					 this.helpItem});
-			// 
-			// fileMenu
-			// 
-			this.fileMenu.Index = 0;
-			this.fileMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
-																					 this.newMenuItem,
-																					 this.openMenuItem,
-																					 this.closeMenuItem,
-																					 this.fileMenuSeparator1,
-																					 this.saveMenuItem,
-																					 this.saveAsMenuItem,
-																					 this.fileMenuSeparator2,
-																					 this.reloadProjectMenuItem,
-																					 this.reloadTestsMenuItem,
-																					 this.menuItem2,
-																					 this.recentProjectsMenu,
-																					 this.fileMenuSeparator4,
-																					 this.exitMenuItem});
-			this.fileMenu.Text = "&File";
-			this.fileMenu.Popup += new System.EventHandler(this.fileMenu_Popup);
-			// 
-			// newMenuItem
-			// 
-			this.newMenuItem.Index = 0;
-			this.newMenuItem.Shortcut = System.Windows.Forms.Shortcut.CtrlN;
-			this.newMenuItem.Text = "&New Project...";
-			this.newMenuItem.Click += new System.EventHandler(this.newMenuItem_Click);
-			// 
-			// openMenuItem
-			// 
-			this.openMenuItem.Index = 1;
-			this.openMenuItem.Shortcut = System.Windows.Forms.Shortcut.CtrlO;
-			this.openMenuItem.Text = "&Open Project...";
-			this.openMenuItem.Click += new System.EventHandler(this.openMenuItem_Click);
-			// 
-			// closeMenuItem
-			// 
-			this.closeMenuItem.Index = 2;
-			this.closeMenuItem.Text = "&Close";
-			this.closeMenuItem.Click += new System.EventHandler(this.closeMenuItem_Click);
-			// 
-			// fileMenuSeparator1
-			// 
-			this.fileMenuSeparator1.Index = 3;
-			this.fileMenuSeparator1.Text = "-";
-			// 
-			// saveMenuItem
-			// 
-			this.saveMenuItem.Index = 4;
-			this.saveMenuItem.Shortcut = System.Windows.Forms.Shortcut.CtrlS;
-			this.saveMenuItem.Text = "&Save";
-			this.saveMenuItem.Click += new System.EventHandler(this.saveMenuItem_Click);
-			// 
-			// saveAsMenuItem
-			// 
-			this.saveAsMenuItem.Index = 5;
-			this.saveAsMenuItem.Text = "Save &As...";
-			this.saveAsMenuItem.Click += new System.EventHandler(this.saveAsMenuItem_Click);
-			// 
-			// fileMenuSeparator2
-			// 
-			this.fileMenuSeparator2.Index = 6;
-			this.fileMenuSeparator2.Text = "-";
-			// 
-			// reloadProjectMenuItem
-			// 
-			this.reloadProjectMenuItem.Index = 7;
-			this.reloadProjectMenuItem.Shortcut = System.Windows.Forms.Shortcut.CtrlP;
-			this.reloadProjectMenuItem.Text = "Reload &Project";
-			this.reloadProjectMenuItem.Click += new System.EventHandler(this.reloadProjectMenuItem_Click);
-			// 
-			// reloadTestsMenuItem
-			// 
-			this.reloadTestsMenuItem.Index = 8;
-			this.reloadTestsMenuItem.Shortcut = System.Windows.Forms.Shortcut.CtrlR;
-			this.reloadTestsMenuItem.Text = "&Reload Tests";
-			this.reloadTestsMenuItem.Click += new System.EventHandler(this.reloadTestsMenuItem_Click);
-			// 
-			// menuItem2
-			// 
-			this.menuItem2.Index = 9;
-			this.menuItem2.Text = "-";
-			// 
-			// recentProjectsMenu
-			// 
-			this.recentProjectsMenu.Index = 10;
-			this.recentProjectsMenu.Text = "Recent &Files";
-			// 
-			// fileMenuSeparator4
-			// 
-			this.fileMenuSeparator4.Index = 11;
-			this.fileMenuSeparator4.Text = "-";
-			// 
-			// exitMenuItem
-			// 
-			this.exitMenuItem.Index = 12;
-			this.exitMenuItem.Text = "E&xit";
-			this.exitMenuItem.Click += new System.EventHandler(this.exitMenuItem_Click);
-			// 
-			// viewMenu
-			// 
-			this.viewMenu.Index = 1;
-			this.viewMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
-																					 this.fullGuiMenuItem,
-																					 this.miniGuiMenuItem,
-																					 this.viewMenuSeparator1,
-																					 this.viewMenuSeparator2,
-																					 this.guiFontMenuItem,
-																					 this.fixedFontMenuItem,
-																					 this.viewMenuSeparator3,
-																					 this.statusBarMenuItem});
-			this.viewMenu.Text = "&View";
-			this.viewMenu.Popup += new System.EventHandler(this.viewMenu_Popup);
-			// 
-			// fullGuiMenuItem
-			// 
-			this.fullGuiMenuItem.Checked = true;
-			this.fullGuiMenuItem.Index = 0;
-			this.fullGuiMenuItem.RadioCheck = true;
-			this.fullGuiMenuItem.Text = "&Full GUI";
-			this.fullGuiMenuItem.Click += new System.EventHandler(this.fullGuiMenuItem_Click);
-			// 
-			// miniGuiMenuItem
-			// 
-			this.miniGuiMenuItem.Index = 1;
-			this.miniGuiMenuItem.RadioCheck = true;
-			this.miniGuiMenuItem.Text = "&Mini GUI";
-			this.miniGuiMenuItem.Click += new System.EventHandler(this.miniGuiMenuItem_Click);
-			// 
-			// viewMenuSeparator1
-			// 
-			this.viewMenuSeparator1.Index = 2;
-			this.viewMenuSeparator1.Text = "-";
-			// 
-			// viewMenuSeparator2
-			// 
-			this.viewMenuSeparator2.Index = 3;
-			this.viewMenuSeparator2.Text = "-";
-			// 
-			// guiFontMenuItem
-			// 
-			this.guiFontMenuItem.Index = 4;
-			this.guiFontMenuItem.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
-																							this.increaseFontMenuItem,
-																							this.decreaseFontMenuItem,
-																							this.fontMenuSeparator,
-																							this.fontChangeMenuItem,
-																							this.defaultFontMenuItem});
-			this.guiFontMenuItem.Text = "GUI Fo&nt";
-			// 
-			// increaseFontMenuItem
-			// 
-			this.increaseFontMenuItem.Index = 0;
-			this.increaseFontMenuItem.Text = "&Increase";
-			this.increaseFontMenuItem.Click += new System.EventHandler(this.increaseFontMenuItem_Click);
-			// 
-			// decreaseFontMenuItem
-			// 
-			this.decreaseFontMenuItem.Index = 1;
-			this.decreaseFontMenuItem.Text = "&Decrease";
-			this.decreaseFontMenuItem.Click += new System.EventHandler(this.decreaseFontMenuItem_Click);
-			// 
-			// fontMenuSeparator
-			// 
-			this.fontMenuSeparator.Index = 2;
-			this.fontMenuSeparator.Text = "-";
-			// 
-			// fontChangeMenuItem
-			// 
-			this.fontChangeMenuItem.Index = 3;
-			this.fontChangeMenuItem.Text = "&Change...";
-			this.fontChangeMenuItem.Click += new System.EventHandler(this.fontChangeMenuItem_Click);
-			// 
-			// defaultFontMenuItem
-			// 
-			this.defaultFontMenuItem.Index = 4;
-			this.defaultFontMenuItem.Text = "&Restore";
-			this.defaultFontMenuItem.Click += new System.EventHandler(this.defaultFontMenuItem_Click);
-			// 
-			// fixedFontMenuItem
-			// 
-			this.fixedFontMenuItem.Index = 5;
-			this.fixedFontMenuItem.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
-																							  this.increaseFixedFontMenuItem,
-																							  this.decreaseFixedFontMenuItem,
-																							  this.menuItem1,
-																							  this.restoreFixedFontMenuItem});
-			this.fixedFontMenuItem.Text = "Fi&xed Font";
-			// 
-			// increaseFixedFontMenuItem
-			// 
-			this.increaseFixedFontMenuItem.Index = 0;
-			this.increaseFixedFontMenuItem.Text = "&Increase";
-			this.increaseFixedFontMenuItem.Click += new System.EventHandler(this.increaseFixedFontMenuItem_Click);
-			// 
-			// decreaseFixedFontMenuItem
-			// 
-			this.decreaseFixedFontMenuItem.Index = 1;
-			this.decreaseFixedFontMenuItem.Text = "&Decrease";
-			this.decreaseFixedFontMenuItem.Click += new System.EventHandler(this.decreaseFixedFontMenuItem_Click);
-			// 
-			// menuItem1
-			// 
-			this.menuItem1.Index = 2;
-			this.menuItem1.Text = "-";
-			// 
-			// restoreFixedFontMenuItem
-			// 
-			this.restoreFixedFontMenuItem.Index = 3;
-			this.restoreFixedFontMenuItem.Text = "&Restore";
-			this.restoreFixedFontMenuItem.Click += new System.EventHandler(this.restoreFixedFontMenuItem_Click);
-			// 
-			// viewMenuSeparator3
-			// 
-			this.viewMenuSeparator3.Index = 6;
-			this.viewMenuSeparator3.Text = "-";
-			// 
-			// statusBarMenuItem
-			// 
-			this.statusBarMenuItem.Checked = true;
-			this.statusBarMenuItem.Index = 7;
-			this.statusBarMenuItem.Text = "&Status Bar";
-			this.statusBarMenuItem.Click += new System.EventHandler(this.statusBarMenuItem_Click);
-			// 
-			// projectMenu
-			// 
-			this.projectMenu.Index = 2;
-			this.projectMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
-																						this.configMenuItem,
-																						this.projectMenuSeparator1,
-																						this.addAssemblyMenuItem,
-																						this.addVSProjectMenuItem,
-																						this.projectMenuSeparator2,
-																						this.editProjectMenuItem});
-			this.projectMenu.Text = "&Project";
-			this.projectMenu.Visible = false;
-			this.projectMenu.Popup += new System.EventHandler(this.projectMenu_Popup);
-			// 
-			// configMenuItem
-			// 
-			this.configMenuItem.Index = 0;
-			this.configMenuItem.Text = "&Configurations";
-			// 
-			// projectMenuSeparator1
-			// 
-			this.projectMenuSeparator1.Index = 1;
-			this.projectMenuSeparator1.Text = "-";
-			// 
-			// addAssemblyMenuItem
-			// 
-			this.addAssemblyMenuItem.Index = 2;
-			this.addAssemblyMenuItem.Text = "Add Assembly...";
-			this.addAssemblyMenuItem.Click += new System.EventHandler(this.addAssemblyMenuItem_Click);
-			// 
-			// addVSProjectMenuItem
-			// 
-			this.addVSProjectMenuItem.Index = 3;
-			this.addVSProjectMenuItem.Text = "Add VS Project...";
-			this.addVSProjectMenuItem.Click += new System.EventHandler(this.addVSProjectMenuItem_Click);
-			// 
-			// projectMenuSeparator2
-			// 
-			this.projectMenuSeparator2.Index = 4;
-			this.projectMenuSeparator2.Text = "-";
-			// 
-			// editProjectMenuItem
-			// 
-			this.editProjectMenuItem.Index = 5;
-			this.editProjectMenuItem.Text = "Edit...";
-			this.editProjectMenuItem.Click += new System.EventHandler(this.editProjectMenuItem_Click);
-			// 
-			// testMenu
-			// 
-			this.testMenu.Index = 3;
-			this.testMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
-																					 this.runAllMenuItem,
-																					 this.runSelectedMenuItem,
-																					 this.runFailedMenuItem,
-																					 this.testMenuSeparator,
-																					 this.stopRunMenuItem});
-			this.testMenu.Text = "&Test";
-			// 
-			// runAllMenuItem
-			// 
-			this.runAllMenuItem.Index = 0;
-			this.runAllMenuItem.Shortcut = System.Windows.Forms.Shortcut.F5;
-			this.runAllMenuItem.Text = "&Run All";
-			this.runAllMenuItem.Click += new System.EventHandler(this.runAllMenuItem_Click);
-			// 
-			// runSelectedMenuItem
-			// 
-			this.runSelectedMenuItem.Index = 1;
-			this.runSelectedMenuItem.Shortcut = System.Windows.Forms.Shortcut.F6;
-			this.runSelectedMenuItem.Text = "Run &Selected";
-			this.runSelectedMenuItem.Click += new System.EventHandler(this.runSelectedMenuItem_Click);
-			// 
-			// runFailedMenuItem
-			// 
-			this.runFailedMenuItem.Enabled = false;
-			this.runFailedMenuItem.Index = 2;
-			this.runFailedMenuItem.Shortcut = System.Windows.Forms.Shortcut.F7;
-			this.runFailedMenuItem.Text = "Run &Failed";
-			this.runFailedMenuItem.Click += new System.EventHandler(this.runFailedMenuItem_Click);
-			// 
-			// testMenuSeparator
-			// 
-			this.testMenuSeparator.Index = 3;
-			this.testMenuSeparator.Text = "-";
-			// 
-			// stopRunMenuItem
-			// 
-			this.stopRunMenuItem.Index = 4;
-			this.stopRunMenuItem.Text = "S&top Run";
-			this.stopRunMenuItem.Click += new System.EventHandler(this.stopRunMenuItem_Click);
-			// 
-			// toolsMenu
-			// 
-			this.toolsMenu.Index = 4;
-			this.toolsMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
-																					  this.assemblyDetailsMenuItem,
-																					  this.saveXmlResultsMenuItem,
-																					  this.exceptionDetailsMenuItem,
-																					  this.toolsMenuSeparator1,
-																					  this.optionsMenuItem,
-																					  this.toolsMenuSeparator2,
-																					  this.addinInfoMenuItem});
-			this.toolsMenu.Text = "T&ools";
-			this.toolsMenu.Popup += new System.EventHandler(this.toolsMenu_Popup);
-			// 
-			// assemblyDetailsMenuItem
-			// 
-			this.assemblyDetailsMenuItem.Index = 0;
-			this.assemblyDetailsMenuItem.Text = "&Assembly Details...";
-			this.assemblyDetailsMenuItem.Click += new System.EventHandler(this.assemblyDetailsMenuItem_Click);
-			// 
-			// saveXmlResultsMenuItem
-			// 
-			this.saveXmlResultsMenuItem.Index = 1;
-			this.saveXmlResultsMenuItem.Text = "&Save Results as XML...";
-			this.saveXmlResultsMenuItem.Click += new System.EventHandler(this.saveXmlResultsMenuItem_Click);
-			// 
-			// exceptionDetailsMenuItem
-			// 
-			this.exceptionDetailsMenuItem.Index = 2;
-			this.exceptionDetailsMenuItem.Text = "&Exception Details...";
-			this.exceptionDetailsMenuItem.Click += new System.EventHandler(this.exceptionDetailsMenuItem_Click);
-			// 
-			// toolsMenuSeparator1
-			// 
-			this.toolsMenuSeparator1.Index = 3;
-			this.toolsMenuSeparator1.Text = "-";
-			// 
-			// optionsMenuItem
-			// 
-			this.optionsMenuItem.Index = 4;
-			this.optionsMenuItem.Text = "&Options...";
-			this.optionsMenuItem.Click += new System.EventHandler(this.optionsMenuItem_Click);
-			// 
-			// toolsMenuSeparator2
-			// 
-			this.toolsMenuSeparator2.Index = 5;
-			this.toolsMenuSeparator2.Text = "-";
-			// 
-			// addinInfoMenuItem
-			// 
-			this.addinInfoMenuItem.Index = 6;
-			this.addinInfoMenuItem.Text = "Addins...";
-			this.addinInfoMenuItem.Click += new System.EventHandler(this.addinInfoMenuItem_Click);
-			// 
-			// helpItem
-			// 
-			this.helpItem.Index = 5;
-			this.helpItem.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
-																					 this.helpMenuItem,
-																					 this.helpMenuSeparator1,
-																					 this.aboutMenuItem});
-			this.helpItem.Text = "&Help";
-			// 
-			// helpMenuItem
-			// 
-			this.helpMenuItem.Index = 0;
-			this.helpMenuItem.Shortcut = System.Windows.Forms.Shortcut.F1;
-			this.helpMenuItem.Text = "NUnit &Help...";
-			this.helpMenuItem.Click += new System.EventHandler(this.helpMenuItem_Click);
-			// 
-			// helpMenuSeparator1
-			// 
-			this.helpMenuSeparator1.Index = 1;
-			this.helpMenuSeparator1.Text = "-";
-			// 
-			// aboutMenuItem
-			// 
-			this.aboutMenuItem.Index = 2;
-			this.aboutMenuItem.Text = "&About NUnit...";
-			this.aboutMenuItem.Click += new System.EventHandler(this.aboutMenuItem_Click);
-			// 
-			// treeSplitter
-			// 
-			this.treeSplitter.Location = new System.Drawing.Point(240, 0);
-			this.treeSplitter.MinSize = 240;
-			this.treeSplitter.Name = "treeSplitter";
-			this.treeSplitter.Size = new System.Drawing.Size(6, 407);
-			this.treeSplitter.TabIndex = 2;
-			this.treeSplitter.TabStop = false;
-			// 
-			// rightPanel
-			// 
-			this.rightPanel.BackColor = System.Drawing.SystemColors.Control;
-			this.rightPanel.Controls.Add(this.groupBox1);
-			this.rightPanel.Controls.Add(this.resultTabs);
-			this.rightPanel.Dock = System.Windows.Forms.DockStyle.Fill;
-			this.rightPanel.Location = new System.Drawing.Point(246, 0);
-			this.rightPanel.Name = "rightPanel";
-			this.rightPanel.Size = new System.Drawing.Size(498, 407);
-			this.rightPanel.TabIndex = 3;
-			// 
-			// groupBox1
-			// 
-			this.groupBox1.Controls.Add(this.runCount);
-			this.groupBox1.Controls.Add(this.stopButton);
-			this.groupBox1.Controls.Add(this.runButton);
-			this.groupBox1.Controls.Add(this.suiteName);
-			this.groupBox1.Controls.Add(this.progressBar);
-			this.groupBox1.Dock = System.Windows.Forms.DockStyle.Top;
-			this.groupBox1.Location = new System.Drawing.Point(0, 0);
-			this.groupBox1.Name = "groupBox1";
-			this.groupBox1.Size = new System.Drawing.Size(498, 120);
-			this.groupBox1.TabIndex = 0;
-			this.groupBox1.TabStop = false;
-			// 
-			// runCount
-			// 
-			this.runCount.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.runCount.Location = new System.Drawing.Point(8, 96);
-			this.runCount.Name = "runCount";
-			this.runCount.Size = new System.Drawing.Size(480, 16);
-			this.runCount.TabIndex = 5;
-			this.runCount.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
-			// 
-			// stopButton
-			// 
-			this.stopButton.Location = new System.Drawing.Point(96, 18);
-			this.stopButton.Name = "stopButton";
-			this.stopButton.Size = new System.Drawing.Size(96, 38);
-			this.stopButton.TabIndex = 4;
-			this.stopButton.Text = "&Stop";
-			this.stopButton.Click += new System.EventHandler(this.stopButton_Click);
-			// 
-			// runButton
-			// 
-			this.runButton.Location = new System.Drawing.Point(8, 18);
-			this.runButton.Name = "runButton";
-			this.runButton.Size = new System.Drawing.Size(88, 38);
-			this.runButton.TabIndex = 3;
-			this.runButton.Text = "&Run";
-			this.runButton.Click += new System.EventHandler(this.runButton_Click);
-			// 
-			// suiteName
-			// 
-			this.suiteName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.suiteName.Location = new System.Drawing.Point(215, 23);
-			this.suiteName.Name = "suiteName";
-			this.suiteName.Size = new System.Drawing.Size(273, 29);
-			this.suiteName.TabIndex = 2;
-			// 
-			// progressBar
-			// 
-			this.progressBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.progressBar.BackColor = System.Drawing.SystemColors.Control;
-			this.progressBar.CausesValidation = false;
-			this.progressBar.Enabled = false;
-			this.progressBar.ForeColor = System.Drawing.SystemColors.Highlight;
-			this.progressBar.Location = new System.Drawing.Point(8, 60);
-			this.progressBar.Maximum = 100;
-			this.progressBar.Minimum = 0;
-			this.progressBar.Name = "progressBar";
-			this.progressBar.Segmented = true;
-			this.progressBar.Size = new System.Drawing.Size(480, 28);
-			this.progressBar.Step = 1;
-			this.progressBar.TabIndex = 0;
-			this.progressBar.Value = 0;
-			// 
-			// resultTabs
-			// 
-			this.resultTabs.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
-				| System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.resultTabs.Location = new System.Drawing.Point(0, 120);
-			this.resultTabs.Name = "resultTabs";
-			this.resultTabs.Size = new System.Drawing.Size(498, 284);
-			this.resultTabs.TabIndex = 2;
-			// 
-			// testTree
-			// 
-			this.testTree.Dock = System.Windows.Forms.DockStyle.Fill;
-			this.testTree.Location = new System.Drawing.Point(0, 0);
-			this.testTree.Name = "testTree";
-			this.testTree.ShowCheckBoxes = false;
-			this.testTree.Size = new System.Drawing.Size(240, 407);
-			this.testTree.TabIndex = 0;
-			this.testTree.SelectedTestsChanged += new NUnit.UiKit.SelectedTestsChangedEventHandler(this.testTree_SelectedTestsChanged);
-			// 
-			// leftPanel
-			// 
-			this.leftPanel.Controls.Add(this.testTree);
-			this.leftPanel.Dock = System.Windows.Forms.DockStyle.Left;
-			this.leftPanel.Location = new System.Drawing.Point(0, 0);
-			this.leftPanel.Name = "leftPanel";
-			this.leftPanel.Size = new System.Drawing.Size(240, 407);
-			this.leftPanel.TabIndex = 4;
-			// 
-			// NUnitForm
-			// 
-			this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);
-			this.ClientSize = new System.Drawing.Size(744, 431);
-			this.Controls.Add(this.rightPanel);
-			this.Controls.Add(this.treeSplitter);
-			this.Controls.Add(this.leftPanel);
-			this.Controls.Add(this.statusBar);
-			this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
-			this.Menu = this.mainMenu;
-			this.MinimumSize = new System.Drawing.Size(160, 32);
-			this.Name = "NUnitForm";
-			this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
-			this.Text = "NUnit";
-			this.Closing += new System.ComponentModel.CancelEventHandler(this.NUnitForm_Closing);
-			this.Load += new System.EventHandler(this.NUnitForm_Load);
-			this.rightPanel.ResumeLayout(false);
-			this.groupBox1.ResumeLayout(false);
-			this.leftPanel.ResumeLayout(false);
-			this.ResumeLayout(false);
+            this.components = new System.ComponentModel.Container();
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(NUnitForm));
+            this.statusBar = new NUnit.UiKit.StatusBar();
+            this.mainMenu = new System.Windows.Forms.MainMenu(this.components);
+            this.fileMenu = new System.Windows.Forms.MenuItem();
+            this.newMenuItem = new System.Windows.Forms.MenuItem();
+            this.openMenuItem = new System.Windows.Forms.MenuItem();
+            this.closeMenuItem = new System.Windows.Forms.MenuItem();
+            this.fileMenuSeparator1 = new System.Windows.Forms.MenuItem();
+            this.saveMenuItem = new System.Windows.Forms.MenuItem();
+            this.saveAsMenuItem = new System.Windows.Forms.MenuItem();
+            this.fileMenuSeparator2 = new System.Windows.Forms.MenuItem();
+            this.reloadProjectMenuItem = new System.Windows.Forms.MenuItem();
+            this.reloadTestsMenuItem = new System.Windows.Forms.MenuItem();
+            this.runtimeMenuItem = new System.Windows.Forms.MenuItem();
+            this.menuItem2 = new System.Windows.Forms.MenuItem();
+            this.recentProjectsMenu = new System.Windows.Forms.MenuItem();
+            this.fileMenuSeparator4 = new System.Windows.Forms.MenuItem();
+            this.exitMenuItem = new System.Windows.Forms.MenuItem();
+            this.viewMenu = new System.Windows.Forms.MenuItem();
+            this.fullGuiMenuItem = new System.Windows.Forms.MenuItem();
+            this.miniGuiMenuItem = new System.Windows.Forms.MenuItem();
+            this.viewMenuSeparator1 = new System.Windows.Forms.MenuItem();
+            this.viewMenuSeparator2 = new System.Windows.Forms.MenuItem();
+            this.guiFontMenuItem = new System.Windows.Forms.MenuItem();
+            this.increaseFontMenuItem = new System.Windows.Forms.MenuItem();
+            this.decreaseFontMenuItem = new System.Windows.Forms.MenuItem();
+            this.fontMenuSeparator = new System.Windows.Forms.MenuItem();
+            this.fontChangeMenuItem = new System.Windows.Forms.MenuItem();
+            this.defaultFontMenuItem = new System.Windows.Forms.MenuItem();
+            this.fixedFontMenuItem = new System.Windows.Forms.MenuItem();
+            this.increaseFixedFontMenuItem = new System.Windows.Forms.MenuItem();
+            this.decreaseFixedFontMenuItem = new System.Windows.Forms.MenuItem();
+            this.menuItem1 = new System.Windows.Forms.MenuItem();
+            this.restoreFixedFontMenuItem = new System.Windows.Forms.MenuItem();
+            this.viewMenuSeparator3 = new System.Windows.Forms.MenuItem();
+            this.statusBarMenuItem = new System.Windows.Forms.MenuItem();
+            this.projectMenu = new System.Windows.Forms.MenuItem();
+            this.configMenuItem = new System.Windows.Forms.MenuItem();
+            this.projectMenuSeparator1 = new System.Windows.Forms.MenuItem();
+            this.addAssemblyMenuItem = new System.Windows.Forms.MenuItem();
+            this.addVSProjectMenuItem = new System.Windows.Forms.MenuItem();
+            this.projectMenuSeparator2 = new System.Windows.Forms.MenuItem();
+            this.editProjectMenuItem = new System.Windows.Forms.MenuItem();
+            this.testMenu = new System.Windows.Forms.MenuItem();
+            this.runAllMenuItem = new System.Windows.Forms.MenuItem();
+            this.runSelectedMenuItem = new System.Windows.Forms.MenuItem();
+            this.runFailedMenuItem = new System.Windows.Forms.MenuItem();
+            this.testMenuSeparator = new System.Windows.Forms.MenuItem();
+            this.stopRunMenuItem = new System.Windows.Forms.MenuItem();
+            this.toolsMenu = new System.Windows.Forms.MenuItem();
+            this.assemblyDetailsMenuItem = new System.Windows.Forms.MenuItem();
+            this.saveXmlResultsMenuItem = new System.Windows.Forms.MenuItem();
+            this.exceptionDetailsMenuItem = new System.Windows.Forms.MenuItem();
+            this.toolsMenuSeparator1 = new System.Windows.Forms.MenuItem();
+            this.settingsMenuItem = new System.Windows.Forms.MenuItem();
+            this.toolsMenuSeparator2 = new System.Windows.Forms.MenuItem();
+            this.addinInfoMenuItem = new System.Windows.Forms.MenuItem();
+            this.helpItem = new System.Windows.Forms.MenuItem();
+            this.helpMenuItem = new System.Windows.Forms.MenuItem();
+            this.helpMenuSeparator1 = new System.Windows.Forms.MenuItem();
+            this.aboutMenuItem = new System.Windows.Forms.MenuItem();
+            this.treeSplitter = new System.Windows.Forms.Splitter();
+            this.rightPanel = new System.Windows.Forms.Panel();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.runCount = new System.Windows.Forms.Label();
+            this.stopButton = new System.Windows.Forms.Button();
+            this.runButton = new System.Windows.Forms.Button();
+            this.suiteName = new System.Windows.Forms.Label();
+            this.progressBar = new NUnit.UiKit.TestProgressBar();
+            this.resultTabs = new NUnit.UiKit.ResultTabs();
+            this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+            this.testTree = new NUnit.UiKit.TestTree();
+            this.leftPanel = new System.Windows.Forms.Panel();
+            this.rightPanel.SuspendLayout();
+            this.groupBox1.SuspendLayout();
+            this.leftPanel.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // statusBar
+            // 
+            this.statusBar.DisplayTestProgress = true;
+            this.statusBar.Location = new System.Drawing.Point(0, 407);
+            this.statusBar.Name = "statusBar";
+            this.statusBar.ShowPanels = true;
+            this.statusBar.Size = new System.Drawing.Size(744, 24);
+            this.statusBar.TabIndex = 0;
+            this.statusBar.Text = "Status";
+            // 
+            // mainMenu
+            // 
+            this.mainMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+            this.fileMenu,
+            this.viewMenu,
+            this.projectMenu,
+            this.testMenu,
+            this.toolsMenu,
+            this.helpItem});
+            // 
+            // fileMenu
+            // 
+            this.fileMenu.Index = 0;
+            this.fileMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+            this.newMenuItem,
+            this.openMenuItem,
+            this.closeMenuItem,
+            this.fileMenuSeparator1,
+            this.saveMenuItem,
+            this.saveAsMenuItem,
+            this.fileMenuSeparator2,
+            this.reloadProjectMenuItem,
+            this.reloadTestsMenuItem,
+            this.runtimeMenuItem,
+            this.menuItem2,
+            this.recentProjectsMenu,
+            this.fileMenuSeparator4,
+            this.exitMenuItem});
+            this.fileMenu.Text = "&File";
+            this.fileMenu.Popup += new System.EventHandler(this.fileMenu_Popup);
+            // 
+            // newMenuItem
+            // 
+            this.newMenuItem.Index = 0;
+            this.newMenuItem.Shortcut = System.Windows.Forms.Shortcut.CtrlN;
+            this.newMenuItem.Text = "&New Project...";
+            this.newMenuItem.Click += new System.EventHandler(this.newMenuItem_Click);
+            // 
+            // openMenuItem
+            // 
+            this.openMenuItem.Index = 1;
+            this.openMenuItem.Shortcut = System.Windows.Forms.Shortcut.CtrlO;
+            this.openMenuItem.Text = "&Open Project...";
+            this.openMenuItem.Click += new System.EventHandler(this.openMenuItem_Click);
+            // 
+            // closeMenuItem
+            // 
+            this.closeMenuItem.Index = 2;
+            this.closeMenuItem.Text = "&Close";
+            this.closeMenuItem.Click += new System.EventHandler(this.closeMenuItem_Click);
+            // 
+            // fileMenuSeparator1
+            // 
+            this.fileMenuSeparator1.Index = 3;
+            this.fileMenuSeparator1.Text = "-";
+            // 
+            // saveMenuItem
+            // 
+            this.saveMenuItem.Index = 4;
+            this.saveMenuItem.Shortcut = System.Windows.Forms.Shortcut.CtrlS;
+            this.saveMenuItem.Text = "&Save";
+            this.saveMenuItem.Click += new System.EventHandler(this.saveMenuItem_Click);
+            // 
+            // saveAsMenuItem
+            // 
+            this.saveAsMenuItem.Index = 5;
+            this.saveAsMenuItem.Text = "Save &As...";
+            this.saveAsMenuItem.Click += new System.EventHandler(this.saveAsMenuItem_Click);
+            // 
+            // fileMenuSeparator2
+            // 
+            this.fileMenuSeparator2.Index = 6;
+            this.fileMenuSeparator2.Text = "-";
+            // 
+            // reloadProjectMenuItem
+            // 
+            this.reloadProjectMenuItem.Index = 7;
+            this.reloadProjectMenuItem.Shortcut = System.Windows.Forms.Shortcut.CtrlL;
+            this.reloadProjectMenuItem.Text = "Re&load Project";
+            this.reloadProjectMenuItem.Click += new System.EventHandler(this.reloadProjectMenuItem_Click);
+            // 
+            // reloadTestsMenuItem
+            // 
+            this.reloadTestsMenuItem.Index = 8;
+            this.reloadTestsMenuItem.Shortcut = System.Windows.Forms.Shortcut.CtrlR;
+            this.reloadTestsMenuItem.Text = "&Reload Tests";
+            this.reloadTestsMenuItem.Click += new System.EventHandler(this.reloadTestsMenuItem_Click);
+            // 
+            // runtimeMenuItem
+            // 
+            this.runtimeMenuItem.Index = 9;
+            this.runtimeMenuItem.Text = "  Select R&untime";
+            // 
+            // menuItem2
+            // 
+            this.menuItem2.Index = 10;
+            this.menuItem2.Text = "-";
+            // 
+            // recentProjectsMenu
+            // 
+            this.recentProjectsMenu.Index = 11;
+            this.recentProjectsMenu.Text = "Recent &Projects";
+            // 
+            // fileMenuSeparator4
+            // 
+            this.fileMenuSeparator4.Index = 12;
+            this.fileMenuSeparator4.Text = "-";
+            // 
+            // exitMenuItem
+            // 
+            this.exitMenuItem.Index = 13;
+            this.exitMenuItem.Text = "E&xit";
+            this.exitMenuItem.Click += new System.EventHandler(this.exitMenuItem_Click);
+            // 
+            // viewMenu
+            // 
+            this.viewMenu.Index = 1;
+            this.viewMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+            this.fullGuiMenuItem,
+            this.miniGuiMenuItem,
+            this.viewMenuSeparator1,
+            this.viewMenuSeparator2,
+            this.guiFontMenuItem,
+            this.fixedFontMenuItem,
+            this.viewMenuSeparator3,
+            this.statusBarMenuItem});
+            this.viewMenu.Text = "&View";
+            this.viewMenu.Popup += new System.EventHandler(this.viewMenu_Popup);
+            // 
+            // fullGuiMenuItem
+            // 
+            this.fullGuiMenuItem.Checked = true;
+            this.fullGuiMenuItem.Index = 0;
+            this.fullGuiMenuItem.RadioCheck = true;
+            this.fullGuiMenuItem.Text = "&Full GUI";
+            this.fullGuiMenuItem.Click += new System.EventHandler(this.fullGuiMenuItem_Click);
+            // 
+            // miniGuiMenuItem
+            // 
+            this.miniGuiMenuItem.Index = 1;
+            this.miniGuiMenuItem.RadioCheck = true;
+            this.miniGuiMenuItem.Text = "&Mini GUI";
+            this.miniGuiMenuItem.Click += new System.EventHandler(this.miniGuiMenuItem_Click);
+            // 
+            // viewMenuSeparator1
+            // 
+            this.viewMenuSeparator1.Index = 2;
+            this.viewMenuSeparator1.Text = "-";
+            // 
+            // viewMenuSeparator2
+            // 
+            this.viewMenuSeparator2.Index = 3;
+            this.viewMenuSeparator2.Text = "-";
+            // 
+            // guiFontMenuItem
+            // 
+            this.guiFontMenuItem.Index = 4;
+            this.guiFontMenuItem.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+            this.increaseFontMenuItem,
+            this.decreaseFontMenuItem,
+            this.fontMenuSeparator,
+            this.fontChangeMenuItem,
+            this.defaultFontMenuItem});
+            this.guiFontMenuItem.Text = "GUI Fo&nt";
+            // 
+            // increaseFontMenuItem
+            // 
+            this.increaseFontMenuItem.Index = 0;
+            this.increaseFontMenuItem.Text = "&Increase";
+            this.increaseFontMenuItem.Click += new System.EventHandler(this.increaseFontMenuItem_Click);
+            // 
+            // decreaseFontMenuItem
+            // 
+            this.decreaseFontMenuItem.Index = 1;
+            this.decreaseFontMenuItem.Text = "&Decrease";
+            this.decreaseFontMenuItem.Click += new System.EventHandler(this.decreaseFontMenuItem_Click);
+            // 
+            // fontMenuSeparator
+            // 
+            this.fontMenuSeparator.Index = 2;
+            this.fontMenuSeparator.Text = "-";
+            // 
+            // fontChangeMenuItem
+            // 
+            this.fontChangeMenuItem.Index = 3;
+            this.fontChangeMenuItem.Text = "&Change...";
+            this.fontChangeMenuItem.Click += new System.EventHandler(this.fontChangeMenuItem_Click);
+            // 
+            // defaultFontMenuItem
+            // 
+            this.defaultFontMenuItem.Index = 4;
+            this.defaultFontMenuItem.Text = "&Restore";
+            this.defaultFontMenuItem.Click += new System.EventHandler(this.defaultFontMenuItem_Click);
+            // 
+            // fixedFontMenuItem
+            // 
+            this.fixedFontMenuItem.Index = 5;
+            this.fixedFontMenuItem.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+            this.increaseFixedFontMenuItem,
+            this.decreaseFixedFontMenuItem,
+            this.menuItem1,
+            this.restoreFixedFontMenuItem});
+            this.fixedFontMenuItem.Text = "Fi&xed Font";
+            // 
+            // increaseFixedFontMenuItem
+            // 
+            this.increaseFixedFontMenuItem.Index = 0;
+            this.increaseFixedFontMenuItem.Text = "&Increase";
+            this.increaseFixedFontMenuItem.Click += new System.EventHandler(this.increaseFixedFontMenuItem_Click);
+            // 
+            // decreaseFixedFontMenuItem
+            // 
+            this.decreaseFixedFontMenuItem.Index = 1;
+            this.decreaseFixedFontMenuItem.Text = "&Decrease";
+            this.decreaseFixedFontMenuItem.Click += new System.EventHandler(this.decreaseFixedFontMenuItem_Click);
+            // 
+            // menuItem1
+            // 
+            this.menuItem1.Index = 2;
+            this.menuItem1.Text = "-";
+            // 
+            // restoreFixedFontMenuItem
+            // 
+            this.restoreFixedFontMenuItem.Index = 3;
+            this.restoreFixedFontMenuItem.Text = "&Restore";
+            this.restoreFixedFontMenuItem.Click += new System.EventHandler(this.restoreFixedFontMenuItem_Click);
+            // 
+            // viewMenuSeparator3
+            // 
+            this.viewMenuSeparator3.Index = 6;
+            this.viewMenuSeparator3.Text = "-";
+            // 
+            // statusBarMenuItem
+            // 
+            this.statusBarMenuItem.Checked = true;
+            this.statusBarMenuItem.Index = 7;
+            this.statusBarMenuItem.Text = "&Status Bar";
+            this.statusBarMenuItem.Click += new System.EventHandler(this.statusBarMenuItem_Click);
+            // 
+            // projectMenu
+            // 
+            this.projectMenu.Index = 2;
+            this.projectMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+            this.configMenuItem,
+            this.projectMenuSeparator1,
+            this.addAssemblyMenuItem,
+            this.addVSProjectMenuItem,
+            this.projectMenuSeparator2,
+            this.editProjectMenuItem});
+            this.projectMenu.Text = "&Project";
+            this.projectMenu.Visible = false;
+            this.projectMenu.Popup += new System.EventHandler(this.projectMenu_Popup);
+            // 
+            // configMenuItem
+            // 
+            this.configMenuItem.Index = 0;
+            this.configMenuItem.Text = "&Configurations";
+            // 
+            // projectMenuSeparator1
+            // 
+            this.projectMenuSeparator1.Index = 1;
+            this.projectMenuSeparator1.Text = "-";
+            // 
+            // addAssemblyMenuItem
+            // 
+            this.addAssemblyMenuItem.Index = 2;
+            this.addAssemblyMenuItem.Text = "Add Assembly...";
+            this.addAssemblyMenuItem.Click += new System.EventHandler(this.addAssemblyMenuItem_Click);
+            // 
+            // addVSProjectMenuItem
+            // 
+            this.addVSProjectMenuItem.Index = 3;
+            this.addVSProjectMenuItem.Text = "Add VS Project...";
+            this.addVSProjectMenuItem.Click += new System.EventHandler(this.addVSProjectMenuItem_Click);
+            // 
+            // projectMenuSeparator2
+            // 
+            this.projectMenuSeparator2.Index = 4;
+            this.projectMenuSeparator2.Text = "-";
+            // 
+            // editProjectMenuItem
+            // 
+            this.editProjectMenuItem.Index = 5;
+            this.editProjectMenuItem.Text = "Edit...";
+            this.editProjectMenuItem.Click += new System.EventHandler(this.editProjectMenuItem_Click);
+            // 
+            // testMenu
+            // 
+            this.testMenu.Index = 3;
+            this.testMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+            this.runAllMenuItem,
+            this.runSelectedMenuItem,
+            this.runFailedMenuItem,
+            this.testMenuSeparator,
+            this.stopRunMenuItem});
+            this.testMenu.Text = "&Test";
+            // 
+            // runAllMenuItem
+            // 
+            this.runAllMenuItem.Index = 0;
+            this.runAllMenuItem.Shortcut = System.Windows.Forms.Shortcut.F5;
+            this.runAllMenuItem.Text = "&Run All";
+            this.runAllMenuItem.Click += new System.EventHandler(this.runAllMenuItem_Click);
+            // 
+            // runSelectedMenuItem
+            // 
+            this.runSelectedMenuItem.Index = 1;
+            this.runSelectedMenuItem.Shortcut = System.Windows.Forms.Shortcut.F6;
+            this.runSelectedMenuItem.Text = "Run &Selected";
+            this.runSelectedMenuItem.Click += new System.EventHandler(this.runSelectedMenuItem_Click);
+            // 
+            // runFailedMenuItem
+            // 
+            this.runFailedMenuItem.Enabled = false;
+            this.runFailedMenuItem.Index = 2;
+            this.runFailedMenuItem.Shortcut = System.Windows.Forms.Shortcut.F7;
+            this.runFailedMenuItem.Text = "Run &Failed";
+            this.runFailedMenuItem.Click += new System.EventHandler(this.runFailedMenuItem_Click);
+            // 
+            // testMenuSeparator
+            // 
+            this.testMenuSeparator.Index = 3;
+            this.testMenuSeparator.Text = "-";
+            // 
+            // stopRunMenuItem
+            // 
+            this.stopRunMenuItem.Index = 4;
+            this.stopRunMenuItem.Text = "S&top Run";
+            this.stopRunMenuItem.Click += new System.EventHandler(this.stopRunMenuItem_Click);
+            // 
+            // toolsMenu
+            // 
+            this.toolsMenu.Index = 4;
+            this.toolsMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+            this.assemblyDetailsMenuItem,
+            this.saveXmlResultsMenuItem,
+            this.exceptionDetailsMenuItem,
+            this.toolsMenuSeparator1,
+            this.settingsMenuItem,
+            this.toolsMenuSeparator2,
+            this.addinInfoMenuItem});
+            this.toolsMenu.Text = "T&ools";
+            this.toolsMenu.Popup += new System.EventHandler(this.toolsMenu_Popup);
+            // 
+            // assemblyDetailsMenuItem
+            // 
+            this.assemblyDetailsMenuItem.Index = 0;
+            this.assemblyDetailsMenuItem.Text = "&Test Assemblies...";
+            this.assemblyDetailsMenuItem.Click += new System.EventHandler(this.assemblyDetailsMenuItem_Click);
+            // 
+            // saveXmlResultsMenuItem
+            // 
+            this.saveXmlResultsMenuItem.Index = 1;
+            this.saveXmlResultsMenuItem.Text = "&Save Results as XML...";
+            this.saveXmlResultsMenuItem.Click += new System.EventHandler(this.saveXmlResultsMenuItem_Click);
+            // 
+            // exceptionDetailsMenuItem
+            // 
+            this.exceptionDetailsMenuItem.Index = 2;
+            this.exceptionDetailsMenuItem.Text = "&Exception Details...";
+            this.exceptionDetailsMenuItem.Click += new System.EventHandler(this.exceptionDetailsMenuItem_Click);
+            // 
+            // toolsMenuSeparator1
+            // 
+            this.toolsMenuSeparator1.Index = 3;
+            this.toolsMenuSeparator1.Text = "-";
+            // 
+            // settingsMenuItem
+            // 
+            this.settingsMenuItem.Index = 4;
+            this.settingsMenuItem.Text = "&Settings...";
+            this.settingsMenuItem.Click += new System.EventHandler(this.settingsMenuItem_Click);
+            // 
+            // toolsMenuSeparator2
+            // 
+            this.toolsMenuSeparator2.Index = 5;
+            this.toolsMenuSeparator2.Text = "-";
+            // 
+            // addinInfoMenuItem
+            // 
+            this.addinInfoMenuItem.Index = 6;
+            this.addinInfoMenuItem.Text = "Addins...";
+            this.addinInfoMenuItem.Click += new System.EventHandler(this.addinInfoMenuItem_Click);
+            // 
+            // helpItem
+            // 
+            this.helpItem.Index = 5;
+            this.helpItem.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+            this.helpMenuItem,
+            this.helpMenuSeparator1,
+            this.aboutMenuItem});
+            this.helpItem.Text = "&Help";
+            // 
+            // helpMenuItem
+            // 
+            this.helpMenuItem.Index = 0;
+            this.helpMenuItem.Shortcut = System.Windows.Forms.Shortcut.F1;
+            this.helpMenuItem.Text = "NUnit &Help...";
+            this.helpMenuItem.Click += new System.EventHandler(this.helpMenuItem_Click);
+            // 
+            // helpMenuSeparator1
+            // 
+            this.helpMenuSeparator1.Index = 1;
+            this.helpMenuSeparator1.Text = "-";
+            // 
+            // aboutMenuItem
+            // 
+            this.aboutMenuItem.Index = 2;
+            this.aboutMenuItem.Text = "&About NUnit...";
+            this.aboutMenuItem.Click += new System.EventHandler(this.aboutMenuItem_Click);
+            // 
+            // treeSplitter
+            // 
+            this.treeSplitter.Location = new System.Drawing.Point(240, 0);
+            this.treeSplitter.MinSize = 240;
+            this.treeSplitter.Name = "treeSplitter";
+            this.treeSplitter.Size = new System.Drawing.Size(6, 407);
+            this.treeSplitter.TabIndex = 2;
+            this.treeSplitter.TabStop = false;
+            // 
+            // rightPanel
+            // 
+            this.rightPanel.BackColor = System.Drawing.SystemColors.Control;
+            this.rightPanel.Controls.Add(this.groupBox1);
+            this.rightPanel.Controls.Add(this.resultTabs);
+            this.rightPanel.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.rightPanel.Location = new System.Drawing.Point(246, 0);
+            this.rightPanel.Name = "rightPanel";
+            this.rightPanel.Size = new System.Drawing.Size(498, 407);
+            this.rightPanel.TabIndex = 3;
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Controls.Add(this.runCount);
+            this.groupBox1.Controls.Add(this.stopButton);
+            this.groupBox1.Controls.Add(this.runButton);
+            this.groupBox1.Controls.Add(this.suiteName);
+            this.groupBox1.Controls.Add(this.progressBar);
+            this.groupBox1.Dock = System.Windows.Forms.DockStyle.Top;
+            this.groupBox1.Location = new System.Drawing.Point(0, 0);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(498, 120);
+            this.groupBox1.TabIndex = 0;
+            this.groupBox1.TabStop = false;
+            // 
+            // runCount
+            // 
+            this.runCount.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.runCount.Location = new System.Drawing.Point(8, 96);
+            this.runCount.Name = "runCount";
+            this.runCount.Size = new System.Drawing.Size(480, 16);
+            this.runCount.TabIndex = 5;
+            this.runCount.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+            // 
+            // stopButton
+            // 
+            this.stopButton.Location = new System.Drawing.Point(96, 18);
+            this.stopButton.Name = "stopButton";
+            this.stopButton.Size = new System.Drawing.Size(96, 38);
+            this.stopButton.TabIndex = 4;
+            this.stopButton.Text = "&Stop";
+            this.stopButton.Click += new System.EventHandler(this.stopButton_Click);
+            // 
+            // runButton
+            // 
+            this.runButton.Location = new System.Drawing.Point(8, 18);
+            this.runButton.Name = "runButton";
+            this.runButton.Size = new System.Drawing.Size(88, 38);
+            this.runButton.TabIndex = 3;
+            this.runButton.Text = "&Run";
+            this.runButton.Click += new System.EventHandler(this.runButton_Click);
+            // 
+            // suiteName
+            // 
+            this.suiteName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.suiteName.Location = new System.Drawing.Point(215, 23);
+            this.suiteName.Name = "suiteName";
+            this.suiteName.Size = new System.Drawing.Size(273, 29);
+            this.suiteName.TabIndex = 2;
+            // 
+            // progressBar
+            // 
+            this.progressBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.progressBar.BackColor = System.Drawing.SystemColors.Control;
+            this.progressBar.CausesValidation = false;
+            this.progressBar.Enabled = false;
+            this.progressBar.ForeColor = System.Drawing.SystemColors.Highlight;
+            this.progressBar.Location = new System.Drawing.Point(8, 60);
+            this.progressBar.Maximum = 100;
+            this.progressBar.Minimum = 0;
+            this.progressBar.Name = "progressBar";
+            this.progressBar.Segmented = true;
+            this.progressBar.Size = new System.Drawing.Size(480, 28);
+            this.progressBar.Step = 1;
+            this.progressBar.TabIndex = 0;
+            this.progressBar.Value = 0;
+            // 
+            // resultTabs
+            // 
+            this.resultTabs.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                        | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.resultTabs.Location = new System.Drawing.Point(0, 120);
+            this.resultTabs.Name = "resultTabs";
+            this.resultTabs.Size = new System.Drawing.Size(498, 284);
+            this.resultTabs.TabIndex = 2;
+            // 
+            // testTree
+            // 
+            this.testTree.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.testTree.Location = new System.Drawing.Point(0, 0);
+            this.testTree.Name = "testTree";
+            this.testTree.ShowCheckBoxes = false;
+            this.testTree.Size = new System.Drawing.Size(240, 407);
+            this.testTree.TabIndex = 0;
+            this.testTree.SelectedTestsChanged += new NUnit.UiKit.SelectedTestsChangedEventHandler(this.testTree_SelectedTestsChanged);
+            // 
+            // leftPanel
+            // 
+            this.leftPanel.Controls.Add(this.testTree);
+            this.leftPanel.Dock = System.Windows.Forms.DockStyle.Left;
+            this.leftPanel.Location = new System.Drawing.Point(0, 0);
+            this.leftPanel.Name = "leftPanel";
+            this.leftPanel.Size = new System.Drawing.Size(240, 407);
+            this.leftPanel.TabIndex = 4;
+            // 
+            // NUnitForm
+            // 
+            this.ClientSize = new System.Drawing.Size(744, 431);
+            this.Controls.Add(this.rightPanel);
+            this.Controls.Add(this.treeSplitter);
+            this.Controls.Add(this.leftPanel);
+            this.Controls.Add(this.statusBar);
+            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+            this.Menu = this.mainMenu;
+            this.MinimumSize = new System.Drawing.Size(160, 32);
+            this.Name = "NUnitForm";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
+            this.Text = "NUnit";
+            this.Load += new System.EventHandler(this.NUnitForm_Load);
+            this.Closing += new System.ComponentModel.CancelEventHandler(this.NUnitForm_Closing);
+            this.rightPanel.ResumeLayout(false);
+            this.groupBox1.ResumeLayout(false);
+            this.leftPanel.ResumeLayout(false);
+            this.ResumeLayout(false);
 
 		}
 
@@ -844,8 +852,31 @@ namespace NUnit.Gui
 			saveAsMenuItem.Enabled = IsProjectLoaded;
 
 			reloadTestsMenuItem.Enabled = IsTestLoaded && !IsTestRunning;
-			reloadProjectMenuItem.Enabled = IsProjectLoaded && !IsTestRunning;
-			
+            reloadProjectMenuItem.Enabled = runtimeMenuItem.Enabled = 
+                IsProjectLoaded && 
+                File.Exists(TestProject.ProjectPath) &&
+                !IsTestRunning;
+
+            RuntimeFramework current = TestLoader.CurrentFramework;
+            RuntimeFramework[] frameworks = RuntimeFramework.AvailableFrameworks;
+
+            runtimeMenuItem.Visible = frameworks.Length > 1;
+
+            if (runtimeMenuItem.Visible && runtimeMenuItem.Enabled)
+            {
+                runtimeMenuItem.MenuItems.Clear();
+
+                foreach (RuntimeFramework framework in frameworks)
+                {
+                    MenuItem item = new MenuItem(framework.DisplayName);
+                    item.Checked = current.Matches(framework);
+                    item.Tag = framework;
+                    item.Click += new EventHandler(runtimeFrameworkMenuItem_Click);
+                    item.Enabled = NUnitConfiguration.GetNUnitBinDirectory(framework.ClrVersion) != null;
+                    runtimeMenuItem.MenuItems.Add(item);
+                }
+            }
+
 			recentProjectsMenu.Enabled = !IsTestRunning;
 
 			if ( !IsTestRunning )
@@ -880,14 +911,27 @@ namespace NUnit.Gui
 		private void saveAsMenuItem_Click(object sender, System.EventArgs e)
 		{
 			TestLoaderUI.SaveProjectAs( this );
+            SetTitleBar(TestProject.Name);
 		}
 
+        private void runtimeFrameworkMenuItem_Click(object sender, System.EventArgs e)
+        {
+            TestLoader.ReloadTest(((MenuItem)sender).Tag as RuntimeFramework);
+        }
+
 		private void reloadProjectMenuItem_Click(object sender, System.EventArgs e)
 		{
-			if ( TestProject.IsAssemblyWrapper )
-				TestLoaderUI.OpenProject( this, TestProject.ProjectPath );
+            bool wrapper = TestProject.IsAssemblyWrapper;
+            string projectPath = TestProject.ProjectPath;
+            string activeConfigName = TestProject.ActiveConfigName;
+
+            // Unload first to avoid message asking about saving
+            TestLoader.UnloadProject();
+
+			if ( wrapper )
+				TestLoaderUI.OpenProject( this, projectPath );
 			else
-				TestLoaderUI.OpenProject( this, TestProject.ProjectPath, TestProject.ActiveConfigName, null );
+				TestLoaderUI.OpenProject( this, projectPath, activeConfigName, null );
 		}
 
 		private void reloadTestsMenuItem_Click(object sender, System.EventArgs e)
@@ -961,14 +1005,15 @@ namespace NUnit.Gui
 			this.displayFormat = "Full";
 			userSettings.SaveSetting( "Gui.DisplayFormat", "Full" );
 
-			this.Controls.Clear();
-			leftPanel.Dock = DockStyle.Left;
-			this.Controls.Add( rightPanel );
-			this.Controls.Add( treeSplitter );
-			this.Controls.Add( leftPanel );
-			this.Controls.Add( statusBar );
+            this.leftPanel.Visible = true;
+            this.leftPanel.Dock = DockStyle.Left;
+            this.treeSplitter.Visible = true;
+            this.rightPanel.Visible = true;
+            this.statusBar.Visible = true;
+
+            resultTabs.TabsMenu.Visible = true;
 
-			int x = userSettings.GetSetting( "Gui.MainForm.Left", 10 );
+            int x = userSettings.GetSetting("Gui.MainForm.Left", 10);
 			int y = userSettings.GetSetting( "Gui.MainForm.Top", 10 );
 			Point location = new Point( x, y );
 
@@ -987,13 +1032,8 @@ namespace NUnit.Gui
 				this.WindowState = FormWindowState.Maximized;
 
 			// Set the font to use
-			string fontDescription = userSettings.GetSetting( "Gui.MainForm.Font", "" );
-			if ( fontDescription != "" )
-			{
-				TypeConverter converter = TypeDescriptor.GetConverter(typeof(Font));
-				applyFont( (Font)converter.ConvertFrom(fontDescription) );
-			}
-		}
+            applyFont(userSettings.GetSetting("Gui.MainForm.Font", Form.DefaultFont));
+        }
 
 		private void displayMiniGui()
 		{
@@ -1003,12 +1043,15 @@ namespace NUnit.Gui
 			this.displayFormat = "Mini";
 			userSettings.SaveSetting( "Gui.DisplayFormat", "Mini" );
 
-			this.Controls.Remove( statusBar );
-			this.Controls.Remove( rightPanel );
-			this.Controls.Remove( treeSplitter );
-			leftPanel.Dock = DockStyle.Fill;
+            this.leftPanel.Visible = true;
+            this.leftPanel.Dock = DockStyle.Fill;
+            this.treeSplitter.Visible = false;
+            this.rightPanel.Visible = false;
+            this.statusBar.Visible = false;
+
+            resultTabs.TabsMenu.Visible = false;
 
-			int x = userSettings.GetSetting( "Gui.MiniForm.Left", 10 );
+            int x = userSettings.GetSetting("Gui.MiniForm.Left", 10);
 			int y = userSettings.GetSetting( "Gui.MiniForm.Top", 10 );
 			Point location = new Point( x, y );
 
@@ -1023,12 +1066,7 @@ namespace NUnit.Gui
 			this.Size = new Size( width, height );
 
 			// Set the font to use
-			string fontDescription = userSettings.GetSetting( "Gui.MiniForm.Font", "" );
-			if ( fontDescription != "" )
-			{
-				TypeConverter converter = TypeDescriptor.GetConverter(typeof(Font));
-				applyFont( (Font)converter.ConvertFrom(fontDescription) );
-			}
+            applyFont(userSettings.GetSetting("Gui.MiniForm.Font", Form.DefaultFont));
 		}
 
 		private void increaseFontMenuItem_Click(object sender, System.EventArgs e)
@@ -1050,7 +1088,7 @@ namespace NUnit.Gui
 			TypeConverter converter = TypeDescriptor.GetConverter(typeof(Font));
 			userSettings.SaveSetting( 
 				displayFormat == "Mini" ? "Gui.MiniForm.Font" : "Gui.MainForm.Font", 
-				converter.ConvertToString( font ) );
+				converter.ConvertToString( null, CultureInfo.InvariantCulture, font ) );
 		}
 
 		private void increaseFixedFontMenuItem_Click(object sender, System.EventArgs e)
@@ -1065,14 +1103,14 @@ namespace NUnit.Gui
 
 		private void restoreFixedFontMenuItem_Click(object sender, System.EventArgs e)
 		{
-			applyFixedFont( new Font( "Courier New", 8.0f ) );
+			applyFixedFont( new Font( FontFamily.GenericMonospace, 8.0f ) );
 		}
 
 		private void applyFixedFont( Font font )
 		{
 			this.fixedFont = font;
 			TypeConverter converter = TypeDescriptor.GetConverter(typeof(Font));
-			userSettings.SaveSetting( "Gui.FixedFont", converter.ConvertToString( font ) );
+			userSettings.SaveSetting( "Gui.FixedFont", converter.ConvertToString( null, CultureInfo.InvariantCulture, font ) );
 		}
 		#endregion
 
@@ -1112,8 +1150,11 @@ namespace NUnit.Gui
 		private void configMenuItem_Click( object sender, EventArgs e )
 		{
 			MenuItem item = (MenuItem)sender;
-			if ( !item.Checked )
-				TestProject.SetActiveConfig( TestProject.Configs[item.Index].Name );
+            if (!item.Checked)
+            {
+                TestProject.SetActiveConfig(TestProject.Configs[item.Index].Name);
+                LoadOrReloadTestAsNeeded();
+            }
 		}
 
 		private void addConfigurationMenuItem_Click( object sender, System.EventArgs e )
@@ -1123,6 +1164,8 @@ namespace NUnit.Gui
 				this.Site.Container.Add( dlg );
 				dlg.ShowDialog();
 			}
+
+            LoadOrReloadTestAsNeeded();
 		}
 
 		private void editConfigurationsMenuItem_Click( object sender, System.EventArgs e )
@@ -1132,16 +1175,20 @@ namespace NUnit.Gui
 				this.Site.Container.Add( editor );
 				editor.ShowDialog();
 			}
+
+            LoadOrReloadTestAsNeeded();
 		}
 
 		private void addAssemblyMenuItem_Click(object sender, System.EventArgs e)
 		{
-			TestLoaderUI.AddAssembly( this );
+            TestLoaderUI.AddAssembly(this);
+            LoadOrReloadTestAsNeeded();
 		}
 
 		private void addVSProjectMenuItem_Click(object sender, System.EventArgs e)
 		{
-			TestLoaderUI.AddVSProject( this );
+            TestLoaderUI.AddVSProject(this);
+            LoadOrReloadTestAsNeeded();
 		}
 
 		private void editProjectMenuItem_Click(object sender, System.EventArgs e)
@@ -1149,10 +1196,27 @@ namespace NUnit.Gui
 			using ( ProjectEditor editor = new ProjectEditor( TestProject ) )
 			{
 				this.Site.Container.Add( editor );
-				editor.VisualStudioSupport = userSettings.GetSetting( "Options.TestLoader.VisualStudioSupport", false );
 				editor.ShowDialog( this );
 			}
-		}
+
+            LoadOrReloadTestAsNeeded();
+        }
+
+        private void LoadOrReloadTestAsNeeded()
+        {
+            if (TestProject.HasChangesRequiringReload)
+            {
+                if (TestProject.IsLoadable)
+                {
+                    if (IsTestLoaded)
+                        TestLoader.ReloadTest();
+                    else
+                        TestLoader.LoadTest();
+                }
+                else
+                    TestLoader.UnloadTest();
+            }
+        }
 
 		#endregion
 
@@ -1184,7 +1248,8 @@ namespace NUnit.Gui
 		#region Tools Menu
 
 		private void toolsMenu_Popup(object sender, System.EventArgs e)
-		{		
+		{
+            assemblyDetailsMenuItem.Enabled = IsTestLoaded;
 			saveXmlResultsMenuItem.Enabled = IsTestLoaded && TestLoader.TestResult != null;
 			exceptionDetailsMenuItem.Enabled = TestLoader.LastException != null;
 		}
@@ -1203,41 +1268,15 @@ namespace NUnit.Gui
 			}
 		}
 
-		private void optionsMenuItem_Click(object sender, System.EventArgs e)
+		private void settingsMenuItem_Click(object sender, System.EventArgs e)
 		{
 			OptionsDialog.Display( this );
 		}
 
 		private void assemblyDetailsMenuItem_Click(object sender, System.EventArgs e)
 		{
-			IList infoList = TestLoader.AssemblyInfo;
-			string msg = "No assemblies are loaded.";
-
-			if ( infoList != null && infoList.Count > 0 )
-			{
-				StringBuilder sb = new StringBuilder( "Test Assemblies - \r\n\r\n" );
-
-				foreach( TestAssemblyInfo info in infoList )
-				{
-					sb.AppendFormat( "{0}\r\n", info.Name );
-					sb.AppendFormat( "Runtime Version:   {0}\r\n", info.RuntimeVersion.ToString() );
-					if ( info.TestFrameworks != null )
-					{
-						string prefix = "Uses: ";
-						foreach( AssemblyName framework in info.TestFrameworks )
-						{
-							sb.AppendFormat( "{0}{1}\r\n", prefix, framework.FullName );
-							prefix = "      ";
-						}
-					}
-					sb.Append("\r\n" );
-				}
-
-				msg = sb.ToString();
-			}
-
-			UserMessage.Display( msg, "Test Assembly Info" );
-		}
+            new TestAssemblyInfoForm().ShowDialog();
+        }
 
 		private void addinInfoMenuItem_Click(object sender, System.EventArgs e)
 		{
@@ -1251,31 +1290,7 @@ namespace NUnit.Gui
 
 		private void helpMenuItem_Click(object sender, System.EventArgs e)
 		{
-			FileInfo exe = new FileInfo( Assembly.GetExecutingAssembly().Location );
-			// In normal install, exe is in bin directory, so we get parent
-			DirectoryInfo dir = exe.Directory.Parent;
-			// If running from bin\Release or bin\Debug, go down four more
-			// to the parent of the src and doc directories
-			if ( dir.Name == "bin" ) dir = dir.Parent.Parent.Parent.Parent;
-
-			string helpUrl = ConfigurationSettings.AppSettings["helpUrl"];
-
-			if ( helpUrl == null )
-			{
-                string localPath = Path.Combine(dir.FullName, @"doc/index.html");
-                if (File.Exists(localPath))
-                {
-                    UriBuilder uri = new UriBuilder();
-                    uri.Scheme = "file";
-                    uri.Host = "localhost";
-                    uri.Path = localPath;
-                    helpUrl = uri.ToString();
-                }
-                else
-                    helpUrl = "http://nunit.org";
-			}
-
-			System.Diagnostics.Process.Start( helpUrl );
+			System.Diagnostics.Process.Start( NUnitConfiguration.HelpUrl );
 		}
 
 		/// <summary>
@@ -1310,6 +1325,7 @@ namespace NUnit.Gui
 				EnableStopCommand( false );
 
 				recentProjectsMenuHandler = new RecentFileMenuHandler( recentProjectsMenu, recentFilesService );
+                recentProjectsMenuHandler.CheckFilesExist = userSettings.GetSetting("Gui.RecentProjects.CheckFilesExist", true);
 
 				LoadFormSettings();
 				SubscribeToTestEvents();
@@ -1357,11 +1373,11 @@ namespace NUnit.Gui
 						// TODO: Temporary fix to avoid problem when /run is used 
 						// with ReloadOnRun turned on. Refactor TestLoader so
 						// we can just do a run without reload.
-						bool reload = TestLoader.ReloadOnRun;
+						bool reload = Services.UserSettings.GetSetting("Options.TestLoader.ReloadOnRun", false);
 					
 						try
 						{
-							TestLoader.ReloadOnRun = false;
+							Services.UserSettings.SaveSetting("Options.TestLoader.ReloadOnRun", false);
 							if ( guiOptions.runselected )
 								testTree.RunSelectedTests();
 							else
@@ -1369,27 +1385,27 @@ namespace NUnit.Gui
 						}
 						finally
 						{
-							TestLoader.ReloadOnRun = reload;
+							Services.UserSettings.SaveSetting("Options.TestLoader.ReloadOnRun", reload);
 						}
 					}
 			}
 		}
-		
+
 		private void LoadFormSettings()
 		{
 			this.displayFormat = userSettings.GetSetting( "Gui.DisplayFormat", "Full" );
 
-			switch( displayFormat )
-			{
-				case "Full":				
-					displayFullGui();
-					break;
-				case "Mini":
-					displayMiniGui();
-					break;
-				default:
-					throw new ApplicationException( "Invalid Setting" );
-			}
+            switch (displayFormat)
+            {
+                case "Full":
+                    displayFullGui();
+                    break;
+                case "Mini":
+                    displayMiniGui();
+                    break;
+                default:
+                    throw new ApplicationException("Invalid Setting");
+            }
 
 			// Handle changes to form position
 			this.Move += new System.EventHandler(this.NUnitForm_Move);
@@ -1404,14 +1420,7 @@ namespace NUnit.Gui
 			this.treeSplitter.SplitterMoved += new SplitterEventHandler( treeSplitter_SplitterMoved );
 
 			// Get the fixed font used by result tabs
-			string fontDescription = userSettings.GetSetting( "Gui.FixedFont", "" );
-			if ( fontDescription == "" )
-				this.fixedFont = new Font( "Courier New", 8.0f );
-			else
-			{
-				TypeConverter converter = TypeDescriptor.GetConverter(typeof(Font));
-				this.fixedFont = (Font)converter.ConvertFrom(fontDescription);
-			}
+            this.fixedFont = userSettings.GetSetting("Gui.FixedFont", new Font(FontFamily.GenericMonospace, 8.0f));
 
 			// Handle changes in form settings
 			userSettings.Changed += new SettingsEventHandler(userSettings_Changed);
@@ -1620,8 +1629,8 @@ namespace NUnit.Gui
 			{
 				Version version = Environment.Version;
 				foreach( TestAssemblyInfo info in TestLoader.AssemblyInfo )
-					if ( info.RuntimeVersion < version )
-						version = info.RuntimeVersion;
+					if ( info.ImageRuntimeVersion < version )
+						version = info.ImageRuntimeVersion;
 			
 				recentFilesService.SetMostRecent( new RecentFileEntry( e.Name, version ) );
 			}
@@ -1680,7 +1689,9 @@ namespace NUnit.Gui
 		private void OnTestUnloaded( object sender, TestEventArgs e )
 		{
 			suiteName.Text = null;
+            runCount.Text = null;
 			EnableRunCommand( false );
+            Refresh();
 		}
 
 		/// <summary>
@@ -1690,11 +1701,17 @@ namespace NUnit.Gui
 		/// </summary>
 		private void OnTestChanged( object sender, TestEventArgs e )
 		{
+            SetTitleBar(TestProject.Name);
+
 			if ( longOpDisplay != null )
 			{
 				longOpDisplay.Dispose();
 				longOpDisplay = null;
 			}
+
+            if (userSettings.GetSetting("Options.TestLoader.ClearResultsOnReload", false))
+                runCount.Text = null;
+
 			EnableRunCommand( true );
 		}
 
@@ -1723,7 +1740,7 @@ namespace NUnit.Gui
 			if ( e.Exception is BadImageFormatException )
 				message = string.Format(
 					@"You may be attempting to load an assembly built with a later version of the CLR than
-the version under which NUnit is currently running, {0}.",
+the version under which NUnit is currently running ({0}) or trying to load a 64-bit assembly into a 32-bit process.",
 					Environment.Version.ToString(3) );
 
 			UserMessage.DisplayFailure( e.Exception, message, "Assembly Not Loaded" );
@@ -1757,16 +1774,19 @@ the version under which NUnit is currently running, {0}.",
 					UserMessage.DisplayFailure( e.Exception, "NUnit Test Run Failed" );
 			}
 
-			SummaryVisitor summary = new SummaryVisitor();
-			e.Result.Accept( summary );
-			this.runCount.Text = string.Format( 
-				"Test Cases: {0}   Tests Run: {1}   Failures: {2}   Ignored: {3}   Skipped: {4}   Run Time: {5}",
-				summary.ResultCount+summary.SkipCount, summary.ResultCount, summary.FailureCount, summary.IgnoreCount, summary.SkipCount, summary.Time );
+			ResultSummarizer summary = new ResultSummarizer( e.Result );
+			this.runCount.Text = string.Format(
+                "Passed: {0}   Failed: {1}   Errors: {2}   Inconclusive: {3}   Invalid: {4}   Ignored: {5}   Skipped: {6}   Time: {7}",
+                summary.Passed, summary.Failures, summary.Errors, summary.Inconclusive, summary.NotRunnable, summary.Ignored, summary.Skipped, summary.Time);
 
 			EnableRunCommand( true );
 
-			if ( e.Result.IsFailure )
-				this.Activate();
+            if (e.Result.ResultState == ResultState.Failure ||
+                e.Result.ResultState == ResultState.Error ||
+                e.Result.ResultState == ResultState.Cancelled)
+            {
+                this.Activate();
+            }
 		}
 
 		#endregion
@@ -1789,9 +1809,9 @@ the version under which NUnit is currently running, {0}.",
 			runButton.Enabled = enable;
 			runAllMenuItem.Enabled = enable;
 			runSelectedMenuItem.Enabled = enable;
-			runFailedMenuItem.Enabled = enable &&
-				this.TestLoader.TestResult != null &&
-				this.TestLoader.TestResult.IsFailure;
+		    runFailedMenuItem.Enabled = enable && this.TestLoader.TestResult != null &&
+		        (this.TestLoader.TestResult.ResultState == ResultState.Failure ||
+		         this.TestLoader.TestResult.ResultState == ResultState.Error);
 		}
 
 		private void EnableStopCommand( bool enable )
diff --git a/src/GuiRunner/nunit-gui/NUnitForm.resx b/src/GuiRunner/nunit-gui/NUnitForm.resx
index a76c76c..0d7193c 100644
--- a/src/GuiRunner/nunit-gui/NUnitForm.resx
+++ b/src/GuiRunner/nunit-gui/NUnitForm.resx
@@ -3,7 +3,7 @@
   <!-- 
     Microsoft ResX Schema 
     
-    Version 1.3
+    Version 2.0
     
     The primary goals of this format is to allow a simple XML format 
     that is mostly human readable. The generation and parsing of the 
@@ -14,16 +14,17 @@
     
     ... ado.net/XML headers & schema ...
     <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">1.3</resheader>
+    <resheader name="version">2.0</resheader>
     <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
     <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1">this is my long string</data>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
     <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
     <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        [base64 mime encoded serialized .NET Framework object]
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
     </data>
     <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
     </data>
                 
     There are any number of "resheader" rows that contain simple 
@@ -35,7 +36,7 @@
     Classes that don't support this are serialized and stored with the 
     mimetype set.
     
-    The mimetype is used forserialized objects, and tells the 
+    The mimetype is used for serialized objects, and tells the 
     ResXResourceReader how to depersist the object. This is currently not 
     extensible. For a given mimetype the value must be set accordingly:
     
@@ -45,7 +46,7 @@
     
     mimetype: application/x-microsoft.net.object.binary.base64
     value   : The object must be serialized with 
-            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
             : and then encoded with base64 encoding.
     
     mimetype: application/x-microsoft.net.object.soap.base64
@@ -59,18 +60,37 @@
             : and then encoded with base64 encoding.
     -->
   <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
     <xsd:element name="root" msdata:IsDataSet="true">
       <xsd:complexType>
         <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
           <xsd:element name="data">
             <xsd:complexType>
               <xsd:sequence>
                 <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                 <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
               </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
               <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
               <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
             </xsd:complexType>
           </xsd:element>
           <xsd:element name="resheader">
@@ -89,540 +109,25 @@
     <value>text/microsoft-resx</value>
   </resheader>
   <resheader name="version">
-    <value>1.3</value>
+    <value>2.0</value>
   </resheader>
   <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
   <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
-  <data name="statusBar.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="statusBar.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="statusBar.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Public</value>
-  </data>
-  <data name="mainMenu.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="mainMenu.Location" type="System.Drawing.Point, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+  <metadata name="mainMenu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>17, 17</value>
-  </data>
-  <data name="mainMenu.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Public</value>
-  </data>
-  <data name="fileMenu.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Public</value>
-  </data>
-  <data name="fileMenu.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="newMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="newMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="openMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="openMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="closeMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="closeMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="fileMenuSeparator1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="fileMenuSeparator1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="saveMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="saveMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="saveAsMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="saveAsMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="fileMenuSeparator2.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="fileMenuSeparator2.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="reloadProjectMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="reloadProjectMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="reloadTestsMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="reloadTestsMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="menuItem2.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="menuItem2.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="recentProjectsMenu.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="recentProjectsMenu.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="fileMenuSeparator4.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Public</value>
-  </data>
-  <data name="fileMenuSeparator4.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="exitMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Public</value>
-  </data>
-  <data name="exitMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="viewMenu.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="viewMenu.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="fullGuiMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="fullGuiMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="miniGuiMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="miniGuiMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="viewMenuSeparator1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="viewMenuSeparator1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="viewMenuSeparator2.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="viewMenuSeparator2.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="guiFontMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="guiFontMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="increaseFontMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="increaseFontMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="decreaseFontMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="decreaseFontMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="fontMenuSeparator.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="fontMenuSeparator.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="fontChangeMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="fontChangeMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="defaultFontMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="defaultFontMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="fixedFontMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="fixedFontMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="increaseFixedFontMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="increaseFixedFontMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="decreaseFixedFontMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="decreaseFixedFontMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="menuItem1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="menuItem1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="restoreFixedFontMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="restoreFixedFontMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="viewMenuSeparator3.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="viewMenuSeparator3.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="statusBarMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="statusBarMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="projectMenu.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="projectMenu.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="configMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="configMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="projectMenuSeparator1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="projectMenuSeparator1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="addAssemblyMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="addAssemblyMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="addVSProjectMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="addVSProjectMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="projectMenuSeparator2.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="projectMenuSeparator2.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="editProjectMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="editProjectMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="testMenu.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="testMenu.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="runAllMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="runAllMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="runSelectedMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="runSelectedMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="runFailedMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="runFailedMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="testMenuSeparator.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="testMenuSeparator.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="stopRunMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="stopRunMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="toolsMenu.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="toolsMenu.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="assemblyDetailsMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="assemblyDetailsMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="saveXmlResultsMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="saveXmlResultsMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="exceptionDetailsMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="exceptionDetailsMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="toolsMenuSeparator1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="toolsMenuSeparator1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="optionsMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="optionsMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="toolsMenuSeparator2.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="toolsMenuSeparator2.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="addinInfoMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="addinInfoMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="helpItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Public</value>
-  </data>
-  <data name="helpItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="helpMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Public</value>
-  </data>
-  <data name="helpMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="helpMenuSeparator1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Public</value>
-  </data>
-  <data name="helpMenuSeparator1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="aboutMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Public</value>
-  </data>
-  <data name="aboutMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="treeSplitter.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="treeSplitter.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="treeSplitter.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Public</value>
-  </data>
-  <data name="rightPanel.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="rightPanel.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="rightPanel.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="rightPanel.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="rightPanel.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Public</value>
-  </data>
-  <data name="rightPanel.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="groupBox1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="groupBox1.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="groupBox1.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="groupBox1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="groupBox1.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="groupBox1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Public</value>
-  </data>
-  <data name="runCount.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="runCount.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="runCount.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="stopButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="stopButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="stopButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="runButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="runButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="runButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Public</value>
-  </data>
-  <data name="suiteName.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="suiteName.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="suiteName.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Public</value>
-  </data>
-  <data name="progressBar.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="progressBar.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Public</value>
-  </data>
-  <data name="progressBar.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="resultTabs.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="resultTabs.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="resultTabs.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Public</value>
-  </data>
-  <data name="toolTip.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="toolTip.Location" type="System.Drawing.Point, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+  </metadata>
+  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>130, 17</value>
-  </data>
-  <data name="toolTip.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Public</value>
-  </data>
-  <data name="testTree.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="testTree.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="testTree.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="leftPanel.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="leftPanel.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="leftPanel.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="leftPanel.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="leftPanel.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="leftPanel.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>(Default)</value>
-  </data>
-  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="$this.Name">
-    <value>NUnitForm</value>
-  </data>
-  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  </metadata>
+  <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>65</value>
-  </data>
-  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  </metadata>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         AAABAAIAICAQAAAAAADoAgAAJgAAABAQEAAAAAAAKAEAAA4DAAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC
         AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/
diff --git a/src/GuiRunner/nunit-gui/OptionsDialog.cs b/src/GuiRunner/nunit-gui/OptionsDialog.cs
index fcad30c..19fe7a9 100644
--- a/src/GuiRunner/nunit-gui/OptionsDialog.cs
+++ b/src/GuiRunner/nunit-gui/OptionsDialog.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 #define TREE_BASED
 using System;
@@ -24,10 +24,11 @@ namespace NUnit.Gui
 				new TreeSettingsPage("Gui.Tree Display"),
 				new TestResultSettingsPage("Gui.Test Results"),
 				new TextOutputSettingsPage("Gui.Text Output"),
-				new TestLoaderSettingsPage("Test Loader.General"),
+				new TestLoaderSettingsPage("Test Loader.Assembly Isolation"),
 				new AssemblyReloadSettingsPage("Test Loader.Assembly Reload"),
 				new AdvancedLoaderSettingsPage("Test Loader.Advanced"),
-				new VisualStudioSettingsPage("IDE Support.Visual Studio"));
+				new VisualStudioSettingsPage("IDE Support.Visual Studio"),
+                new InternalTraceSettingsPage("Advanced Settings.Internal Trace"));
 		}
 #else
 		public static void Display( Form owner )
diff --git a/src/GuiRunner/nunit-gui/ProjectEditor.cs b/src/GuiRunner/nunit-gui/ProjectEditor.cs
index 6852c46..4fb6a3c 100644
--- a/src/GuiRunner/nunit-gui/ProjectEditor.cs
+++ b/src/GuiRunner/nunit-gui/ProjectEditor.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -12,8 +12,7 @@ using System.ComponentModel;
 using System.Windows.Forms;
 using NUnit.Util;
 using NUnit.UiKit;
-using CP.Windows.Forms;
-using CP.Windows.Shell;
+using NUnit.Core;
 
 namespace NUnit.Gui
 {
@@ -56,6 +55,14 @@ namespace NUnit.Gui
 		private System.Windows.Forms.Label label2;
 		private System.Windows.Forms.TextBox assemblyPathTextBox;
 		private System.Windows.Forms.Button assemblyPathBrowseButton;
+		private System.Windows.Forms.Label label7;
+		private System.Windows.Forms.ComboBox runtimeComboBox;
+		private System.Windows.Forms.Label label9;
+		private System.Windows.Forms.Label label10;
+		private System.Windows.Forms.ComboBox processModelComboBox;
+		private System.Windows.Forms.ComboBox domainUsageComboBox;
+		private System.Windows.Forms.Label label11;
+		private System.Windows.Forms.ComboBox runtimeVersionComboBox;
 		private System.ComponentModel.IContainer components = null;
 
 		#endregion
@@ -92,447 +99,549 @@ namespace NUnit.Gui
 
 		#endregion
 
-		#region Windows Form Designer generated code
-		/// <summary>
+        #region Windows Form Designer generated code
+        /// <summary>
 		/// Required method for Designer support - do not modify
 		/// the contents of this method with the code editor.
 		/// </summary>
 		private void InitializeComponent()
 		{
-			System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(ProjectEditor));
-			this.fileNameHeader = new System.Windows.Forms.ColumnHeader();
-			this.fullPathHeader = new System.Windows.Forms.ColumnHeader();
-			this.closeButton = new System.Windows.Forms.Button();
-			this.helpProvider1 = new System.Windows.Forms.HelpProvider();
-			this.label5 = new System.Windows.Forms.Label();
-			this.projectPathLabel = new CP.Windows.Forms.ExpandingLabel();
-			this.label8 = new System.Windows.Forms.Label();
-			this.projectBaseTextBox = new System.Windows.Forms.TextBox();
-			this.projectTabControl = new System.Windows.Forms.TabControl();
-			this.generalTabPage = new System.Windows.Forms.TabPage();
-			this.autoBinPathRadioButton = new System.Windows.Forms.RadioButton();
-			this.manualBinPathRadioButton = new System.Windows.Forms.RadioButton();
-			this.noBinPathRadioButton = new System.Windows.Forms.RadioButton();
-			this.configBaseBrowseButton = new System.Windows.Forms.Button();
-			this.privateBinPathTextBox = new System.Windows.Forms.TextBox();
-			this.label6 = new System.Windows.Forms.Label();
-			this.configFileTextBox = new System.Windows.Forms.TextBox();
-			this.label4 = new System.Windows.Forms.Label();
-			this.applicationBaseTextBox = new System.Windows.Forms.TextBox();
-			this.label3 = new System.Windows.Forms.Label();
-			this.assemblyTabPage = new System.Windows.Forms.TabPage();
-			this.assemblyPathTextBox = new System.Windows.Forms.TextBox();
-			this.label2 = new System.Windows.Forms.Label();
-			this.assemblyListBox = new System.Windows.Forms.ListBox();
-			this.addAssemblyButton = new System.Windows.Forms.Button();
-			this.removeAssemblyButton = new System.Windows.Forms.Button();
-			this.editConfigsButton = new System.Windows.Forms.Button();
-			this.configComboBox = new System.Windows.Forms.ComboBox();
-			this.label1 = new System.Windows.Forms.Label();
-			this.projectBaseBrowseButton = new System.Windows.Forms.Button();
-			this.groupBox1 = new System.Windows.Forms.GroupBox();
-			this.assemblyPathBrowseButton = new System.Windows.Forms.Button();
-			this.projectTabControl.SuspendLayout();
-			this.generalTabPage.SuspendLayout();
-			this.assemblyTabPage.SuspendLayout();
-			this.groupBox1.SuspendLayout();
-			this.SuspendLayout();
-			// 
-			// fileNameHeader
-			// 
-			this.fileNameHeader.Text = "File Name";
-			this.fileNameHeader.Width = 100;
-			// 
-			// fullPathHeader
-			// 
-			this.fullPathHeader.Text = "Full Path";
-			this.fullPathHeader.Width = 256;
-			// 
-			// closeButton
-			// 
-			this.closeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
-			this.closeButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
-			this.closeButton.Location = new System.Drawing.Point(408, 415);
-			this.closeButton.Name = "closeButton";
-			this.helpProvider1.SetShowHelp(this.closeButton, false);
-			this.closeButton.Size = new System.Drawing.Size(104, 23);
-			this.closeButton.TabIndex = 6;
-			this.closeButton.Text = "Close";
-			this.closeButton.Click += new System.EventHandler(this.closeButton_Click);
-			// 
-			// label5
-			// 
-			this.label5.Location = new System.Drawing.Point(24, 8);
-			this.label5.Name = "label5";
-			this.helpProvider1.SetShowHelp(this.label5, false);
-			this.label5.Size = new System.Drawing.Size(88, 16);
-			this.label5.TabIndex = 0;
-			this.label5.Text = "Project Path:";
-			// 
-			// projectPathLabel
-			// 
-			this.projectPathLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.projectPathLabel.Location = new System.Drawing.Point(128, 8);
-			this.projectPathLabel.Name = "projectPathLabel";
-			this.helpProvider1.SetShowHelp(this.projectPathLabel, false);
-			this.projectPathLabel.Size = new System.Drawing.Size(394, 16);
-			this.projectPathLabel.TabIndex = 1;
-			// 
-			// label8
-			// 
-			this.label8.Location = new System.Drawing.Point(24, 37);
-			this.label8.Name = "label8";
-			this.helpProvider1.SetShowHelp(this.label8, false);
-			this.label8.Size = new System.Drawing.Size(120, 16);
-			this.label8.TabIndex = 7;
-			this.label8.Text = "Project Base:";
-			// 
-			// projectBaseTextBox
-			// 
-			this.helpProvider1.SetHelpString(this.projectBaseTextBox, "The ApplicationBase for the project. Defaults to the location of the project file" +
-				".");
-			this.projectBaseTextBox.Location = new System.Drawing.Point(125, 37);
-			this.projectBaseTextBox.Name = "projectBaseTextBox";
-			this.helpProvider1.SetShowHelp(this.projectBaseTextBox, true);
-			this.projectBaseTextBox.Size = new System.Drawing.Size(339, 22);
-			this.projectBaseTextBox.TabIndex = 8;
-			this.projectBaseTextBox.Text = "";
-			this.projectBaseTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.projectBaseTextBox_Validating);
-			this.projectBaseTextBox.Validated += new System.EventHandler(this.projectBaseTextBox_Validated);
-			// 
-			// projectTabControl
-			// 
-			this.projectTabControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
-				| System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.projectTabControl.Controls.Add(this.generalTabPage);
-			this.projectTabControl.Controls.Add(this.assemblyTabPage);
-			this.projectTabControl.ItemSize = new System.Drawing.Size(49, 18);
-			this.projectTabControl.Location = new System.Drawing.Point(8, 64);
-			this.projectTabControl.Name = "projectTabControl";
-			this.projectTabControl.SelectedIndex = 0;
-			this.helpProvider1.SetShowHelp(this.projectTabControl, false);
-			this.projectTabControl.Size = new System.Drawing.Size(488, 264);
-			this.projectTabControl.TabIndex = 9;
-			// 
-			// generalTabPage
-			// 
-			this.generalTabPage.Controls.Add(this.autoBinPathRadioButton);
-			this.generalTabPage.Controls.Add(this.manualBinPathRadioButton);
-			this.generalTabPage.Controls.Add(this.noBinPathRadioButton);
-			this.generalTabPage.Controls.Add(this.configBaseBrowseButton);
-			this.generalTabPage.Controls.Add(this.privateBinPathTextBox);
-			this.generalTabPage.Controls.Add(this.label6);
-			this.generalTabPage.Controls.Add(this.configFileTextBox);
-			this.generalTabPage.Controls.Add(this.label4);
-			this.generalTabPage.Controls.Add(this.applicationBaseTextBox);
-			this.generalTabPage.Controls.Add(this.label3);
-			this.generalTabPage.Location = new System.Drawing.Point(4, 22);
-			this.generalTabPage.Name = "generalTabPage";
-			this.helpProvider1.SetShowHelp(this.generalTabPage, false);
-			this.generalTabPage.Size = new System.Drawing.Size(480, 238);
-			this.generalTabPage.TabIndex = 0;
-			this.generalTabPage.Text = "General";
-			// 
-			// autoBinPathRadioButton
-			// 
-			this.autoBinPathRadioButton.Location = new System.Drawing.Point(32, 96);
-			this.autoBinPathRadioButton.Name = "autoBinPathRadioButton";
-			this.helpProvider1.SetShowHelp(this.autoBinPathRadioButton, false);
-			this.autoBinPathRadioButton.Size = new System.Drawing.Size(328, 24);
-			this.autoBinPathRadioButton.TabIndex = 10;
-			this.autoBinPathRadioButton.Text = "Use automatically generated path";
-			this.autoBinPathRadioButton.CheckedChanged += new System.EventHandler(this.autoBinPathRadioButton_CheckedChanged);
-			// 
-			// manualBinPathRadioButton
-			// 
-			this.manualBinPathRadioButton.Location = new System.Drawing.Point(32, 128);
-			this.manualBinPathRadioButton.Name = "manualBinPathRadioButton";
-			this.helpProvider1.SetShowHelp(this.manualBinPathRadioButton, false);
-			this.manualBinPathRadioButton.TabIndex = 9;
-			this.manualBinPathRadioButton.Text = "Use this path:";
-			this.manualBinPathRadioButton.CheckedChanged += new System.EventHandler(this.manualBinPathRadioButton_CheckedChanged);
-			// 
-			// noBinPathRadioButton
-			// 
-			this.noBinPathRadioButton.Location = new System.Drawing.Point(32, 160);
-			this.noBinPathRadioButton.Name = "noBinPathRadioButton";
-			this.helpProvider1.SetShowHelp(this.noBinPathRadioButton, false);
-			this.noBinPathRadioButton.Size = new System.Drawing.Size(424, 24);
-			this.noBinPathRadioButton.TabIndex = 8;
-			this.noBinPathRadioButton.Text = "None - or specified in Configuration File";
-			this.noBinPathRadioButton.CheckedChanged += new System.EventHandler(this.noBinPathRadioButton_CheckedChanged);
-			// 
-			// configBaseBrowseButton
-			// 
-			this.configBaseBrowseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
-			this.helpProvider1.SetHelpString(this.configBaseBrowseButton, "Browse to locate ApplicationBase directory.");
-			this.configBaseBrowseButton.Image = ((System.Drawing.Image)(resources.GetObject("configBaseBrowseButton.Image")));
-			this.configBaseBrowseButton.Location = new System.Drawing.Point(448, 8);
-			this.configBaseBrowseButton.Name = "configBaseBrowseButton";
-			this.helpProvider1.SetShowHelp(this.configBaseBrowseButton, true);
-			this.configBaseBrowseButton.Size = new System.Drawing.Size(24, 24);
-			this.configBaseBrowseButton.TabIndex = 7;
-			this.configBaseBrowseButton.Click += new System.EventHandler(this.configBaseBrowseButton_Click);
-			// 
-			// privateBinPathTextBox
-			// 
-			this.privateBinPathTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.helpProvider1.SetHelpString(this.privateBinPathTextBox, "Path searched when probing for private asemblies. Directories must be descendants" +
-				" of the ApplicationBase.");
-			this.privateBinPathTextBox.Location = new System.Drawing.Point(136, 128);
-			this.privateBinPathTextBox.Name = "privateBinPathTextBox";
-			this.helpProvider1.SetShowHelp(this.privateBinPathTextBox, true);
-			this.privateBinPathTextBox.Size = new System.Drawing.Size(336, 22);
-			this.privateBinPathTextBox.TabIndex = 5;
-			this.privateBinPathTextBox.Text = "";
-			this.privateBinPathTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.privateBinPathTextBox_Validating);
-			this.privateBinPathTextBox.Validated += new System.EventHandler(this.privateBinPathTextBox_Validated);
-			// 
-			// label6
-			// 
-			this.label6.AutoSize = true;
-			this.label6.Location = new System.Drawing.Point(16, 72);
-			this.label6.Name = "label6";
-			this.helpProvider1.SetShowHelp(this.label6, false);
-			this.label6.Size = new System.Drawing.Size(97, 18);
-			this.label6.TabIndex = 4;
-			this.label6.Text = "PrivateBinPath:";
-			// 
-			// configFileTextBox
-			// 
-			this.configFileTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.helpProvider1.SetHelpString(this.configFileTextBox, "Configuration file to use when loading assemblies if it exists. Defaults to <proj" +
-				"ectname>.config. Must be located in the ApplicationBase directory.");
-			this.configFileTextBox.Location = new System.Drawing.Point(176, 40);
-			this.configFileTextBox.Name = "configFileTextBox";
-			this.helpProvider1.SetShowHelp(this.configFileTextBox, true);
-			this.configFileTextBox.Size = new System.Drawing.Size(296, 22);
-			this.configFileTextBox.TabIndex = 3;
-			this.configFileTextBox.Text = "";
-			this.configFileTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.configFileTextBox_Validating);
-			this.configFileTextBox.Validated += new System.EventHandler(this.configFileTextBox_Validated);
-			// 
-			// label4
-			// 
-			this.label4.AutoSize = true;
-			this.label4.Location = new System.Drawing.Point(16, 40);
-			this.label4.Name = "label4";
-			this.helpProvider1.SetShowHelp(this.label4, false);
-			this.label4.Size = new System.Drawing.Size(153, 18);
-			this.label4.TabIndex = 2;
-			this.label4.Text = "Configuration File Name:";
-			// 
-			// applicationBaseTextBox
-			// 
-			this.applicationBaseTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.helpProvider1.SetHelpString(this.applicationBaseTextBox, "The ApplicationBase for this configuration. May be absolute or relative to the pr" +
-				"oject base. Defaults to the project base if not set.");
-			this.applicationBaseTextBox.Location = new System.Drawing.Point(128, 8);
-			this.applicationBaseTextBox.Name = "applicationBaseTextBox";
-			this.helpProvider1.SetShowHelp(this.applicationBaseTextBox, true);
-			this.applicationBaseTextBox.Size = new System.Drawing.Size(304, 22);
-			this.applicationBaseTextBox.TabIndex = 1;
-			this.applicationBaseTextBox.Text = "";
-			this.applicationBaseTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.applicationBaseTextBox_Validating);
-			this.applicationBaseTextBox.Validated += new System.EventHandler(this.applicationBaseTextBox_Validated);
-			// 
-			// label3
-			// 
-			this.label3.AutoSize = true;
-			this.label3.Location = new System.Drawing.Point(16, 8);
-			this.label3.Name = "label3";
-			this.helpProvider1.SetShowHelp(this.label3, false);
-			this.label3.Size = new System.Drawing.Size(105, 18);
-			this.label3.TabIndex = 0;
-			this.label3.Text = "ApplicationBase:";
-			// 
-			// assemblyTabPage
-			// 
-			this.assemblyTabPage.Controls.Add(this.assemblyPathBrowseButton);
-			this.assemblyTabPage.Controls.Add(this.assemblyPathTextBox);
-			this.assemblyTabPage.Controls.Add(this.label2);
-			this.assemblyTabPage.Controls.Add(this.assemblyListBox);
-			this.assemblyTabPage.Controls.Add(this.addAssemblyButton);
-			this.assemblyTabPage.Controls.Add(this.removeAssemblyButton);
-			this.assemblyTabPage.Location = new System.Drawing.Point(4, 22);
-			this.assemblyTabPage.Name = "assemblyTabPage";
-			this.helpProvider1.SetShowHelp(this.assemblyTabPage, false);
-			this.assemblyTabPage.Size = new System.Drawing.Size(480, 238);
-			this.assemblyTabPage.TabIndex = 1;
-			this.assemblyTabPage.Text = "Assemblies";
-			this.assemblyTabPage.Visible = false;
-			// 
-			// assemblyPathTextBox
-			// 
-			this.assemblyPathTextBox.Location = new System.Drawing.Point(16, 168);
-			this.assemblyPathTextBox.Name = "assemblyPathTextBox";
-			this.assemblyPathTextBox.Size = new System.Drawing.Size(416, 22);
-			this.assemblyPathTextBox.TabIndex = 8;
-			this.assemblyPathTextBox.Text = "";
-			this.assemblyPathTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.assemblyPathTextBox_Validating);
-			this.assemblyPathTextBox.Validated += new System.EventHandler(this.assemblyPathTextBox_Validated);
-			// 
-			// label2
-			// 
-			this.label2.Location = new System.Drawing.Point(16, 144);
-			this.label2.Name = "label2";
-			this.label2.Size = new System.Drawing.Size(128, 16);
-			this.label2.TabIndex = 7;
-			this.label2.Text = "Assembly Path:";
-			// 
-			// assemblyListBox
-			// 
-			this.helpProvider1.SetHelpString(this.assemblyListBox, "Checked assemblies will have tests loaded in the UI. Tests (if any) in unchecked " +
-				"assemblies will not be loaded. All listed assemblies are watched for changes and" +
-				" used in determining the PrivateBinPath.");
-			this.assemblyListBox.ItemHeight = 16;
-			this.assemblyListBox.Location = new System.Drawing.Point(16, 16);
-			this.assemblyListBox.Name = "assemblyListBox";
-			this.helpProvider1.SetShowHelp(this.assemblyListBox, true);
-			this.assemblyListBox.Size = new System.Drawing.Size(368, 116);
-			this.assemblyListBox.TabIndex = 6;
-			this.assemblyListBox.SelectedIndexChanged += new System.EventHandler(this.assemblyListBox_SelectedIndexChanged);
-			// 
-			// addAssemblyButton
-			// 
-			this.addAssemblyButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
-			this.helpProvider1.SetHelpString(this.addAssemblyButton, "Add an assembly to this configuration.");
-			this.addAssemblyButton.Location = new System.Drawing.Point(392, 24);
-			this.addAssemblyButton.Name = "addAssemblyButton";
-			this.helpProvider1.SetShowHelp(this.addAssemblyButton, true);
-			this.addAssemblyButton.Size = new System.Drawing.Size(80, 23);
-			this.addAssemblyButton.TabIndex = 2;
-			this.addAssemblyButton.Text = "&Add...";
-			this.addAssemblyButton.Click += new System.EventHandler(this.addAssemblyButton_Click);
-			// 
-			// removeAssemblyButton
-			// 
-			this.removeAssemblyButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
-			this.helpProvider1.SetHelpString(this.removeAssemblyButton, "Remove the selected assembly from the configuration.");
-			this.removeAssemblyButton.Location = new System.Drawing.Point(392, 56);
-			this.removeAssemblyButton.Name = "removeAssemblyButton";
-			this.helpProvider1.SetShowHelp(this.removeAssemblyButton, true);
-			this.removeAssemblyButton.Size = new System.Drawing.Size(80, 23);
-			this.removeAssemblyButton.TabIndex = 5;
-			this.removeAssemblyButton.Text = "&Remove";
-			this.removeAssemblyButton.Click += new System.EventHandler(this.removeAssemblyButton_Click);
-			// 
-			// editConfigsButton
-			// 
-			this.editConfigsButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
-			this.helpProvider1.SetHelpString(this.editConfigsButton, "Add, remove or rename configurations.");
-			this.editConfigsButton.Location = new System.Drawing.Point(385, 24);
-			this.editConfigsButton.Name = "editConfigsButton";
-			this.helpProvider1.SetShowHelp(this.editConfigsButton, true);
-			this.editConfigsButton.Size = new System.Drawing.Size(104, 23);
-			this.editConfigsButton.TabIndex = 8;
-			this.editConfigsButton.Text = "&Edit Configs...";
-			this.editConfigsButton.Click += new System.EventHandler(this.editConfigsButton_Click);
-			// 
-			// configComboBox
-			// 
-			this.configComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.helpProvider1.SetHelpString(this.configComboBox, "Select the configuration to edit");
-			this.configComboBox.ItemHeight = 16;
-			this.configComboBox.Location = new System.Drawing.Point(120, 24);
-			this.configComboBox.Name = "configComboBox";
-			this.helpProvider1.SetShowHelp(this.configComboBox, true);
-			this.configComboBox.Size = new System.Drawing.Size(256, 24);
-			this.configComboBox.TabIndex = 7;
-			this.configComboBox.SelectedIndexChanged += new System.EventHandler(this.configComboBox_SelectedIndexChanged);
-			// 
-			// label1
-			// 
-			this.label1.Location = new System.Drawing.Point(16, 32);
-			this.label1.Name = "label1";
-			this.helpProvider1.SetShowHelp(this.label1, false);
-			this.label1.Size = new System.Drawing.Size(88, 16);
-			this.label1.TabIndex = 6;
-			this.label1.Text = "Configuration:";
-			// 
-			// projectBaseBrowseButton
-			// 
-			this.projectBaseBrowseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
-			this.helpProvider1.SetHelpString(this.projectBaseBrowseButton, "Browse to locate ApplicationBase directory.");
-			this.projectBaseBrowseButton.Image = ((System.Drawing.Image)(resources.GetObject("projectBaseBrowseButton.Image")));
-			this.projectBaseBrowseButton.Location = new System.Drawing.Point(472, 40);
-			this.projectBaseBrowseButton.Name = "projectBaseBrowseButton";
-			this.helpProvider1.SetShowHelp(this.projectBaseBrowseButton, true);
-			this.projectBaseBrowseButton.Size = new System.Drawing.Size(24, 24);
-			this.projectBaseBrowseButton.TabIndex = 10;
-			this.projectBaseBrowseButton.Click += new System.EventHandler(this.projectBaseBrowseButton_Click);
-			// 
-			// groupBox1
-			// 
-			this.groupBox1.BackColor = System.Drawing.SystemColors.Control;
-			this.groupBox1.Controls.Add(this.projectTabControl);
-			this.groupBox1.Controls.Add(this.editConfigsButton);
-			this.groupBox1.Controls.Add(this.configComboBox);
-			this.groupBox1.Controls.Add(this.label1);
-			this.groupBox1.Location = new System.Drawing.Point(16, 72);
-			this.groupBox1.Name = "groupBox1";
-			this.groupBox1.Size = new System.Drawing.Size(505, 336);
-			this.groupBox1.TabIndex = 9;
-			this.groupBox1.TabStop = false;
-			this.groupBox1.Text = "Configuration Properties";
-			// 
-			// assemblyPathBrowseButton
-			// 
-			this.assemblyPathBrowseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
-			this.helpProvider1.SetHelpString(this.assemblyPathBrowseButton, "Browse to locate ApplicationBase directory.");
-			this.assemblyPathBrowseButton.Image = ((System.Drawing.Image)(resources.GetObject("assemblyPathBrowseButton.Image")));
-			this.assemblyPathBrowseButton.Location = new System.Drawing.Point(448, 168);
-			this.assemblyPathBrowseButton.Name = "assemblyPathBrowseButton";
-			this.helpProvider1.SetShowHelp(this.assemblyPathBrowseButton, true);
-			this.assemblyPathBrowseButton.Size = new System.Drawing.Size(24, 24);
-			this.assemblyPathBrowseButton.TabIndex = 11;
-			this.assemblyPathBrowseButton.Click += new System.EventHandler(this.assemblyPathBrowseButton_Click);
-			// 
-			// ProjectEditor
-			// 
-			this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);
-			this.ClientSize = new System.Drawing.Size(537, 442);
-			this.Controls.Add(this.projectBaseBrowseButton);
-			this.Controls.Add(this.groupBox1);
-			this.Controls.Add(this.projectBaseTextBox);
-			this.Controls.Add(this.label8);
-			this.Controls.Add(this.projectPathLabel);
-			this.Controls.Add(this.label5);
-			this.Controls.Add(this.closeButton);
-			this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
-			this.HelpButton = true;
-			this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
-			this.MaximizeBox = false;
-			this.MinimizeBox = false;
-			this.MinimumSize = new System.Drawing.Size(376, 400);
-			this.Name = "ProjectEditor";
-			this.helpProvider1.SetShowHelp(this, false);
-			this.ShowInTaskbar = false;
-			this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
-			this.Text = "NUnit Test Project Editor";
-			this.TransparencyKey = System.Drawing.Color.Green;
-			this.Load += new System.EventHandler(this.ProjectEditor_Load);
-			this.projectTabControl.ResumeLayout(false);
-			this.generalTabPage.ResumeLayout(false);
-			this.assemblyTabPage.ResumeLayout(false);
-			this.groupBox1.ResumeLayout(false);
-			this.ResumeLayout(false);
-
-		}
-		#endregion
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ProjectEditor));
+            this.fileNameHeader = new System.Windows.Forms.ColumnHeader();
+            this.fullPathHeader = new System.Windows.Forms.ColumnHeader();
+            this.closeButton = new System.Windows.Forms.Button();
+            this.helpProvider1 = new System.Windows.Forms.HelpProvider();
+            this.label5 = new System.Windows.Forms.Label();
+            this.projectPathLabel = new CP.Windows.Forms.ExpandingLabel();
+            this.label8 = new System.Windows.Forms.Label();
+            this.projectBaseTextBox = new System.Windows.Forms.TextBox();
+            this.projectTabControl = new System.Windows.Forms.TabControl();
+            this.generalTabPage = new System.Windows.Forms.TabPage();
+            this.runtimeVersionComboBox = new System.Windows.Forms.ComboBox();
+            this.label11 = new System.Windows.Forms.Label();
+            this.runtimeComboBox = new System.Windows.Forms.ComboBox();
+            this.label7 = new System.Windows.Forms.Label();
+            this.autoBinPathRadioButton = new System.Windows.Forms.RadioButton();
+            this.manualBinPathRadioButton = new System.Windows.Forms.RadioButton();
+            this.noBinPathRadioButton = new System.Windows.Forms.RadioButton();
+            this.configBaseBrowseButton = new System.Windows.Forms.Button();
+            this.privateBinPathTextBox = new System.Windows.Forms.TextBox();
+            this.label6 = new System.Windows.Forms.Label();
+            this.configFileTextBox = new System.Windows.Forms.TextBox();
+            this.label4 = new System.Windows.Forms.Label();
+            this.applicationBaseTextBox = new System.Windows.Forms.TextBox();
+            this.label3 = new System.Windows.Forms.Label();
+            this.assemblyTabPage = new System.Windows.Forms.TabPage();
+            this.assemblyPathBrowseButton = new System.Windows.Forms.Button();
+            this.assemblyPathTextBox = new System.Windows.Forms.TextBox();
+            this.label2 = new System.Windows.Forms.Label();
+            this.assemblyListBox = new System.Windows.Forms.ListBox();
+            this.addAssemblyButton = new System.Windows.Forms.Button();
+            this.removeAssemblyButton = new System.Windows.Forms.Button();
+            this.editConfigsButton = new System.Windows.Forms.Button();
+            this.configComboBox = new System.Windows.Forms.ComboBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.projectBaseBrowseButton = new System.Windows.Forms.Button();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.label9 = new System.Windows.Forms.Label();
+            this.label10 = new System.Windows.Forms.Label();
+            this.processModelComboBox = new System.Windows.Forms.ComboBox();
+            this.domainUsageComboBox = new System.Windows.Forms.ComboBox();
+            this.projectTabControl.SuspendLayout();
+            this.generalTabPage.SuspendLayout();
+            this.assemblyTabPage.SuspendLayout();
+            this.groupBox1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // fileNameHeader
+            // 
+            this.fileNameHeader.Text = "File Name";
+            this.fileNameHeader.Width = 100;
+            // 
+            // fullPathHeader
+            // 
+            this.fullPathHeader.Text = "Full Path";
+            this.fullPathHeader.Width = 256;
+            // 
+            // closeButton
+            // 
+            this.closeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+            this.closeButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+            this.closeButton.Location = new System.Drawing.Point(383, 496);
+            this.closeButton.Name = "closeButton";
+            this.helpProvider1.SetShowHelp(this.closeButton, false);
+            this.closeButton.Size = new System.Drawing.Size(87, 24);
+            this.closeButton.TabIndex = 6;
+            this.closeButton.Text = "Close";
+            this.closeButton.Click += new System.EventHandler(this.closeButton_Click);
+            // 
+            // label5
+            // 
+            this.label5.Location = new System.Drawing.Point(20, 7);
+            this.label5.Name = "label5";
+            this.helpProvider1.SetShowHelp(this.label5, false);
+            this.label5.Size = new System.Drawing.Size(84, 14);
+            this.label5.TabIndex = 0;
+            this.label5.Text = "Project Path:";
+            // 
+            // projectPathLabel
+            // 
+            this.projectPathLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.projectPathLabel.Location = new System.Drawing.Point(112, 7);
+            this.projectPathLabel.Name = "projectPathLabel";
+            this.helpProvider1.SetShowHelp(this.projectPathLabel, false);
+            this.projectPathLabel.Size = new System.Drawing.Size(352, 14);
+            this.projectPathLabel.TabIndex = 1;
+            // 
+            // label8
+            // 
+            this.label8.Location = new System.Drawing.Point(20, 45);
+            this.label8.Name = "label8";
+            this.helpProvider1.SetShowHelp(this.label8, false);
+            this.label8.Size = new System.Drawing.Size(100, 14);
+            this.label8.TabIndex = 7;
+            this.label8.Text = "Project Base:";
+            // 
+            // projectBaseTextBox
+            // 
+            this.projectBaseTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.helpProvider1.SetHelpString(this.projectBaseTextBox, "The ApplicationBase for the project. Defaults to the location of the project file" +
+                    ".");
+            this.projectBaseTextBox.Location = new System.Drawing.Point(112, 44);
+            this.projectBaseTextBox.Name = "projectBaseTextBox";
+            this.helpProvider1.SetShowHelp(this.projectBaseTextBox, true);
+            this.projectBaseTextBox.Size = new System.Drawing.Size(320, 22);
+            this.projectBaseTextBox.TabIndex = 8;
+            this.projectBaseTextBox.Validated += new System.EventHandler(this.projectBaseTextBox_Validated);
+            this.projectBaseTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.projectBaseTextBox_Validating);
+            // 
+            // projectTabControl
+            // 
+            this.projectTabControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                        | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.projectTabControl.Controls.Add(this.generalTabPage);
+            this.projectTabControl.Controls.Add(this.assemblyTabPage);
+            this.projectTabControl.ItemSize = new System.Drawing.Size(49, 18);
+            this.projectTabControl.Location = new System.Drawing.Point(7, 82);
+            this.projectTabControl.Name = "projectTabControl";
+            this.projectTabControl.SelectedIndex = 0;
+            this.helpProvider1.SetShowHelp(this.projectTabControl, false);
+            this.projectTabControl.Size = new System.Drawing.Size(446, 278);
+            this.projectTabControl.TabIndex = 9;
+            // 
+            // generalTabPage
+            // 
+            this.generalTabPage.Controls.Add(this.runtimeVersionComboBox);
+            this.generalTabPage.Controls.Add(this.label11);
+            this.generalTabPage.Controls.Add(this.runtimeComboBox);
+            this.generalTabPage.Controls.Add(this.label7);
+            this.generalTabPage.Controls.Add(this.autoBinPathRadioButton);
+            this.generalTabPage.Controls.Add(this.manualBinPathRadioButton);
+            this.generalTabPage.Controls.Add(this.noBinPathRadioButton);
+            this.generalTabPage.Controls.Add(this.configBaseBrowseButton);
+            this.generalTabPage.Controls.Add(this.privateBinPathTextBox);
+            this.generalTabPage.Controls.Add(this.label6);
+            this.generalTabPage.Controls.Add(this.configFileTextBox);
+            this.generalTabPage.Controls.Add(this.label4);
+            this.generalTabPage.Controls.Add(this.applicationBaseTextBox);
+            this.generalTabPage.Controls.Add(this.label3);
+            this.generalTabPage.Location = new System.Drawing.Point(4, 22);
+            this.generalTabPage.Name = "generalTabPage";
+            this.helpProvider1.SetShowHelp(this.generalTabPage, false);
+            this.generalTabPage.Size = new System.Drawing.Size(438, 252);
+            this.generalTabPage.TabIndex = 0;
+            this.generalTabPage.Text = "General";
+            // 
+            // runtimeVersionComboBox
+            // 
+            this.runtimeVersionComboBox.Items.AddRange(new object[] {
+            "Default",
+            "1.0",
+            "1.1",
+            "2.0",
+            "4.0"});
+            this.runtimeVersionComboBox.Location = new System.Drawing.Point(320, 16);
+            this.runtimeVersionComboBox.Name = "runtimeVersionComboBox";
+            this.runtimeVersionComboBox.Size = new System.Drawing.Size(101, 24);
+            this.runtimeVersionComboBox.TabIndex = 14;
+            this.runtimeVersionComboBox.Validating += new System.ComponentModel.CancelEventHandler(this.runtimeVersionComboBox_Validating);
+            this.runtimeVersionComboBox.Validated += new System.EventHandler(this.runtimeVersionComboBox_Validated);
+            // 
+            // label11
+            // 
+            this.label11.Location = new System.Drawing.Point(192, 16);
+            this.label11.Name = "label11";
+            this.label11.Size = new System.Drawing.Size(122, 16);
+            this.label11.TabIndex = 13;
+            this.label11.Text = "Runtime Version";
+            // 
+            // runtimeComboBox
+            // 
+            this.runtimeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+            this.runtimeComboBox.Items.AddRange(new object[] {
+            "Any",
+            "Net",
+            "Mono"});
+            this.runtimeComboBox.Location = new System.Drawing.Point(87, 16);
+            this.runtimeComboBox.Name = "runtimeComboBox";
+            this.runtimeComboBox.Size = new System.Drawing.Size(81, 24);
+            this.runtimeComboBox.TabIndex = 12;
+            // 
+            // label7
+            // 
+            this.label7.Location = new System.Drawing.Point(13, 16);
+            this.label7.Name = "label7";
+            this.label7.Size = new System.Drawing.Size(60, 16);
+            this.label7.TabIndex = 11;
+            this.label7.Text = "Runtime:";
+            // 
+            // autoBinPathRadioButton
+            // 
+            this.autoBinPathRadioButton.Location = new System.Drawing.Point(24, 154);
+            this.autoBinPathRadioButton.Name = "autoBinPathRadioButton";
+            this.helpProvider1.SetShowHelp(this.autoBinPathRadioButton, false);
+            this.autoBinPathRadioButton.Size = new System.Drawing.Size(273, 21);
+            this.autoBinPathRadioButton.TabIndex = 10;
+            this.autoBinPathRadioButton.Text = "Use automatically generated path";
+            this.autoBinPathRadioButton.CheckedChanged += new System.EventHandler(this.autoBinPathRadioButton_CheckedChanged);
+            // 
+            // manualBinPathRadioButton
+            // 
+            this.manualBinPathRadioButton.Location = new System.Drawing.Point(24, 186);
+            this.manualBinPathRadioButton.Name = "manualBinPathRadioButton";
+            this.helpProvider1.SetShowHelp(this.manualBinPathRadioButton, false);
+            this.manualBinPathRadioButton.Size = new System.Drawing.Size(101, 20);
+            this.manualBinPathRadioButton.TabIndex = 9;
+            this.manualBinPathRadioButton.Text = "Use this path:";
+            this.manualBinPathRadioButton.CheckedChanged += new System.EventHandler(this.manualBinPathRadioButton_CheckedChanged);
+            // 
+            // noBinPathRadioButton
+            // 
+            this.noBinPathRadioButton.Location = new System.Drawing.Point(24, 218);
+            this.noBinPathRadioButton.Name = "noBinPathRadioButton";
+            this.helpProvider1.SetShowHelp(this.noBinPathRadioButton, false);
+            this.noBinPathRadioButton.Size = new System.Drawing.Size(353, 21);
+            this.noBinPathRadioButton.TabIndex = 8;
+            this.noBinPathRadioButton.Text = "None - or specified in Configuration File";
+            this.noBinPathRadioButton.CheckedChanged += new System.EventHandler(this.noBinPathRadioButton_CheckedChanged);
+            // 
+            // configBaseBrowseButton
+            // 
+            this.configBaseBrowseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+            this.helpProvider1.SetHelpString(this.configBaseBrowseButton, "Browse to locate ApplicationBase directory.");
+            this.configBaseBrowseButton.Image = ((System.Drawing.Image)(resources.GetObject("configBaseBrowseButton.Image")));
+            this.configBaseBrowseButton.Location = new System.Drawing.Point(401, 56);
+            this.configBaseBrowseButton.Name = "configBaseBrowseButton";
+            this.helpProvider1.SetShowHelp(this.configBaseBrowseButton, true);
+            this.configBaseBrowseButton.Size = new System.Drawing.Size(20, 20);
+            this.configBaseBrowseButton.TabIndex = 7;
+            this.configBaseBrowseButton.Click += new System.EventHandler(this.configBaseBrowseButton_Click);
+            // 
+            // privateBinPathTextBox
+            // 
+            this.privateBinPathTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.helpProvider1.SetHelpString(this.privateBinPathTextBox, "Path searched when probing for private asemblies. Directories must be descendants" +
+                    " of the ApplicationBase.");
+            this.privateBinPathTextBox.Location = new System.Drawing.Point(144, 186);
+            this.privateBinPathTextBox.Name = "privateBinPathTextBox";
+            this.helpProvider1.SetShowHelp(this.privateBinPathTextBox, true);
+            this.privateBinPathTextBox.Size = new System.Drawing.Size(280, 22);
+            this.privateBinPathTextBox.TabIndex = 5;
+            this.privateBinPathTextBox.Validated += new System.EventHandler(this.privateBinPathTextBox_Validated);
+            this.privateBinPathTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.privateBinPathTextBox_Validating);
+            // 
+            // label6
+            // 
+            this.label6.AutoSize = true;
+            this.label6.Location = new System.Drawing.Point(8, 130);
+            this.label6.Name = "label6";
+            this.helpProvider1.SetShowHelp(this.label6, false);
+            this.label6.Size = new System.Drawing.Size(105, 17);
+            this.label6.TabIndex = 4;
+            this.label6.Text = "PrivateBinPath:";
+            // 
+            // configFileTextBox
+            // 
+            this.configFileTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.helpProvider1.SetHelpString(this.configFileTextBox, "Configuration file to use when loading assemblies if it exists. Defaults to <proj" +
+                    "ectname>.config. Must be located in the ApplicationBase directory.");
+            this.configFileTextBox.Location = new System.Drawing.Point(168, 96);
+            this.configFileTextBox.Name = "configFileTextBox";
+            this.helpProvider1.SetShowHelp(this.configFileTextBox, true);
+            this.configFileTextBox.Size = new System.Drawing.Size(256, 22);
+            this.configFileTextBox.TabIndex = 3;
+            this.configFileTextBox.Validated += new System.EventHandler(this.configFileTextBox_Validated);
+            this.configFileTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.configFileTextBox_Validating);
+            // 
+            // label4
+            // 
+            this.label4.AutoSize = true;
+            this.label4.Location = new System.Drawing.Point(8, 98);
+            this.label4.Name = "label4";
+            this.helpProvider1.SetShowHelp(this.label4, false);
+            this.label4.Size = new System.Drawing.Size(163, 17);
+            this.label4.TabIndex = 2;
+            this.label4.Text = "Configuration File Name:";
+            // 
+            // applicationBaseTextBox
+            // 
+            this.applicationBaseTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.helpProvider1.SetHelpString(this.applicationBaseTextBox, "The ApplicationBase for this configuration. May be absolute or relative to the pr" +
+                    "oject base. Defaults to the project base if not set.");
+            this.applicationBaseTextBox.Location = new System.Drawing.Point(128, 56);
+            this.applicationBaseTextBox.Name = "applicationBaseTextBox";
+            this.helpProvider1.SetShowHelp(this.applicationBaseTextBox, true);
+            this.applicationBaseTextBox.Size = new System.Drawing.Size(264, 22);
+            this.applicationBaseTextBox.TabIndex = 1;
+            this.applicationBaseTextBox.Validated += new System.EventHandler(this.applicationBaseTextBox_Validated);
+            this.applicationBaseTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.applicationBaseTextBox_Validating);
+            // 
+            // label3
+            // 
+            this.label3.AutoSize = true;
+            this.label3.Location = new System.Drawing.Point(8, 57);
+            this.label3.Name = "label3";
+            this.helpProvider1.SetShowHelp(this.label3, false);
+            this.label3.Size = new System.Drawing.Size(113, 17);
+            this.label3.TabIndex = 0;
+            this.label3.Text = "ApplicationBase:";
+            // 
+            // assemblyTabPage
+            // 
+            this.assemblyTabPage.Controls.Add(this.assemblyPathBrowseButton);
+            this.assemblyTabPage.Controls.Add(this.assemblyPathTextBox);
+            this.assemblyTabPage.Controls.Add(this.label2);
+            this.assemblyTabPage.Controls.Add(this.assemblyListBox);
+            this.assemblyTabPage.Controls.Add(this.addAssemblyButton);
+            this.assemblyTabPage.Controls.Add(this.removeAssemblyButton);
+            this.assemblyTabPage.Location = new System.Drawing.Point(4, 22);
+            this.assemblyTabPage.Name = "assemblyTabPage";
+            this.helpProvider1.SetShowHelp(this.assemblyTabPage, false);
+            this.assemblyTabPage.Size = new System.Drawing.Size(438, 252);
+            this.assemblyTabPage.TabIndex = 1;
+            this.assemblyTabPage.Text = "Assemblies";
+            this.assemblyTabPage.Visible = false;
+            // 
+            // assemblyPathBrowseButton
+            // 
+            this.assemblyPathBrowseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+            this.helpProvider1.SetHelpString(this.assemblyPathBrowseButton, "Browse to locate ApplicationBase directory.");
+            this.assemblyPathBrowseButton.Image = ((System.Drawing.Image)(resources.GetObject("assemblyPathBrowseButton.Image")));
+            this.assemblyPathBrowseButton.Location = new System.Drawing.Point(413, 192);
+            this.assemblyPathBrowseButton.Name = "assemblyPathBrowseButton";
+            this.helpProvider1.SetShowHelp(this.assemblyPathBrowseButton, true);
+            this.assemblyPathBrowseButton.Size = new System.Drawing.Size(20, 20);
+            this.assemblyPathBrowseButton.TabIndex = 11;
+            this.assemblyPathBrowseButton.Click += new System.EventHandler(this.assemblyPathBrowseButton_Click);
+            // 
+            // assemblyPathTextBox
+            // 
+            this.assemblyPathTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.assemblyPathTextBox.Location = new System.Drawing.Point(13, 192);
+            this.assemblyPathTextBox.Name = "assemblyPathTextBox";
+            this.assemblyPathTextBox.Size = new System.Drawing.Size(387, 22);
+            this.assemblyPathTextBox.TabIndex = 8;
+            this.assemblyPathTextBox.Validated += new System.EventHandler(this.assemblyPathTextBox_Validated);
+            this.assemblyPathTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.assemblyPathTextBox_Validating);
+            // 
+            // label2
+            // 
+            this.label2.Location = new System.Drawing.Point(13, 176);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(107, 14);
+            this.label2.TabIndex = 7;
+            this.label2.Text = "Assembly Path:";
+            // 
+            // assemblyListBox
+            // 
+            this.assemblyListBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.helpProvider1.SetHelpString(this.assemblyListBox, resources.GetString("assemblyListBox.HelpString"));
+            this.assemblyListBox.ItemHeight = 16;
+            this.assemblyListBox.Location = new System.Drawing.Point(13, 24);
+            this.assemblyListBox.Name = "assemblyListBox";
+            this.helpProvider1.SetShowHelp(this.assemblyListBox, true);
+            this.assemblyListBox.Size = new System.Drawing.Size(339, 132);
+            this.assemblyListBox.TabIndex = 6;
+            this.assemblyListBox.SelectedIndexChanged += new System.EventHandler(this.assemblyListBox_SelectedIndexChanged);
+            // 
+            // addAssemblyButton
+            // 
+            this.addAssemblyButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+            this.helpProvider1.SetHelpString(this.addAssemblyButton, "Add an assembly to this configuration.");
+            this.addAssemblyButton.Location = new System.Drawing.Point(367, 21);
+            this.addAssemblyButton.Name = "addAssemblyButton";
+            this.helpProvider1.SetShowHelp(this.addAssemblyButton, true);
+            this.addAssemblyButton.Size = new System.Drawing.Size(66, 20);
+            this.addAssemblyButton.TabIndex = 2;
+            this.addAssemblyButton.Text = "&Add...";
+            this.addAssemblyButton.Click += new System.EventHandler(this.addAssemblyButton_Click);
+            // 
+            // removeAssemblyButton
+            // 
+            this.removeAssemblyButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+            this.helpProvider1.SetHelpString(this.removeAssemblyButton, "Remove the selected assembly from the configuration.");
+            this.removeAssemblyButton.Location = new System.Drawing.Point(367, 49);
+            this.removeAssemblyButton.Name = "removeAssemblyButton";
+            this.helpProvider1.SetShowHelp(this.removeAssemblyButton, true);
+            this.removeAssemblyButton.Size = new System.Drawing.Size(66, 19);
+            this.removeAssemblyButton.TabIndex = 5;
+            this.removeAssemblyButton.Text = "&Remove";
+            this.removeAssemblyButton.Click += new System.EventHandler(this.removeAssemblyButton_Click);
+            // 
+            // editConfigsButton
+            // 
+            this.editConfigsButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+            this.helpProvider1.SetHelpString(this.editConfigsButton, "Add, remove or rename configurations.");
+            this.editConfigsButton.Location = new System.Drawing.Point(352, 33);
+            this.editConfigsButton.Name = "editConfigsButton";
+            this.helpProvider1.SetShowHelp(this.editConfigsButton, true);
+            this.editConfigsButton.Size = new System.Drawing.Size(95, 26);
+            this.editConfigsButton.TabIndex = 8;
+            this.editConfigsButton.Text = "&Edit Configs...";
+            this.editConfigsButton.Click += new System.EventHandler(this.editConfigsButton_Click);
+            // 
+            // configComboBox
+            // 
+            this.configComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.helpProvider1.SetHelpString(this.configComboBox, "Select the configuration to edit");
+            this.configComboBox.ItemHeight = 16;
+            this.configComboBox.Location = new System.Drawing.Point(112, 34);
+            this.configComboBox.Name = "configComboBox";
+            this.helpProvider1.SetShowHelp(this.configComboBox, true);
+            this.configComboBox.Size = new System.Drawing.Size(232, 24);
+            this.configComboBox.TabIndex = 7;
+            this.configComboBox.SelectedIndexChanged += new System.EventHandler(this.configComboBox_SelectedIndexChanged);
+            // 
+            // label1
+            // 
+            this.label1.Location = new System.Drawing.Point(13, 35);
+            this.label1.Name = "label1";
+            this.helpProvider1.SetShowHelp(this.label1, false);
+            this.label1.Size = new System.Drawing.Size(102, 24);
+            this.label1.TabIndex = 6;
+            this.label1.Text = "Configuration:";
+            // 
+            // projectBaseBrowseButton
+            // 
+            this.projectBaseBrowseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+            this.helpProvider1.SetHelpString(this.projectBaseBrowseButton, "Browse to locate ApplicationBase directory.");
+            this.projectBaseBrowseButton.Image = ((System.Drawing.Image)(resources.GetObject("projectBaseBrowseButton.Image")));
+            this.projectBaseBrowseButton.Location = new System.Drawing.Point(448, 45);
+            this.projectBaseBrowseButton.Name = "projectBaseBrowseButton";
+            this.helpProvider1.SetShowHelp(this.projectBaseBrowseButton, true);
+            this.projectBaseBrowseButton.Size = new System.Drawing.Size(24, 20);
+            this.projectBaseBrowseButton.TabIndex = 10;
+            this.projectBaseBrowseButton.Click += new System.EventHandler(this.projectBaseBrowseButton_Click);
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                        | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.groupBox1.BackColor = System.Drawing.SystemColors.Control;
+            this.groupBox1.Controls.Add(this.projectTabControl);
+            this.groupBox1.Controls.Add(this.editConfigsButton);
+            this.groupBox1.Controls.Add(this.configComboBox);
+            this.groupBox1.Controls.Add(this.label1);
+            this.groupBox1.Location = new System.Drawing.Point(17, 124);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(461, 366);
+            this.groupBox1.TabIndex = 9;
+            this.groupBox1.TabStop = false;
+            this.groupBox1.Text = "Configuration Properties";
+            // 
+            // label9
+            // 
+            this.label9.Location = new System.Drawing.Point(20, 87);
+            this.label9.Name = "label9";
+            this.label9.Size = new System.Drawing.Size(110, 16);
+            this.label9.TabIndex = 11;
+            this.label9.Text = "Process Model:";
+            // 
+            // label10
+            // 
+            this.label10.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.label10.Location = new System.Drawing.Point(248, 87);
+            this.label10.Name = "label10";
+            this.label10.Size = new System.Drawing.Size(112, 16);
+            this.label10.TabIndex = 12;
+            this.label10.Text = "Domain Usage:";
+            // 
+            // processModelComboBox
+            // 
+            this.processModelComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+            this.processModelComboBox.Items.AddRange(new object[] {
+            "Default",
+            "Single",
+            "Separate",
+            "Multiple"});
+            this.processModelComboBox.Location = new System.Drawing.Point(136, 82);
+            this.processModelComboBox.Name = "processModelComboBox";
+            this.processModelComboBox.Size = new System.Drawing.Size(104, 24);
+            this.processModelComboBox.TabIndex = 13;
+            // 
+            // domainUsageComboBox
+            // 
+            this.domainUsageComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.domainUsageComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+            this.domainUsageComboBox.Items.AddRange(new object[] {
+            "Default",
+            "None",
+            "Single",
+            "Multiple"});
+            this.domainUsageComboBox.Location = new System.Drawing.Point(360, 82);
+            this.domainUsageComboBox.Name = "domainUsageComboBox";
+            this.domainUsageComboBox.Size = new System.Drawing.Size(112, 24);
+            this.domainUsageComboBox.TabIndex = 14;
+            // 
+            // ProjectEditor
+            // 
+            this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);
+            this.ClientSize = new System.Drawing.Size(490, 523);
+            this.Controls.Add(this.domainUsageComboBox);
+            this.Controls.Add(this.processModelComboBox);
+            this.Controls.Add(this.label10);
+            this.Controls.Add(this.label9);
+            this.Controls.Add(this.projectBaseBrowseButton);
+            this.Controls.Add(this.groupBox1);
+            this.Controls.Add(this.projectBaseTextBox);
+            this.Controls.Add(this.label8);
+            this.Controls.Add(this.projectPathLabel);
+            this.Controls.Add(this.label5);
+            this.Controls.Add(this.closeButton);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+            this.HelpButton = true;
+            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+            this.MaximizeBox = false;
+            this.MinimizeBox = false;
+            this.MinimumSize = new System.Drawing.Size(376, 400);
+            this.Name = "ProjectEditor";
+            this.helpProvider1.SetShowHelp(this, false);
+            this.ShowInTaskbar = false;
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+            this.Text = "NUnit Test Project Editor";
+            this.TransparencyKey = System.Drawing.Color.Green;
+            this.Load += new System.EventHandler(this.ProjectEditor_Load);
+            this.projectTabControl.ResumeLayout(false);
+            this.generalTabPage.ResumeLayout(false);
+            this.generalTabPage.PerformLayout();
+            this.assemblyTabPage.ResumeLayout(false);
+            this.assemblyTabPage.PerformLayout();
+            this.groupBox1.ResumeLayout(false);
+            this.ResumeLayout(false);
+            this.PerformLayout();
 
-		#region Properties
-		private bool visualStudioSupport;
-		public bool VisualStudioSupport
-		{
-			get { return visualStudioSupport; }
-			set { visualStudioSupport = value; }
 		}
 		#endregion
 
@@ -571,6 +680,26 @@ namespace NUnit.Gui
 		private void configComboBox_SelectedIndexChanged(object sender, System.EventArgs e)
 		{
 			selectedConfig = project.Configs[(string)configComboBox.SelectedItem];
+
+			RuntimeFramework framework = selectedConfig.RuntimeFramework;
+
+			RuntimeType runtime = RuntimeType.Any;
+            Version version = RuntimeFramework.DefaultVersion;
+
+            if (framework != null)
+            {
+                runtime = framework.Runtime;
+                version = framework.ClrVersion;
+            }
+
+			int index = runtimeComboBox.FindStringExact(runtime.ToString(), 0);
+			if ( index < 0 ) index = 0;
+			runtimeComboBox.SelectedIndex = index;
+
+            if (framework == null || framework.AllowAnyVersion)
+                runtimeVersionComboBox.SelectedIndex = 0;
+            else
+				runtimeVersionComboBox.Text = version.ToString();
 			
 			applicationBaseTextBox.Text = selectedConfig.RelativeBasePath;
 
@@ -614,9 +743,18 @@ namespace NUnit.Gui
 
 			if ( assemblyListBox.Items.Count > 0 && selectedIndex == -1)
 				selectedIndex = 0;
-				
-			if ( selectedIndex != -1 )
-				assemblyListBox.SelectedIndex = selectedIndex;
+
+            if (selectedIndex == -1)
+            {
+                removeAssemblyButton.Enabled = false;
+                assemblyPathBrowseButton.Enabled = false;
+            }
+            else
+            {
+                assemblyListBox.SelectedIndex = selectedIndex;
+                removeAssemblyButton.Enabled = true;
+                assemblyPathBrowseButton.Enabled = true;
+            }
 		}
 
 		private void assemblyListBox_SelectedIndexChanged(object sender, System.EventArgs e)
@@ -624,14 +762,16 @@ namespace NUnit.Gui
 			if ( assemblyListBox.SelectedIndex == -1 )
 			{
 				assemblyPathTextBox.Text = selectedAssembly = null;
-				removeAssemblyButton.Enabled = false;
-			}
+                removeAssemblyButton.Enabled = false;
+                assemblyPathBrowseButton.Enabled = false;
+            }
 			else 
 			{
 				assemblyPathTextBox.Text = selectedAssembly = //(string)assemblyListBox.SelectedItem;
-					project.ActiveConfig.Assemblies[assemblyListBox.SelectedIndex];
+					selectedConfig.Assemblies[assemblyListBox.SelectedIndex];
 				removeAssemblyButton.Enabled = true;
-			}
+                assemblyPathBrowseButton.Enabled = true;
+            }
 		}
 
 		#endregion
@@ -639,14 +779,15 @@ namespace NUnit.Gui
 		#region Project Base Methods and Events
 		private void projectBaseBrowseButton_Click(object sender, System.EventArgs e)
 		{
-			FolderBrowser browser = new FolderBrowser( this );
-			browser.Caption = "Project Editor";
-			browser.Title = string.Format( "Select ApplicationBase for the project", selectedConfig.Name );
-			browser.InitialSelection = project.BasePath;
-			string projectBase = browser.BrowseForFolder();
-			if ( projectBase != null && projectBase != project.BasePath )
-				UpdateProjectBase( projectBase );
-		}
+            FolderBrowserDialog browser = new FolderBrowserDialog();
+            browser.Description = string.Format("Select ApplicationBase for the project as a whole.");
+            if (browser.ShowDialog(this) == DialogResult.OK)
+            {
+                string projectBase = browser.SelectedPath;
+                if (projectBase != null && projectBase != project.BasePath)
+                    UpdateProjectBase(projectBase);
+            }
+        }
 
 		private void projectBaseTextBox_Validating(object sender, System.ComponentModel.CancelEventArgs e)
 		{
@@ -661,7 +802,7 @@ namespace NUnit.Gui
 				catch( Exception ex )
 				{
 					projectBaseTextBox.SelectAll();
-					UserMessage.DisplayFailure( ex, "Invalid Entry" );
+					UserMessage.DisplayFailure( ex, "Invalid Project Base" );
 					e.Cancel = true;
 				}
 
@@ -703,13 +844,18 @@ namespace NUnit.Gui
 		#region Config Base Methods and Events
 		private void configBaseBrowseButton_Click(object sender, System.EventArgs e)
 		{
-			FolderBrowser browser = new FolderBrowser( this, project.BasePath );
-			browser.Caption = "Project Editor";
-			browser.Title = string.Format( "Select ApplicationBase for the {0} configuration", selectedConfig.Name );
-			browser.InitialSelection = selectedConfig.BasePath;
-			string appbase = browser.BrowseForFolder();
-			if ( appbase != null && appbase != selectedConfig.BasePath )
-				UpdateApplicationBase( appbase );
+            FolderBrowserDialog browser = new FolderBrowserDialog();
+            browser.Description = string.Format(
+                "Select ApplicationBase for the {0} configuration, if different from the project as a whole.",
+                selectedConfig.Name);
+            //browser.RootFolder = project.BasePath;
+            browser.SelectedPath = selectedConfig.BasePath;
+            if (browser.ShowDialog(this) == DialogResult.OK)
+            {
+                string appbase = browser.SelectedPath;
+                if (appbase != null && appbase != selectedConfig.BasePath)
+                    UpdateApplicationBase(appbase);
+            }
 		}
 
 		private void applicationBaseTextBox_Validating(object sender, System.ComponentModel.CancelEventArgs e)
@@ -726,7 +872,7 @@ namespace NUnit.Gui
 				catch( Exception exception )
 				{
 					applicationBaseTextBox.SelectAll();
-					UserMessage.DisplayFailure( exception, "Invalid Entry" );
+					UserMessage.DisplayFailure( exception, "Invalid ApplicationBase" );
 					e.Cancel = true;
 				}
 
@@ -790,16 +936,16 @@ namespace NUnit.Gui
 			string configFile = configFileTextBox.Text;
 			if ( configFile != String.Empty )
 			{
-				try
-				{
-					File.Open( Path.Combine( selectedConfig.BasePath, configFile ), FileMode.Open );
-				}
-				catch( System.Exception exception )
-				{
-					configFileTextBox.SelectAll();
-					UserMessage.DisplayFailure( exception, "Invalid Entry" );
-					e.Cancel = true;
-				}
+                try
+                {
+                    new FileInfo(Path.Combine(selectedConfig.BasePath, configFile));
+                }
+                catch (System.Exception exception)
+                {
+                    assemblyPathTextBox.SelectAll();
+                    UserMessage.DisplayFailure(exception, "Invalid Config File Entry");
+                    e.Cancel = true;
+                }
 
 				if ( configFile != Path.GetFileName( configFile ) )
 				{
@@ -819,6 +965,123 @@ namespace NUnit.Gui
 		}
 		#endregion
 
+        #region Process Model Methods and Events
+
+        private void processModelComboBox_SelectedIndexChanged(object sender, System.EventArgs e)
+        {
+            project.ProcessModel = this.ProcessModel;
+            populateDomainUsageComboBox();
+        }
+
+        private ProcessModel ProcessModel
+        {
+            get { return (ProcessModel)processModelComboBox.SelectedIndex; }
+            set { processModelComboBox.SelectedIndex = (int)value; }
+        }
+
+        #endregion
+
+        #region DomainUsage MethodsAndEvents
+
+        private void domainUsageComboBox_SelectedIndexChanged(object sender, System.EventArgs e)
+        {
+            project.DomainUsage = this.DomainUsage;
+        }
+
+        private DomainUsage DomainUsage
+        {
+            get
+            {
+                int index = domainUsageComboBox.SelectedIndex;
+                if (index < 0)
+                    return DomainUsage.Default;
+
+                return (DomainUsage)Enum.Parse(
+                    typeof(DomainUsage),
+                    domainUsageComboBox.SelectedItem.ToString());
+            }
+            set
+            {
+                domainUsageComboBox.SelectedIndex =
+                    domainUsageComboBox.FindString(value.ToString());
+            }
+        }
+
+        private void populateDomainUsageComboBox()
+        {
+            domainUsageComboBox.Items.Clear();
+            domainUsageComboBox.Items.Add("Default");
+            //domainUsageComboBox.Items.Add("None");
+            domainUsageComboBox.Items.Add("Single");
+            if (project.ProcessModel != ProcessModel.Multiple)
+                domainUsageComboBox.Items.Add("Multiple");
+
+            domainUsageComboBox.SelectedIndex = 0;
+        }
+
+        #endregion
+
+        #region Runtime Framework Methods and Events
+		private void runtimeComboBox_SelectedIndexChanged(object sender, System.EventArgs e)
+		{
+            SetRuntimeFramework();
+		}
+
+        private void runtimeVersionComboBox_Validating(object sender, System.ComponentModel.CancelEventArgs e)
+        {
+			string s = runtimeVersionComboBox.Text;
+			
+			if (s != string.Empty && s != "Default")
+			{
+		        try
+		        {
+		            new Version(s);
+		        }
+		        catch (Exception ex)
+		        {
+		            runtimeVersionComboBox.SelectAll();
+		            UserMessage.DisplayFailure(ex, "Invalid Runtime Version");
+		            e.Cancel = true;
+		        }
+			}
+        }
+
+        private void runtimeVersionComboBox_Validated(object sender, System.EventArgs e)
+        {
+            SetRuntimeFramework();
+        }
+
+        private void SetRuntimeFramework()
+        {
+            selectedConfig.RuntimeFramework = new RuntimeFramework(this.RuntimeType, this.RuntimeVersion);
+        }
+
+        private RuntimeType RuntimeType
+        {
+            get
+            {
+                int index = runtimeComboBox.SelectedIndex;
+                if (index < 0)
+                    return RuntimeType.Any;
+
+                string s = runtimeComboBox.SelectedItem.ToString();
+                return (RuntimeType)Enum.Parse(typeof(RuntimeType), s);
+            }
+        }
+
+        private Version RuntimeVersion
+        {
+            get
+            {
+                string s = runtimeVersionComboBox.Text;
+                return s == string.Empty || s == "Default"
+                    ? RuntimeFramework.DefaultVersion
+                    : new Version(s);
+            }
+        }
+        
+        #endregion
+
 		#region PrivateBinPath Methods and Events
 		private void privateBinPathTextBox_Validating(object sender, System.ComponentModel.CancelEventArgs e)
 		{
@@ -835,7 +1098,7 @@ namespace NUnit.Gui
 					catch(System.Exception exception)
 					{
 						privateBinPathTextBox.Select( binPath.IndexOf( element ), element.Length );
-						UserMessage.DisplayFailure( exception, "Invalid Entry" );
+						UserMessage.DisplayFailure( exception, "Invalid Path: " + element );
 						e.Cancel = true;
 					}
 				}
@@ -849,7 +1112,35 @@ namespace NUnit.Gui
 			else
 				selectedConfig.PrivateBinPath = privateBinPathTextBox.Text;
 		}
-		#endregion
+
+        private void autoBinPathRadioButton_CheckedChanged(object sender, System.EventArgs e)
+        {
+            if (autoBinPathRadioButton.Checked)
+            {
+                selectedConfig.BinPathType = BinPathType.Auto;
+                privateBinPathTextBox.Enabled = false;
+            }
+        }
+
+        private void manualBinPathRadioButton_CheckedChanged(object sender, System.EventArgs e)
+        {
+            if (manualBinPathRadioButton.Checked)
+            {
+                selectedConfig.BinPathType = BinPathType.Manual;
+                privateBinPathTextBox.Enabled = true;
+            }
+        }
+
+        private void noBinPathRadioButton_CheckedChanged(object sender, System.EventArgs e)
+        {
+            if (noBinPathRadioButton.Checked)
+            {
+                selectedConfig.BinPathType = BinPathType.None;
+                privateBinPathTextBox.Enabled = false;
+            }
+        }
+        
+        #endregion
 
 		#region Assembly Path Methods and Events
 		private void assemblyPathBrowseButton_Click(object sender, System.EventArgs e)
@@ -869,31 +1160,34 @@ namespace NUnit.Gui
 			{
 				selectedConfig.Assemblies[assemblyListBox.SelectedIndex] = dlg.FileName;
 				assemblyListBox_Populate();
-			}
+            }
 		}
 
 		private void assemblyPathTextBox_Validating(object sender, System.ComponentModel.CancelEventArgs e)
 		{
 			string path = assemblyPathTextBox.Text;
 
-			try
-			{
-				FileInfo info = new FileInfo( path );
-
-				if ( !info.Exists )
-				{
-					DialogResult answer = UserMessage.Ask( string.Format( 
-						"The path {0} does not exist. Do you want to use it anyway?", path ) );
-					if ( answer != DialogResult.Yes )
-						e.Cancel = true;
-				}
-			}
-			catch( System.Exception exception )
-			{
-				assemblyPathTextBox.SelectAll();
-				UserMessage.DisplayFailure( exception, "Invalid Entry" );
-				e.Cancel = true;
-			}		
+            if (path != string.Empty)
+            {
+                try
+                {
+                    FileInfo info = new FileInfo(path);
+
+                    if (!info.Exists)
+                    {
+                        DialogResult answer = UserMessage.Ask(string.Format(
+                            "The path {0} does not exist. Do you want to use it anyway?", path));
+                        if (answer != DialogResult.Yes)
+                            e.Cancel = true;
+                    }
+                }
+                catch (System.Exception exception)
+                {
+                    assemblyPathTextBox.SelectAll();
+                    UserMessage.DisplayFailure(exception, "Invalid Assembly Path");
+                    e.Cancel = true;
+                }
+            }
 		}
 
 		private void assemblyPathTextBox_Validated(object sender, System.EventArgs e)
@@ -911,10 +1205,17 @@ namespace NUnit.Gui
 				project.Name );
 
 			projectPathLabel.Text = project.ProjectPath;
-
 			projectBaseTextBox.Text = project.BasePath;
 
-			configComboBox_Populate();
+            configComboBox_Populate();
+			populateDomainUsageComboBox();
+
+            this.ProcessModel = project.ProcessModel;
+            this.DomainUsage = project.DomainUsage;
+
+			this.processModelComboBox.SelectedIndexChanged += new System.EventHandler(this.processModelComboBox_SelectedIndexChanged);
+			this.domainUsageComboBox.SelectedIndexChanged += new System.EventHandler(this.domainUsageComboBox_SelectedIndexChanged);
+			this.runtimeComboBox.SelectedIndexChanged += new System.EventHandler(this.runtimeComboBox_SelectedIndexChanged);
 		}
 
 		private void editConfigsButton_Click(object sender, System.EventArgs e)
@@ -940,6 +1241,7 @@ namespace NUnit.Gui
 			{
 				int index = assemblyListBox.SelectedIndex;
 				selectedConfig.Assemblies.RemoveAt( index );
+
 				assemblyListBox.Items.RemoveAt( index );
 				if ( index >= assemblyListBox.Items.Count )
 					--index;
@@ -959,32 +1261,6 @@ namespace NUnit.Gui
 			this.Close();		
 		}
 
-		private void autoBinPathRadioButton_CheckedChanged(object sender, System.EventArgs e)
-		{
-			if ( autoBinPathRadioButton.Checked )
-			{
-				selectedConfig.BinPathType = BinPathType.Auto;
-				privateBinPathTextBox.Enabled = false;
-			}
-		}
-
-		private void manualBinPathRadioButton_CheckedChanged(object sender, System.EventArgs e)
-		{
-			if ( manualBinPathRadioButton.Checked )
-			{
-				selectedConfig.BinPathType = BinPathType.Manual;
-				privateBinPathTextBox.Enabled = true;
-			}
-		}
-
-		private void noBinPathRadioButton_CheckedChanged(object sender, System.EventArgs e)
-		{
-			if ( noBinPathRadioButton.Checked )
-			{
-				selectedConfig.BinPathType = BinPathType.None;
-				privateBinPathTextBox.Enabled = false;
-			}
-		}
-		#endregion
+        #endregion
 	}
 }
diff --git a/src/GuiRunner/nunit-gui/ProjectEditor.resx b/src/GuiRunner/nunit-gui/ProjectEditor.resx
index c42e933..ea10b78 100644
--- a/src/GuiRunner/nunit-gui/ProjectEditor.resx
+++ b/src/GuiRunner/nunit-gui/ProjectEditor.resx
@@ -1,9 +1,9 @@
-<?xml version="1.0" encoding="utf-8" ?>
+<?xml version="1.0" encoding="utf-8"?>
 <root>
-	<!-- 
+  <!-- 
     Microsoft ResX Schema 
     
-    Version 1.3
+    Version 2.0
     
     The primary goals of this format is to allow a simple XML format 
     that is mostly human readable. The generation and parsing of the 
@@ -14,16 +14,17 @@
     
     ... ado.net/XML headers & schema ...
     <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">1.3</resheader>
+    <resheader name="version">2.0</resheader>
     <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
     <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1">this is my long string</data>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
     <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
     <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        [base64 mime encoded serialized .NET Framework object]
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
     </data>
     <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
     </data>
                 
     There are any number of "resheader" rows that contain simple 
@@ -35,7 +36,7 @@
     Classes that don't support this are serialized and stored with the 
     mimetype set.
     
-    The mimetype is used forserialized objects, and tells the 
+    The mimetype is used for serialized objects, and tells the 
     ResXResourceReader how to depersist the object. This is currently not 
     extensible. For a given mimetype the value must be set accordingly:
     
@@ -45,7 +46,7 @@
     
     mimetype: application/x-microsoft.net.object.binary.base64
     value   : The object must be serialized with 
-            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
             : and then encoded with base64 encoding.
     
     mimetype: application/x-microsoft.net.object.soap.base64
@@ -58,417 +59,91 @@
             : using a System.ComponentModel.TypeConverter
             : and then encoded with base64 encoding.
     -->
-	<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-		<xsd:element name="root" msdata:IsDataSet="true">
-			<xsd:complexType>
-				<xsd:choice maxOccurs="unbounded">
-					<xsd:element name="data">
-						<xsd:complexType>
-							<xsd:sequence>
-								<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-								<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-							</xsd:sequence>
-							<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
-							<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-							<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-						</xsd:complexType>
-					</xsd:element>
-					<xsd:element name="resheader">
-						<xsd:complexType>
-							<xsd:sequence>
-								<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-							</xsd:sequence>
-							<xsd:attribute name="name" type="xsd:string" use="required" />
-						</xsd:complexType>
-					</xsd:element>
-				</xsd:choice>
-			</xsd:complexType>
-		</xsd:element>
-	</xsd:schema>
-	<resheader name="resmimetype">
-		<value>text/microsoft-resx</value>
-	</resheader>
-	<resheader name="version">
-		<value>1.3</value>
-	</resheader>
-	<resheader name="reader">
-		<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-	</resheader>
-	<resheader name="writer">
-		<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-	</resheader>
-	<data name="fileNameHeader.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="fileNameHeader.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="fullPathHeader.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="fullPathHeader.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="closeButton.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="closeButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="closeButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="helpProvider1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="helpProvider1.Location" type="System.Drawing.Point, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-		<value>17, 17</value>
-	</data>
-	<data name="helpProvider1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="label5.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="label5.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="label5.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="projectPathLabel.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="projectPathLabel.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="projectPathLabel.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="label8.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="label8.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="label8.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="projectBaseTextBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="projectBaseTextBox.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="projectBaseTextBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="projectTabControl.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>True</value>
-	</data>
-	<data name="projectTabControl.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="projectTabControl.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>True</value>
-	</data>
-	<data name="projectTabControl.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-		<value>8, 8</value>
-	</data>
-	<data name="projectTabControl.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="projectTabControl.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="generalTabPage.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="generalTabPage.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>True</value>
-	</data>
-	<data name="generalTabPage.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>True</value>
-	</data>
-	<data name="generalTabPage.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="generalTabPage.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="generalTabPage.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-		<value>8, 8</value>
-	</data>
-	<data name="autoBinPathRadioButton.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="autoBinPathRadioButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="autoBinPathRadioButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="manualBinPathRadioButton.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="manualBinPathRadioButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="manualBinPathRadioButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="noBinPathRadioButton.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="noBinPathRadioButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="noBinPathRadioButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="configBaseBrowseButton.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="configBaseBrowseButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="configBaseBrowseButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="configBaseBrowseButton.Image" type="System.Drawing.Bitmap, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
-		mimetype="application/x-microsoft.net.object.bytearray.base64">
-		<value>
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="helpProvider1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="configBaseBrowseButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
         R0lGODlhCgAKAPMAAAAAAIAAAACAAICAAAAAgIAAgACAgMDAwICAgP8AAAD/AP//AAAA//8A/wD/////
         /yH5BAEAAA8ALAAAAAAKAAoAAAQS8MlJq72YAiB339zjiWFmnlgEADs=
 </value>
-	</data>
-	<data name="privateBinPathTextBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="privateBinPathTextBox.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="privateBinPathTextBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="label6.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="label6.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="label6.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="configFileTextBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="configFileTextBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="configFileTextBox.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="label4.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="label4.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="label4.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="applicationBaseTextBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="applicationBaseTextBox.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="applicationBaseTextBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="label3.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="label3.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="label3.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="assemblyTabPage.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="assemblyTabPage.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>True</value>
-	</data>
-	<data name="assemblyTabPage.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>True</value>
-	</data>
-	<data name="assemblyTabPage.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="assemblyTabPage.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="assemblyTabPage.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-		<value>8, 8</value>
-	</data>
-	<data name="assemblyPathTextBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="assemblyPathTextBox.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="assemblyPathTextBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="label2.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="label2.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="label2.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="assemblyListBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="assemblyListBox.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="assemblyListBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="addAssemblyButton.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="addAssemblyButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="addAssemblyButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="removeAssemblyButton.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="removeAssemblyButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="removeAssemblyButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="editConfigsButton.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="editConfigsButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="editConfigsButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="configComboBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="configComboBox.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="configComboBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="label1.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="label1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="label1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="projectBaseBrowseButton.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="projectBaseBrowseButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="projectBaseBrowseButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="projectBaseBrowseButton.Image" type="System.Drawing.Bitmap, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
-		mimetype="application/x-microsoft.net.object.bytearray.base64">
-		<value>
+  </data>
+  <data name="assemblyPathBrowseButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
         R0lGODlhCgAKAPMAAAAAAIAAAACAAICAAAAAgIAAgACAgMDAwICAgP8AAAD/AP//AAAA//8A/wD/////
         /yH5BAEAAA8ALAAAAAAKAAoAAAQS8MlJq72YAiB339zjiWFmnlgEADs=
 </value>
-	</data>
-	<data name="groupBox1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="groupBox1.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-		<value>8, 8</value>
-	</data>
-	<data name="groupBox1.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>True</value>
-	</data>
-	<data name="groupBox1.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="groupBox1.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>True</value>
-	</data>
-	<data name="groupBox1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="assemblyPathBrowseButton.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="assemblyPathBrowseButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="assemblyPathBrowseButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="assemblyPathBrowseButton.Image" type="System.Drawing.Bitmap, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
-		mimetype="application/x-microsoft.net.object.bytearray.base64">
-		<value>
+  </data>
+  <data name="assemblyListBox.HelpString" xml:space="preserve">
+    <value>Checked assemblies will have tests loaded in the UI. Tests (if any) in unchecked assemblies will not be loaded. All listed assemblies are watched for changes and used in determining the PrivateBinPath.</value>
+  </data>
+  <data name="projectBaseBrowseButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
         R0lGODlhCgAKAPMAAAAAAIAAAACAAICAAAAAgIAAgACAgMDAwICAgP8AAAD/AP//AAAA//8A/wD/////
         /yH5BAEAAA8ALAAAAAAKAAoAAAQS8MlJq72YAiB339zjiWFmnlgEADs=
 </value>
-	</data>
-	<data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>(Default)</value>
-	</data>
-	<data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>False</value>
-	</data>
-	<data name="$this.Name">
-		<value>ProjectEditor</value>
-	</data>
-	<data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-		<value>8, 8</value>
-	</data>
-	<data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>True</value>
-	</data>
-	<data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>40</value>
-	</data>
-	<data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>True</value>
-	</data>
-	<data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-		<value>Private</value>
-	</data>
-	<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
-		mimetype="application/x-microsoft.net.object.bytearray.base64">
-		<value>
+  </data>
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
         AAABAAIAICAQAAAAAADoAgAAJgAAABAQEAAAAAAAKAEAAA4DAAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC
         AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/
         AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@@ -488,5 +163,5 @@
         r6qZn5mf+qqvqv////+qqvqqr///////////////////////////////////////////////AAAAAAAA
         AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
 </value>
-	</data>
+  </data>
 </root>
\ No newline at end of file
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/AdvancedLoaderSettingsPage.cs b/src/GuiRunner/nunit-gui/SettingsPages/AdvancedLoaderSettingsPage.cs
index 83e3db7..5d1554d 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/AdvancedLoaderSettingsPage.cs
+++ b/src/GuiRunner/nunit-gui/SettingsPages/AdvancedLoaderSettingsPage.cs
@@ -1,140 +1,184 @@
-using System;
-using System.Collections;
-using System.ComponentModel;
-using System.Drawing;
-using System.Windows.Forms;
-using NUnit.Util;
-
-namespace NUnit.Gui.SettingsPages
-{
-	public class AdvancedLoaderSettingsPage : NUnit.UiKit.SettingsPage
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Collections;
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+using NUnit.Util;
+
+namespace NUnit.Gui.SettingsPages
+{
+	public class AdvancedLoaderSettingsPage : NUnit.UiKit.SettingsPage
 	{
 		private System.Windows.Forms.Label label3;
 		private System.Windows.Forms.GroupBox groupBox3;
-		private System.Windows.Forms.CheckBox disableShadowCopyCheckBox;
+		private System.Windows.Forms.CheckBox enableShadowCopyCheckBox;
 		private System.Windows.Forms.Label label1;
 		private System.Windows.Forms.Label label2;
-		private System.Windows.Forms.HelpProvider helpProvider1;
-		private System.ComponentModel.IContainer components = null;
-
-		public AdvancedLoaderSettingsPage( string key ) : base( key )
-		{
-			// This call is required by the Windows Form Designer.
-			InitializeComponent();
-
-			// TODO: Add any initialization after the InitializeComponent call
-		}
-
-		/// <summary>
-		/// Clean up any resources being used.
-		/// </summary>
-		protected override void Dispose( bool disposing )
-		{
-			if( disposing )
-			{
-				if (components != null) 
-				{
-					components.Dispose();
-				}
-			}
-			base.Dispose( disposing );
-		}
-
-		#region Designer generated code
-		/// <summary>
-		/// Required method for Designer support - do not modify
-		/// the contents of this method with the code editor.
-		/// </summary>
-		private void InitializeComponent()
-		{
-			this.label3 = new System.Windows.Forms.Label();
-			this.groupBox3 = new System.Windows.Forms.GroupBox();
-			this.disableShadowCopyCheckBox = new System.Windows.Forms.CheckBox();
-			this.label1 = new System.Windows.Forms.Label();
-			this.label2 = new System.Windows.Forms.Label();
-			this.helpProvider1 = new System.Windows.Forms.HelpProvider();
-			this.SuspendLayout();
-			// 
-			// label3
-			// 
-			this.label3.Location = new System.Drawing.Point(8, 8);
-			this.label3.Name = "label3";
-			this.label3.Size = new System.Drawing.Size(88, 16);
-			this.label3.TabIndex = 12;
-			this.label3.Text = "Shadow Copy";
-			// 
-			// groupBox3
-			// 
-			this.groupBox3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.groupBox3.Location = new System.Drawing.Point(104, 8);
-			this.groupBox3.Name = "groupBox3";
-			this.groupBox3.Size = new System.Drawing.Size(344, 8);
-			this.groupBox3.TabIndex = 11;
-			this.groupBox3.TabStop = false;
-			// 
-			// disableShadowCopyCheckBox
-			// 
-			this.helpProvider1.SetHelpString(this.disableShadowCopyCheckBox, "If checked, NUnit will disable copying of the assemblies to the shadow copy cache" +
-				" by the CLR. With shadow copying disabled, it is not possible to make changes to" +
-				" the assemblies while NUnit is running.");
-			this.disableShadowCopyCheckBox.Location = new System.Drawing.Point(24, 32);
-			this.disableShadowCopyCheckBox.Name = "disableShadowCopyCheckBox";
-			this.helpProvider1.SetShowHelp(this.disableShadowCopyCheckBox, true);
-			this.disableShadowCopyCheckBox.Size = new System.Drawing.Size(280, 22);
-			this.disableShadowCopyCheckBox.TabIndex = 31;
-			this.disableShadowCopyCheckBox.Text = "Disable Shadow Copy (default: Enabled)";
-			// 
-			// label1
-			// 
-			this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
-			this.label1.Location = new System.Drawing.Point(24, 296);
-			this.label1.Name = "label1";
-			this.label1.Size = new System.Drawing.Size(72, 24);
-			this.label1.TabIndex = 32;
-			this.label1.Text = "Warning:";
-			// 
-			// label2
-			// 
-			this.label2.Location = new System.Drawing.Point(96, 296);
-			this.label2.Name = "label2";
-			this.label2.Size = new System.Drawing.Size(336, 32);
-			this.label2.TabIndex = 33;
-			this.label2.Text = "Don\'t change any settings on this page unless you know what you are doing!";
-			// 
-			// AdvancedLoaderSettingsPage
-			// 
-			this.Controls.Add(this.label2);
-			this.Controls.Add(this.label1);
-			this.Controls.Add(this.label3);
-			this.Controls.Add(this.groupBox3);
-			this.Controls.Add(this.disableShadowCopyCheckBox);
-			this.Name = "AdvancedLoaderSettingsPage";
-			this.ResumeLayout(false);
+		private System.Windows.Forms.HelpProvider helpProvider1;
+        private Label label4;
+        private TextBox shadowCopyPathTextBox;
+		private System.ComponentModel.IContainer components = null;
+
+		public AdvancedLoaderSettingsPage( string key ) : base( key )
+		{
+			// This call is required by the Windows Form Designer.
+			InitializeComponent();
+
+			// TODO: Add any initialization after the InitializeComponent call
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if (components != null) 
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AdvancedLoaderSettingsPage));
+            this.label3 = new System.Windows.Forms.Label();
+            this.groupBox3 = new System.Windows.Forms.GroupBox();
+            this.enableShadowCopyCheckBox = new System.Windows.Forms.CheckBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.label2 = new System.Windows.Forms.Label();
+            this.helpProvider1 = new System.Windows.Forms.HelpProvider();
+            this.label4 = new System.Windows.Forms.Label();
+            this.shadowCopyPathTextBox = new System.Windows.Forms.TextBox();
+            this.SuspendLayout();
+            // 
+            // label3
+            // 
+            this.label3.Location = new System.Drawing.Point(8, 8);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(88, 16);
+            this.label3.TabIndex = 12;
+            this.label3.Text = "Shadow Copy";
+            // 
+            // groupBox3
+            // 
+            this.groupBox3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.groupBox3.Location = new System.Drawing.Point(104, 8);
+            this.groupBox3.Name = "groupBox3";
+            this.groupBox3.Size = new System.Drawing.Size(344, 8);
+            this.groupBox3.TabIndex = 11;
+            this.groupBox3.TabStop = false;
+            // 
+            // enableShadowCopyCheckBox
+            // 
+            this.helpProvider1.SetHelpString(this.enableShadowCopyCheckBox, resources.GetString("enableShadowCopyCheckBox.HelpString"));
+            this.enableShadowCopyCheckBox.Location = new System.Drawing.Point(24, 32);
+            this.enableShadowCopyCheckBox.Name = "enableShadowCopyCheckBox";
+            this.helpProvider1.SetShowHelp(this.enableShadowCopyCheckBox, true);
+            this.enableShadowCopyCheckBox.Size = new System.Drawing.Size(280, 22);
+            this.enableShadowCopyCheckBox.TabIndex = 31;
+            this.enableShadowCopyCheckBox.Text = "Enable Shadow Copy";
+            this.enableShadowCopyCheckBox.CheckedChanged += new System.EventHandler(this.enableShadowCopyCheckBox_CheckedChanged);
+            // 
+            // label1
+            // 
+            this.label1.Font = new System.Drawing.Font(FontFamily.GenericSansSerif, 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.label1.Location = new System.Drawing.Point(24, 113);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(72, 40);
+            this.label1.TabIndex = 32;
+            this.label1.Text = "Warning:";
+            // 
+            // label2
+            // 
+            this.label2.Location = new System.Drawing.Point(96, 113);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(357, 40);
+            this.label2.TabIndex = 33;
+            this.label2.Text = "Shadow copy settings should normally not be changed.";
+            // 
+            // label4
+            // 
+            this.label4.AutoSize = true;
+            this.label4.Location = new System.Drawing.Point(42, 66);
+            this.label4.Name = "label4";
+            this.label4.Size = new System.Drawing.Size(85, 17);
+            this.label4.TabIndex = 34;
+            this.label4.Text = "Cache Path:";
+            // 
+            // shadowCopyPathTextBox
+            // 
+            this.helpProvider1.SetHelpString(this.shadowCopyPathTextBox, "Leave this blank to permit NUnit to select a location under your temp directory.");
+            this.shadowCopyPathTextBox.Location = new System.Drawing.Point(139, 65);
+            this.shadowCopyPathTextBox.Name = "shadowCopyPathTextBox";
+            this.helpProvider1.SetShowHelp(this.shadowCopyPathTextBox, true);
+            this.shadowCopyPathTextBox.Size = new System.Drawing.Size(309, 22);
+            this.shadowCopyPathTextBox.TabIndex = 35;
+            // 
+            // AdvancedLoaderSettingsPage
+            // 
+            this.Controls.Add(this.shadowCopyPathTextBox);
+            this.Controls.Add(this.label4);
+            this.Controls.Add(this.label2);
+            this.Controls.Add(this.label1);
+            this.Controls.Add(this.label3);
+            this.Controls.Add(this.groupBox3);
+            this.Controls.Add(this.enableShadowCopyCheckBox);
+            this.Name = "AdvancedLoaderSettingsPage";
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+		}
+		#endregion
 
-		}
-		#endregion
-
 		public override void LoadSettings()
 		{
 			this.settings = Services.UserSettings;
 
-			disableShadowCopyCheckBox.Checked = !settings.GetSetting( "Options.TestLoader.ShadowCopyFiles", true );
+			enableShadowCopyCheckBox.Checked = settings.GetSetting( "Options.TestLoader.ShadowCopyFiles", true );
+            shadowCopyPathTextBox.Text = settings.GetSetting("Options.TestLoader.ShadowCopyPath", "");
 		}
-
+
 		public override void ApplySettings()
 		{
-			settings.SaveSetting( "Options.TestLoader.ShadowCopyFiles", !disableShadowCopyCheckBox.Checked );
+			settings.SaveSetting( "Options.TestLoader.ShadowCopyFiles", enableShadowCopyCheckBox.Checked );
+            if (shadowCopyPathTextBox.Text != "")
+                settings.SaveSetting("Options.TestLoader.ShadowCopyPath", shadowCopyPathTextBox.Text);
+            else
+                settings.RemoveSetting("Options.TestLoader.ShadowCopyPath");
 		}
-
+
 		public override bool HasChangesRequiringReload
 		{
 			get
 			{
-				bool oldSetting = !settings.GetSetting( "Options.TestLoader.ShadowCopyFiles", true );
-				return disableShadowCopyCheckBox.Checked != oldSetting;
+				bool oldSetting = settings.GetSetting( "Options.TestLoader.ShadowCopyFiles", true );
+                string oldPath = settings.GetSetting("Options.TestLoader.ShadowCopyPath", "");
+
+				return enableShadowCopyCheckBox.Checked != oldSetting
+                    || shadowCopyPathTextBox.Text != oldPath;
+
 			}
 		}
-	}
-}
-
+
+        private void enableShadowCopyCheckBox_CheckedChanged(object sender, EventArgs e)
+        {
+            shadowCopyPathTextBox.Enabled = enableShadowCopyCheckBox.Checked;
+        }
+	}
+}
+
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/AdvancedLoaderSettingsPage.resx b/src/GuiRunner/nunit-gui/SettingsPages/AdvancedLoaderSettingsPage.resx
index 16d81f0..be6a7a0 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/AdvancedLoaderSettingsPage.resx
+++ b/src/GuiRunner/nunit-gui/SettingsPages/AdvancedLoaderSettingsPage.resx
@@ -3,7 +3,7 @@
   <!-- 
     Microsoft ResX Schema 
     
-    Version 1.3
+    Version 2.0
     
     The primary goals of this format is to allow a simple XML format 
     that is mostly human readable. The generation and parsing of the 
@@ -14,16 +14,17 @@
     
     ... ado.net/XML headers & schema ...
     <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">1.3</resheader>
+    <resheader name="version">2.0</resheader>
     <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
     <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1">this is my long string</data>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
     <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
     <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        [base64 mime encoded serialized .NET Framework object]
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
     </data>
     <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
     </data>
                 
     There are any number of "resheader" rows that contain simple 
@@ -35,7 +36,7 @@
     Classes that don't support this are serialized and stored with the 
     mimetype set.
     
-    The mimetype is used forserialized objects, and tells the 
+    The mimetype is used for serialized objects, and tells the 
     ResXResourceReader how to depersist the object. This is currently not 
     extensible. For a given mimetype the value must be set accordingly:
     
@@ -45,7 +46,7 @@
     
     mimetype: application/x-microsoft.net.object.binary.base64
     value   : The object must be serialized with 
-            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
             : and then encoded with base64 encoding.
     
     mimetype: application/x-microsoft.net.object.soap.base64
@@ -59,18 +60,37 @@
             : and then encoded with base64 encoding.
     -->
   <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
     <xsd:element name="root" msdata:IsDataSet="true">
       <xsd:complexType>
         <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
           <xsd:element name="data">
             <xsd:complexType>
               <xsd:sequence>
                 <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                 <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
               </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
               <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
               <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
             </xsd:complexType>
           </xsd:element>
           <xsd:element name="resheader">
@@ -89,105 +109,18 @@
     <value>text/microsoft-resx</value>
   </resheader>
   <resheader name="version">
-    <value>1.3</value>
+    <value>2.0</value>
   </resheader>
   <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
   <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
-  <data name="label3.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="label3.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label3.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="groupBox3.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="groupBox3.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="groupBox3.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="groupBox3.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="groupBox3.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="groupBox3.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="disableShadowCopyCheckBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="disableShadowCopyCheckBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="disableShadowCopyCheckBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="label1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label2.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="label2.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label2.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="helpProvider1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="helpProvider1.Location" type="System.Drawing.Point, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+  <metadata name="helpProvider1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>17, 17</value>
-  </data>
-  <data name="helpProvider1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>80</value>
-  </data>
-  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>(Default)</value>
-  </data>
-  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.Name">
-    <value>AdvancedLoaderSettingsPage</value>
+  </metadata>
+  <data name="enableShadowCopyCheckBox.HelpString" xml:space="preserve">
+    <value>If checked, NUnit will enable copying of the assemblies to the shadow copy cache by the CLR. This is the default. Note that with shadow copying disabled, it is not possible to make changes to the assemblies while NUnit is running.</value>
   </data>
 </root>
\ No newline at end of file
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/AssemblyReloadSettingsPage.cs b/src/GuiRunner/nunit-gui/SettingsPages/AssemblyReloadSettingsPage.cs
index 6867dd7..e8a6a9f 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/AssemblyReloadSettingsPage.cs
+++ b/src/GuiRunner/nunit-gui/SettingsPages/AssemblyReloadSettingsPage.cs
@@ -1,52 +1,57 @@
-using System;
-using System.Collections;
-using System.ComponentModel;
-using System.Drawing;
-using System.Windows.Forms;
-using NUnit.Util;
-
-namespace NUnit.Gui.SettingsPages
-{
-	public class AssemblyReloadSettingsPage : NUnit.UiKit.SettingsPage
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Collections;
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+using NUnit.Util;
+
+namespace NUnit.Gui.SettingsPages
+{
+	public class AssemblyReloadSettingsPage : NUnit.UiKit.SettingsPage
 	{
 		private System.Windows.Forms.Label label1;
 		private System.Windows.Forms.GroupBox groupBox1;
 		private System.Windows.Forms.CheckBox rerunOnChangeCheckBox;
 		private System.Windows.Forms.CheckBox reloadOnRunCheckBox;
 		private System.Windows.Forms.CheckBox reloadOnChangeCheckBox;
-		private System.Windows.Forms.HelpProvider helpProvider1;
-		private System.ComponentModel.IContainer components = null;
-
-		public AssemblyReloadSettingsPage(string key) : base(key)
-		{
-			// This call is required by the Windows Form Designer.
-			InitializeComponent();
-
-			// TODO: Add any initialization after the InitializeComponent call
-		}
-
-		/// <summary>
-		/// Clean up any resources being used.
-		/// </summary>
-		protected override void Dispose( bool disposing )
-		{
-			if( disposing )
-			{
-				if (components != null) 
-				{
-					components.Dispose();
-				}
-			}
-			base.Dispose( disposing );
-		}
-
-		#region Designer generated code
-		/// <summary>
-		/// Required method for Designer support - do not modify
-		/// the contents of this method with the code editor.
-		/// </summary>
-		private void InitializeComponent()
-		{
+		private System.Windows.Forms.HelpProvider helpProvider1;
+		private System.ComponentModel.IContainer components = null;
+
+		public AssemblyReloadSettingsPage(string key) : base(key)
+		{
+			// This call is required by the Windows Form Designer.
+			InitializeComponent();
+
+			// TODO: Add any initialization after the InitializeComponent call
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if (components != null) 
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
 			this.label1 = new System.Windows.Forms.Label();
 			this.groupBox1 = new System.Windows.Forms.GroupBox();
 			this.rerunOnChangeCheckBox = new System.Windows.Forms.CheckBox();
@@ -117,24 +122,21 @@ namespace NUnit.Gui.SettingsPages
 			this.Name = "AssemblyReloadSettingsPage";
 			this.ResumeLayout(false);
 
-		}
-		#endregion
+		}
+		#endregion
 
 		public override void LoadSettings()
 		{
-			reloadOnChangeCheckBox.Enabled = Environment.OSVersion.Platform == System.PlatformID.Win32NT;
 			reloadOnChangeCheckBox.Checked = settings.GetSetting( "Options.TestLoader.ReloadOnChange", true );
 			rerunOnChangeCheckBox.Checked = settings.GetSetting( "Options.TestLoader.RerunOnChange", false );
-			reloadOnRunCheckBox.Checked = settings.GetSetting( "Options.TestLoader.ReloadOnRun", true );
+			reloadOnRunCheckBox.Checked = settings.GetSetting( "Options.TestLoader.ReloadOnRun", false );
 		}
 
 		public override void ApplySettings()
 		{
-			TestLoader loader = Services.TestLoader;
-
-			settings.SaveSetting( "Options.TestLoader.ReloadOnChange", loader.ReloadOnChange = reloadOnChangeCheckBox.Checked );
-			settings.SaveSetting( "Options.TestLoader.RerunOnChange", loader.RerunOnChange = rerunOnChangeCheckBox.Checked );
-			settings.SaveSetting( "Options.TestLoader.ReloadOnRun", loader.ReloadOnRun = reloadOnRunCheckBox.Checked );
+			settings.SaveSetting( "Options.TestLoader.ReloadOnChange", reloadOnChangeCheckBox.Checked );
+			settings.SaveSetting( "Options.TestLoader.RerunOnChange", rerunOnChangeCheckBox.Checked );
+			settings.SaveSetting( "Options.TestLoader.ReloadOnRun", reloadOnRunCheckBox.Checked );
 		}
 
 
@@ -142,13 +144,13 @@ namespace NUnit.Gui.SettingsPages
 		private void reloadOnChangeCheckBox_CheckedChanged(object sender, System.EventArgs e)
 		{
 			rerunOnChangeCheckBox.Enabled = reloadOnChangeCheckBox.Checked;
-		}
-
+		}
+
 		protected override void OnHelpRequested(HelpEventArgs hevent)
 		{
 			System.Diagnostics.Process.Start( "http://nunit.com/?p=optionsDialog&r=2.4.5" );
 		}
-
-	}
-}
-
+
+	}
+}
+
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/GuiSettingsPage.cs b/src/GuiRunner/nunit-gui/SettingsPages/GuiSettingsPage.cs
index 4fbc2fa..6191533 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/GuiSettingsPage.cs
+++ b/src/GuiRunner/nunit-gui/SettingsPages/GuiSettingsPage.cs
@@ -1,14 +1,19 @@
-using System;
-using System.Collections;
-using System.ComponentModel;
-using System.Drawing;
-using System.Windows.Forms;
-using NUnit.Util;
-using NUnit.UiKit;
-
-namespace NUnit.Gui.SettingsPages
-{
-	public class GuiSettingsPage : NUnit.UiKit.SettingsPage
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Collections;
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+using NUnit.Util;
+using NUnit.UiKit;
+
+namespace NUnit.Gui.SettingsPages
+{
+	public class GuiSettingsPage : NUnit.UiKit.SettingsPage
 	{
 		private System.Windows.Forms.Label label1;
 		private System.Windows.Forms.GroupBox groupBox1;
@@ -20,162 +25,177 @@ namespace NUnit.Gui.SettingsPages
 		private System.Windows.Forms.CheckBox loadLastProjectCheckBox;
 		private System.Windows.Forms.RadioButton fullGuiRadioButton;
 		private System.Windows.Forms.RadioButton miniGuiRadioButton;
-		private System.Windows.Forms.HelpProvider helpProvider1;
-		private System.ComponentModel.IContainer components = null;
-
-		public GuiSettingsPage(string key) : base(key)
-		{
-			// This call is required by the Windows Form Designer.
-			InitializeComponent();
-
-			// TODO: Add any initialization after the InitializeComponent call
-		}
-
-		/// <summary>
-		/// Clean up any resources being used.
-		/// </summary>
-		protected override void Dispose( bool disposing )
-		{
-			if( disposing )
-			{
-				if (components != null) 
-				{
-					components.Dispose();
-				}
-			}
-			base.Dispose( disposing );
-		}
-
-		#region Designer generated code
-		/// <summary>
-		/// Required method for Designer support - do not modify
-		/// the contents of this method with the code editor.
-		/// </summary>
-		private void InitializeComponent()
-		{
-			this.label1 = new System.Windows.Forms.Label();
-			this.groupBox1 = new System.Windows.Forms.GroupBox();
-			this.label2 = new System.Windows.Forms.Label();
-			this.groupBox2 = new System.Windows.Forms.GroupBox();
-			this.label3 = new System.Windows.Forms.Label();
-			this.recentFilesCountTextBox = new System.Windows.Forms.TextBox();
-			this.label4 = new System.Windows.Forms.Label();
-			this.loadLastProjectCheckBox = new System.Windows.Forms.CheckBox();
-			this.fullGuiRadioButton = new System.Windows.Forms.RadioButton();
-			this.miniGuiRadioButton = new System.Windows.Forms.RadioButton();
-			this.helpProvider1 = new System.Windows.Forms.HelpProvider();
-			this.SuspendLayout();
-			// 
-			// label1
-			// 
-			this.label1.Location = new System.Drawing.Point(8, 0);
-			this.label1.Name = "label1";
-			this.label1.Size = new System.Drawing.Size(88, 16);
-			this.label1.TabIndex = 7;
-			this.label1.Text = "Gui Display";
-			// 
-			// groupBox1
-			// 
-			this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.groupBox1.Location = new System.Drawing.Point(80, 0);
-			this.groupBox1.Name = "groupBox1";
-			this.groupBox1.Size = new System.Drawing.Size(368, 8);
-			this.groupBox1.TabIndex = 6;
-			this.groupBox1.TabStop = false;
-			// 
-			// label2
-			// 
-			this.label2.Location = new System.Drawing.Point(8, 96);
-			this.label2.Name = "label2";
-			this.label2.Size = new System.Drawing.Size(96, 16);
-			this.label2.TabIndex = 9;
-			this.label2.Text = "Recent Files";
-			// 
-			// groupBox2
-			// 
-			this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.groupBox2.Location = new System.Drawing.Point(88, 96);
-			this.groupBox2.Name = "groupBox2";
-			this.groupBox2.Size = new System.Drawing.Size(360, 8);
-			this.groupBox2.TabIndex = 8;
-			this.groupBox2.TabStop = false;
-			// 
-			// label3
-			// 
-			this.label3.Location = new System.Drawing.Point(152, 120);
-			this.label3.Name = "label3";
-			this.label3.Size = new System.Drawing.Size(96, 24);
-			this.label3.TabIndex = 30;
-			this.label3.Text = "files in list";
-			// 
-			// recentFilesCountTextBox
-			// 
-			this.helpProvider1.SetHelpString(this.recentFilesCountTextBox, "The maximum number of files to display in the Recent Files list.");
-			this.recentFilesCountTextBox.Location = new System.Drawing.Point(96, 120);
-			this.recentFilesCountTextBox.Name = "recentFilesCountTextBox";
-			this.helpProvider1.SetShowHelp(this.recentFilesCountTextBox, true);
-			this.recentFilesCountTextBox.Size = new System.Drawing.Size(40, 22);
-			this.recentFilesCountTextBox.TabIndex = 29;
-			this.recentFilesCountTextBox.Text = "";
-			// 
-			// label4
-			// 
-			this.label4.Location = new System.Drawing.Point(32, 120);
-			this.label4.Name = "label4";
-			this.label4.Size = new System.Drawing.Size(55, 16);
-			this.label4.TabIndex = 28;
-			this.label4.Text = "Display";
-			// 
-			// loadLastProjectCheckBox
-			// 
-			this.helpProvider1.SetHelpString(this.loadLastProjectCheckBox, "If checked, most recent project is loaded at startup.");
-			this.loadLastProjectCheckBox.Location = new System.Drawing.Point(32, 152);
-			this.loadLastProjectCheckBox.Name = "loadLastProjectCheckBox";
-			this.helpProvider1.SetShowHelp(this.loadLastProjectCheckBox, true);
-			this.loadLastProjectCheckBox.Size = new System.Drawing.Size(250, 24);
-			this.loadLastProjectCheckBox.TabIndex = 31;
-			this.loadLastProjectCheckBox.Text = "Load most recent project at startup.";
-			// 
-			// fullGuiRadioButton
-			// 
-			this.helpProvider1.SetHelpString(this.fullGuiRadioButton, "If selected, the full Gui is displayed, including the progress bar and output tab" +
-				"s.");
-			this.fullGuiRadioButton.Location = new System.Drawing.Point(32, 24);
-			this.fullGuiRadioButton.Name = "fullGuiRadioButton";
-			this.helpProvider1.SetShowHelp(this.fullGuiRadioButton, true);
-			this.fullGuiRadioButton.Size = new System.Drawing.Size(328, 24);
-			this.fullGuiRadioButton.TabIndex = 32;
-			this.fullGuiRadioButton.Text = "Full Gui with progress bar and result tabs";
-			// 
-			// miniGuiRadioButton
-			// 
-			this.helpProvider1.SetHelpString(this.miniGuiRadioButton, "If selected, the mini-Gui, consisting of only the tree of tests, is displayed.");
-			this.miniGuiRadioButton.Location = new System.Drawing.Point(32, 56);
-			this.miniGuiRadioButton.Name = "miniGuiRadioButton";
-			this.helpProvider1.SetShowHelp(this.miniGuiRadioButton, true);
-			this.miniGuiRadioButton.Size = new System.Drawing.Size(320, 24);
-			this.miniGuiRadioButton.TabIndex = 33;
-			this.miniGuiRadioButton.Text = "Mini Gui showing tree only";
-			// 
-			// GuiSettingsPage
-			// 
-			this.Controls.Add(this.miniGuiRadioButton);
-			this.Controls.Add(this.fullGuiRadioButton);
-			this.Controls.Add(this.label3);
-			this.Controls.Add(this.recentFilesCountTextBox);
-			this.Controls.Add(this.label4);
-			this.Controls.Add(this.loadLastProjectCheckBox);
-			this.Controls.Add(this.groupBox2);
-			this.Controls.Add(this.label2);
-			this.Controls.Add(this.groupBox1);
-			this.Controls.Add(this.label1);
-			this.Name = "GuiSettingsPage";
-			this.ResumeLayout(false);
-
-		}
-		#endregion
+		private System.Windows.Forms.HelpProvider helpProvider1;
+        private CheckBox checkFilesExistCheckBox;
+		private System.ComponentModel.IContainer components = null;
+
+		public GuiSettingsPage(string key) : base(key)
+		{
+			// This call is required by the Windows Form Designer.
+			InitializeComponent();
+
+			// TODO: Add any initialization after the InitializeComponent call
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if (components != null) 
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+            this.label1 = new System.Windows.Forms.Label();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.label2 = new System.Windows.Forms.Label();
+            this.groupBox2 = new System.Windows.Forms.GroupBox();
+            this.label3 = new System.Windows.Forms.Label();
+            this.recentFilesCountTextBox = new System.Windows.Forms.TextBox();
+            this.label4 = new System.Windows.Forms.Label();
+            this.loadLastProjectCheckBox = new System.Windows.Forms.CheckBox();
+            this.fullGuiRadioButton = new System.Windows.Forms.RadioButton();
+            this.miniGuiRadioButton = new System.Windows.Forms.RadioButton();
+            this.helpProvider1 = new System.Windows.Forms.HelpProvider();
+            this.checkFilesExistCheckBox = new System.Windows.Forms.CheckBox();
+            this.SuspendLayout();
+            // 
+            // label1
+            // 
+            this.label1.Location = new System.Drawing.Point(8, 0);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(88, 16);
+            this.label1.TabIndex = 7;
+            this.label1.Text = "Gui Display";
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.groupBox1.Location = new System.Drawing.Point(80, 0);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(368, 8);
+            this.groupBox1.TabIndex = 6;
+            this.groupBox1.TabStop = false;
+            // 
+            // label2
+            // 
+            this.label2.Location = new System.Drawing.Point(8, 96);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(96, 16);
+            this.label2.TabIndex = 9;
+            this.label2.Text = "Recent Files";
+            // 
+            // groupBox2
+            // 
+            this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.groupBox2.Location = new System.Drawing.Point(88, 96);
+            this.groupBox2.Name = "groupBox2";
+            this.groupBox2.Size = new System.Drawing.Size(360, 8);
+            this.groupBox2.TabIndex = 8;
+            this.groupBox2.TabStop = false;
+            // 
+            // label3
+            // 
+            this.label3.Location = new System.Drawing.Point(152, 120);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(96, 24);
+            this.label3.TabIndex = 30;
+            this.label3.Text = "files in menu";
+            // 
+            // recentFilesCountTextBox
+            // 
+            this.helpProvider1.SetHelpString(this.recentFilesCountTextBox, "The maximum number of files to display in the Recent Files list.");
+            this.recentFilesCountTextBox.Location = new System.Drawing.Point(96, 120);
+            this.recentFilesCountTextBox.Name = "recentFilesCountTextBox";
+            this.helpProvider1.SetShowHelp(this.recentFilesCountTextBox, true);
+            this.recentFilesCountTextBox.Size = new System.Drawing.Size(40, 22);
+            this.recentFilesCountTextBox.TabIndex = 29;
+            this.recentFilesCountTextBox.Validated += new System.EventHandler(this.recentFilesCountTextBox_Validated);
+            this.recentFilesCountTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.recentFilesCountTextBox_Validating);
+            // 
+            // label4
+            // 
+            this.label4.Location = new System.Drawing.Point(32, 120);
+            this.label4.Name = "label4";
+            this.label4.Size = new System.Drawing.Size(55, 16);
+            this.label4.TabIndex = 28;
+            this.label4.Text = "List";
+            // 
+            // loadLastProjectCheckBox
+            // 
+            this.helpProvider1.SetHelpString(this.loadLastProjectCheckBox, "If checked, most recent project is loaded at startup.");
+            this.loadLastProjectCheckBox.Location = new System.Drawing.Point(32, 198);
+            this.loadLastProjectCheckBox.Name = "loadLastProjectCheckBox";
+            this.helpProvider1.SetShowHelp(this.loadLastProjectCheckBox, true);
+            this.loadLastProjectCheckBox.Size = new System.Drawing.Size(311, 24);
+            this.loadLastProjectCheckBox.TabIndex = 31;
+            this.loadLastProjectCheckBox.Text = "Load most recent project at startup.";
+            // 
+            // fullGuiRadioButton
+            // 
+            this.helpProvider1.SetHelpString(this.fullGuiRadioButton, "If selected, the full Gui is displayed, including the progress bar and output tab" +
+                    "s.");
+            this.fullGuiRadioButton.Location = new System.Drawing.Point(32, 24);
+            this.fullGuiRadioButton.Name = "fullGuiRadioButton";
+            this.helpProvider1.SetShowHelp(this.fullGuiRadioButton, true);
+            this.fullGuiRadioButton.Size = new System.Drawing.Size(328, 24);
+            this.fullGuiRadioButton.TabIndex = 32;
+            this.fullGuiRadioButton.Text = "Full Gui with progress bar and result tabs";
+            // 
+            // miniGuiRadioButton
+            // 
+            this.helpProvider1.SetHelpString(this.miniGuiRadioButton, "If selected, the mini-Gui, consisting of only the tree of tests, is displayed.");
+            this.miniGuiRadioButton.Location = new System.Drawing.Point(32, 56);
+            this.miniGuiRadioButton.Name = "miniGuiRadioButton";
+            this.helpProvider1.SetShowHelp(this.miniGuiRadioButton, true);
+            this.miniGuiRadioButton.Size = new System.Drawing.Size(320, 24);
+            this.miniGuiRadioButton.TabIndex = 33;
+            this.miniGuiRadioButton.Text = "Mini Gui showing tree only";
+            // 
+            // checkFilesExistCheckBox
+            // 
+            this.checkFilesExistCheckBox.AutoSize = true;
+            this.checkFilesExistCheckBox.Location = new System.Drawing.Point(32, 159);
+            this.checkFilesExistCheckBox.Name = "checkFilesExistCheckBox";
+            this.checkFilesExistCheckBox.Size = new System.Drawing.Size(243, 21);
+            this.checkFilesExistCheckBox.TabIndex = 34;
+            this.checkFilesExistCheckBox.Text = "Check that files exist before listing";
+            this.checkFilesExistCheckBox.UseVisualStyleBackColor = true;
+            // 
+            // GuiSettingsPage
+            // 
+            this.Controls.Add(this.checkFilesExistCheckBox);
+            this.Controls.Add(this.miniGuiRadioButton);
+            this.Controls.Add(this.fullGuiRadioButton);
+            this.Controls.Add(this.label3);
+            this.Controls.Add(this.recentFilesCountTextBox);
+            this.Controls.Add(this.label4);
+            this.Controls.Add(this.loadLastProjectCheckBox);
+            this.Controls.Add(this.groupBox2);
+            this.Controls.Add(this.label2);
+            this.Controls.Add(this.groupBox1);
+            this.Controls.Add(this.label1);
+            this.Name = "GuiSettingsPage";
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+		}
+		#endregion
 
 		public override void LoadSettings()
 		{
@@ -191,13 +211,15 @@ namespace NUnit.Gui.SettingsPages
 			}
 
 			recentFilesCountTextBox.Text = Services.RecentFiles.MaxFiles.ToString();
+            checkFilesExistCheckBox.Checked = settings.GetSetting("Gui.RecentProjects.CheckFilesExist", true);
 			loadLastProjectCheckBox.Checked = settings.GetSetting( "Options.LoadLastProject", true );
 		}
 
 		public override void ApplySettings()
 		{
 			string fmt = fullGuiRadioButton.Checked ? "Full" : "Mini";
-			settings.SaveSetting( "Gui.DisplayFormat", fmt ); 
+			settings.SaveSetting( "Gui.DisplayFormat", fmt );
+            settings.SaveSetting("Gui.RecentProjects.CheckFilesExist", checkFilesExistCheckBox.Checked);
 			settings.SaveSetting( "Options.LoadLastProject", loadLastProjectCheckBox.Checked );
 		}
 
@@ -242,9 +264,11 @@ namespace NUnit.Gui.SettingsPages
 		{
 			int count = int.Parse( recentFilesCountTextBox.Text );
 			Services.RecentFiles.MaxFiles = count;
+            if (count == 0)
+                loadLastProjectCheckBox.Checked = false;
 		}
 
 
-	}
-}
-
+	}
+}
+
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/GuiSettingsPage.resx b/src/GuiRunner/nunit-gui/SettingsPages/GuiSettingsPage.resx
index ab039b9..61bb827 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/GuiSettingsPage.resx
+++ b/src/GuiRunner/nunit-gui/SettingsPages/GuiSettingsPage.resx
@@ -3,7 +3,7 @@
   <!-- 
     Microsoft ResX Schema 
     
-    Version 1.3
+    Version 2.0
     
     The primary goals of this format is to allow a simple XML format 
     that is mostly human readable. The generation and parsing of the 
@@ -14,16 +14,17 @@
     
     ... ado.net/XML headers & schema ...
     <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">1.3</resheader>
+    <resheader name="version">2.0</resheader>
     <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
     <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1">this is my long string</data>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
     <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
     <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        [base64 mime encoded serialized .NET Framework object]
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
     </data>
     <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
     </data>
                 
     There are any number of "resheader" rows that contain simple 
@@ -35,7 +36,7 @@
     Classes that don't support this are serialized and stored with the 
     mimetype set.
     
-    The mimetype is used forserialized objects, and tells the 
+    The mimetype is used for serialized objects, and tells the 
     ResXResourceReader how to depersist the object. This is currently not 
     extensible. For a given mimetype the value must be set accordingly:
     
@@ -45,7 +46,7 @@
     
     mimetype: application/x-microsoft.net.object.binary.base64
     value   : The object must be serialized with 
-            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
             : and then encoded with base64 encoding.
     
     mimetype: application/x-microsoft.net.object.soap.base64
@@ -59,18 +60,37 @@
             : and then encoded with base64 encoding.
     -->
   <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
     <xsd:element name="root" msdata:IsDataSet="true">
       <xsd:complexType>
         <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
           <xsd:element name="data">
             <xsd:complexType>
               <xsd:sequence>
                 <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                 <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
               </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
               <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
               <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
             </xsd:complexType>
           </xsd:element>
           <xsd:element name="resheader">
@@ -89,159 +109,18 @@
     <value>text/microsoft-resx</value>
   </resheader>
   <resheader name="version">
-    <value>1.3</value>
+    <value>2.0</value>
   </resheader>
   <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
   <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
-  <data name="label1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="label1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="groupBox1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="groupBox1.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="groupBox1.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="groupBox1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="groupBox1.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="groupBox1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label2.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="label2.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label2.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="groupBox2.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="groupBox2.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="groupBox2.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="groupBox2.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="groupBox2.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="groupBox2.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label3.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="label3.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label3.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="recentFilesCountTextBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="recentFilesCountTextBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="recentFilesCountTextBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label4.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="label4.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label4.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="loadLastProjectCheckBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="loadLastProjectCheckBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="loadLastProjectCheckBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="fullGuiRadioButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="fullGuiRadioButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="fullGuiRadioButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="miniGuiRadioButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="miniGuiRadioButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="miniGuiRadioButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="helpProvider1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="helpProvider1.Location" type="System.Drawing.Point, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+  <metadata name="helpProvider1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="helpProvider1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>17, 17</value>
-  </data>
-  <data name="helpProvider1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>80</value>
-  </data>
-  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>(Default)</value>
-  </data>
-  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.Name">
-    <value>GuiSettingsPage</value>
-  </data>
+  </metadata>
 </root>
\ No newline at end of file
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/InternalTraceSettingsPage.Designer.cs b/src/GuiRunner/nunit-gui/SettingsPages/InternalTraceSettingsPage.Designer.cs
new file mode 100644
index 0000000..e3d05b0
--- /dev/null
+++ b/src/GuiRunner/nunit-gui/SettingsPages/InternalTraceSettingsPage.Designer.cs
@@ -0,0 +1,147 @@
+namespace NUnit.Gui.SettingsPages
+{
+    partial class InternalTraceSettingsPage
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.label3 = new System.Windows.Forms.Label();
+            this.groupBox3 = new System.Windows.Forms.GroupBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.traceLevelComboBox = new System.Windows.Forms.ComboBox();
+            this.label4 = new System.Windows.Forms.Label();
+            this.logDirectoryLabel = new System.Windows.Forms.Label();
+            this.label2 = new System.Windows.Forms.Label();
+            this.label5 = new System.Windows.Forms.Label();
+            this.SuspendLayout();
+            // 
+            // label3
+            // 
+            this.label3.Location = new System.Drawing.Point(9, 5);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(88, 16);
+            this.label3.TabIndex = 14;
+            this.label3.Text = "Internal Trace";
+            // 
+            // groupBox3
+            // 
+            this.groupBox3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.groupBox3.Location = new System.Drawing.Point(105, 5);
+            this.groupBox3.Name = "groupBox3";
+            this.groupBox3.Size = new System.Drawing.Size(344, 8);
+            this.groupBox3.TabIndex = 13;
+            this.groupBox3.TabStop = false;
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(19, 46);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(67, 13);
+            this.label1.TabIndex = 15;
+            this.label1.Text = "Trace Level:";
+            // 
+            // traceLevelComboBox
+            // 
+            this.traceLevelComboBox.FormattingEnabled = true;
+            this.traceLevelComboBox.Items.AddRange(new object[] {
+            "Default",
+            "Off",
+            "Error",
+            "Warning",
+            "Info",
+            "Verbose"});
+            this.traceLevelComboBox.Location = new System.Drawing.Point(105, 43);
+            this.traceLevelComboBox.Name = "traceLevelComboBox";
+            this.traceLevelComboBox.Size = new System.Drawing.Size(61, 21);
+            this.traceLevelComboBox.TabIndex = 16;
+            // 
+            // label4
+            // 
+            this.label4.AutoSize = true;
+            this.label4.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.label4.Location = new System.Drawing.Point(19, 87);
+            this.label4.Name = "label4";
+            this.label4.Size = new System.Drawing.Size(73, 13);
+            this.label4.TabIndex = 18;
+            this.label4.Text = "Log Directory:";
+            // 
+            // logDirectoryLabel
+            // 
+            this.logDirectoryLabel.AutoSize = true;
+            this.logDirectoryLabel.Location = new System.Drawing.Point(102, 87);
+            this.logDirectoryLabel.Name = "logDirectoryLabel";
+            this.logDirectoryLabel.Size = new System.Drawing.Size(0, 13);
+            this.logDirectoryLabel.TabIndex = 19;
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.label2.Location = new System.Drawing.Point(47, 130);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(38, 13);
+            this.label2.TabIndex = 20;
+            this.label2.Text = "Note:";
+            // 
+            // label5
+            // 
+            this.label5.Location = new System.Drawing.Point(102, 130);
+            this.label5.Name = "label5";
+            this.label5.Size = new System.Drawing.Size(329, 40);
+            this.label5.TabIndex = 21;
+            this.label5.Text = "Changes in the Trace Level will not affect the current session. After changing th" +
+                "e level, you should shut down and restart the Gui.";
+            // 
+            // InternalTraceSettingsPage
+            // 
+            this.Controls.Add(this.label5);
+            this.Controls.Add(this.label2);
+            this.Controls.Add(this.logDirectoryLabel);
+            this.Controls.Add(this.label4);
+            this.Controls.Add(this.traceLevelComboBox);
+            this.Controls.Add(this.label1);
+            this.Controls.Add(this.label3);
+            this.Controls.Add(this.groupBox3);
+            this.Name = "InternalTraceSettingsPage";
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Label label3;
+        private System.Windows.Forms.GroupBox groupBox3;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.ComboBox traceLevelComboBox;
+        private System.Windows.Forms.Label label4;
+        private System.Windows.Forms.Label logDirectoryLabel;
+        private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.Label label5;
+    }
+}
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/InternalTraceSettingsPage.cs b/src/GuiRunner/nunit-gui/SettingsPages/InternalTraceSettingsPage.cs
new file mode 100644
index 0000000..7a126d0
--- /dev/null
+++ b/src/GuiRunner/nunit-gui/SettingsPages/InternalTraceSettingsPage.cs
@@ -0,0 +1,32 @@
+// ****************************************************************
+// Copyright 2010, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Core;
+
+namespace NUnit.Gui.SettingsPages
+{
+    public partial class InternalTraceSettingsPage : NUnit.UiKit.SettingsPage
+    {
+        public InternalTraceSettingsPage(string key) : base(key)
+        {
+            InitializeComponent();
+        }
+
+        public override void LoadSettings()
+        {
+            traceLevelComboBox.SelectedIndex = (int)(InternalTraceLevel)settings.GetSetting("Options.InternalTraceLevel", InternalTraceLevel.Default);
+            logDirectoryLabel.Text = System.IO.Path.Combine(
+                Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
+                "logs");
+        }
+
+        public override void ApplySettings()
+        {
+           settings.SaveSetting("Options.InternalTraceLevel", (InternalTraceLevel)traceLevelComboBox.SelectedIndex);
+        }
+    }
+}
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/InternalTraceSettingsPage.resx b/src/GuiRunner/nunit-gui/SettingsPages/InternalTraceSettingsPage.resx
new file mode 100644
index 0000000..ff31a6d
--- /dev/null
+++ b/src/GuiRunner/nunit-gui/SettingsPages/InternalTraceSettingsPage.resx
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/OldTabPages/GeneralSettingsTab.cs b/src/GuiRunner/nunit-gui/SettingsPages/OldTabPages/GeneralSettingsTab.cs
deleted file mode 100644
index 837c04e..0000000
--- a/src/GuiRunner/nunit-gui/SettingsPages/OldTabPages/GeneralSettingsTab.cs
+++ /dev/null
@@ -1,315 +0,0 @@
-using System;
-using System.Collections;
-using System.ComponentModel;
-using System.Drawing;
-using System.Data;
-using System.Windows.Forms;
-using NUnit.Util;
-using NUnit.UiKit;
-
-namespace NUnit.Gui.SettingsPages
-{
-	/// <summary>
-	/// Summary description for GeneralOptions.
-	/// </summary>
-	public class GeneralSettingsTab : NUnit.UiKit.SettingsPage
-	{
-		private System.Windows.Forms.GroupBox groupBox1;
-		private System.Windows.Forms.Label label3;
-		private System.Windows.Forms.TextBox recentFilesCountTextBox;
-		private System.Windows.Forms.Label label2;
-		private System.Windows.Forms.CheckBox loadLastProjectCheckBox;
-		private System.Windows.Forms.GroupBox groupBox2;
-		private System.Windows.Forms.Label label1;
-		private System.Windows.Forms.ComboBox initialDisplayComboBox;
-		private System.Windows.Forms.CheckBox clearResultsCheckBox;
-		private System.Windows.Forms.CheckBox saveVisualStateCheckBox;
-		private System.Windows.Forms.GroupBox groupBox3;
-		private System.Windows.Forms.CheckBox visualStudioSupportCheckBox;
-		private System.Windows.Forms.GroupBox groupBox4;
-		private System.Windows.Forms.CheckBox shadowCopyCheckBox;
-		/// <summary> 
-		/// Required designer variable.
-		/// </summary>
-		private System.ComponentModel.Container components = null;
-
-		public GeneralSettingsTab(string key) : base(key)
-		{
-			// This call is required by the Windows.Forms Form Designer.
-			InitializeComponent();
-
-			// TODO: Add any initialization after the InitializeComponent call
-		}
-
-		/// <summary> 
-		/// Clean up any resources being used.
-		/// </summary>
-		protected override void Dispose( bool disposing )
-		{
-			if( disposing )
-			{
-				if(components != null)
-				{
-					components.Dispose();
-				}
-			}
-			base.Dispose( disposing );
-		}
-
-		#region Component Designer generated code
-		/// <summary> 
-		/// Required method for Designer support - do not modify 
-		/// the contents of this method with the code editor.
-		/// </summary>
-		private void InitializeComponent()
-		{
-			this.groupBox1 = new System.Windows.Forms.GroupBox();
-			this.label3 = new System.Windows.Forms.Label();
-			this.recentFilesCountTextBox = new System.Windows.Forms.TextBox();
-			this.label2 = new System.Windows.Forms.Label();
-			this.loadLastProjectCheckBox = new System.Windows.Forms.CheckBox();
-			this.groupBox2 = new System.Windows.Forms.GroupBox();
-			this.label1 = new System.Windows.Forms.Label();
-			this.initialDisplayComboBox = new System.Windows.Forms.ComboBox();
-			this.clearResultsCheckBox = new System.Windows.Forms.CheckBox();
-			this.saveVisualStateCheckBox = new System.Windows.Forms.CheckBox();
-			this.groupBox3 = new System.Windows.Forms.GroupBox();
-			this.visualStudioSupportCheckBox = new System.Windows.Forms.CheckBox();
-			this.groupBox4 = new System.Windows.Forms.GroupBox();
-			this.shadowCopyCheckBox = new System.Windows.Forms.CheckBox();
-			this.groupBox1.SuspendLayout();
-			this.groupBox2.SuspendLayout();
-			this.groupBox3.SuspendLayout();
-			this.groupBox4.SuspendLayout();
-			this.SuspendLayout();
-			// 
-			// groupBox1
-			// 
-			this.groupBox1.Controls.Add(this.label3);
-			this.groupBox1.Controls.Add(this.recentFilesCountTextBox);
-			this.groupBox1.Controls.Add(this.label2);
-			this.groupBox1.Controls.Add(this.loadLastProjectCheckBox);
-			this.groupBox1.Location = new System.Drawing.Point(8, 8);
-			this.groupBox1.Name = "groupBox1";
-			this.groupBox1.Size = new System.Drawing.Size(288, 100);
-			this.groupBox1.TabIndex = 30;
-			this.groupBox1.TabStop = false;
-			this.groupBox1.Text = "Recent Files";
-			// 
-			// label3
-			// 
-			this.label3.Location = new System.Drawing.Point(144, 24);
-			this.label3.Name = "label3";
-			this.label3.Size = new System.Drawing.Size(96, 24);
-			this.label3.TabIndex = 26;
-			this.label3.Text = "files in list";
-			// 
-			// recentFilesCountTextBox
-			// 
-			this.recentFilesCountTextBox.Location = new System.Drawing.Point(86, 24);
-			this.recentFilesCountTextBox.Name = "recentFilesCountTextBox";
-			this.recentFilesCountTextBox.Size = new System.Drawing.Size(40, 22);
-			this.recentFilesCountTextBox.TabIndex = 25;
-			this.recentFilesCountTextBox.Text = "";
-			// 
-			// label2
-			// 
-			this.label2.Location = new System.Drawing.Point(19, 24);
-			this.label2.Name = "label2";
-			this.label2.Size = new System.Drawing.Size(55, 16);
-			this.label2.TabIndex = 24;
-			this.label2.Text = "Display";
-			// 
-			// loadLastProjectCheckBox
-			// 
-			this.loadLastProjectCheckBox.Location = new System.Drawing.Point(19, 64);
-			this.loadLastProjectCheckBox.Name = "loadLastProjectCheckBox";
-			this.loadLastProjectCheckBox.Size = new System.Drawing.Size(250, 24);
-			this.loadLastProjectCheckBox.TabIndex = 27;
-			this.loadLastProjectCheckBox.Text = "Load most recent project at startup.";
-			// 
-			// groupBox2
-			// 
-			this.groupBox2.Controls.Add(this.label1);
-			this.groupBox2.Controls.Add(this.initialDisplayComboBox);
-			this.groupBox2.Controls.Add(this.clearResultsCheckBox);
-			this.groupBox2.Controls.Add(this.saveVisualStateCheckBox);
-			this.groupBox2.Location = new System.Drawing.Point(8, 112);
-			this.groupBox2.Name = "groupBox2";
-			this.groupBox2.Size = new System.Drawing.Size(288, 112);
-			this.groupBox2.TabIndex = 31;
-			this.groupBox2.TabStop = false;
-			this.groupBox2.Text = "Tree View";
-			// 
-			// label1
-			// 
-			this.label1.Location = new System.Drawing.Point(20, 24);
-			this.label1.Name = "label1";
-			this.label1.Size = new System.Drawing.Size(144, 24);
-			this.label1.TabIndex = 28;
-			this.label1.Text = "Initial display on load:";
-			// 
-			// initialDisplayComboBox
-			// 
-			this.initialDisplayComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
-			this.initialDisplayComboBox.ItemHeight = 16;
-			this.initialDisplayComboBox.Items.AddRange(new object[] {
-																		"Auto",
-																		"Expand",
-																		"Collapse",
-																		"HideTests"});
-			this.initialDisplayComboBox.Location = new System.Drawing.Point(172, 24);
-			this.initialDisplayComboBox.Name = "initialDisplayComboBox";
-			this.initialDisplayComboBox.Size = new System.Drawing.Size(87, 24);
-			this.initialDisplayComboBox.TabIndex = 29;
-			// 
-			// clearResultsCheckBox
-			// 
-			this.clearResultsCheckBox.Location = new System.Drawing.Point(20, 48);
-			this.clearResultsCheckBox.Name = "clearResultsCheckBox";
-			this.clearResultsCheckBox.Size = new System.Drawing.Size(232, 24);
-			this.clearResultsCheckBox.TabIndex = 30;
-			this.clearResultsCheckBox.Text = "Clear results when reloading.";
-			// 
-			// saveVisualStateCheckBox
-			// 
-			this.saveVisualStateCheckBox.Location = new System.Drawing.Point(20, 80);
-			this.saveVisualStateCheckBox.Name = "saveVisualStateCheckBox";
-			this.saveVisualStateCheckBox.Size = new System.Drawing.Size(248, 24);
-			this.saveVisualStateCheckBox.TabIndex = 31;
-			this.saveVisualStateCheckBox.Text = "Save Visual State of each project";
-			// 
-			// groupBox3
-			// 
-			this.groupBox3.Controls.Add(this.visualStudioSupportCheckBox);
-			this.groupBox3.Location = new System.Drawing.Point(8, 232);
-			this.groupBox3.Name = "groupBox3";
-			this.groupBox3.Size = new System.Drawing.Size(288, 48);
-			this.groupBox3.TabIndex = 32;
-			this.groupBox3.TabStop = false;
-			this.groupBox3.Text = "Visual Studio";
-			// 
-			// visualStudioSupportCheckBox
-			// 
-			this.visualStudioSupportCheckBox.Location = new System.Drawing.Point(16, 16);
-			this.visualStudioSupportCheckBox.Name = "visualStudioSupportCheckBox";
-			this.visualStudioSupportCheckBox.Size = new System.Drawing.Size(224, 25);
-			this.visualStudioSupportCheckBox.TabIndex = 29;
-			this.visualStudioSupportCheckBox.Text = "Enable Visual Studio Support";
-			// 
-			// groupBox4
-			// 
-			this.groupBox4.Controls.Add(this.shadowCopyCheckBox);
-			this.groupBox4.Location = new System.Drawing.Point(8, 288);
-			this.groupBox4.Name = "groupBox4";
-			this.groupBox4.Size = new System.Drawing.Size(288, 48);
-			this.groupBox4.TabIndex = 33;
-			this.groupBox4.TabStop = false;
-			this.groupBox4.Text = "Shadow Copy";
-			// 
-			// shadowCopyCheckBox
-			// 
-			this.shadowCopyCheckBox.Location = new System.Drawing.Point(16, 16);
-			this.shadowCopyCheckBox.Name = "shadowCopyCheckBox";
-			this.shadowCopyCheckBox.Size = new System.Drawing.Size(240, 22);
-			this.shadowCopyCheckBox.TabIndex = 30;
-			this.shadowCopyCheckBox.Text = "Enable Shadow Copy";
-			// 
-			// GeneralSettingsTab
-			// 
-			this.Controls.Add(this.groupBox4);
-			this.Controls.Add(this.groupBox3);
-			this.Controls.Add(this.groupBox2);
-			this.Controls.Add(this.groupBox1);
-			this.Name = "GeneralSettingsTab";
-			this.Size = new System.Drawing.Size(310, 344);
-			this.groupBox1.ResumeLayout(false);
-			this.groupBox2.ResumeLayout(false);
-			this.groupBox3.ResumeLayout(false);
-			this.groupBox4.ResumeLayout(false);
-			this.ResumeLayout(false);
-
-		}
-		#endregion
-
-		public override void LoadSettings()
-		{
-			this.settings = Services.UserSettings;
-
-			recentFilesCountTextBox.Text = Services.RecentFiles.MaxFiles.ToString();
-			loadLastProjectCheckBox.Checked = settings.GetSetting( "Options.LoadLastProject", true );
-
-			initialDisplayComboBox.SelectedIndex = (int)(TestSuiteTreeView.DisplayStyle)settings.GetSetting( "Gui.TestTree.InitialTreeDisplay", TestSuiteTreeView.DisplayStyle.Auto );
-			clearResultsCheckBox.Checked = settings.GetSetting( "Options.TestLoader.ClearResultsOnReload", true );
-			saveVisualStateCheckBox.Checked = settings.GetSetting( "Gui.TestTree.SaveVisualState", true );
-
-			shadowCopyCheckBox.Checked = settings.GetSetting( "Options.TestLoader.ShadowCopyFiles", true );
-
-			visualStudioSupportCheckBox.Checked = settings.GetSetting( "Options.TestLoader.VisualStudioSupport", false );
-		}
-
-		public override void ApplySettings()
-		{
-			settings.SaveSetting( "Options.LoadLastProject", loadLastProjectCheckBox.Checked );
-
-			settings.SaveSetting( "Gui.TestTree.InitialTreeDisplay", (TestSuiteTreeView.DisplayStyle)initialDisplayComboBox.SelectedIndex );
-			settings.SaveSetting( "Options.TestLoader.ClearResultsOnReload", clearResultsCheckBox.Checked );
-			settings.SaveSetting( "Gui.TestTree.SaveVisualState", saveVisualStateCheckBox.Checked );
-		
-			settings.SaveSetting( "Options.TestLoader.VisualStudioSupport", visualStudioSupportCheckBox.Checked );
-
-			settings.SaveSetting( "Options.TestLoader.ShadowCopyFiles", Services.TestLoader.ShadowCopyFiles = shadowCopyCheckBox.Checked );
-		}
-
-		public override bool HasChangesRequiringReload
-		{
-			get
-			{
-				return settings.GetSetting( "Options.TestLoader.ShadowCopyFiles", true ) != shadowCopyCheckBox.Checked;
-			}
-		}
-
-		private void recentFilesCountTextBox_Validating(object sender, System.ComponentModel.CancelEventArgs e)
-		{
-			if ( recentFilesCountTextBox.Text.Length == 0 )
-			{
-				recentFilesCountTextBox.Text = Services.RecentFiles.MaxFiles.ToString();
-				recentFilesCountTextBox.SelectAll();
-				e.Cancel = true;
-			}
-			else
-			{
-				string errmsg = null;
-
-				try
-				{
-					int count = int.Parse( recentFilesCountTextBox.Text );
-
-					if ( count < RecentFilesService.MinSize ||
-						count > RecentFilesService.MaxSize )
-					{
-						errmsg = string.Format( "Number of files must be from {0} to {1}", 
-							RecentFilesService.MinSize, RecentFilesService.MaxSize );
-					}
-				}
-				catch
-				{
-					errmsg = "Number of files must be numeric";
-				}
-
-				if ( errmsg != null )
-				{
-					recentFilesCountTextBox.SelectAll();
-					UserMessage.DisplayFailure( errmsg );
-					e.Cancel = true;
-				}
-			}
-		}
-
-		private void recentFilesCountTextBox_Validated(object sender, System.EventArgs e)
-		{
-			int count = int.Parse( recentFilesCountTextBox.Text );
-			Services.RecentFiles.MaxFiles = count;
-		}
-	}
-}
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/OldTabPages/GeneralSettingsTab.resx b/src/GuiRunner/nunit-gui/SettingsPages/OldTabPages/GeneralSettingsTab.resx
deleted file mode 100644
index 352cc5c..0000000
--- a/src/GuiRunner/nunit-gui/SettingsPages/OldTabPages/GeneralSettingsTab.resx
+++ /dev/null
@@ -1,292 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 1.3
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">1.3</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1">this is my long string</data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        [base64 mime encoded serialized .NET Framework object]
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        [base64 mime encoded string representing a byte array form of the .NET Framework object]
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used forserialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>1.3</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <data name="groupBox1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="groupBox1.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="groupBox1.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="groupBox1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="groupBox1.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="groupBox1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label3.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="label3.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label3.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="recentFilesCountTextBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="recentFilesCountTextBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="recentFilesCountTextBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label2.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="label2.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label2.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="loadLastProjectCheckBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="loadLastProjectCheckBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="loadLastProjectCheckBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="groupBox2.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="groupBox2.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="groupBox2.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="groupBox2.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="groupBox2.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="groupBox2.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="label1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="initialDisplayComboBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="initialDisplayComboBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="initialDisplayComboBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="clearResultsCheckBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="clearResultsCheckBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="clearResultsCheckBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="saveVisualStateCheckBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="saveVisualStateCheckBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="saveVisualStateCheckBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="groupBox3.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="groupBox3.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="groupBox3.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="groupBox3.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="groupBox3.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="groupBox3.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="visualStudioSupportCheckBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="visualStudioSupportCheckBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="visualStudioSupportCheckBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="groupBox4.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="groupBox4.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="groupBox4.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="groupBox4.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="groupBox4.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="groupBox4.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="shadowCopyCheckBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="shadowCopyCheckBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="shadowCopyCheckBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Name">
-    <value>GeneralSettingsTab</value>
-  </data>
-  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>80</value>
-  </data>
-  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>(Default)</value>
-  </data>
-  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-</root>
\ No newline at end of file
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/OldTabPages/TestLoaderSettingsTab.cs b/src/GuiRunner/nunit-gui/SettingsPages/OldTabPages/TestLoaderSettingsTab.cs
deleted file mode 100644
index 84fcd1a..0000000
--- a/src/GuiRunner/nunit-gui/SettingsPages/OldTabPages/TestLoaderSettingsTab.cs
+++ /dev/null
@@ -1,248 +0,0 @@
-using System;
-using System.Collections;
-using System.ComponentModel;
-using System.Drawing;
-using System.Windows.Forms;
-using NUnit.Util;
-
-namespace NUnit.Gui.SettingsPages
-{
-	public class TestLoaderSettingsTab : NUnit.UiKit.SettingsPage
-	{
-		private System.Windows.Forms.GroupBox groupBox7;
-		private System.Windows.Forms.RadioButton flatTestList;
-		private System.Windows.Forms.RadioButton autoNamespaceSuites;
-		private System.Windows.Forms.GroupBox groupBox6;
-		private System.Windows.Forms.CheckBox mergeAssembliesCheckBox;
-		private System.Windows.Forms.RadioButton singleDomainRadioButton;
-		private System.Windows.Forms.RadioButton multiDomainRadioButton;
-		private System.Windows.Forms.GroupBox groupBox2;
-		private System.Windows.Forms.CheckBox rerunOnChangeCheckBox;
-		private System.Windows.Forms.CheckBox reloadOnRunCheckBox;
-		private System.Windows.Forms.CheckBox reloadOnChangeCheckBox;
-		private System.ComponentModel.IContainer components = null;
-
-		public TestLoaderSettingsTab(string key) : base( key )
-		{
-			// This call is required by the Windows Form Designer.
-			InitializeComponent();
-
-			// TODO: Add any initialization after the InitializeComponent call
-		}
-
-		/// <summary>
-		/// Clean up any resources being used.
-		/// </summary>
-		protected override void Dispose( bool disposing )
-		{
-			if( disposing )
-			{
-				if (components != null) 
-				{
-					components.Dispose();
-				}
-			}
-			base.Dispose( disposing );
-		}
-
-		#region Designer generated code
-		/// <summary>
-		/// Required method for Designer support - do not modify
-		/// the contents of this method with the code editor.
-		/// </summary>
-		private void InitializeComponent()
-		{
-			this.groupBox7 = new System.Windows.Forms.GroupBox();
-			this.flatTestList = new System.Windows.Forms.RadioButton();
-			this.autoNamespaceSuites = new System.Windows.Forms.RadioButton();
-			this.groupBox6 = new System.Windows.Forms.GroupBox();
-			this.mergeAssembliesCheckBox = new System.Windows.Forms.CheckBox();
-			this.singleDomainRadioButton = new System.Windows.Forms.RadioButton();
-			this.multiDomainRadioButton = new System.Windows.Forms.RadioButton();
-			this.groupBox2 = new System.Windows.Forms.GroupBox();
-			this.rerunOnChangeCheckBox = new System.Windows.Forms.CheckBox();
-			this.reloadOnRunCheckBox = new System.Windows.Forms.CheckBox();
-			this.reloadOnChangeCheckBox = new System.Windows.Forms.CheckBox();
-			this.groupBox7.SuspendLayout();
-			this.groupBox6.SuspendLayout();
-			this.groupBox2.SuspendLayout();
-			this.SuspendLayout();
-			// 
-			// groupBox7
-			// 
-			this.groupBox7.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.groupBox7.Controls.Add(this.flatTestList);
-			this.groupBox7.Controls.Add(this.autoNamespaceSuites);
-			this.groupBox7.Location = new System.Drawing.Point(11, 16);
-			this.groupBox7.Name = "groupBox7";
-			this.groupBox7.Size = new System.Drawing.Size(288, 80);
-			this.groupBox7.TabIndex = 3;
-			this.groupBox7.TabStop = false;
-			this.groupBox7.Text = "Test Structure";
-			// 
-			// flatTestList
-			// 
-			this.flatTestList.Location = new System.Drawing.Point(24, 48);
-			this.flatTestList.Name = "flatTestList";
-			this.flatTestList.Size = new System.Drawing.Size(216, 24);
-			this.flatTestList.TabIndex = 1;
-			this.flatTestList.Text = "Flat list of TestFixtures";
-			// 
-			// autoNamespaceSuites
-			// 
-			this.autoNamespaceSuites.Location = new System.Drawing.Point(24, 16);
-			this.autoNamespaceSuites.Name = "autoNamespaceSuites";
-			this.autoNamespaceSuites.Size = new System.Drawing.Size(224, 24);
-			this.autoNamespaceSuites.TabIndex = 0;
-			this.autoNamespaceSuites.Text = "Automatic Namespace suites";
-			// 
-			// groupBox6
-			// 
-			this.groupBox6.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.groupBox6.Controls.Add(this.mergeAssembliesCheckBox);
-			this.groupBox6.Controls.Add(this.singleDomainRadioButton);
-			this.groupBox6.Controls.Add(this.multiDomainRadioButton);
-			this.groupBox6.Location = new System.Drawing.Point(11, 104);
-			this.groupBox6.Name = "groupBox6";
-			this.groupBox6.Size = new System.Drawing.Size(288, 104);
-			this.groupBox6.TabIndex = 4;
-			this.groupBox6.TabStop = false;
-			this.groupBox6.Text = "Multiple Assemblies";
-			// 
-			// mergeAssembliesCheckBox
-			// 
-			this.mergeAssembliesCheckBox.Location = new System.Drawing.Point(40, 72);
-			this.mergeAssembliesCheckBox.Name = "mergeAssembliesCheckBox";
-			this.mergeAssembliesCheckBox.Size = new System.Drawing.Size(224, 24);
-			this.mergeAssembliesCheckBox.TabIndex = 2;
-			this.mergeAssembliesCheckBox.Text = "Merge tests across assemblies";
-			// 
-			// singleDomainRadioButton
-			// 
-			this.singleDomainRadioButton.Checked = true;
-			this.singleDomainRadioButton.Location = new System.Drawing.Point(24, 48);
-			this.singleDomainRadioButton.Name = "singleDomainRadioButton";
-			this.singleDomainRadioButton.Size = new System.Drawing.Size(240, 24);
-			this.singleDomainRadioButton.TabIndex = 1;
-			this.singleDomainRadioButton.TabStop = true;
-			this.singleDomainRadioButton.Text = "Load in a single AppDomain";
-			// 
-			// multiDomainRadioButton
-			// 
-			this.multiDomainRadioButton.Location = new System.Drawing.Point(24, 24);
-			this.multiDomainRadioButton.Name = "multiDomainRadioButton";
-			this.multiDomainRadioButton.Size = new System.Drawing.Size(240, 24);
-			this.multiDomainRadioButton.TabIndex = 0;
-			this.multiDomainRadioButton.Text = "Load in separate AppDomains";
-			// 
-			// groupBox2
-			// 
-			this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.groupBox2.Controls.Add(this.rerunOnChangeCheckBox);
-			this.groupBox2.Controls.Add(this.reloadOnRunCheckBox);
-			this.groupBox2.Controls.Add(this.reloadOnChangeCheckBox);
-			this.groupBox2.Location = new System.Drawing.Point(13, 216);
-			this.groupBox2.Name = "groupBox2";
-			this.groupBox2.Size = new System.Drawing.Size(288, 120);
-			this.groupBox2.TabIndex = 5;
-			this.groupBox2.TabStop = false;
-			this.groupBox2.Text = "Assembly Reload";
-			// 
-			// rerunOnChangeCheckBox
-			// 
-			this.rerunOnChangeCheckBox.Enabled = false;
-			this.rerunOnChangeCheckBox.Location = new System.Drawing.Point(40, 80);
-			this.rerunOnChangeCheckBox.Name = "rerunOnChangeCheckBox";
-			this.rerunOnChangeCheckBox.Size = new System.Drawing.Size(200, 24);
-			this.rerunOnChangeCheckBox.TabIndex = 10;
-			this.rerunOnChangeCheckBox.Text = "Re-run last tests run";
-			// 
-			// reloadOnRunCheckBox
-			// 
-			this.reloadOnRunCheckBox.Location = new System.Drawing.Point(19, 28);
-			this.reloadOnRunCheckBox.Name = "reloadOnRunCheckBox";
-			this.reloadOnRunCheckBox.Size = new System.Drawing.Size(237, 23);
-			this.reloadOnRunCheckBox.TabIndex = 8;
-			this.reloadOnRunCheckBox.Text = "Reload before each test run";
-			// 
-			// reloadOnChangeCheckBox
-			// 
-			this.reloadOnChangeCheckBox.Location = new System.Drawing.Point(19, 55);
-			this.reloadOnChangeCheckBox.Name = "reloadOnChangeCheckBox";
-			this.reloadOnChangeCheckBox.Size = new System.Drawing.Size(245, 25);
-			this.reloadOnChangeCheckBox.TabIndex = 9;
-			this.reloadOnChangeCheckBox.Text = "Reload when test assembly changes";
-			// 
-			// TestLoaderSettingsTab
-			// 
-			this.Controls.Add(this.groupBox7);
-			this.Controls.Add(this.groupBox6);
-			this.Controls.Add(this.groupBox2);
-			this.Name = "TestLoaderSettingsTab";
-			this.Size = new System.Drawing.Size(310, 344);
-			this.groupBox7.ResumeLayout(false);
-			this.groupBox6.ResumeLayout(false);
-			this.groupBox2.ResumeLayout(false);
-			this.ResumeLayout(false);
-
-		}
-		#endregion
-
-		public override void LoadSettings()
-		{
-			reloadOnChangeCheckBox.Enabled = Environment.OSVersion.Platform == System.PlatformID.Win32NT;
-			reloadOnChangeCheckBox.Checked = settings.GetSetting( "Options.TestLoader.ReloadOnChange", true );
-			rerunOnChangeCheckBox.Checked = settings.GetSetting( "Options.TestLoader.RerunOnChange", false );
-			reloadOnRunCheckBox.Checked = settings.GetSetting( "Options.TestLoader.ReloadOnRun", true );
-
-			bool multiDomain = settings.GetSetting( "Options.TestLoader.MultiDomain", false );
-			multiDomainRadioButton.Checked = multiDomain;
-			singleDomainRadioButton.Checked = !multiDomain;
-			mergeAssembliesCheckBox.Enabled = !multiDomain;
-			mergeAssembliesCheckBox.Checked = settings.GetSetting( "Options.TestLoader.MergeAssemblies", false );
-			autoNamespaceSuites.Checked = settings.GetSetting( "Options.TestLoader.AutoNamespaceSuites", true );
-			flatTestList.Checked = !autoNamespaceSuites.Checked;
-		}
-
-		public override void ApplySettings()
-		{
-			TestLoader loader = Services.TestLoader;
-
-			settings.SaveSetting( "Options.TestLoader.ReloadOnChange", loader.ReloadOnChange = reloadOnChangeCheckBox.Checked );
-			settings.SaveSetting( "Options.TestLoader.RerunOnChange", loader.RerunOnChange = rerunOnChangeCheckBox.Checked );
-			settings.SaveSetting( "Options.TestLoader.ReloadOnRun", loader.ReloadOnRun = reloadOnRunCheckBox.Checked );
-
-			settings.SaveSetting( "Options.TestLoader.MultiDomain", loader.MultiDomain = multiDomainRadioButton.Checked );
-			settings.SaveSetting( "Options.TestLoader.MergeAssemblies", loader.MergeAssemblies = mergeAssembliesCheckBox.Checked );
-			settings.SaveSetting( "Options.TestLoader.AutoNamespaceSuites", loader.AutoNamespaceSuites = autoNamespaceSuites.Checked );
-		}
-
-		public override bool HasChangesRequiringReload
-		{
-			get 
-			{
-				return 
-					settings.GetSetting( "Options.TestLoader.ReloadOnChange", true ) != reloadOnChangeCheckBox.Checked ||
-					settings.GetSetting( "Options.TestLoader.MultiDomain", false ) != multiDomainRadioButton.Checked ||
-					settings.GetSetting( "Options.TestLoader.MergeAssemblies", false ) != mergeAssembliesCheckBox.Checked ||
-					settings.GetSetting( "Options.TestLoader.AutoNamespaceSuites", true ) != autoNamespaceSuites.Checked;
-			}
-		}
-
-		private void singleDomainRadioButton_CheckedChanged(object sender, System.EventArgs e)
-		{
-			mergeAssembliesCheckBox.Enabled = singleDomainRadioButton.Checked;
-		}
-
-		private void reloadOnChangeCheckBox_CheckedChanged(object sender, System.EventArgs e)
-		{
-			rerunOnChangeCheckBox.Enabled = reloadOnChangeCheckBox.Checked;
-			rerunOnChangeCheckBox.Checked = false;
-		}
-
-	}
-}
-
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/OldTabPages/TestLoaderSettingsTab.resx b/src/GuiRunner/nunit-gui/SettingsPages/OldTabPages/TestLoaderSettingsTab.resx
deleted file mode 100644
index 8b39c9e..0000000
--- a/src/GuiRunner/nunit-gui/SettingsPages/OldTabPages/TestLoaderSettingsTab.resx
+++ /dev/null
@@ -1,256 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 1.3
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">1.3</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1">this is my long string</data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        [base64 mime encoded serialized .NET Framework object]
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        [base64 mime encoded string representing a byte array form of the .NET Framework object]
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used forserialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>1.3</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <data name="groupBox7.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="groupBox7.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="groupBox7.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="groupBox7.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="groupBox7.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="groupBox7.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="flatTestList.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="flatTestList.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="flatTestList.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="autoNamespaceSuites.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="autoNamespaceSuites.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="autoNamespaceSuites.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="groupBox6.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="groupBox6.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="groupBox6.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="groupBox6.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="groupBox6.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="groupBox6.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="mergeAssembliesCheckBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="mergeAssembliesCheckBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="mergeAssembliesCheckBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="singleDomainRadioButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="singleDomainRadioButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="singleDomainRadioButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="multiDomainRadioButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="multiDomainRadioButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="multiDomainRadioButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="groupBox2.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="groupBox2.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="groupBox2.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="groupBox2.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="groupBox2.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="groupBox2.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="rerunOnChangeCheckBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="rerunOnChangeCheckBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="rerunOnChangeCheckBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="reloadOnRunCheckBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="reloadOnRunCheckBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="reloadOnRunCheckBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="reloadOnChangeCheckBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="reloadOnChangeCheckBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="reloadOnChangeCheckBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>80</value>
-  </data>
-  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>(Default)</value>
-  </data>
-  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.Name">
-    <value>TestLoaderSettingsTab</value>
-  </data>
-  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-</root>
\ No newline at end of file
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/OldTabPages/TestOutputSettingsTab.cs b/src/GuiRunner/nunit-gui/SettingsPages/OldTabPages/TestOutputSettingsTab.cs
deleted file mode 100644
index a7ea1af..0000000
--- a/src/GuiRunner/nunit-gui/SettingsPages/OldTabPages/TestOutputSettingsTab.cs
+++ /dev/null
@@ -1,310 +0,0 @@
-using System;
-using System.Collections;
-using System.ComponentModel;
-using System.Drawing;
-using System.Windows.Forms;
-
-namespace NUnit.Gui.SettingsPages
-{
-	public class TestOutputSettingsTab : NUnit.UiKit.SettingsPage
-	{
-		private System.Windows.Forms.GroupBox groupBox3;
-		private System.Windows.Forms.CheckBox errorsTabCheckBox;
-		private System.Windows.Forms.CheckBox failureToolTips;
-		private System.Windows.Forms.CheckBox enableWordWrap;
-		private System.Windows.Forms.CheckBox notRunTabCheckBox;
-		private System.Windows.Forms.GroupBox groupBox8;
-		private System.Windows.Forms.CheckBox consoleOutputCheckBox;
-		private System.Windows.Forms.CheckBox labelTestOutputCheckBox;
-		private System.Windows.Forms.Panel panel1;
-		private System.Windows.Forms.CheckBox consoleErrrorCheckBox;
-		private System.Windows.Forms.RadioButton mergeErrors;
-		private System.Windows.Forms.RadioButton separateErrors;
-		private System.Windows.Forms.Panel panel2;
-		private System.Windows.Forms.RadioButton separateTrace;
-		private System.Windows.Forms.CheckBox traceOutputCheckBox;
-		private System.Windows.Forms.RadioButton mergeTrace;
-		private System.ComponentModel.IContainer components = null;
-
-		public TestOutputSettingsTab(string key) : base(key)
-		{
-			// This call is required by the Windows Form Designer.
-			InitializeComponent();
-
-			// TODO: Add any initialization after the InitializeComponent call
-		}
-
-		/// <summary>
-		/// Clean up any resources being used.
-		/// </summary>
-		protected override void Dispose( bool disposing )
-		{
-			if( disposing )
-			{
-				if (components != null) 
-				{
-					components.Dispose();
-				}
-			}
-			base.Dispose( disposing );
-		}
-
-		#region Designer generated code
-		/// <summary>
-		/// Required method for Designer support - do not modify
-		/// the contents of this method with the code editor.
-		/// </summary>
-		private void InitializeComponent()
-		{
-			this.groupBox3 = new System.Windows.Forms.GroupBox();
-			this.errorsTabCheckBox = new System.Windows.Forms.CheckBox();
-			this.failureToolTips = new System.Windows.Forms.CheckBox();
-			this.enableWordWrap = new System.Windows.Forms.CheckBox();
-			this.notRunTabCheckBox = new System.Windows.Forms.CheckBox();
-			this.groupBox8 = new System.Windows.Forms.GroupBox();
-			this.consoleOutputCheckBox = new System.Windows.Forms.CheckBox();
-			this.labelTestOutputCheckBox = new System.Windows.Forms.CheckBox();
-			this.panel1 = new System.Windows.Forms.Panel();
-			this.consoleErrrorCheckBox = new System.Windows.Forms.CheckBox();
-			this.mergeErrors = new System.Windows.Forms.RadioButton();
-			this.separateErrors = new System.Windows.Forms.RadioButton();
-			this.panel2 = new System.Windows.Forms.Panel();
-			this.separateTrace = new System.Windows.Forms.RadioButton();
-			this.traceOutputCheckBox = new System.Windows.Forms.CheckBox();
-			this.mergeTrace = new System.Windows.Forms.RadioButton();
-			this.groupBox3.SuspendLayout();
-			this.groupBox8.SuspendLayout();
-			this.panel1.SuspendLayout();
-			this.panel2.SuspendLayout();
-			this.SuspendLayout();
-			// 
-			// groupBox3
-			// 
-			this.groupBox3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.groupBox3.Controls.Add(this.errorsTabCheckBox);
-			this.groupBox3.Controls.Add(this.failureToolTips);
-			this.groupBox3.Controls.Add(this.enableWordWrap);
-			this.groupBox3.Controls.Add(this.notRunTabCheckBox);
-			this.groupBox3.Location = new System.Drawing.Point(8, 8);
-			this.groupBox3.Name = "groupBox3";
-			this.groupBox3.Size = new System.Drawing.Size(296, 128);
-			this.groupBox3.TabIndex = 0;
-			this.groupBox3.TabStop = false;
-			this.groupBox3.Text = "Test Results";
-			// 
-			// errorsTabCheckBox
-			// 
-			this.errorsTabCheckBox.Checked = true;
-			this.errorsTabCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
-			this.errorsTabCheckBox.Location = new System.Drawing.Point(16, 16);
-			this.errorsTabCheckBox.Name = "errorsTabCheckBox";
-			this.errorsTabCheckBox.Size = new System.Drawing.Size(248, 24);
-			this.errorsTabCheckBox.TabIndex = 0;
-			this.errorsTabCheckBox.Text = "Display Errors and Failures";
-			// 
-			// failureToolTips
-			// 
-			this.failureToolTips.Location = new System.Drawing.Point(32, 40);
-			this.failureToolTips.Name = "failureToolTips";
-			this.failureToolTips.Size = new System.Drawing.Size(202, 19);
-			this.failureToolTips.TabIndex = 1;
-			this.failureToolTips.Text = "Display Failure ToolTips";
-			// 
-			// enableWordWrap
-			// 
-			this.enableWordWrap.Location = new System.Drawing.Point(32, 64);
-			this.enableWordWrap.Name = "enableWordWrap";
-			this.enableWordWrap.Size = new System.Drawing.Size(248, 19);
-			this.enableWordWrap.TabIndex = 2;
-			this.enableWordWrap.Text = "Enable Word Wrap";
-			// 
-			// notRunTabCheckBox
-			// 
-			this.notRunTabCheckBox.Checked = true;
-			this.notRunTabCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
-			this.notRunTabCheckBox.Location = new System.Drawing.Point(16, 96);
-			this.notRunTabCheckBox.Name = "notRunTabCheckBox";
-			this.notRunTabCheckBox.Size = new System.Drawing.Size(264, 16);
-			this.notRunTabCheckBox.TabIndex = 3;
-			this.notRunTabCheckBox.Text = "Display Tests Not Run";
-			// 
-			// groupBox8
-			// 
-			this.groupBox8.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.groupBox8.Controls.Add(this.consoleOutputCheckBox);
-			this.groupBox8.Controls.Add(this.labelTestOutputCheckBox);
-			this.groupBox8.Controls.Add(this.panel1);
-			this.groupBox8.Controls.Add(this.panel2);
-			this.groupBox8.Location = new System.Drawing.Point(8, 144);
-			this.groupBox8.Name = "groupBox8";
-			this.groupBox8.Size = new System.Drawing.Size(298, 232);
-			this.groupBox8.TabIndex = 2;
-			this.groupBox8.TabStop = false;
-			this.groupBox8.Text = "Text Output";
-			// 
-			// consoleOutputCheckBox
-			// 
-			this.consoleOutputCheckBox.Checked = true;
-			this.consoleOutputCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
-			this.consoleOutputCheckBox.Location = new System.Drawing.Point(16, 18);
-			this.consoleOutputCheckBox.Name = "consoleOutputCheckBox";
-			this.consoleOutputCheckBox.Size = new System.Drawing.Size(240, 16);
-			this.consoleOutputCheckBox.TabIndex = 0;
-			this.consoleOutputCheckBox.Text = "Display Console Standard Output";
-			// 
-			// labelTestOutputCheckBox
-			// 
-			this.labelTestOutputCheckBox.Location = new System.Drawing.Point(32, 40);
-			this.labelTestOutputCheckBox.Name = "labelTestOutputCheckBox";
-			this.labelTestOutputCheckBox.Size = new System.Drawing.Size(237, 19);
-			this.labelTestOutputCheckBox.TabIndex = 1;
-			this.labelTestOutputCheckBox.Text = "Label Test Cases";
-			// 
-			// panel1
-			// 
-			this.panel1.Controls.Add(this.consoleErrrorCheckBox);
-			this.panel1.Controls.Add(this.mergeErrors);
-			this.panel1.Controls.Add(this.separateErrors);
-			this.panel1.Location = new System.Drawing.Point(8, 64);
-			this.panel1.Name = "panel1";
-			this.panel1.Size = new System.Drawing.Size(272, 80);
-			this.panel1.TabIndex = 2;
-			// 
-			// consoleErrrorCheckBox
-			// 
-			this.consoleErrrorCheckBox.Checked = true;
-			this.consoleErrrorCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
-			this.consoleErrrorCheckBox.Location = new System.Drawing.Point(8, 8);
-			this.consoleErrrorCheckBox.Name = "consoleErrrorCheckBox";
-			this.consoleErrrorCheckBox.Size = new System.Drawing.Size(232, 24);
-			this.consoleErrrorCheckBox.TabIndex = 0;
-			this.consoleErrrorCheckBox.Text = "Display Console Error Output";
-			// 
-			// mergeErrors
-			// 
-			this.mergeErrors.Location = new System.Drawing.Point(32, 56);
-			this.mergeErrors.Name = "mergeErrors";
-			this.mergeErrors.Size = new System.Drawing.Size(192, 16);
-			this.mergeErrors.TabIndex = 2;
-			this.mergeErrors.Text = "Merge with Console Output";
-			// 
-			// separateErrors
-			// 
-			this.separateErrors.Checked = true;
-			this.separateErrors.Location = new System.Drawing.Point(32, 32);
-			this.separateErrors.Name = "separateErrors";
-			this.separateErrors.Size = new System.Drawing.Size(224, 16);
-			this.separateErrors.TabIndex = 1;
-			this.separateErrors.TabStop = true;
-			this.separateErrors.Text = "In Separate Tab";
-			// 
-			// panel2
-			// 
-			this.panel2.Controls.Add(this.separateTrace);
-			this.panel2.Controls.Add(this.traceOutputCheckBox);
-			this.panel2.Location = new System.Drawing.Point(8, 144);
-			this.panel2.Name = "panel2";
-			this.panel2.Size = new System.Drawing.Size(272, 80);
-			this.panel2.TabIndex = 3;
-			// 
-			// separateTrace
-			// 
-			this.separateTrace.Checked = true;
-			this.separateTrace.Location = new System.Drawing.Point(32, 32);
-			this.separateTrace.Name = "separateTrace";
-			this.separateTrace.Size = new System.Drawing.Size(224, 16);
-			this.separateTrace.TabIndex = 1;
-			this.separateTrace.TabStop = true;
-			this.separateTrace.Text = "In Separate Tab";
-			// 
-			// traceOutputCheckBox
-			// 
-			this.traceOutputCheckBox.Checked = true;
-			this.traceOutputCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
-			this.traceOutputCheckBox.Location = new System.Drawing.Point(8, 8);
-			this.traceOutputCheckBox.Name = "traceOutputCheckBox";
-			this.traceOutputCheckBox.Size = new System.Drawing.Size(208, 16);
-			this.traceOutputCheckBox.TabIndex = 0;
-			this.traceOutputCheckBox.Text = "Display Trace Output";
-			// 
-			// mergeTrace
-			// 
-			this.mergeTrace.Location = new System.Drawing.Point(0, 0);
-			this.mergeTrace.Name = "mergeTrace";
-			this.mergeTrace.TabIndex = 0;
-			// 
-			// TestOutputSettingsTab
-			// 
-			this.Controls.Add(this.groupBox3);
-			this.Controls.Add(this.groupBox8);
-			this.Name = "TestOutputSettingsTab";
-			this.Size = new System.Drawing.Size(310, 384);
-			this.groupBox3.ResumeLayout(false);
-			this.groupBox8.ResumeLayout(false);
-			this.panel1.ResumeLayout(false);
-			this.panel2.ResumeLayout(false);
-			this.ResumeLayout(false);
-
-		}
-		#endregion
-
-		public override void LoadSettings()
-		{
-			errorsTabCheckBox.Checked = settings.GetSetting( "Gui.ResultTabs.DisplayErrorsTab", true );
-			notRunTabCheckBox.Checked = settings.GetSetting( "Gui.ResultTabs.DisplayNotRunTab", true );
-			consoleOutputCheckBox.Checked = settings.GetSetting( "Gui.ResultTabs.DisplayConsoleOutputTab", true );
-			consoleErrrorCheckBox.Checked = settings.GetSetting( "Gui.ResultTabs.DisplayConsoleErrorTab", true )
-				|| settings.GetSetting( "Gui.ResultTabs.MergeErrorOutput", false );
-			traceOutputCheckBox.Checked = settings.GetSetting( "Gui.ResultTabs.DisplayTraceTab", true )
-				|| settings.GetSetting( "Gui.ResultTabs.MergeTraceOutput", false );
-
-			labelTestOutputCheckBox.Checked = settings.GetSetting( "Gui.ResultTabs.DisplayTestLabels", false );
-			failureToolTips.Checked = settings.GetSetting( "Gui.ResultTabs.ErrorsTab.ToolTipsEnabled", true );
-			enableWordWrap.Checked = settings.GetSetting( "Gui.ResultTabs.ErrorsTab.WordWrapEnabled", true );
-
-			mergeErrors.Checked = settings.GetSetting( "Gui.ResultTabs.MergeErrorOutput", false );
-			mergeTrace.Checked = settings.GetSetting( "Gui.ResultTabs.MergeTraceOutput", false );
-		}
-
-		public override void ApplySettings()
-		{
-			settings.SaveSetting( "Gui.ResultTabs.DisplayTestLabels", labelTestOutputCheckBox.Checked );
-			settings.SaveSetting( "Gui.ResultTabs.ErrorsTab.ToolTipsEnabled", failureToolTips.Checked );
-			settings.SaveSetting( "Gui.ResultTabs.ErrorsTab.WordWrapEnabled", enableWordWrap.Checked );
-		
-
-			settings.SaveSetting( "Gui.ResultTabs.DisplayErrorsTab", errorsTabCheckBox.Checked );
-			settings.SaveSetting( "Gui.ResultTabs.DisplayNotRunTab", notRunTabCheckBox.Checked );
-			settings.SaveSetting( "Gui.ResultTabs.DisplayConsoleOutputTab", consoleOutputCheckBox.Checked );
-			settings.SaveSetting( "Gui.ResultTabs.DisplayConsoleErrorTab", consoleErrrorCheckBox.Checked && separateErrors.Checked );
-			settings.SaveSetting( "Gui.ResultTabs.DisplayTraceTab", traceOutputCheckBox.Checked && separateTrace.Checked );
-
-			settings.SaveSetting( "Gui.ResultTabs.MergeErrorOutput", mergeErrors.Checked );
-			settings.SaveSetting( "Gui.ResultTabs.MergeTraceOutput", mergeTrace.Checked );
-		}
-
-		private void errorsTabCheckBox_CheckedChanged(object sender, System.EventArgs e)
-		{
-			this.failureToolTips.Enabled = this.enableWordWrap.Enabled = this.errorsTabCheckBox.Checked;
-		}
-
-		private void consoleOutputCheckBox_CheckedChanged(object sender, System.EventArgs e)
-		{
-			this.labelTestOutputCheckBox.Enabled = this.consoleOutputCheckBox.Checked;
-		}
-
-		private void consoleErrrorCheckBox_CheckedChanged(object sender, System.EventArgs e)
-		{
-			this.separateErrors.Enabled = this.mergeErrors.Enabled = this.consoleErrrorCheckBox.Checked;
-		}
-
-		private void traceOutputCheckBox_CheckedChanged(object sender, System.EventArgs e)
-		{
-			this.separateTrace.Enabled = this.mergeTrace.Enabled = this.traceOutputCheckBox.Checked;
-		}
-
-	}
-}
-
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/OldTabPages/TestOutputSettingsTab.resx b/src/GuiRunner/nunit-gui/SettingsPages/OldTabPages/TestOutputSettingsTab.resx
deleted file mode 100644
index c146f2e..0000000
--- a/src/GuiRunner/nunit-gui/SettingsPages/OldTabPages/TestOutputSettingsTab.resx
+++ /dev/null
@@ -1,310 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 1.3
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">1.3</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1">this is my long string</data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        [base64 mime encoded serialized .NET Framework object]
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        [base64 mime encoded string representing a byte array form of the .NET Framework object]
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used forserialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>1.3</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <data name="groupBox3.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="groupBox3.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="groupBox3.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="groupBox3.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="groupBox3.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="groupBox3.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="errorsTabCheckBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="errorsTabCheckBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="errorsTabCheckBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="failureToolTips.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="failureToolTips.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="failureToolTips.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="enableWordWrap.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="enableWordWrap.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="enableWordWrap.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="notRunTabCheckBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="notRunTabCheckBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="notRunTabCheckBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="groupBox8.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="groupBox8.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="groupBox8.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="groupBox8.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="groupBox8.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="groupBox8.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="consoleOutputCheckBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="consoleOutputCheckBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="consoleOutputCheckBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="labelTestOutputCheckBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="labelTestOutputCheckBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="labelTestOutputCheckBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="panel1.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="panel1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="panel1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="panel1.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="panel1.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="panel1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="consoleErrrorCheckBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="consoleErrrorCheckBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="consoleErrrorCheckBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="mergeErrors.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="mergeErrors.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="mergeErrors.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="separateErrors.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="separateErrors.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="separateErrors.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="panel2.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="panel2.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="panel2.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="panel2.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="panel2.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="panel2.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="separateTrace.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="separateTrace.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="separateTrace.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="traceOutputCheckBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="traceOutputCheckBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="traceOutputCheckBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="mergeTrace.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="mergeTrace.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="mergeTrace.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>80</value>
-  </data>
-  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>(Default)</value>
-  </data>
-  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Name">
-    <value>TestOutputSettingsTab</value>
-  </data>
-  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-</root>
\ No newline at end of file
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/TestLoaderSettingsPage.cs b/src/GuiRunner/nunit-gui/SettingsPages/TestLoaderSettingsPage.cs
index 6b8a0cf..1cebd80 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/TestLoaderSettingsPage.cs
+++ b/src/GuiRunner/nunit-gui/SettingsPages/TestLoaderSettingsPage.cs
@@ -1,24 +1,31 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using System.Collections;
 using System.ComponentModel;
 using System.Drawing;
 using System.Windows.Forms;
 using NUnit.Util;
+using NUnit.Core;
 
 namespace NUnit.Gui.SettingsPages
 {
 	public class TestLoaderSettingsPage : NUnit.UiKit.SettingsPage
 	{
-		private System.Windows.Forms.GroupBox groupBox1;
-		private System.Windows.Forms.Label label1;
-		private System.Windows.Forms.Label label2;
-		private System.Windows.Forms.GroupBox groupBox2;
 		private System.Windows.Forms.CheckBox mergeAssembliesCheckBox;
 		private System.Windows.Forms.RadioButton singleDomainRadioButton;
 		private System.Windows.Forms.RadioButton multiDomainRadioButton;
-		private System.Windows.Forms.RadioButton flatTestList;
-		private System.Windows.Forms.RadioButton autoNamespaceSuites;
 		private System.Windows.Forms.HelpProvider helpProvider1;
+        private Label label3;
+        private GroupBox groupBox3;
+        private RadioButton multiProcessRadioButton;
+        private RadioButton separateProcessRadioButton;
+        private RadioButton sameProcessRadioButton;
+        private Label label2;
+        private GroupBox groupBox2;
 		private System.ComponentModel.IContainer components = null;
 
 		public TestLoaderSettingsPage(string key) : base(key)
@@ -51,58 +58,23 @@ namespace NUnit.Gui.SettingsPages
 		/// </summary>
 		private void InitializeComponent()
 		{
-			this.groupBox1 = new System.Windows.Forms.GroupBox();
-			this.label1 = new System.Windows.Forms.Label();
-			this.label2 = new System.Windows.Forms.Label();
-			this.groupBox2 = new System.Windows.Forms.GroupBox();
 			this.mergeAssembliesCheckBox = new System.Windows.Forms.CheckBox();
 			this.singleDomainRadioButton = new System.Windows.Forms.RadioButton();
 			this.multiDomainRadioButton = new System.Windows.Forms.RadioButton();
-			this.flatTestList = new System.Windows.Forms.RadioButton();
-			this.autoNamespaceSuites = new System.Windows.Forms.RadioButton();
 			this.helpProvider1 = new System.Windows.Forms.HelpProvider();
+			this.label3 = new System.Windows.Forms.Label();
+			this.groupBox3 = new System.Windows.Forms.GroupBox();
+			this.multiProcessRadioButton = new System.Windows.Forms.RadioButton();
+			this.separateProcessRadioButton = new System.Windows.Forms.RadioButton();
+			this.sameProcessRadioButton = new System.Windows.Forms.RadioButton();
+			this.label2 = new System.Windows.Forms.Label();
+			this.groupBox2 = new System.Windows.Forms.GroupBox();
 			this.SuspendLayout();
 			// 
-			// groupBox1
-			// 
-			this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.groupBox1.Location = new System.Drawing.Point(104, 0);
-			this.groupBox1.Name = "groupBox1";
-			this.groupBox1.Size = new System.Drawing.Size(352, 8);
-			this.groupBox1.TabIndex = 4;
-			this.groupBox1.TabStop = false;
-			// 
-			// label1
-			// 
-			this.label1.Location = new System.Drawing.Point(16, 0);
-			this.label1.Name = "label1";
-			this.label1.Size = new System.Drawing.Size(96, 16);
-			this.label1.TabIndex = 5;
-			this.label1.Text = "Test Structure";
-			// 
-			// label2
-			// 
-			this.label2.Location = new System.Drawing.Point(16, 96);
-			this.label2.Name = "label2";
-			this.label2.Size = new System.Drawing.Size(128, 16);
-			this.label2.TabIndex = 7;
-			this.label2.Text = "Multiple Assemblies";
-			// 
-			// groupBox2
-			// 
-			this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.groupBox2.Location = new System.Drawing.Point(144, 96);
-			this.groupBox2.Name = "groupBox2";
-			this.groupBox2.Size = new System.Drawing.Size(312, 8);
-			this.groupBox2.TabIndex = 6;
-			this.groupBox2.TabStop = false;
-			// 
 			// mergeAssembliesCheckBox
 			// 
 			this.helpProvider1.SetHelpString(this.mergeAssembliesCheckBox, "If checked, tests in each assembly will be merged into a single tree.");
-			this.mergeAssembliesCheckBox.Location = new System.Drawing.Point(48, 184);
+			this.mergeAssembliesCheckBox.Location = new System.Drawing.Point(48, 208);
 			this.mergeAssembliesCheckBox.Name = "mergeAssembliesCheckBox";
 			this.helpProvider1.SetShowHelp(this.mergeAssembliesCheckBox, true);
 			this.mergeAssembliesCheckBox.Size = new System.Drawing.Size(224, 24);
@@ -114,68 +86,106 @@ namespace NUnit.Gui.SettingsPages
 			this.singleDomainRadioButton.AutoCheck = false;
 			this.singleDomainRadioButton.Checked = true;
 			this.helpProvider1.SetHelpString(this.singleDomainRadioButton, "If selected, all test assemblies will be loaded in the same AppDomain.");
-			this.singleDomainRadioButton.Location = new System.Drawing.Point(32, 152);
+			this.singleDomainRadioButton.Location = new System.Drawing.Point(32, 176);
 			this.singleDomainRadioButton.Name = "singleDomainRadioButton";
 			this.helpProvider1.SetShowHelp(this.singleDomainRadioButton, true);
-			this.singleDomainRadioButton.Size = new System.Drawing.Size(240, 24);
+			this.singleDomainRadioButton.Size = new System.Drawing.Size(272, 24);
 			this.singleDomainRadioButton.TabIndex = 9;
 			this.singleDomainRadioButton.TabStop = true;
-			this.singleDomainRadioButton.Text = "Load in a single AppDomain";
+			this.singleDomainRadioButton.Text = "Use a single AppDomain for all tests";
 			this.singleDomainRadioButton.Click += new System.EventHandler(this.toggleMultiDomain);
 			// 
 			// multiDomainRadioButton
 			// 
 			this.multiDomainRadioButton.AutoCheck = false;
 			this.helpProvider1.SetHelpString(this.multiDomainRadioButton, "If selected, each test assembly will be loaded in a separate AppDomain.");
-			this.multiDomainRadioButton.Location = new System.Drawing.Point(32, 120);
+			this.multiDomainRadioButton.Location = new System.Drawing.Point(32, 144);
 			this.multiDomainRadioButton.Name = "multiDomainRadioButton";
 			this.helpProvider1.SetShowHelp(this.multiDomainRadioButton, true);
-			this.multiDomainRadioButton.Size = new System.Drawing.Size(240, 24);
+			this.multiDomainRadioButton.Size = new System.Drawing.Size(302, 24);
 			this.multiDomainRadioButton.TabIndex = 8;
-			this.multiDomainRadioButton.Text = "Load in separate AppDomains";
+			this.multiDomainRadioButton.Text = "Use a separate AppDomain per Assembly";
 			this.multiDomainRadioButton.Click += new System.EventHandler(this.toggleMultiDomain);
 			// 
-			// flatTestList
-			// 
-			this.flatTestList.AutoCheck = false;
-			this.helpProvider1.SetHelpString(this.flatTestList, "If selected, the tree will consist of a flat list of fixtures, without any higher" +
-				"-level structure beyond the assemblies.");
-			this.flatTestList.Location = new System.Drawing.Point(32, 56);
-			this.flatTestList.Name = "flatTestList";
-			this.helpProvider1.SetShowHelp(this.flatTestList, true);
-			this.flatTestList.Size = new System.Drawing.Size(216, 24);
-			this.flatTestList.TabIndex = 33;
-			this.flatTestList.Text = "Flat list of TestFixtures";
-			this.flatTestList.Click += new System.EventHandler(this.toggleTestStructure);
-			// 
-			// autoNamespaceSuites
-			// 
-			this.autoNamespaceSuites.AutoCheck = false;
-			this.autoNamespaceSuites.Checked = true;
-			this.helpProvider1.SetHelpString(this.autoNamespaceSuites, "If selected, the tree will follow the namespace structure of the tests, with suit" +
-				"es automatically created at each level.");
-			this.autoNamespaceSuites.Location = new System.Drawing.Point(32, 24);
-			this.autoNamespaceSuites.Name = "autoNamespaceSuites";
-			this.helpProvider1.SetShowHelp(this.autoNamespaceSuites, true);
-			this.autoNamespaceSuites.Size = new System.Drawing.Size(224, 24);
-			this.autoNamespaceSuites.TabIndex = 32;
-			this.autoNamespaceSuites.TabStop = true;
-			this.autoNamespaceSuites.Text = "Automatic Namespace suites";
-			this.autoNamespaceSuites.Click += new System.EventHandler(this.toggleTestStructure);
+			// label3
+			// 
+			this.label3.Location = new System.Drawing.Point(16, 8);
+			this.label3.Name = "label3";
+			this.label3.Size = new System.Drawing.Size(165, 18);
+			this.label3.TabIndex = 35;
+			this.label3.Text = "Default Process Model";
+			// 
+			// groupBox3
+			// 
+			this.groupBox3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+				| System.Windows.Forms.AnchorStyles.Right)));
+			this.groupBox3.Location = new System.Drawing.Point(112, 8);
+			this.groupBox3.Name = "groupBox3";
+			this.groupBox3.Size = new System.Drawing.Size(340, 8);
+			this.groupBox3.TabIndex = 34;
+			this.groupBox3.TabStop = false;
+			// 
+			// multiProcessRadioButton
+			// 
+			this.multiProcessRadioButton.Location = new System.Drawing.Point(32, 96);
+			this.multiProcessRadioButton.Name = "multiProcessRadioButton";
+			this.multiProcessRadioButton.Size = new System.Drawing.Size(319, 21);
+			this.multiProcessRadioButton.TabIndex = 36;
+			this.multiProcessRadioButton.Text = "Run tests in a separate process per Assembly";
+			this.multiProcessRadioButton.CheckedChanged += new System.EventHandler(this.toggleProcessUsage);
+			// 
+			// separateProcessRadioButton
+			// 
+			this.separateProcessRadioButton.Location = new System.Drawing.Point(32, 64);
+			this.separateProcessRadioButton.Name = "separateProcessRadioButton";
+			this.separateProcessRadioButton.Size = new System.Drawing.Size(271, 21);
+			this.separateProcessRadioButton.TabIndex = 37;
+			this.separateProcessRadioButton.Text = "Run tests in a single separate process";
+			this.separateProcessRadioButton.CheckedChanged += new System.EventHandler(this.toggleProcessUsage);
+			// 
+			// sameProcessRadioButton
+			// 
+			this.sameProcessRadioButton.Checked = true;
+			this.sameProcessRadioButton.Location = new System.Drawing.Point(32, 32);
+			this.sameProcessRadioButton.Name = "sameProcessRadioButton";
+			this.sameProcessRadioButton.Size = new System.Drawing.Size(270, 21);
+			this.sameProcessRadioButton.TabIndex = 38;
+			this.sameProcessRadioButton.TabStop = true;
+			this.sameProcessRadioButton.Text = "Run tests directly in the NUnit process";
+			this.sameProcessRadioButton.CheckedChanged += new System.EventHandler(this.toggleProcessUsage);
+			// 
+			// label2
+			// 
+			this.label2.Location = new System.Drawing.Point(16, 128);
+			this.label2.Name = "label2";
+			this.label2.Size = new System.Drawing.Size(156, 18);
+			this.label2.TabIndex = 40;
+			this.label2.Text = "Default Domain Usage";
+			// 
+			// groupBox2
+			// 
+			this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+				| System.Windows.Forms.AnchorStyles.Right)));
+			this.groupBox2.Location = new System.Drawing.Point(112, 128);
+			this.groupBox2.Name = "groupBox2";
+			this.groupBox2.Size = new System.Drawing.Size(340, 8);
+			this.groupBox2.TabIndex = 39;
+			this.groupBox2.TabStop = false;
 			// 
 			// TestLoaderSettingsPage
 			// 
-			this.Controls.Add(this.flatTestList);
-			this.Controls.Add(this.autoNamespaceSuites);
+			this.Controls.Add(this.label2);
+			this.Controls.Add(this.groupBox2);
+			this.Controls.Add(this.sameProcessRadioButton);
+			this.Controls.Add(this.separateProcessRadioButton);
+			this.Controls.Add(this.multiProcessRadioButton);
+			this.Controls.Add(this.label3);
+			this.Controls.Add(this.groupBox3);
 			this.Controls.Add(this.mergeAssembliesCheckBox);
 			this.Controls.Add(this.singleDomainRadioButton);
 			this.Controls.Add(this.multiDomainRadioButton);
-			this.Controls.Add(this.label2);
-			this.Controls.Add(this.groupBox2);
-			this.Controls.Add(this.label1);
-			this.Controls.Add(this.groupBox1);
 			this.Name = "TestLoaderSettingsPage";
-			this.Size = new System.Drawing.Size(456, 312);
+			this.Size = new System.Drawing.Size(456, 341);
 			this.ResumeLayout(false);
 
 		}
@@ -183,47 +193,102 @@ namespace NUnit.Gui.SettingsPages
 		
 		public override void LoadSettings()
 		{
-			bool multiDomain = settings.GetSetting( "Options.TestLoader.MultiDomain", false );
+            switch( GetSavedProcessModel() )
+            {
+                case ProcessModel.Separate:
+                    separateProcessRadioButton.Checked = true;
+                    sameProcessRadioButton.Checked = false;
+                    multiProcessRadioButton.Checked = false;
+                    break;
+                case ProcessModel.Multiple:
+                    multiProcessRadioButton.Checked = true;
+                    sameProcessRadioButton.Checked = false;
+                    separateProcessRadioButton.Checked = false;
+                    break;
+                default:
+                    sameProcessRadioButton.Checked = true;
+                    multiProcessRadioButton.Checked = false;
+                    separateProcessRadioButton.Checked = false;
+                    break;
+            }
+
+			bool multiDomain = GetSavedDomainUsage() == DomainUsage.Multiple;
 			multiDomainRadioButton.Checked = multiDomain;
 			singleDomainRadioButton.Checked = !multiDomain;
-			mergeAssembliesCheckBox.Enabled = !multiDomain;
+            mergeAssembliesCheckBox.Enabled = !multiDomain;
+
 			mergeAssembliesCheckBox.Checked = settings.GetSetting( "Options.TestLoader.MergeAssemblies", false );
-			autoNamespaceSuites.Checked = settings.GetSetting( "Options.TestLoader.AutoNamespaceSuites", true );
-			flatTestList.Checked = !autoNamespaceSuites.Checked;
 		}
 
 		public override void ApplySettings()
 		{
-			TestLoader loader = Services.TestLoader;
+            if (multiProcessRadioButton.Checked)
+                settings.SaveSetting("Options.TestLoader.ProcessModel", ProcessModel.Multiple);
+            else if (separateProcessRadioButton.Checked)
+                settings.SaveSetting("Options.TestLoader.ProcessModel", ProcessModel.Separate);
+            else
+                settings.RemoveSetting("Options.TestLoader.ProcessModel");
 
-			settings.SaveSetting( "Options.TestLoader.MultiDomain", loader.MultiDomain = multiDomainRadioButton.Checked );
-			settings.SaveSetting( "Options.TestLoader.MergeAssemblies", loader.MergeAssemblies = mergeAssembliesCheckBox.Checked );
-			settings.SaveSetting( "Options.TestLoader.AutoNamespaceSuites", loader.AutoNamespaceSuites = autoNamespaceSuites.Checked );
+            if (multiDomainRadioButton.Checked)
+                settings.SaveSetting("Options.TestLoader.DomainUsage", DomainUsage.Multiple);
+            else
+                settings.RemoveSetting("Options.TestLoader.DomainUsage");
+			
+            settings.SaveSetting( "Options.TestLoader.MergeAssemblies", mergeAssembliesCheckBox.Checked );
 		}
 
-		private void toggleTestStructure(object sender, System.EventArgs e)
-		{
-			bool auto = autoNamespaceSuites.Checked = !autoNamespaceSuites.Checked;
-			flatTestList.Checked = !auto;
-		}
-
-		private void toggleMultiDomain(object sender, System.EventArgs e)
+        // TODO: Combine toggleProcessUsage and toggleMultiDomain
+        private void toggleProcessUsage(object sender, EventArgs e)
+        {
+            bool enable = sameProcessRadioButton.Checked || separateProcessRadioButton.Checked;
+            singleDomainRadioButton.Enabled = enable;
+            multiDomainRadioButton.Enabled = enable;
+            mergeAssembliesCheckBox.Enabled = enable && singleDomainRadioButton.Checked;
+        }
+        
+        private void toggleMultiDomain(object sender, System.EventArgs e)
 		{
 			bool multiDomain = multiDomainRadioButton.Checked = ! multiDomainRadioButton.Checked;
 			singleDomainRadioButton.Checked = !multiDomain;
-			mergeAssembliesCheckBox.Enabled = !multiDomain;
+			mergeAssembliesCheckBox.Enabled = !multiDomain && !multiProcessRadioButton.Checked;
 		}
 
 		public override bool HasChangesRequiringReload
 		{
 			get 
 			{
-				return 
-					settings.GetSetting( "Options.TestLoader.MultiDomain", false ) != multiDomainRadioButton.Checked ||
-					settings.GetSetting( "Options.TestLoader.MergeAssemblies", false ) != mergeAssembliesCheckBox.Checked ||
-					settings.GetSetting( "Options.TestLoader.AutoNamespaceSuites", true ) != autoNamespaceSuites.Checked;
+				return
+                    GetSavedProcessModel() != GetSelectedProcessModel() ||
+                    GetSavedDomainUsage() != GetSelectedDomainUsage() ||
+					settings.GetSetting("Options.TestLoader.MergeAssemblies", false ) != mergeAssembliesCheckBox.Checked;
 			}
 		}
+
+        private ProcessModel GetSavedProcessModel()
+        {
+            return (ProcessModel)settings.GetSetting("Options.TestLoader.ProcessModel", ProcessModel.Default);
+        }
+
+        private DomainUsage GetSavedDomainUsage()
+        {
+            return (DomainUsage)settings.GetSetting("Options.TestLoader.DomainUsage", DomainUsage.Default);
+        }
+
+        private ProcessModel GetSelectedProcessModel()
+        {
+            return separateProcessRadioButton.Checked
+                ? ProcessModel.Separate
+                : multiProcessRadioButton.Checked
+                    ? ProcessModel.Multiple
+                    : ProcessModel.Single;
+        }
+
+        private DomainUsage GetSelectedDomainUsage()
+        {
+            return multiDomainRadioButton.Checked
+                ? DomainUsage.Multiple
+                : DomainUsage.Single;
+        }
 	}
 }
 
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/TestLoaderSettingsPage.resx b/src/GuiRunner/nunit-gui/SettingsPages/TestLoaderSettingsPage.resx
index 93d2788..9c4e8c8 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/TestLoaderSettingsPage.resx
+++ b/src/GuiRunner/nunit-gui/SettingsPages/TestLoaderSettingsPage.resx
@@ -97,116 +97,122 @@
   <resheader name="writer">
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
-  <data name="groupBox1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
+  <data name="mergeAssembliesCheckBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
   </data>
-  <data name="groupBox1.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
+  <data name="mergeAssembliesCheckBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
   </data>
-  <data name="groupBox1.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
+  <data name="mergeAssembliesCheckBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
   </data>
-  <data name="groupBox1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="singleDomainRadioButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>False</value>
   </data>
-  <data name="groupBox1.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
+  <data name="singleDomainRadioButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
   </data>
-  <data name="groupBox1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="singleDomainRadioButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>Private</value>
   </data>
-  <data name="label1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="multiDomainRadioButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>False</value>
   </data>
-  <data name="label1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="multiDomainRadioButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>Private</value>
   </data>
-  <data name="label1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="multiDomainRadioButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>Private</value>
   </data>
-  <data name="label2.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="helpProvider1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="helpProvider1.Location" type="System.Drawing.Point, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </data>
+  <data name="helpProvider1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label3.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>False</value>
   </data>
-  <data name="label2.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="label3.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>Private</value>
   </data>
-  <data name="label2.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="label3.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>Private</value>
   </data>
-  <data name="groupBox2.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="groupBox3.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>Private</value>
   </data>
-  <data name="groupBox2.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+  <data name="groupBox3.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>8, 8</value>
   </data>
-  <data name="groupBox2.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="groupBox3.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>True</value>
   </data>
-  <data name="groupBox2.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="groupBox3.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>False</value>
   </data>
-  <data name="groupBox2.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="groupBox3.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>True</value>
   </data>
-  <data name="groupBox2.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="groupBox3.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>Private</value>
   </data>
-  <data name="mergeAssembliesCheckBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="multiProcessRadioButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>False</value>
   </data>
-  <data name="mergeAssembliesCheckBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="multiProcessRadioButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>Private</value>
   </data>
-  <data name="mergeAssembliesCheckBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="multiProcessRadioButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>Private</value>
   </data>
-  <data name="singleDomainRadioButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="separateProcessRadioButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>False</value>
   </data>
-  <data name="singleDomainRadioButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="separateProcessRadioButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>Private</value>
   </data>
-  <data name="singleDomainRadioButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="separateProcessRadioButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>Private</value>
   </data>
-  <data name="multiDomainRadioButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="sameProcessRadioButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>False</value>
   </data>
-  <data name="multiDomainRadioButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="sameProcessRadioButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>Private</value>
   </data>
-  <data name="multiDomainRadioButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="sameProcessRadioButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>Private</value>
   </data>
-  <data name="flatTestList.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="label2.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>False</value>
   </data>
-  <data name="flatTestList.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="label2.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>Private</value>
   </data>
-  <data name="flatTestList.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="label2.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>Private</value>
   </data>
-  <data name="autoNamespaceSuites.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="autoNamespaceSuites.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+  <data name="groupBox2.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>Private</value>
   </data>
-  <data name="autoNamespaceSuites.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
+  <data name="groupBox2.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
   </data>
-  <data name="helpProvider1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
+  <data name="groupBox2.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
   </data>
-  <data name="helpProvider1.Location" type="System.Drawing.Point, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 17</value>
+  <data name="groupBox2.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
   </data>
-  <data name="helpProvider1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
+  <data name="groupBox2.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
   </data>
-  <data name="$this.Name">
-    <value>TestLoaderSettingsPage</value>
+  <data name="groupBox2.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
   </data>
   <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>False</value>
@@ -235,4 +241,7 @@
   <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>Private</value>
   </data>
+  <data name="$this.Name">
+    <value>TestLoaderSettingsPage</value>
+  </data>
 </root>
\ No newline at end of file
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/TestResultSettingsPage.cs b/src/GuiRunner/nunit-gui/SettingsPages/TestResultSettingsPage.cs
index e04f927..93c7710 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/TestResultSettingsPage.cs
+++ b/src/GuiRunner/nunit-gui/SettingsPages/TestResultSettingsPage.cs
@@ -1,12 +1,17 @@
-using System;
-using System.Collections;
-using System.ComponentModel;
-using System.Drawing;
-using System.Windows.Forms;
-
-namespace NUnit.Gui.SettingsPages
-{
-	public class TestResultSettingsPage : NUnit.UiKit.SettingsPage
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Collections;
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace NUnit.Gui.SettingsPages
+{
+	public class TestResultSettingsPage : NUnit.UiKit.SettingsPage
 	{
 		private System.Windows.Forms.GroupBox groupBox1;
 		private System.Windows.Forms.Label label1;
@@ -16,147 +21,147 @@ namespace NUnit.Gui.SettingsPages
 		private System.Windows.Forms.CheckBox notRunTabCheckBox;
 		private System.Windows.Forms.GroupBox groupBox2;
 		private System.Windows.Forms.Label label2;
-		private System.Windows.Forms.HelpProvider helpProvider1;
-		private System.ComponentModel.IContainer components = null;
-
-		public TestResultSettingsPage(string key) : base(key)
-		{
-			// This call is required by the Windows Form Designer.
-			InitializeComponent();
-
-			// TODO: Add any initialization after the InitializeComponent call
-		}
-
-		/// <summary>
-		/// Clean up any resources being used.
-		/// </summary>
-		protected override void Dispose( bool disposing )
-		{
-			if( disposing )
-			{
-				if (components != null) 
-				{
-					components.Dispose();
-				}
-			}
-			base.Dispose( disposing );
-		}
-
-		#region Designer generated code
-		/// <summary>
-		/// Required method for Designer support - do not modify
-		/// the contents of this method with the code editor.
-		/// </summary>
-		private void InitializeComponent()
-		{
-			this.groupBox1 = new System.Windows.Forms.GroupBox();
-			this.label1 = new System.Windows.Forms.Label();
-			this.errorsTabCheckBox = new System.Windows.Forms.CheckBox();
-			this.failureToolTips = new System.Windows.Forms.CheckBox();
-			this.enableWordWrap = new System.Windows.Forms.CheckBox();
-			this.notRunTabCheckBox = new System.Windows.Forms.CheckBox();
-			this.groupBox2 = new System.Windows.Forms.GroupBox();
-			this.label2 = new System.Windows.Forms.Label();
-			this.helpProvider1 = new System.Windows.Forms.HelpProvider();
-			this.SuspendLayout();
-			// 
-			// groupBox1
-			// 
-			this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.groupBox1.Location = new System.Drawing.Point(80, 0);
-			this.groupBox1.Name = "groupBox1";
-			this.groupBox1.Size = new System.Drawing.Size(376, 8);
-			this.groupBox1.TabIndex = 8;
-			this.groupBox1.TabStop = false;
-			// 
-			// label1
-			// 
-			this.label1.Location = new System.Drawing.Point(8, 0);
-			this.label1.Name = "label1";
-			this.label1.Size = new System.Drawing.Size(88, 16);
-			this.label1.TabIndex = 9;
-			this.label1.Text = "Errors Tab";
-			// 
-			// errorsTabCheckBox
-			// 
-			this.errorsTabCheckBox.Checked = true;
-			this.errorsTabCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
-			this.helpProvider1.SetHelpString(this.errorsTabCheckBox, "If checked, the Errors and Failures Tab will be displayed in the Gui");
-			this.errorsTabCheckBox.Location = new System.Drawing.Point(32, 24);
-			this.errorsTabCheckBox.Name = "errorsTabCheckBox";
-			this.helpProvider1.SetShowHelp(this.errorsTabCheckBox, true);
-			this.errorsTabCheckBox.Size = new System.Drawing.Size(304, 24);
-			this.errorsTabCheckBox.TabIndex = 10;
-			this.errorsTabCheckBox.Text = "Display Errors and Failures Tab";
-			// 
-			// failureToolTips
-			// 
-			this.helpProvider1.SetHelpString(this.failureToolTips, "If checked, a tooltip will be displayed when hovering over an error that does not" +
-				" fit the display.");
-			this.failureToolTips.Location = new System.Drawing.Point(48, 56);
-			this.failureToolTips.Name = "failureToolTips";
-			this.helpProvider1.SetShowHelp(this.failureToolTips, true);
-			this.failureToolTips.Size = new System.Drawing.Size(202, 19);
-			this.failureToolTips.TabIndex = 11;
-			this.failureToolTips.Text = "Enable Failure ToolTips";
-			// 
-			// enableWordWrap
-			// 
-			this.helpProvider1.SetHelpString(this.enableWordWrap, "If checked, error messages will be word wrapped to subsequent display lines.");
-			this.enableWordWrap.Location = new System.Drawing.Point(48, 88);
-			this.enableWordWrap.Name = "enableWordWrap";
-			this.helpProvider1.SetShowHelp(this.enableWordWrap, true);
-			this.enableWordWrap.Size = new System.Drawing.Size(248, 19);
-			this.enableWordWrap.TabIndex = 12;
-			this.enableWordWrap.Text = "Enable Word Wrap";
-			// 
-			// notRunTabCheckBox
-			// 
-			this.notRunTabCheckBox.Checked = true;
-			this.notRunTabCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
-			this.helpProvider1.SetHelpString(this.notRunTabCheckBox, "If checked, the Tests Not Run Tab will be displayed in the Gui.");
-			this.notRunTabCheckBox.Location = new System.Drawing.Point(32, 152);
-			this.notRunTabCheckBox.Name = "notRunTabCheckBox";
-			this.helpProvider1.SetShowHelp(this.notRunTabCheckBox, true);
-			this.notRunTabCheckBox.Size = new System.Drawing.Size(264, 16);
-			this.notRunTabCheckBox.TabIndex = 13;
-			this.notRunTabCheckBox.Text = "Display Tests Not Run Tab";
-			// 
-			// groupBox2
-			// 
-			this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.groupBox2.Location = new System.Drawing.Point(88, 128);
-			this.groupBox2.Name = "groupBox2";
-			this.groupBox2.Size = new System.Drawing.Size(368, 8);
-			this.groupBox2.TabIndex = 14;
-			this.groupBox2.TabStop = false;
-			// 
-			// label2
-			// 
-			this.label2.Location = new System.Drawing.Point(8, 128);
-			this.label2.Name = "label2";
-			this.label2.Size = new System.Drawing.Size(88, 16);
-			this.label2.TabIndex = 15;
-			this.label2.Text = "Not Run Tab";
-			// 
-			// TestResultSettingsPage
-			// 
-			this.Controls.Add(this.groupBox2);
-			this.Controls.Add(this.label2);
-			this.Controls.Add(this.groupBox1);
-			this.Controls.Add(this.errorsTabCheckBox);
-			this.Controls.Add(this.failureToolTips);
-			this.Controls.Add(this.enableWordWrap);
-			this.Controls.Add(this.notRunTabCheckBox);
-			this.Controls.Add(this.label1);
-			this.Name = "TestResultSettingsPage";
-			this.ResumeLayout(false);
+		private System.Windows.Forms.HelpProvider helpProvider1;
+		private System.ComponentModel.IContainer components = null;
+
+		public TestResultSettingsPage(string key) : base(key)
+		{
+			// This call is required by the Windows Form Designer.
+			InitializeComponent();
 
-		}
+			// TODO: Add any initialization after the InitializeComponent call
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if (components != null) 
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.errorsTabCheckBox = new System.Windows.Forms.CheckBox();
+            this.failureToolTips = new System.Windows.Forms.CheckBox();
+            this.enableWordWrap = new System.Windows.Forms.CheckBox();
+            this.notRunTabCheckBox = new System.Windows.Forms.CheckBox();
+            this.groupBox2 = new System.Windows.Forms.GroupBox();
+            this.label2 = new System.Windows.Forms.Label();
+            this.helpProvider1 = new System.Windows.Forms.HelpProvider();
+            this.SuspendLayout();
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.groupBox1.Location = new System.Drawing.Point(80, 0);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(376, 8);
+            this.groupBox1.TabIndex = 8;
+            this.groupBox1.TabStop = false;
+            // 
+            // label1
+            // 
+            this.label1.Location = new System.Drawing.Point(8, 0);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(88, 16);
+            this.label1.TabIndex = 9;
+            this.label1.Text = "Errors Tab";
+            // 
+            // errorsTabCheckBox
+            // 
+            this.errorsTabCheckBox.Checked = true;
+            this.errorsTabCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
+            this.helpProvider1.SetHelpString(this.errorsTabCheckBox, "If checked, the Errors and Failures Tab will be displayed in the Gui");
+            this.errorsTabCheckBox.Location = new System.Drawing.Point(32, 24);
+            this.errorsTabCheckBox.Name = "errorsTabCheckBox";
+            this.helpProvider1.SetShowHelp(this.errorsTabCheckBox, true);
+            this.errorsTabCheckBox.Size = new System.Drawing.Size(304, 24);
+            this.errorsTabCheckBox.TabIndex = 10;
+            this.errorsTabCheckBox.Text = "Display Errors and Failures Tab";
+            // 
+            // failureToolTips
+            // 
+            this.helpProvider1.SetHelpString(this.failureToolTips, "If checked, a tooltip will be displayed when hovering over an error that does not" +
+                    " fit the display.");
+            this.failureToolTips.Location = new System.Drawing.Point(48, 56);
+            this.failureToolTips.Name = "failureToolTips";
+            this.helpProvider1.SetShowHelp(this.failureToolTips, true);
+            this.failureToolTips.Size = new System.Drawing.Size(202, 19);
+            this.failureToolTips.TabIndex = 11;
+            this.failureToolTips.Text = "Enable Failure ToolTips";
+            // 
+            // enableWordWrap
+            // 
+            this.helpProvider1.SetHelpString(this.enableWordWrap, "If checked, error messages will be word wrapped to subsequent display lines.");
+            this.enableWordWrap.Location = new System.Drawing.Point(48, 88);
+            this.enableWordWrap.Name = "enableWordWrap";
+            this.helpProvider1.SetShowHelp(this.enableWordWrap, true);
+            this.enableWordWrap.Size = new System.Drawing.Size(248, 19);
+            this.enableWordWrap.TabIndex = 12;
+            this.enableWordWrap.Text = "Enable Word Wrap";
+            // 
+            // notRunTabCheckBox
+            // 
+            this.notRunTabCheckBox.Checked = true;
+            this.notRunTabCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
+            this.helpProvider1.SetHelpString(this.notRunTabCheckBox, "If checked, the Tests Not Run Tab will be displayed in the Gui.");
+            this.notRunTabCheckBox.Location = new System.Drawing.Point(32, 152);
+            this.notRunTabCheckBox.Name = "notRunTabCheckBox";
+            this.helpProvider1.SetShowHelp(this.notRunTabCheckBox, true);
+            this.notRunTabCheckBox.Size = new System.Drawing.Size(264, 25);
+            this.notRunTabCheckBox.TabIndex = 13;
+            this.notRunTabCheckBox.Text = "Display Tests Not Run Tab";
+            // 
+            // groupBox2
+            // 
+            this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.groupBox2.Location = new System.Drawing.Point(88, 128);
+            this.groupBox2.Name = "groupBox2";
+            this.groupBox2.Size = new System.Drawing.Size(368, 8);
+            this.groupBox2.TabIndex = 14;
+            this.groupBox2.TabStop = false;
+            // 
+            // label2
+            // 
+            this.label2.Location = new System.Drawing.Point(8, 128);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(88, 16);
+            this.label2.TabIndex = 15;
+            this.label2.Text = "Not Run Tab";
+            // 
+            // TestResultSettingsPage
+            // 
+            this.Controls.Add(this.groupBox2);
+            this.Controls.Add(this.label2);
+            this.Controls.Add(this.groupBox1);
+            this.Controls.Add(this.errorsTabCheckBox);
+            this.Controls.Add(this.failureToolTips);
+            this.Controls.Add(this.enableWordWrap);
+            this.Controls.Add(this.notRunTabCheckBox);
+            this.Controls.Add(this.label1);
+            this.Name = "TestResultSettingsPage";
+            this.ResumeLayout(false);
+
+		}
 		#endregion
-
+
 		public override void LoadSettings()
 		{
 			errorsTabCheckBox.Checked = settings.GetSetting( "Gui.ResultTabs.DisplayErrorsTab", true );
@@ -179,6 +184,6 @@ namespace NUnit.Gui.SettingsPages
 		{
 			this.failureToolTips.Enabled = this.enableWordWrap.Enabled = this.errorsTabCheckBox.Checked;
 		}
-	}
-}
-
+	}
+}
+
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/TestResultSettingsPage.resx b/src/GuiRunner/nunit-gui/SettingsPages/TestResultSettingsPage.resx
index 33ec8e7..7e44abc 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/TestResultSettingsPage.resx
+++ b/src/GuiRunner/nunit-gui/SettingsPages/TestResultSettingsPage.resx
@@ -3,7 +3,7 @@
   <!-- 
     Microsoft ResX Schema 
     
-    Version 1.3
+    Version 2.0
     
     The primary goals of this format is to allow a simple XML format 
     that is mostly human readable. The generation and parsing of the 
@@ -14,16 +14,17 @@
     
     ... ado.net/XML headers & schema ...
     <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">1.3</resheader>
+    <resheader name="version">2.0</resheader>
     <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
     <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1">this is my long string</data>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
     <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
     <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        [base64 mime encoded serialized .NET Framework object]
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
     </data>
     <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
     </data>
                 
     There are any number of "resheader" rows that contain simple 
@@ -35,7 +36,7 @@
     Classes that don't support this are serialized and stored with the 
     mimetype set.
     
-    The mimetype is used forserialized objects, and tells the 
+    The mimetype is used for serialized objects, and tells the 
     ResXResourceReader how to depersist the object. This is currently not 
     extensible. For a given mimetype the value must be set accordingly:
     
@@ -45,7 +46,7 @@
     
     mimetype: application/x-microsoft.net.object.binary.base64
     value   : The object must be serialized with 
-            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
             : and then encoded with base64 encoding.
     
     mimetype: application/x-microsoft.net.object.soap.base64
@@ -59,18 +60,37 @@
             : and then encoded with base64 encoding.
     -->
   <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
     <xsd:element name="root" msdata:IsDataSet="true">
       <xsd:complexType>
         <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
           <xsd:element name="data">
             <xsd:complexType>
               <xsd:sequence>
                 <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                 <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
               </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
               <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
               <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
             </xsd:complexType>
           </xsd:element>
           <xsd:element name="resheader">
@@ -89,141 +109,15 @@
     <value>text/microsoft-resx</value>
   </resheader>
   <resheader name="version">
-    <value>1.3</value>
+    <value>2.0</value>
   </resheader>
   <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
   <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
-  <data name="groupBox1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="groupBox1.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="groupBox1.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="groupBox1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="groupBox1.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="groupBox1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="label1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="errorsTabCheckBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="errorsTabCheckBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="errorsTabCheckBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="failureToolTips.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="failureToolTips.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="failureToolTips.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="enableWordWrap.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="enableWordWrap.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="enableWordWrap.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="notRunTabCheckBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="notRunTabCheckBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="notRunTabCheckBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="groupBox2.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="groupBox2.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="groupBox2.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="groupBox2.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="groupBox2.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="groupBox2.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label2.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="label2.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label2.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="helpProvider1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="helpProvider1.Location" type="System.Drawing.Point, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+  <metadata name="helpProvider1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>17, 17</value>
-  </data>
-  <data name="helpProvider1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>80</value>
-  </data>
-  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>(Default)</value>
-  </data>
-  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.Name">
-    <value>TestResultSettingsPage</value>
-  </data>
+  </metadata>
 </root>
\ No newline at end of file
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/TreeSettingsPage.cs b/src/GuiRunner/nunit-gui/SettingsPages/TreeSettingsPage.cs
index ed7005a..5252dd5 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/TreeSettingsPage.cs
+++ b/src/GuiRunner/nunit-gui/SettingsPages/TreeSettingsPage.cs
@@ -1,13 +1,18 @@
-using System;
-using System.Collections;
-using System.ComponentModel;
-using System.Drawing;
-using System.Windows.Forms;
-using NUnit.UiKit;
-
-namespace NUnit.Gui.SettingsPages
-{
-	public class TreeSettingsPage : NUnit.UiKit.SettingsPage
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Collections;
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+using NUnit.UiKit;
+
+namespace NUnit.Gui.SettingsPages
+{
+	public class TreeSettingsPage : NUnit.UiKit.SettingsPage
 	{
 		private System.Windows.Forms.GroupBox groupBox1;
 		private System.Windows.Forms.Label label1;
@@ -16,39 +21,43 @@ namespace NUnit.Gui.SettingsPages
 		private System.Windows.Forms.CheckBox clearResultsCheckBox;
 		private System.Windows.Forms.CheckBox saveVisualStateCheckBox;
 		private System.Windows.Forms.CheckBox showCheckBoxesCheckBox;
-		private System.Windows.Forms.HelpProvider helpProvider1;
-		private System.ComponentModel.IContainer components = null;
-
-		public TreeSettingsPage(string key) : base(key)
-		{
-			// This call is required by the Windows Form Designer.
-			InitializeComponent();
-
-			// TODO: Add any initialization after the InitializeComponent call
-		}
-
-		/// <summary>
-		/// Clean up any resources being used.
-		/// </summary>
-		protected override void Dispose( bool disposing )
-		{
-			if( disposing )
-			{
-				if (components != null) 
-				{
-					components.Dispose();
-				}
-			}
-			base.Dispose( disposing );
-		}
-
-		#region Designer generated code
-		/// <summary>
-		/// Required method for Designer support - do not modify
-		/// the contents of this method with the code editor.
-		/// </summary>
-		private void InitializeComponent()
-		{
+		private System.Windows.Forms.HelpProvider helpProvider1;
+		private System.Windows.Forms.RadioButton flatTestList;
+		private System.Windows.Forms.RadioButton autoNamespaceSuites;
+		private System.Windows.Forms.Label label3;
+		private System.Windows.Forms.GroupBox groupBox2;
+		private System.ComponentModel.IContainer components = null;
+
+		public TreeSettingsPage(string key) : base(key)
+		{
+			// This call is required by the Windows Form Designer.
+			InitializeComponent();
+
+			// TODO: Add any initialization after the InitializeComponent call
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if (components != null) 
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
 			this.groupBox1 = new System.Windows.Forms.GroupBox();
 			this.label1 = new System.Windows.Forms.Label();
 			this.label2 = new System.Windows.Forms.Label();
@@ -57,6 +66,10 @@ namespace NUnit.Gui.SettingsPages
 			this.saveVisualStateCheckBox = new System.Windows.Forms.CheckBox();
 			this.showCheckBoxesCheckBox = new System.Windows.Forms.CheckBox();
 			this.helpProvider1 = new System.Windows.Forms.HelpProvider();
+			this.flatTestList = new System.Windows.Forms.RadioButton();
+			this.autoNamespaceSuites = new System.Windows.Forms.RadioButton();
+			this.label3 = new System.Windows.Forms.Label();
+			this.groupBox2 = new System.Windows.Forms.GroupBox();
 			this.SuspendLayout();
 			// 
 			// groupBox1
@@ -83,13 +96,13 @@ namespace NUnit.Gui.SettingsPages
 			this.label2.Name = "label2";
 			this.label2.Size = new System.Drawing.Size(144, 24);
 			this.label2.TabIndex = 32;
-			this.label2.Text = "Initial display on load:";
+			this.label2.Text = "Initial display on load";
 			// 
 			// initialDisplayComboBox
 			// 
 			this.initialDisplayComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
 			this.helpProvider1.SetHelpString(this.initialDisplayComboBox, "Selects the initial display style of the tree when an assembly is loaded");
-			this.initialDisplayComboBox.ItemHeight = 16;
+			this.initialDisplayComboBox.ItemHeight = 13;
 			this.initialDisplayComboBox.Items.AddRange(new object[] {
 																		"Auto",
 																		"Expand",
@@ -98,7 +111,7 @@ namespace NUnit.Gui.SettingsPages
 			this.initialDisplayComboBox.Location = new System.Drawing.Point(184, 24);
 			this.initialDisplayComboBox.Name = "initialDisplayComboBox";
 			this.helpProvider1.SetShowHelp(this.initialDisplayComboBox, true);
-			this.initialDisplayComboBox.Size = new System.Drawing.Size(87, 24);
+			this.initialDisplayComboBox.Size = new System.Drawing.Size(87, 21);
 			this.initialDisplayComboBox.TabIndex = 33;
 			// 
 			// clearResultsCheckBox
@@ -132,8 +145,58 @@ namespace NUnit.Gui.SettingsPages
 			this.showCheckBoxesCheckBox.TabIndex = 36;
 			this.showCheckBoxesCheckBox.Text = "Show CheckBoxes";
 			// 
+			// flatTestList
+			// 
+			this.flatTestList.AutoCheck = false;
+			this.helpProvider1.SetHelpString(this.flatTestList, "If selected, the tree will consist of a flat list of fixtures, without any higher" +
+				"-level structure beyond the assemblies.");
+			this.flatTestList.Location = new System.Drawing.Point(24, 240);
+			this.flatTestList.Name = "flatTestList";
+			this.helpProvider1.SetShowHelp(this.flatTestList, true);
+			this.flatTestList.Size = new System.Drawing.Size(216, 24);
+			this.flatTestList.TabIndex = 40;
+			this.flatTestList.Text = "Flat list of TestFixtures";
+			this.flatTestList.Click += new System.EventHandler(this.toggleTestStructure);
+			// 
+			// autoNamespaceSuites
+			// 
+			this.autoNamespaceSuites.AutoCheck = false;
+			this.autoNamespaceSuites.Checked = true;
+			this.helpProvider1.SetHelpString(this.autoNamespaceSuites, "If selected, the tree will follow the namespace structure of the tests, with suit" +
+				"es automatically created at each level.");
+			this.autoNamespaceSuites.Location = new System.Drawing.Point(24, 208);
+			this.autoNamespaceSuites.Name = "autoNamespaceSuites";
+			this.helpProvider1.SetShowHelp(this.autoNamespaceSuites, true);
+			this.autoNamespaceSuites.Size = new System.Drawing.Size(224, 24);
+			this.autoNamespaceSuites.TabIndex = 39;
+			this.autoNamespaceSuites.TabStop = true;
+			this.autoNamespaceSuites.Text = "Automatic Namespace suites";
+			this.autoNamespaceSuites.Click += new System.EventHandler(this.toggleTestStructure);
+			// 
+			// label3
+			// 
+			this.label3.Location = new System.Drawing.Point(8, 184);
+			this.label3.Name = "label3";
+			this.label3.Size = new System.Drawing.Size(88, 16);
+			this.label3.TabIndex = 38;
+			this.label3.Text = "Test Structure";
+			// 
+			// groupBox2
+			// 
+			this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+				| System.Windows.Forms.AnchorStyles.Right)));
+			this.groupBox2.Location = new System.Drawing.Point(112, 184);
+			this.groupBox2.Name = "groupBox2";
+			this.groupBox2.Size = new System.Drawing.Size(336, 8);
+			this.groupBox2.TabIndex = 37;
+			this.groupBox2.TabStop = false;
+			// 
 			// TreeSettingsPage
 			// 
+			this.Controls.Add(this.label3);
+			this.Controls.Add(this.flatTestList);
+			this.Controls.Add(this.autoNamespaceSuites);
+			this.Controls.Add(this.groupBox2);
 			this.Controls.Add(this.showCheckBoxesCheckBox);
 			this.Controls.Add(this.label2);
 			this.Controls.Add(this.initialDisplayComboBox);
@@ -144,24 +207,43 @@ namespace NUnit.Gui.SettingsPages
 			this.Name = "TreeSettingsPage";
 			this.ResumeLayout(false);
 
-		}
-		#endregion
-
+		}
+		#endregion
+
 		public override void LoadSettings()
 		{
 			initialDisplayComboBox.SelectedIndex = (int)(TestSuiteTreeView.DisplayStyle)settings.GetSetting( "Gui.TestTree.InitialTreeDisplay", TestSuiteTreeView.DisplayStyle.Auto );
 			clearResultsCheckBox.Checked = settings.GetSetting( "Options.TestLoader.ClearResultsOnReload", true );
 			saveVisualStateCheckBox.Checked = settings.GetSetting( "Gui.TestTree.SaveVisualState", true );
 			showCheckBoxesCheckBox.Checked = settings.GetSetting( "Options.ShowCheckBoxes", false );
+		
+			autoNamespaceSuites.Checked = settings.GetSetting( "Options.TestLoader.AutoNamespaceSuites", true );
+			flatTestList.Checked = !autoNamespaceSuites.Checked;
 		}
-
+
 		public override void ApplySettings()
 		{
 			settings.SaveSetting( "Gui.TestTree.InitialTreeDisplay", (TestSuiteTreeView.DisplayStyle)initialDisplayComboBox.SelectedIndex );
 			settings.SaveSetting( "Options.TestLoader.ClearResultsOnReload", clearResultsCheckBox.Checked );
 			settings.SaveSetting( "Gui.TestTree.SaveVisualState", saveVisualStateCheckBox.Checked );
 			settings.SaveSetting( "Options.ShowCheckBoxes", showCheckBoxesCheckBox.Checked );
-		}
-	}
-}
-
+			settings.SaveSetting( "Options.TestLoader.AutoNamespaceSuites", autoNamespaceSuites.Checked );
+		}
+
+		private void toggleTestStructure(object sender, System.EventArgs e)
+		{
+			bool auto = autoNamespaceSuites.Checked = !autoNamespaceSuites.Checked;
+			flatTestList.Checked = !auto;
+		}
+	
+		public override bool HasChangesRequiringReload
+		{
+			get
+			{
+				return settings.GetSetting( "Options.TestLoader.AutoNamespaceSuites", true ) != autoNamespaceSuites.Checked;
+			}
+		}
+
+	}
+}
+
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/TreeSettingsPage.resx b/src/GuiRunner/nunit-gui/SettingsPages/TreeSettingsPage.resx
index 29fb0fb..1058af9 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/TreeSettingsPage.resx
+++ b/src/GuiRunner/nunit-gui/SettingsPages/TreeSettingsPage.resx
@@ -142,12 +142,12 @@
   <data name="initialDisplayComboBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>Private</value>
   </data>
-  <data name="clearResultsCheckBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
   <data name="clearResultsCheckBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>Private</value>
   </data>
+  <data name="clearResultsCheckBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
   <data name="clearResultsCheckBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>Private</value>
   </data>
@@ -178,6 +178,51 @@
   <data name="helpProvider1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>Private</value>
   </data>
+  <data name="flatTestList.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="flatTestList.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="flatTestList.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="autoNamespaceSuites.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="autoNamespaceSuites.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="autoNamespaceSuites.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label3.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="label3.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label3.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="groupBox2.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="groupBox2.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="groupBox2.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="groupBox2.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="groupBox2.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="groupBox2.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
   <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>False</value>
   </data>
@@ -187,9 +232,6 @@
   <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>True</value>
   </data>
-  <data name="$this.Name">
-    <value>TreeSettingsPage</value>
-  </data>
   <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>True</value>
   </data>
@@ -208,4 +250,7 @@
   <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>Private</value>
   </data>
+  <data name="$this.Name">
+    <value>TreeSettingsPage</value>
+  </data>
 </root>
\ No newline at end of file
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/VisualStudioSettingsPage.cs b/src/GuiRunner/nunit-gui/SettingsPages/VisualStudioSettingsPage.cs
index deded74..77afa7f 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/VisualStudioSettingsPage.cs
+++ b/src/GuiRunner/nunit-gui/SettingsPages/VisualStudioSettingsPage.cs
@@ -1,49 +1,54 @@
-using System;
-using System.Collections;
-using System.ComponentModel;
-using System.Drawing;
-using System.Windows.Forms;
-
-namespace NUnit.Gui.SettingsPages
-{
-	public class VisualStudioSettingsPage : NUnit.UiKit.SettingsPage
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Collections;
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace NUnit.Gui.SettingsPages
+{
+	public class VisualStudioSettingsPage : NUnit.UiKit.SettingsPage
 	{
 		private System.Windows.Forms.Label label1;
 		private System.Windows.Forms.GroupBox groupBox1;
 		private System.Windows.Forms.CheckBox visualStudioSupportCheckBox;
-		private System.Windows.Forms.HelpProvider helpProvider1;
-		private System.ComponentModel.IContainer components = null;
-
-		public VisualStudioSettingsPage(string key) : base(key)
-		{
-			// This call is required by the Windows Form Designer.
-			InitializeComponent();
-
-			// TODO: Add any initialization after the InitializeComponent call
-		}
-
-		/// <summary>
-		/// Clean up any resources being used.
-		/// </summary>
-		protected override void Dispose( bool disposing )
-		{
-			if( disposing )
-			{
-				if (components != null) 
-				{
-					components.Dispose();
-				}
-			}
-			base.Dispose( disposing );
-		}
-
-		#region Designer generated code
-		/// <summary>
-		/// Required method for Designer support - do not modify
-		/// the contents of this method with the code editor.
-		/// </summary>
-		private void InitializeComponent()
-		{
+		private System.Windows.Forms.HelpProvider helpProvider1;
+		private System.ComponentModel.IContainer components = null;
+
+		public VisualStudioSettingsPage(string key) : base(key)
+		{
+			// This call is required by the Windows Form Designer.
+			InitializeComponent();
+
+			// TODO: Add any initialization after the InitializeComponent call
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if (components != null) 
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
 			this.label1 = new System.Windows.Forms.Label();
 			this.groupBox1 = new System.Windows.Forms.GroupBox();
 			this.visualStudioSupportCheckBox = new System.Windows.Forms.CheckBox();
@@ -87,9 +92,9 @@ namespace NUnit.Gui.SettingsPages
 			this.Name = "VisualStudioSettingsPage";
 			this.ResumeLayout(false);
 
-		}
-		#endregion
-
+		}
+		#endregion
+
 		public override void LoadSettings()
 		{
 			visualStudioSupportCheckBox.Checked = settings.GetSetting( "Options.TestLoader.VisualStudioSupport", false );
@@ -100,7 +105,7 @@ namespace NUnit.Gui.SettingsPages
 			settings.SaveSetting( "Options.TestLoader.VisualStudioSupport", visualStudioSupportCheckBox.Checked );
 		}
 
-
-	}
-}
-
+
+	}
+}
+
diff --git a/src/GuiRunner/nunit-gui/TestAssemblyInfoForm.cs b/src/GuiRunner/nunit-gui/TestAssemblyInfoForm.cs
new file mode 100644
index 0000000..baac6d8
--- /dev/null
+++ b/src/GuiRunner/nunit-gui/TestAssemblyInfoForm.cs
@@ -0,0 +1,141 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Text;
+using System.IO;
+using System.Collections;
+using System.Reflection;
+using System.Windows.Forms;
+using System.Drawing;
+using System.Diagnostics;
+using NUnit.UiKit;
+using NUnit.Util;
+using NUnit.Core;
+
+namespace NUnit.Gui
+{
+    public class TestAssemblyInfoForm : ScrollingTextDisplayForm
+    {
+        protected override void OnLoad(EventArgs e)
+        {
+            this.Text = "Test Assemblies";
+            this.TextBox.WordWrap = false;
+            //this.TextBox.ContentsResized += new ContentsResizedEventHandler(TextBox_ContentsResized);
+            this.TextBox.Font = new System.Drawing.Font(FontFamily.GenericMonospace, 8.25F);
+
+            base.OnLoad(e);
+
+            Process p = Process.GetCurrentProcess();
+            int currentProcessId = p.Id;
+            string currentDomainName = "";
+
+            AppendProcessInfo(
+			      currentProcessId, 
+			      Path.GetFileName(Assembly.GetEntryAssembly().Location), 
+			      RuntimeFramework.CurrentFramework );
+
+            foreach (TestAssemblyInfo info in Services.TestLoader.AssemblyInfo)
+            {
+                if (info.ProcessId != currentProcessId)
+                {
+                    this.TextBox.AppendText("\r\n");
+                    AppendProcessInfo(info);
+                    currentProcessId = info.ProcessId;
+                }
+
+                if (info.DomainName != currentDomainName)
+                {
+                    AppendDomainInfo(info);
+                    currentDomainName = info.DomainName;
+                }
+
+                AppendAssemblyInfo(info);
+            }
+			
+			TextBox.Select(0,0);
+			TextBox.ScrollToCaret();
+        }
+
+        private void AppendProcessInfo(TestAssemblyInfo info)
+        {
+            AppendProcessInfo(info.ProcessId, info.ModuleName, info.RunnerRuntimeFramework);
+        }
+
+        private void AppendProcessInfo( int pid, string moduleName, RuntimeFramework framework )
+        {
+            AppendBoldText(string.Format("{0} ( {1} )\r\n", moduleName, pid));
+
+            TextBox.AppendText(string.Format(
+                "  CLR Version: {0} ( {1} )\r\n",
+                framework.ClrVersion.ToString(), 
+                framework.DisplayName));
+        }
+
+        private void AppendDomainInfo(TestAssemblyInfo info)
+        {
+            AppendBoldText(string.Format("\r\n  {0}\r\n", info.DomainName));
+
+            StringBuilder sb = new StringBuilder();
+
+            sb.AppendFormat( "    ApplicationBase: {0}\r\n", info.ApplicationBase );
+
+            if (info.PrivateBinPath != null)
+            {
+                string prefix = "    PrivateBinPath: ";
+                foreach (string s in info.PrivateBinPath.Split(new char[] { ';' }))
+                {
+                    sb.AppendFormat("{0}{1}\r\n", prefix, s);
+                    prefix = "                    ";
+                }
+            }
+
+            sb.AppendFormat("    Configuration File: {0}\r\n", info.ConfigurationFile); 
+
+            TextBox.AppendText(sb.ToString());
+        }
+
+        private void AppendAssemblyInfo(TestAssemblyInfo info)
+        {
+            AppendBoldText(
+                string.Format("    {0}\r\n", Path.GetFileNameWithoutExtension(info.Name)));
+
+            StringBuilder sb = new StringBuilder();
+
+            sb.AppendFormat("      Path: {0}\r\n", info.Name);
+            sb.AppendFormat("      Image Runtime Version: {0}\r\n", info.ImageRuntimeVersion.ToString());
+
+            if (info.TestFrameworks != null)
+            {
+                string prefix = "      Uses: ";
+                foreach (AssemblyName framework in info.TestFrameworks)
+                {
+                    sb.AppendFormat("{0}{1}\r\n", prefix, framework.FullName);
+                    prefix = "            ";
+                }
+            }
+
+            TextBox.AppendText(sb.ToString());
+        }
+
+        private void AppendBoldText(string text)
+        {
+            TextBox.Select(TextBox.Text.Length, 0);
+            TextBox.SelectionFont = new Font(TextBox.Font, FontStyle.Bold);
+
+            TextBox.SelectedText += text;
+        }
+
+		void TextBox_ContentsResized(object sender, ContentsResizedEventArgs e)
+		{
+            int increase = e.NewRectangle.Width - TextBox.ClientSize.Width;
+            if (increase > 0)
+            {
+                TextBox.Width += increase;
+                this.Width += increase;
+            }
+		}
+	}
+}
diff --git a/src/GuiRunner/nunit-gui/nunit-gui.build b/src/GuiRunner/nunit-gui/nunit-gui.build
index a8fb56c..a2ff772 100644
--- a/src/GuiRunner/nunit-gui/nunit-gui.build
+++ b/src/GuiRunner/nunit-gui/nunit-gui.build
@@ -1,67 +1,85 @@
 <?xml version="1.0"?>
 <project name="NUnitGuiRunner" default="build" basedir=".">
 
+  <patternset id="source-files">
+    <include name="AboutBox.cs"/>
+    <include name="AddinDialog.cs"/>
+    <include name="AppEntry.cs"/>
+    <include name="AssemblyInfo.cs"/>
+    <include name="DetailResults.cs"/>
+    <include name="ExceptionDetailsForm.cs"/>
+    <include name="GuiOptions.cs"/>
+    <include name="NUnitForm.cs"/>
+    <include name="OptionsDialog.cs"/>
+    <include name="ProjectEditor.cs"/>
+    <include name="TestAssemblyInfoForm.cs"/>
+    <include name="SettingsPages/AdvancedLoaderSettingsPage.cs"/>
+    <include name="SettingsPages/AssemblyReloadSettingsPage.cs"/>
+    <include name="SettingsPages/GuiSettingsPage.cs"/>
+    <include name="SettingsPages/InternalTraceSettingsPage.cs"/>
+    <include name="SettingsPages/InternalTraceSettingsPage.Designer.cs"/>
+    <include name="SettingsPages/TestLoaderSettingsPage.cs"/>
+    <include name="SettingsPages/TestResultSettingsPage.cs"/>
+    <include name="SettingsPages/TreeSettingsPage.cs"/>
+    <include name="SettingsPages/VisualStudioSettingsPage.cs"/>
+  </patternset>
+
+  <patternset id="resource-files">
+    <include name="AboutBox.resx"/>
+    <include name="AddinDialog.resx"/>
+    <include name="ExceptionDetailsForm.resx"/>
+    <include name="NUnitForm.resx"/>
+    <include name="OptionsDialog.resx"/>
+    <include name="ProjectEditor.resx"/>
+    <include name="App.ico"/>
+    <include name="Logo.ico"/>
+    <include name="SettingsPages/AdvancedLoaderSettingsPage.resx"/>
+    <include name="SettingsPages/AssemblyReloadSettingsPage.resx"/>
+    <include name="SettingsPages/GuiSettingsPage.resx"/>
+    <include name="SettingsPages/InternalTraceSettingsPage.resx"/>
+    <include name="SettingsPages/TestLoaderSettingsPage.resx"/>
+    <include name="SettingsPages/TestResultSettingsPage.resx"/>
+    <include name="SettingsPages/TreeSettingsPage.resx"/>
+    <include name="SettingsPages/VisualStudioSettingsPage.resx"/>
+  </patternset>
+
   <target name="build">
     <csc target="library" 
-       output="${current.build.dir}/nunit-gui-runner.dll" 
+       output="${current.lib.dir}/nunit-gui-runner.dll" 
        win32icon="Logo.ico" debug="${build.debug}"
        define="${build.defines}">
       <sources>
-        <include name="AboutBox.cs"/>
-        <include name="AddinDialog.cs"/>
-        <include name="AppEntry.cs"/>
-        <include name="AssemblyInfo.cs"/>
-        <include name="DetailResults.cs"/>
-        <include name="ExceptionDetailsForm.cs"/>
-        <include name="GuiOptions.cs"/>
-        <include name="NUnitForm.cs"/>
-        <include name="OptionsDialog.cs"/>
-        <include name="ProjectEditor.cs"/>
-        <include name="SettingsPages/AdvancedLoaderSettingsPage.cs"/>
-        <include name="SettingsPages/AssemblyReloadSettingsPage.cs"/>
-        <include name="SettingsPages/GuiSettingsPage.cs"/>
-        <include name="SettingsPages/TestLoaderSettingsPage.cs"/>
-        <include name="SettingsPages/TestResultSettingsPage.cs"/>
-        <include name="SettingsPages/TreeSettingsPage.cs"/>
-        <include name="SettingsPages/VisualStudioSettingsPage.cs"/>
-        <include name="../../CommonAssemblyInfo.cs"/>-->
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
       </sources>
       <nowarn>
-        <warning number="618,1699" if="${runtime.version=='2.0'}"/>
+        <warning number="618,1699" if="${runtime.version>='2.0'}"/>
       </nowarn>
       <resources>
-        <include name="AboutBox.resx"/>
-        <include name="AddinDialog.resx"/>
-        <include name="ExceptionDetailsForm.resx"/>
-        <include name="NUnitForm.resx"/>
-        <include name="OptionsDialog.resx"/>
-        <include name="ProjectEditor.resx"/>
-        <include name="App.ico"/>
-        <include name="Logo.ico"/>
-        <include name="SettingsPages/AssemblyReloadSettingsPage.resx"/>
-        <include name="SettingsPages/GuiSettingsPage.resx"/>
-        <include name="SettingsPages/TestLoaderSettingsPage.resx"/>
-        <include name="SettingsPages/TestResultSettingsPage.resx"/>
-        <include name="SettingsPages/TreeSettingsPage.resx"/>
-        <include name="SettingsPages/VisualStudioSettingsPage.resx"/>
-      </resources>-->
-      <references basedir="${current.build.dir}">
+        <patternset refid="resource-files"/>
+      </resources>
+      <references>
         <include name="System.Windows.Forms.dll"/>
         <include name="System.Drawing.dll"/>
-        <include name="nunit.core.dll"/>
-        <include name="nunit.core.interfaces.dll"/>
-        <include name="nunit.util.dll"/>
-        <include name="nunit.uikit.dll"/>
-        <include name="nunit.core.dll"/>
-        <include name="nunit.framework.dll"/>
+        <include name="System.Configuration.dll"/>
+        <include name="${current.lib.dir}/nunit.core.dll"/>
+        <include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
+        <include name="${current.lib.dir}/nunit.util.dll"/>
+        <include name="${current.lib.dir}/nunit.uikit.dll"/>
+        <include name="${current.lib.dir}/nunit.core.dll"/>
       </references>
     </csc>
   </target>
 
   <target name="package">
     <copy todir="${package.src.dir}/GuiRunner/nunit-gui">
-      <fileset refid="source-files" />
+      <fileset>
+        <patternset refid="source-files"/>
+        <patternset refid="resource-files"/>
+        <include name="nunit-gui.csproj"/>
+        <include name="nunit-gui.build"/>
+      </fileset>
     </copy>
   </target>
 
-</project>
\ No newline at end of file
+</project>
diff --git a/src/GuiRunner/nunit-gui/nunit-gui.csproj b/src/GuiRunner/nunit-gui/nunit-gui.csproj
index 8280fcc..f895794 100644
--- a/src/GuiRunner/nunit-gui/nunit-gui.csproj
+++ b/src/GuiRunner/nunit-gui/nunit-gui.csproj
@@ -1,310 +1,225 @@
-<VisualStudioProject>
-    <CSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = ""
-                AssemblyKeyContainerName = ""
-                AssemblyName = "nunit-gui-runner"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "Library"
-                PreBuildEvent = ""
-                PostBuildEvent = ""
-                RootNamespace = "NUnit.Gui"
-                RunPostBuildEvent = "OnBuildSuccess"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE;NUNIT_LEAKAGE_TEST"
-                    DocumentationFile = ""
-                    DebugSymbols = "true"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "true"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-                <Config
-                    Name = "Release"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "false"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "System"
-                    AssemblyName = "System"
-                    HintPath = "..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll"
-                />
-                <Reference
-                    Name = "System.Windows.Forms"
-                    AssemblyName = "System.Windows.Forms"
-                    HintPath = "..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll"
-                />
-                <Reference
-                    Name = "System.Drawing"
-                    AssemblyName = "System.Drawing"
-                    HintPath = "E:\WINNT\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll"
-                />
-                <Reference
-                    Name = "System.Data"
-                    AssemblyName = "System.Data"
-                    HintPath = "E:\WINNT\Microsoft.NET\Framework\v1.0.3705\System.Data.dll"
-                />
-                <Reference
-                    Name = "System.XML"
-                    AssemblyName = "System.Xml"
-                    HintPath = "E:\WINNT\Microsoft.NET\Framework\v1.0.3705\System.XML.dll"
-                />
-                <Reference
-                    Name = "nunit.uikit.dll"
-                    Project = "{27531BBF-183D-4C3A-935B-D840B9F1A3A4}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.util.dll"
-                    Project = "{61CE9CE5-943E-44D4-A381-814DC1406767}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.core.interfaces.dll"
-                    Project = "{435428F8-5995-4CE4-8022-93D595A8CC0F}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.core.dll"
-                    Project = "{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-            </References>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "AboutBox.cs"
-                    SubType = "Form"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "AboutBox.resx"
-                    DependentUpon = "AboutBox.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "AddinDialog.cs"
-                    SubType = "Form"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "AddinDialog.resx"
-                    DependentUpon = "AddinDialog.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "AppEntry.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "AssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CommonAssemblyInfo.cs"
-                    Link = "..\..\CommonAssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "DetailResults.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ExceptionDetailsForm.cs"
-                    SubType = "Form"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ExceptionDetailsForm.resx"
-                    DependentUpon = "ExceptionDetailsForm.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "GuiOptions.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Logo.ico"
-                    BuildAction = "Content"
-                />
-                <File
-                    RelPath = "NUnitForm.cs"
-                    SubType = "Form"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "NUnitForm.resx"
-                    DependentUpon = "NUnitForm.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "OptionsDialog.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "OptionsDialog.resx"
-                    DependentUpon = "OptionsDialog.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "ProjectEditor.cs"
-                    SubType = "Form"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ProjectEditor.resx"
-                    DependentUpon = "ProjectEditor.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "SettingsPages\AdvancedLoaderSettingsPage.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SettingsPages\AdvancedLoaderSettingsPage.resx"
-                    DependentUpon = "AdvancedLoaderSettingsPage.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "SettingsPages\AssemblyReloadSettingsPage.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SettingsPages\AssemblyReloadSettingsPage.resx"
-                    DependentUpon = "AssemblyReloadSettingsPage.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "SettingsPages\GuiSettingsPage.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SettingsPages\GuiSettingsPage.resx"
-                    DependentUpon = "GuiSettingsPage.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "SettingsPages\TestLoaderSettingsPage.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SettingsPages\TestLoaderSettingsPage.resx"
-                    DependentUpon = "TestLoaderSettingsPage.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "SettingsPages\TestResultSettingsPage.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SettingsPages\TestResultSettingsPage.resx"
-                    DependentUpon = "TestResultSettingsPage.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "SettingsPages\TreeSettingsPage.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SettingsPages\TreeSettingsPage.resx"
-                    DependentUpon = "TreeSettingsPage.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "SettingsPages\VisualStudioSettingsPage.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SettingsPages\VisualStudioSettingsPage.resx"
-                    DependentUpon = "VisualStudioSettingsPage.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "SettingsPages\OldTabPages\GeneralSettingsTab.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SettingsPages\OldTabPages\GeneralSettingsTab.resx"
-                    DependentUpon = "GeneralSettingsTab.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "SettingsPages\OldTabPages\TestLoaderSettingsTab.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SettingsPages\OldTabPages\TestLoaderSettingsTab.resx"
-                    DependentUpon = "TestLoaderSettingsTab.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "SettingsPages\OldTabPages\TestOutputSettingsTab.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SettingsPages\OldTabPages\TestOutputSettingsTab.resx"
-                    DependentUpon = "TestOutputSettingsTab.cs"
-                    BuildAction = "EmbeddedResource"
-                />
-            </Include>
-        </Files>
-    </CSHARP>
-</VisualStudioProject>
-
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit-gui-runner</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.Gui</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\lib\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>1699</NoWarn>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\lib\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>1699</NoWarn>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Drawing">
+      <Name>System.Drawing</Name>
+    </Reference>
+    <Reference Include="System.Windows.Forms">
+      <Name>System.Windows.Forms</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
+      <Name>nunit.util.dll</Name>
+      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\GuiComponents\UiKit\nunit.uikit.dll.csproj">
+      <Name>nunit.uikit.dll</Name>
+      <Project>{27531BBF-183D-4C3A-935B-D840B9F1A3A4}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\GuiException\UiException\nunit.uiexception.dll.csproj">
+      <Project>{3E87A106-EB20-4147-84C8-95B0BB43A1D4}</Project>
+      <Name>nunit.uiexception.dll</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
+      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
+      <Name>nunit.core.dll</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
+      <Name>nunit.core.interfaces.dll</Name>
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <Reference Include="System.Configuration" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="AboutBox.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="AddinDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="AppEntry.cs" />
+    <Compile Include="AssemblyInfo.cs" />
+    <Compile Include="DetailResults.cs" />
+    <Compile Include="ExceptionDetailsForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="GuiOptions.cs" />
+    <Compile Include="NUnitForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="OptionsDialog.cs" />
+    <Compile Include="ProjectEditor.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="SettingsPages\AdvancedLoaderSettingsPage.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="SettingsPages\AssemblyReloadSettingsPage.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="SettingsPages\GuiSettingsPage.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="SettingsPages\InternalTraceSettingsPage.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="SettingsPages\InternalTraceSettingsPage.Designer.cs">
+      <DependentUpon>InternalTraceSettingsPage.cs</DependentUpon>
+    </Compile>
+    <Compile Include="SettingsPages\TestLoaderSettingsPage.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="SettingsPages\TestResultSettingsPage.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="SettingsPages\TreeSettingsPage.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="SettingsPages\VisualStudioSettingsPage.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="TestAssemblyInfoForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <EmbeddedResource Include="AboutBox.resx">
+      <DependentUpon>AboutBox.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="AddinDialog.resx">
+      <DependentUpon>AddinDialog.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ExceptionDetailsForm.resx">
+      <DependentUpon>ExceptionDetailsForm.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="NUnitForm.resx">
+      <DependentUpon>NUnitForm.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="OptionsDialog.resx">
+      <DependentUpon>OptionsDialog.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ProjectEditor.resx">
+      <DependentUpon>ProjectEditor.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="SettingsPages\AdvancedLoaderSettingsPage.resx">
+      <DependentUpon>AdvancedLoaderSettingsPage.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="SettingsPages\AssemblyReloadSettingsPage.resx">
+      <DependentUpon>AssemblyReloadSettingsPage.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="SettingsPages\GuiSettingsPage.resx">
+      <DependentUpon>GuiSettingsPage.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="SettingsPages\InternalTraceSettingsPage.resx">
+      <DependentUpon>InternalTraceSettingsPage.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="SettingsPages\TestLoaderSettingsPage.resx">
+      <DependentUpon>TestLoaderSettingsPage.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="SettingsPages\TestResultSettingsPage.resx">
+      <DependentUpon>TestResultSettingsPage.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="SettingsPages\TreeSettingsPage.resx">
+      <DependentUpon>TreeSettingsPage.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="SettingsPages\VisualStudioSettingsPage.resx">
+      <DependentUpon>VisualStudioSettingsPage.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit-gui.build" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/GuiRunner/nunit-gui/nunit-gui_VS2005.csproj b/src/GuiRunner/nunit-gui/nunit-gui_VS2005.csproj
deleted file mode 100644
index 5462e74..0000000
--- a/src/GuiRunner/nunit-gui/nunit-gui_VS2005.csproj
+++ /dev/null
@@ -1,198 +0,0 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>8.0.50727</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ApplicationIcon>
-    </ApplicationIcon>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit-gui-runner</AssemblyName>
-    <AssemblyOriginatorKeyFile>
-    </AssemblyOriginatorKeyFile>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.Gui</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <StartupObject>
-    </StartupObject>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-    <SignAssembly>false</SignAssembly>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release2005|AnyCPU' ">
-    <OutputPath>bin\Release2005\</OutputPath>
-    <DefineConstants>TRACE;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <Optimize>true</Optimize>
-    <NoWarn>1701;1702;1699;618</NoWarn>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug2005|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\Debug2005\</OutputPath>
-    <DefineConstants>TRACE;DEBUG;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <NoWarn>1701;1702;1699;618</NoWarn>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Drawing">
-      <Name>System.Drawing</Name>
-    </Reference>
-    <Reference Include="System.Windows.Forms">
-      <Name>System.Windows.Forms</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="AboutBox.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="AddinDialog.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="AppEntry.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="AssemblyInfo.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="DetailResults.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="ExceptionDetailsForm.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="GuiOptions.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="NUnitForm.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="OptionsDialog.cs">
-    </Compile>
-    <Compile Include="ProjectEditor.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="SettingsPages\AdvancedLoaderSettingsPage.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="SettingsPages\AssemblyReloadSettingsPage.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="SettingsPages\GuiSettingsPage.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="SettingsPages\TestLoaderSettingsPage.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="SettingsPages\TestResultSettingsPage.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="SettingsPages\TreeSettingsPage.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="SettingsPages\VisualStudioSettingsPage.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <EmbeddedResource Include="AboutBox.resx">
-      <DependentUpon>AboutBox.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="AddinDialog.resx">
-      <DependentUpon>AddinDialog.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="ExceptionDetailsForm.resx">
-      <DependentUpon>ExceptionDetailsForm.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="NUnitForm.resx">
-      <DependentUpon>NUnitForm.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="OptionsDialog.resx">
-      <DependentUpon>OptionsDialog.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="ProjectEditor.resx">
-      <DependentUpon>ProjectEditor.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="SettingsPages\AdvancedLoaderSettingsPage.resx">
-      <DependentUpon>AdvancedLoaderSettingsPage.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="SettingsPages\AssemblyReloadSettingsPage.resx">
-      <DependentUpon>AssemblyReloadSettingsPage.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="SettingsPages\GuiSettingsPage.resx">
-      <DependentUpon>GuiSettingsPage.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="SettingsPages\TestLoaderSettingsPage.resx">
-      <DependentUpon>TestLoaderSettingsPage.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="SettingsPages\TestResultSettingsPage.resx">
-      <DependentUpon>TestResultSettingsPage.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="SettingsPages\TreeSettingsPage.resx">
-      <DependentUpon>TreeSettingsPage.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="SettingsPages\VisualStudioSettingsPage.resx">
-      <DependentUpon>VisualStudioSettingsPage.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <Content Include="Logo.ico" />
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll_VS2005.csproj">
-      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
-      <Name>nunit.util.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\GuiComponents\UiKit\nunit.uikit.dll_VS2005.csproj">
-      <Project>{27531BBF-183D-4C3A-935B-D840B9F1A3A4}</Project>
-      <Name>nunit.uikit.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll_VS2005.csproj">
-      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
-      <Name>nunit.core.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll_VS2005.csproj">
-      <Project>{DCC88998-255A-4247-B658-71DD932E9873}</Project>
-      <Name>nunit.core.interfaces.dll_VS2005</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <Folder Include="SettingsPages\OldTabPages\" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
-</Project>
\ No newline at end of file
diff --git a/src/GuiRunner/tests/CommandLineTests.cs b/src/GuiRunner/tests/CommandLineTests.cs
index 32ab62c..05e66a7 100644
--- a/src/GuiRunner/tests/CommandLineTests.cs
+++ b/src/GuiRunner/tests/CommandLineTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 namespace NUnit.Gui.Tests
diff --git a/src/GuiRunner/tests/ExceptionDetailsFormTests.cs b/src/GuiRunner/tests/ExceptionDetailsFormTests.cs
index 6bec406..f5e6874 100644
--- a/src/GuiRunner/tests/ExceptionDetailsFormTests.cs
+++ b/src/GuiRunner/tests/ExceptionDetailsFormTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 using System.Windows.Forms;
diff --git a/src/GuiRunner/tests/FormSettingsTests.cs b/src/GuiRunner/tests/FormSettingsTests.cs
deleted file mode 100644
index 36a5079..0000000
--- a/src/GuiRunner/tests/FormSettingsTests.cs
+++ /dev/null
@@ -1,148 +0,0 @@
-#region Copyright (c) 2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig
-/************************************************************************************
-'
-' Copyright  2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole
-' Copyright  2000-2002 Philip A. Craig
-'
-' This software is provided 'as-is', without any express or implied warranty. In no 
-' event will the authors be held liable for any damages arising from the use of this 
-' software.
-' 
-' Permission is granted to anyone to use this software for any purpose, including 
-' commercial applications, and to alter it and redistribute it freely, subject to the 
-' following restrictions:
-'
-' 1. The origin of this software must not be misrepresented; you must not claim that 
-' you wrote the original software. If you use this software in a product, an 
-' acknowledgment (see the following) in the product documentation is required.
-'
-' Portions Copyright  2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole
-' or Copyright  2000-2002 Philip A. Craig
-'
-' 2. Altered source versions must be plainly marked as such, and must not be 
-' misrepresented as being the original software.
-'
-' 3. This notice may not be removed or altered from any source distribution.
-'
-'***********************************************************************************/
-#endregion
-
-using System;
-using System.Drawing;
-using System.Windows.Forms;
-using NUnit.Framework;
-using NUnit.Util;
-using Microsoft.Win32;
-
-namespace NUnit.Gui.Tests
-{
-	[TestFixture]
-	public class FormSettingsTests
-	{
-		static Point DEFAULT_LOCATION = new Point( FormSettings.DEFAULT_XLOCATION, FormSettings.DEFAULT_YLOCATION );
-		static Size DEFAULT_SIZE = new Size( FormSettings.DEFAULT_WIDTH, FormSettings.DEFAULT_HEIGHT );
-		static Size MIN_SIZE = new Size( FormSettings.MIN_WIDTH, FormSettings.MIN_HEIGHT );
-		static int TREE_MIN_POSITION = FormSettings.TREE_MIN_POSITION;
-		static int TAB_MIN_POSITION = FormSettings.TAB_MIN_POSITION;
-		
-		FormSettings formSettings;
-
-		[SetUp]
-		public void Init()
-		{
-			MemorySettingsStorage storage = new MemorySettingsStorage();
-			formSettings = new UserSettings( storage ).Form;
-		}
-
-		[TearDown]
-		public void Cleanup()
-		{
-			formSettings.Dispose();
-		}
-
-		[Test]
-		public void FormPosition()
-		{
-			Point pt = new Point( 100, 200 );
-			Size sz = new Size( 300, 200 );
-			
-			formSettings.Location = pt;
-			formSettings.Size = sz;
-
-			Assert.AreEqual( pt, formSettings.Location );
-			Assert.AreEqual( sz, formSettings.Size );
-		}
-
-		[Test]
-		public void SplitterPosition()
-		{
-			int position = 383;
-
-			formSettings.TreeSplitterPosition = position; 
-			Assert.AreEqual(position, formSettings.TreeSplitterPosition);
-
-			formSettings.TabSplitterPosition = position;
-			Assert.AreEqual(position, formSettings.TabSplitterPosition);
-		}
-
-		[Test]
-		public void FormPositionDefaults()
-		{	
-			Point pt = formSettings.Location;
-			Size sz = formSettings.Size;
-
-			Assert.AreEqual( DEFAULT_LOCATION, pt );
-			Assert.AreEqual( DEFAULT_SIZE, sz );
-		}
-
-		[Test]
-		public void FormSizeTooSmall()
-		{
-			Point pt = new Point( 100, 200 );
-			Size sz = new Size( 20, 25 );
-			
-			formSettings.Location = pt;
-			formSettings.Size = sz;
-
-			Assert.AreEqual( pt, formSettings.Location );
-			Assert.AreEqual( MIN_SIZE, formSettings.Size );
-		}
-
-		[Test]
-		public void PositionOutOfBounds()
-		{
-			int minX = 0;
-			foreach( Screen screen in Screen.AllScreens )
-				if ( screen.Bounds.Left < minX )
-					minX = screen.Bounds.Left;
-
-			Point pt = new Point( minX-1000, 200 );
-			Size sz = new Size( 300, 200 );
-
-			formSettings.Location = pt;
-			formSettings.Size = sz;
-
-			Assert.AreEqual( DEFAULT_LOCATION, formSettings.Location );
-			Assert.AreEqual( sz, formSettings.Size );
-		}
-
-		[Test]
-		public void BadTreeSplitterPosition()
-		{
-			formSettings.TreeSplitterPosition = 5;
-			Assert.AreEqual( TREE_MIN_POSITION, formSettings.TreeSplitterPosition );
-			formSettings.TreeSplitterPosition = 5000; 
-			Assert.AreEqual( TREE_MIN_POSITION, formSettings.TreeSplitterPosition );
-		}
-	
-		[Test]
-		public void BadTabSplitterPosition()
-		{
-			formSettings.TabSplitterPosition = 5;
-			Assert.AreEqual( TAB_MIN_POSITION, formSettings.TabSplitterPosition );
-
-			formSettings.TabSplitterPosition = 5000;
-			Assert.AreEqual( TAB_MIN_POSITION, formSettings.TabSplitterPosition );
-		}
-	}
-}
diff --git a/src/GuiRunner/tests/OptionSettingsTests.cs b/src/GuiRunner/tests/OptionSettingsTests.cs
deleted file mode 100644
index c23683b..0000000
--- a/src/GuiRunner/tests/OptionSettingsTests.cs
+++ /dev/null
@@ -1,128 +0,0 @@
-#region Copyright (c) 2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig
-/************************************************************************************
-'
-' Copyright  2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole
-' Copyright  2000-2002 Philip A. Craig
-'
-' This software is provided 'as-is', without any express or implied warranty. In no 
-' event will the authors be held liable for any damages arising from the use of this 
-' software.
-' 
-' Permission is granted to anyone to use this software for any purpose, including 
-' commercial applications, and to alter it and redistribute it freely, subject to the 
-' following restrictions:
-'
-' 1. The origin of this software must not be misrepresented; you must not claim that 
-' you wrote the original software. If you use this software in a product, an 
-' acknowledgment (see the following) in the product documentation is required.
-'
-' Portions Copyright  2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole
-' or Copyright  2000-2002 Philip A. Craig
-'
-' 2. Altered source versions must be plainly marked as such, and must not be 
-' misrepresented as being the original software.
-'
-' 3. This notice may not be removed or altered from any source distribution.
-'
-'***********************************************************************************/
-#endregion
-
-using System;
-using NUnit.Framework;
-using NUnit.Util;
-
-namespace NUnit.Gui.Tests
-{
-	/// <summary>
-	/// Summary description for OptionSettingsTests.
-	/// </summary>
-	[TestFixture]
-	public class OptionSettingsTests
-	{
-		private OptionSettings opts;
-
-		[SetUp]
-		public void Init()
-		{
-			opts = new UserSettings( new MemorySettingsStorage() ).Options;
-		}
-
-		[TearDown]
-		public void Cleanup()
-		{
-			opts.Dispose();
-		}
-
-		[Test]
-		public void LoadLastProject()
-		{
-			Assert.AreEqual( true, opts.LoadLastProject );
-			opts.LoadLastProject = true;
-			Assert.AreEqual( true, opts.LoadLastProject );
-			opts.LoadLastProject = false;
-			Assert.AreEqual( false, opts.LoadLastProject );
-		}
-
-		[Test]
-		public void LoadLastInitialTreeDisplay()
-		{
-			Assert.AreEqual( 0, opts.InitialTreeDisplay );
-			opts.InitialTreeDisplay = 1;
-			Assert.AreEqual( 1, opts.InitialTreeDisplay );
-			opts.InitialTreeDisplay = 2;
-			Assert.AreEqual( 2, opts.InitialTreeDisplay );
-		}
-
-		[Test]
-		public void ReloadOnChange()
-		{
-			if ( Environment.OSVersion.Platform == System.PlatformID.Win32NT )
-			{
-				Assert.AreEqual( true, opts.ReloadOnChange );
-				opts.ReloadOnChange = true;
-				Assert.AreEqual( true, opts.ReloadOnChange );
-				opts.ReloadOnChange = false;
-				Assert.AreEqual( false, opts.ReloadOnChange );
-			}
-			else
-			{
-				Assert.AreEqual( false, opts.ReloadOnChange );
-				opts.ReloadOnChange = true;
-				Assert.AreEqual( false, opts.ReloadOnChange );
-			}
-			
-		}
-
-		[Test]
-		public void ReloadOnRun()
-		{
-			Assert.AreEqual( true, opts.ReloadOnRun );
-			opts.ReloadOnRun = true;
-			Assert.AreEqual( true, opts.ReloadOnRun );
-			opts.ReloadOnRun = false;
-			Assert.AreEqual( false, opts.ReloadOnRun );
-			
-		}
-
-		[Test]
-		public void ClearResults()
-		{
-			Assert.AreEqual( true, opts.ClearResults );
-			opts.ClearResults = true;
-			Assert.AreEqual( true, opts.ClearResults );
-			opts.ClearResults = false;
-			Assert.AreEqual( false, opts.ClearResults );
-
-		}
-
-		[Test]
-		public void VisualStudioSupport()
-		{
-			Assert.AreEqual( false, opts.VisualStudioSupport );
-			opts.VisualStudioSupport = true;
-			Assert.AreEqual( true, opts.VisualStudioSupport );
-			opts.VisualStudioSupport = false;
-			Assert.AreEqual( false, opts.VisualStudioSupport );
-		}
-	}
-}
diff --git a/src/GuiRunner/tests/ProjectEditorTests.cs b/src/GuiRunner/tests/ProjectEditorTests.cs
index 4a7ea7c..1ac6512 100644
--- a/src/GuiRunner/tests/ProjectEditorTests.cs
+++ b/src/GuiRunner/tests/ProjectEditorTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 using System.IO;
@@ -29,7 +29,6 @@ namespace NUnit.Gui.Tests
 			project.Configs.Add( "Release" );
 
 			editor = new ProjectEditor( project );
-			editor.VisualStudioSupport = true;
 			
 			this.Form = editor;
 		}
@@ -37,8 +36,8 @@ namespace NUnit.Gui.Tests
 		[TearDown]
 		public void Close()
 		{
-            if ( editor != null )
-			    editor.Close();
+            //if ( editor != null )
+            //    editor.Close();
 		}
 		[Test]
 		public void CheckControls()
@@ -54,23 +53,24 @@ namespace NUnit.Gui.Tests
 			tester.AssertControlExists( "projectTabControl" );
 		}
 
-		[Test]
-		public void InitialFieldValues()
+        [Test, Platform(Exclude="Net-1.0", Reason="Sporadic NullReferenceException in SafeNativeMethods.ShowWindow")]
+        public void InitialFieldValues()
 		{
 			editor.Show();
-			Assert.AreEqual( Path.GetFullPath( "temp.nunit" ), GetText( "projectPathLabel" ) );
-			Assert.AreEqual( Environment.CurrentDirectory, GetText( "projectBaseTextBox" ) );
+            Assert.AreEqual( Path.GetFullPath( "temp.nunit" ), GetText( "projectPathLabel" ) );
+            Assert.AreEqual( Environment.CurrentDirectory, GetText( "projectBaseTextBox" ) );
 		}
 
-		[Test, Platform(Exclude="Linux", Reason="Validate on focus change doesn't work on Mono")]
+		[Test, Explicit("Fails when running on TeamCity Server")]
 		public void SetProjectBase()
 		{
 			editor.Show();
-			TextBox textBox = TextBoxes["projectBaseTextBox"];
-			textBox.Focus();
-			textBox.Text = Environment.SystemDirectory; // Guaranteed to exist
-			Buttons["closeButton"].Focus();
-			Assert.AreEqual( Environment.SystemDirectory, project.BasePath );
+            TextBox textBox = TextBoxes["projectBaseTextBox"];
+            textBox.Focus();
+			string appDataPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
+            textBox.Text = appDataPath;
+            Buttons["closeButton"].Focus();
+            Assert.AreEqual( appDataPath, project.BasePath );
 		}
 	}
 }
diff --git a/src/GuiRunner/tests/UserSettingsTests.cs b/src/GuiRunner/tests/UserSettingsTests.cs
deleted file mode 100644
index 411ea64..0000000
--- a/src/GuiRunner/tests/UserSettingsTests.cs
+++ /dev/null
@@ -1,76 +0,0 @@
-#region Copyright (c) 2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig
-/************************************************************************************
-'
-' Copyright  2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole
-' Copyright  2000-2002 Philip A. Craig
-'
-' This software is provided 'as-is', without any express or implied warranty. In no 
-' event will the authors be held liable for any damages arising from the use of this 
-' software.
-' 
-' Permission is granted to anyone to use this software for any purpose, including 
-' commercial applications, and to alter it and redistribute it freely, subject to the 
-' following restrictions:
-'
-' 1. The origin of this software must not be misrepresented; you must not claim that 
-' you wrote the original software. If you use this software in a product, an 
-' acknowledgment (see the following) in the product documentation is required.
-'
-' Portions Copyright  2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole
-' or Copyright  2000-2002 Philip A. Craig
-'
-' 2. Altered source versions must be plainly marked as such, and must not be 
-' misrepresented as being the original software.
-'
-' 3. This notice may not be removed or altered from any source distribution.
-'
-'***********************************************************************************/
-#endregion
-
-using System;
-using System.Drawing;
-using NUnit.Framework;
-using NUnit.Util;
-using Microsoft.Win32;
-
-namespace NUnit.Gui.Tests
-{
-	/// <summary>
-	/// Summary description for UserSettingsTests.
-	/// </summary>
-	[TestFixture]
-	public class UserSettingsTests
-	{
-		UserSettings settings;
-
-		[SetUp]
-		public void Init()
-		{
-			settings = new UserSettings( new MemorySettingsStorage() );
-		}
-
-		[TearDown]
-		public void Cleanup()
-		{
-			settings.Dispose();
-		}
-		
-		[Test]
-		public void OptionSettings()
-		{
-			Assert.IsInstanceOfType( typeof( MemorySettingsStorage ), settings.Options.Storage );
-		}
-
-		[Test]
-		public void FormSettings()
-		{
-			Assert.IsInstanceOfType( typeof( MemorySettingsStorage ), settings.Form.Storage );
-		}
-
-		[Test]
-		public void RecentProjects()
-		{
-			Assert.IsInstanceOfType( typeof( MemorySettingsStorage ), settings.RecentProjects.Storage );
-		}
-	}
-}
diff --git a/src/GuiRunner/tests/nunit-gui.tests.build b/src/GuiRunner/tests/nunit-gui.tests.build
index e02ad39..f8d6076 100644
--- a/src/GuiRunner/tests/nunit-gui.tests.build
+++ b/src/GuiRunner/tests/nunit-gui.tests.build
@@ -1,30 +1,38 @@
 <?xml version="1.0"?>
 <project name="NUnitGuiTests" default="build" basedir=".">
 
+  <patternset id="source-files">
+        <include name="CommandLineTests.cs"/>
+        <include name="ExceptionDetailsFormTests.cs"/>
+        <include name="ProjectEditorTests.cs"/>
+  </patternset>
+
   <target name="build">
     <csc target="library" 
-        output="${current.build.dir}/nunit-gui.tests.dll" 
+        output="${current.test.dir}/nunit-gui.tests.dll" 
         debug="${build.debug}" define="${build.defines}">
       <sources>
-        <include name="CommandLineTests.cs"/>
-        <include name="ExceptionDetailsFormTests.cs"/>
-        <include name="ProjectEditorTests.cs"/>
-        <include name="../../CommonAssemblyInfo.cs"/>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
       </sources>
-      <references basedir="${current.build.dir}">
+      <references>
         <include name="System.Windows.Forms.dll"/>
-	<include name="System.Drawing.dll"/>
-        <include name="nunit-gui-runner.dll"/>
-        <include name="nunit.util.dll"/>
-        <include name="nunit.framework.dll"/>
-        <include name="test-utilities.dll"/>
+	  <include name="System.Drawing.dll"/>
+        <include name="${current.lib.dir}/nunit-gui-runner.dll"/>
+        <include name="${current.lib.dir}/nunit.util.dll"/>
+        <include name="${current.framework.dir}/nunit.framework.dll"/>
+        <include name="${current.test.dir}/test-utilities.dll"/>
       </references>
     </csc>
   </target>
 
   <target name="package">
     <copy todir="${package.src.dir}/GuiRunner/tests">
-      <fileset refid="source-files" />
+      <fileset>
+        <patternset refid="source-files"/>
+        <include name="nunit-gui.tests.csproj"/>
+        <include name="nunit-gui.tests.build"/>
+      </fileset>
     </copy>
   </target>
 
diff --git a/src/GuiRunner/tests/nunit-gui.tests.csproj b/src/GuiRunner/tests/nunit-gui.tests.csproj
index a5c3b63..1443a80 100644
--- a/src/GuiRunner/tests/nunit-gui.tests.csproj
+++ b/src/GuiRunner/tests/nunit-gui.tests.csproj
@@ -1,141 +1,113 @@
-<VisualStudioProject>
-    <CSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{AAD27267-DE1F-4F61-A1FB-D1680A5B8001}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = ""
-                AssemblyKeyContainerName = ""
-                AssemblyName = "nunit-gui.tests"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "Library"
-                PreBuildEvent = ""
-                PostBuildEvent = ""
-                RootNamespace = "NUnit.Gui.Tests"
-                RunPostBuildEvent = "OnBuildSuccess"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "true"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-                <Config
-                    Name = "Release"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "false"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "System"
-                    AssemblyName = "System"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.dll"
-                />
-                <Reference
-                    Name = "System.Data"
-                    AssemblyName = "System.Data"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Data.dll"
-                />
-                <Reference
-                    Name = "System.XML"
-                    AssemblyName = "System.Xml"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.XML.dll"
-                />
-                <Reference
-                    Name = "nunit.framework.dll"
-                    Project = "{83DD7E12-A705-4DBA-9D71-09C8973D9382}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "System.Drawing"
-                    AssemblyName = "System.Drawing"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Drawing.dll"
-                />
-                <Reference
-                    Name = "nunit-gui"
-                    Project = "{3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.util.dll"
-                    Project = "{61CE9CE5-943E-44D4-A381-814DC1406767}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "System.Windows.Forms"
-                    AssemblyName = "System.Windows.Forms"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Windows.Forms.dll"
-                />
-                <Reference
-                    Name = "test-utilities"
-                    Project = "{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-            </References>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "CommandLineTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CommonAssemblyInfo.cs"
-                    Link = "..\..\CommonAssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ExceptionDetailsFormTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ProjectEditorTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-            </Include>
-        </Files>
-    </CSHARP>
-</VisualStudioProject>
-
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{AAD27267-DE1F-4F61-A1FB-D1680A5B8001}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit-gui.tests</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.Gui.Tests</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Drawing">
+      <Name>System.Drawing</Name>
+    </Reference>
+    <Reference Include="System.Windows.Forms">
+      <Name>System.Windows.Forms</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
+      <Name>nunit.util.dll</Name>
+      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
+      <Name>nunit.framework.dll</Name>
+      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\..\tests\test-utilities\test-utilities.csproj">
+      <Name>test-utilities</Name>
+      <Project>{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\nunit-gui\nunit-gui.csproj">
+      <Name>nunit-gui</Name>
+      <Project>{3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="CommandLineTests.cs" />
+    <Compile Include="ExceptionDetailsFormTests.cs" />
+    <Compile Include="ProjectEditorTests.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit-gui.tests.build" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/GuiRunner/tests/nunit-gui.tests.dll.config b/src/GuiRunner/tests/nunit-gui.tests.dll.config
deleted file mode 100644
index fb965cb..0000000
--- a/src/GuiRunner/tests/nunit-gui.tests.dll.config
+++ /dev/null
@@ -1,88 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<configuration>
-
-	<!--
-	 This is the configuration file for the nunit-gui.tests.dll test project. You may
-	 need to create a similar configuration file for your own test project. 
-	 
-	 In your own configuration file, the include any appSettings that you require.
-	 The <NUnit> section is only needed if you want to use a non-default value
-	 for any of the settings.
-	-->
-  <configSections>
-	<sectionGroup name="NUnit">
-		<section name="TestRunner" type="System.Configuration.NameValueSectionHandler"/>
-	</sectionGroup>
-  </configSections>
-  
-  <appSettings>
-    <!--   User application and configured property settings go here.-->
-    <!--   Example: <add key="settingName" value="settingValue"/> -->
-    <add key="test.setting" value="54321" />
-  </appSettings>
-
-  <NUnit>
-	<TestRunner>
-		<!-- Valid values are STA,MTA. Others ignored. -->
-		<add key="ApartmentState" value="MTA" />
-		
-		<!-- See ThreadPriority enum for other valid values -->
-		<add key="ThreadPriority" value="Normal" />
-	</TestRunner>
-  </NUnit>
-
-   <!--
-    The following <runtime> section allows running nunit tests under 
-    .NET 1.0 by redirecting assemblies. The appliesTo attribute
-    causes the section to be ignored except under .NET 1.0.
-   --> 
- <runtime>
-   
-    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
-			appliesTo="v1.0.3705">
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Data" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Drawing" 
-                          publicKeyToken="b03f5f7f11d50a3a" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Windows.Forms" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Xml" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-    </assemblyBinding>
-  
-  </runtime>
-
-</configuration> 
diff --git a/src/GuiRunner/tests/nunit-gui.tests_VS2005.csproj b/src/GuiRunner/tests/nunit-gui.tests_VS2005.csproj
deleted file mode 100644
index 93a6c4a..0000000
--- a/src/GuiRunner/tests/nunit-gui.tests_VS2005.csproj
+++ /dev/null
@@ -1,94 +0,0 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>8.0.50727</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{AAD27267-DE1F-4F61-A1FB-D1680A5B8001}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ApplicationIcon>
-    </ApplicationIcon>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit-gui.tests</AssemblyName>
-    <AssemblyOriginatorKeyFile>
-    </AssemblyOriginatorKeyFile>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.Gui.Tests</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <StartupObject>
-    </StartupObject>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release2005|AnyCPU' ">
-    <OutputPath>bin\Release2005\</OutputPath>
-    <DefineConstants>TRACE;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <Optimize>true</Optimize>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug2005|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\Debug2005\</OutputPath>
-    <DefineConstants>TRACE;DEBUG;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Drawing">
-      <Name>System.Drawing</Name>
-    </Reference>
-    <Reference Include="System.Windows.Forms">
-      <Name>System.Windows.Forms</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll_VS2005.csproj">
-      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
-      <Name>nunit.util.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll_VS2005.csproj">
-      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
-      <Name>nunit.framework.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\tests\test-utilities\test-utilities_VS2005.csproj">
-      <Project>{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}</Project>
-      <Name>test-utilities_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\nunit-gui\nunit-gui_VS2005.csproj">
-      <Project>{3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}</Project>
-      <Name>nunit-gui_VS2005</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="CommandLineTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="ExceptionDetailsFormTests.cs" />
-    <Compile Include="ProjectEditorTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
-</Project>
\ No newline at end of file
diff --git a/src/NUnitBinTests.config b/src/NUnitBinTests.config
deleted file mode 100644
index 11231af..0000000
--- a/src/NUnitBinTests.config
+++ /dev/null
@@ -1,80 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<configuration>
-	<!--
-	 This is the configuration file for the NUnitTests.nunit test project. You may
-	 need to create a similar configuration file for your own test project. 
-	 
-	 In your own configuration file, the include any appSettings that you require.
-	 The <NUnit> section is only needed if you want to use a non-default value
-	 for any of the settings.
-	 
-	 NOTE: A bug in .NET 2.0 Beta 2.0 requires that you make changes below
-	 when running in that environment. This is supposed to be fixed in a
-	 later release.
-	-->
-	<configSections>
-		<sectionGroup name="NUnit">
-			<section name="TestCaseBuilder" type="System.Configuration.NameValueSectionHandler, System"/>
-			<section name="TestRunner" type="System.Configuration.NameValueSectionHandler, System"/>
-<!--	For .NET 2.0 Beta 2 replace the lines with the following -->
-<!--
-			<section name="TestCaseBuilder" type="System.Configuration.NameValueSectionHandler, System, Version=2.0.50215.44, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
-			<section name="TestRunner" type="System.Configuration.NameValueSectionHandler, System, Version=2.0.50215.44, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
--->
-		</sectionGroup>
-	</configSections>
-	
-	<appSettings>
-		<!--   User application and configured property settings go here.-->
-		<!--   Example: <add key="settingName" value="settingValue"/> -->
-    
-    <!-- The following is used by the NUnit tests. TODO: REMOVE -->
-		<add key="test.setting" value="54321" />
-	</appSettings>
-
-  <!-- The following settings for NUnit are not actually needed, but are -->
-  <!-- provided for documentation purposes. The values are all defaults. -->
-  <NUnit>
-		<TestCaseBuilder>
-			<add key="OldStyleTestCases" value="false" />
-		</TestCaseBuilder>
-		<TestRunner>
-			<!-- Valid values are STA,MTA. Others ignored. -->
-			<add key="ApartmentState" value="MTA" />
-
-			<!-- See ThreadPriority enum for other valid values -->
-			<add key="ThreadPriority" value="Normal" />
-		</TestRunner>
-	</NUnit>
-	
-	<!--
-     The following <runtime> section allows running nunit tests under 
-     .NET 1.0 by redirecting assemblies. The appliesTo attribute
-     causes the section to be ignored except under .NET 1.0.
-	-->
-	<runtime>
-		<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
-				appliesTo="v1.0.3705">
-			<dependentAssembly>
-				<assemblyIdentity name="System" publicKeyToken="b77a5c561934e089" culture="" />
-				<bindingRedirect oldVersion="1.0.5000.0" newVersion="1.0.3300.0" />
-			</dependentAssembly>
-			<dependentAssembly>
-				<assemblyIdentity name="System.Data" publicKeyToken="b77a5c561934e089" culture="" />
-				<bindingRedirect oldVersion="1.0.5000.0" newVersion="1.0.3300.0" />
-			</dependentAssembly>
-			<dependentAssembly>
-				<assemblyIdentity name="System.Drawing" publicKeyToken="b03f5f7f11d50a3a" culture="" />
-				<bindingRedirect oldVersion="1.0.5000.0" newVersion="1.0.3300.0" />
-			</dependentAssembly>
-			<dependentAssembly>
-				<assemblyIdentity name="System.Windows.Forms" publicKeyToken="b77a5c561934e089" culture="" />
-				<bindingRedirect oldVersion="1.0.5000.0" newVersion="1.0.3300.0" />
-			</dependentAssembly>
-			<dependentAssembly>
-				<assemblyIdentity name="System.Xml" publicKeyToken="b77a5c561934e089" culture="" />
-				<bindingRedirect oldVersion="1.0.5000.0" newVersion="1.0.3300.0" />
-			</dependentAssembly>
-		</assemblyBinding>
-	</runtime>
-</configuration>
diff --git a/src/NUnitBinTests.nunit b/src/NUnitBinTests.nunit
deleted file mode 100644
index 9306e92..0000000
--- a/src/NUnitBinTests.nunit
+++ /dev/null
@@ -1,13 +0,0 @@
-<NUnitProject>
-  <Config name="Default" binpathtype="Auto">
-    <assembly path="nunit.framework.tests.dll" />
-    <assembly path="nunit.core.tests.dll" />
-    <assembly path="nunit.util.tests.dll" />
-    <assembly path="nunit.mocks.tests.dll" />
-    <assembly path="nunit.extensions.tests.dll" />
-    <assembly path="nunit-console.tests.dll" />
-    <assembly path="nunit.uikit.tests.dll" />
-    <assembly path="nunit-gui.tests.dll" />
-    <assembly path="nunit.fixtures.tests.dll" />
-  </Config>
-</NUnitProject>
diff --git a/src/NUnitCore/core/AbstractTestCaseDecoration.cs b/src/NUnitCore/core/AbstractTestCaseDecoration.cs
index 99583c9..19ebc63 100644
--- a/src/NUnitCore/core/AbstractTestCaseDecoration.cs
+++ b/src/NUnitCore/core/AbstractTestCaseDecoration.cs
@@ -1,31 +1,42 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 using System;
+using System.Collections;
+using System.Collections.Specialized;
 
 namespace NUnit.Core
 {
 	/// <summary>
-	/// TestCaseDecorator is used to add functionality to
-	/// another TestCase, which it aggregates.
+	/// TestDecorator is used to add functionality to
+	/// another Test, which it aggregates.
 	/// </summary>
-	public abstract class AbstractTestCaseDecoration : TestCase
+	public abstract class TestDecorator : TestMethod
 	{
-		protected TestCase testCase;
+		protected TestMethod test;
 
-		public AbstractTestCaseDecoration( TestCase testCase )
-			: base( (TestName)testCase.TestName.Clone() )
+		public TestDecorator( TestMethod test )
+			//: base( (TestName)test.TestName.Clone() )
+            : base( test.Method )
 		{
-			this.testCase = testCase;
-			this.RunState = testCase.RunState;
-			this.IgnoreReason = testCase.IgnoreReason;
-		}
+			this.test = test;
+			this.RunState = test.RunState;
+			this.IgnoreReason = test.IgnoreReason;
+            this.Description = test.Description;
+            this.Categories = new System.Collections.ArrayList( test.Categories );
+            if ( test.Properties != null )
+            {
+                this.Properties = new ListDictionary();
+                foreach (DictionaryEntry entry in test.Properties)
+                    this.Properties.Add(entry.Key, entry.Value);
+            }
+        }
 
 		public override int TestCount
 		{
-			get { return testCase.TestCount; }
+			get { return test.TestCount; }
 		}
 	}
 }
diff --git a/src/NUnitCore/core/AssemblyHelper.cs b/src/NUnitCore/core/AssemblyHelper.cs
new file mode 100644
index 0000000..fd21350
--- /dev/null
+++ b/src/NUnitCore/core/AssemblyHelper.cs
@@ -0,0 +1,45 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Reflection;
+
+namespace NUnit.Core
+{
+    public class AssemblyHelper
+    {
+        #region GetAssemblyPath
+
+        public static string GetAssemblyPath(Type type)
+        {
+            return GetAssemblyPath(type.Assembly);
+        }
+
+        public static string GetAssemblyPath(Assembly assembly)
+        {
+            string path = assembly.CodeBase;
+            Uri uri = new Uri(path);
+
+            // If it wasn't loaded locally, use the Location
+            if (!uri.IsFile)
+                return assembly.Location;
+
+            if (uri.IsUnc)
+                return path.Substring(Uri.UriSchemeFile.Length + 1);
+
+            return uri.LocalPath;
+        }
+
+        #endregion
+
+        #region GetDirectoryName
+        public static string GetDirectoryName( Assembly assembly )
+        {
+            return System.IO.Path.GetDirectoryName(GetAssemblyPath(assembly));
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/core/AssemblyInfo.cs b/src/NUnitCore/core/AssemblyInfo.cs
index 43368f7..ebc2192 100644
--- a/src/NUnitCore/core/AssemblyInfo.cs
+++ b/src/NUnitCore/core/AssemblyInfo.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 using System;
 using System.Reflection;
@@ -9,5 +9,5 @@ using System.Reflection;
 [assembly: CLSCompliant(true)]
 
 [assembly: AssemblyDelaySign(false)]
-[assembly: AssemblyKeyFile("../../../../nunit.snk")]
+[assembly: AssemblyKeyFile("../../nunit.snk")]
 [assembly: AssemblyKeyName("")]
diff --git a/src/NUnitCore/core/AssemblyReader.cs b/src/NUnitCore/core/AssemblyReader.cs
index ef85499..d44d898 100644
--- a/src/NUnitCore/core/AssemblyReader.cs
+++ b/src/NUnitCore/core/AssemblyReader.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 using System;
 using System.Reflection;
@@ -20,9 +20,11 @@ namespace NUnit.Core
 		private FileStream fs;
 
 		UInt16 dos_magic = 0xffff;
-		uint pe_signature = 0xffffffff;
-		UInt16 numDataSections;
+		UInt32 pe_signature = 0xffffffff;
+		UInt16 numberOfSections;
 		UInt16 optionalHeaderSize;
+        UInt16 peType;
+        UInt32 numDataDirectoryEntries;
 
 		private uint peHeader = 0;
 		private uint fileHeader = 0;
@@ -30,14 +32,14 @@ namespace NUnit.Core
 		private uint dataDirectory = 0;
 		private uint dataSections = 0;
 
-		private struct Section
+		private struct DataSection
 		{
 			public uint virtualAddress;
 			public uint virtualSize;
 			public uint fileOffset;
 		};
 
-		private Section[] sections;
+		private DataSection[] sections;
 
 		public AssemblyReader( string assemblyPath )
 		{
@@ -47,7 +49,7 @@ namespace NUnit.Core
 
 		public AssemblyReader( Assembly assembly )
 		{
-			this.assemblyPath = TestFixtureBuilder.GetAssemblyPath( assembly );
+			this.assemblyPath = AssemblyHelper.GetAssemblyPath( assembly );
 			CalcHeaderOffsets();
 		}
 
@@ -62,20 +64,28 @@ namespace NUnit.Core
 				peHeader = rdr.ReadUInt32();
 				fileHeader = peHeader + 4;
 				optionalHeader = fileHeader + 20;
-				dataDirectory = optionalHeader + 96;
-				// dotNetDirectoryEntry = dataDirectory + 14 * 8;
+
+                fs.Position = optionalHeader;
+                peType = rdr.ReadUInt16();
+
+                dataDirectory = peType == 0x20b
+                    ? optionalHeader + 112
+                    : optionalHeader + 96;
+
+                fs.Position = dataDirectory - 4;
+                numDataDirectoryEntries = rdr.ReadUInt32();
 
 				fs.Position = peHeader;
 				pe_signature = rdr.ReadUInt32();
 				rdr.ReadUInt16(); // machine
-				numDataSections = rdr.ReadUInt16();
+				numberOfSections = rdr.ReadUInt16();
 				fs.Position += 12;
 				optionalHeaderSize = rdr.ReadUInt16();
 				dataSections = optionalHeader + optionalHeaderSize;
 
-				sections = new Section[numDataSections];
+				sections = new DataSection[numberOfSections];
 				fs.Position = dataSections;
-				for( int i = 0; i < numDataSections; i++ )
+				for( int i = 0; i < numberOfSections; i++ )
 				{
 					fs.Position += 8;
 					sections[i].virtualSize = rdr.ReadUInt32();
@@ -98,7 +108,7 @@ namespace NUnit.Core
 
 		private uint RvaToLfa( uint rva )
 		{
-			for( int i = 0; i < numDataSections; i++ )
+			for( int i = 0; i < numberOfSections; i++ )
 				if ( rva >= sections[i].virtualAddress && rva < sections[i].virtualAddress + sections[i].virtualSize )
 					return rva - sections[i].virtualAddress + sections[i].fileOffset;
 
@@ -117,38 +127,46 @@ namespace NUnit.Core
 
 		public bool IsDotNetFile
 		{
-			get { return IsValidPeFile && DataDirectoryRva(14) != 0; }
+			get { return IsValidPeFile && numDataDirectoryEntries > 14 && DataDirectoryRva(14) != 0; }
 		}
 
+        public bool Is64BitImage
+        {
+            get { return peType == 0x20b; }
+        }
+
 		public string ImageRuntimeVersion
 		{
 			get 
 			{
 				string runtimeVersion = string.Empty;
 
-				uint rva = DataDirectoryRva(14);
-				if ( rva != 0 )
-				{
-					fs.Position = RvaToLfa( rva ) + 8;
-					uint metadata = rdr.ReadUInt32();
-					fs.Position = RvaToLfa( metadata );
-					if ( rdr.ReadUInt32() == 0x424a5342 )
-					{
-						// Copy string representing runtime version
-						fs.Position += 12;
-						StringBuilder sb = new StringBuilder();
-						char c;
-						while ((c = rdr.ReadChar())!= '\0')
-							sb.Append(c);
-
-						if (sb[0] == 'v') // Last sanity check
-							runtimeVersion = sb.ToString();
-
-						// Could do fixups here for bad values in older files
-						// like 1.x86, 1.build, etc. But we are only using
-						// the major version anyway
-					}
-				}
+                if (this.IsDotNetFile)
+                {
+                    uint rva = DataDirectoryRva(14);
+                    if (rva != 0)
+                    {
+                        fs.Position = RvaToLfa(rva) + 8;
+                        uint metadata = rdr.ReadUInt32();
+                        fs.Position = RvaToLfa(metadata);
+                        if (rdr.ReadUInt32() == 0x424a5342)
+                        {
+                            // Copy string representing runtime version
+                            fs.Position += 12;
+                            StringBuilder sb = new StringBuilder();
+                            char c;
+                            while ((c = rdr.ReadChar()) != '\0')
+                                sb.Append(c);
+
+                            if (sb[0] == 'v') // Last sanity check
+                                runtimeVersion = sb.ToString();
+
+                            // Could do fixups here for bad values in older files
+                            // like 1.x86, 1.build, etc. But we are only using
+                            // the major version anyway
+                        }
+                    }
+                }
 
 				return runtimeVersion; 
 			}
diff --git a/src/NUnitCore/core/AssemblyResolver.cs b/src/NUnitCore/core/AssemblyResolver.cs
index 5785c03..dec7ac2 100644
--- a/src/NUnitCore/core/AssemblyResolver.cs
+++ b/src/NUnitCore/core/AssemblyResolver.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 namespace NUnit.Core
@@ -17,6 +17,8 @@ namespace NUnit.Core
 	/// </summary>
     public class AssemblyResolver : MarshalByRefObject, IDisposable
 	{
+		static Logger log = InternalTrace.GetLogger(typeof(AssemblyResolver));
+
 		private class AssemblyCache
 		{
 			private Hashtable _resolved = new Hashtable();
@@ -79,15 +81,13 @@ namespace NUnit.Core
 			int index = fullName.IndexOf(',');
 			if(index == -1)							// Only resolve using full name.
 			{
-				NTrace.Debug( string.Format("Not a strong name: {0}", fullName ),
-					"'AssemblyResolver'" );
+				log.Debug( string.Format("Not a strong name: {0}", fullName ) );
 				return null;
 			}
 
 			if ( _cache.Contains( fullName ) )
 			{
-				NTrace.Info( string.Format( "Resolved from Cache: {0}", fullName ), 
-					"'AssemblyResolver'" );
+				log.Info( string.Format( "Resolved from Cache: {0}", fullName ) );
 				return _cache.Resolve(fullName);
 			}
 
@@ -96,26 +96,28 @@ namespace NUnit.Core
 				foreach( string file in Directory.GetFiles( dir, "*.dll" ) )
 				{
 					string fullFile = Path.Combine( dir, file );
+                    AssemblyReader rdr = new AssemblyReader(fullFile);
 					try
 					{
-						if ( AssemblyName.GetAssemblyName( fullFile ).FullName == fullName )
-						{
-							NTrace.Info( string.Format( "Added to Cache: {0}", fullFile ), 
-								"'AssemblyResolver'" );
-							AddFile( fullFile );
-							return _cache.Resolve( fullName );
-						}
+                        if (rdr.IsDotNetFile)
+                        {
+                            if (AssemblyName.GetAssemblyName(fullFile).FullName == fullName)
+                            {
+                                log.Info(string.Format("Added to Cache: {0}", fullFile));
+                                AddFile(fullFile);
+                                return _cache.Resolve(fullName);
+                            }
+                        }
 					}
-					catch
+					catch(Exception ex)
 					{
-						// Keep going if there's a bad assembly
-						NTrace.Debug( string.Format( "Bad assembly: {0}", fullFile  ), "AssemblyResolver");
+                        log.Error( "Unable to load addin assembly", ex );
+                        throw;
 					}
 				}
 			}
 
-			NTrace.Debug( string.Format( "Not in Cache: {0}", fullName), 
-				"'AssemblyResolver'");
+			log.Debug( string.Format( "Not in Cache: {0}", fullName) ); 
 			return null;
 		}
 	}
diff --git a/src/NUnitCore/core/Builders/AbstractFixtureBuilder.cs b/src/NUnitCore/core/Builders/AbstractFixtureBuilder.cs
deleted file mode 100644
index a546bba..0000000
--- a/src/NUnitCore/core/Builders/AbstractFixtureBuilder.cs
+++ /dev/null
@@ -1,201 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.Reflection;
-
-namespace NUnit.Core.Builders
-{
-	/// <summary>
-	/// AbstractFixtureBuilder may serve as a base class for 
-	/// implementing a suite builder. It provides a templated
-	/// implementation of the BuildFrom method as well as a 
-	/// number of useful methods that derived classes may use.
-	/// </summary>
-	public abstract class AbstractFixtureBuilder : Extensibility.ISuiteBuilder
-	{
-		#region Instance Fields
-		/// <summary>
-		/// The TestSuite being constructed;
-		/// </summary>
-		protected TestSuite suite;
-
-		/// <summary>
-		/// The fixture builder's own test case builder collection 
-		/// </summary>
-		protected Extensibility.TestCaseBuilderCollection testCaseBuilders = 
-			new Extensibility.TestCaseBuilderCollection(CoreExtensions.Host);
-		#endregion
-
-		#region Abstract Methods
-		/// <summary>
-		/// Examine the type and determine if it is suitable for
-		/// this builder to use in building a TestSuite.
-		/// 
-		/// Note that returning false will cause the type to be ignored 
-		/// in loading the tests. If it is desired to load the suite
-		/// but label it as non-runnable, ignored, etc., then this
-		/// method must return true.
-		/// </summary>
-		/// <param name="type">The type of the fixture to be used</param>
-		/// <returns>True if the type can be used to build a TestSuite</returns>
-		public abstract bool CanBuildFrom(Type type);
-
-		/// <summary>
-		/// Method that actually creates a new TestSuite object
-		/// 
-		/// Derived classes must override this method.
-		/// </summary>
-		/// <param name="type">The user fixture type</param>
-		/// <returns></returns>
-		protected abstract TestSuite MakeSuite( Type type );
-		#endregion
-
-		#region Virtual Methods
-		/// <summary>
-		/// Templated implementaton of ISuiteBuilder.BuildFrom. Any
-		/// derived builder may choose to override this method in
-		/// it's entirety or to let it stand and override some of
-		/// the virtual methods that it calls.
-		/// </summary>
-		/// <param name="type"></param>
-		/// <returns></returns>
-		public virtual Test BuildFrom(Type type)
-		{
-			this.suite = MakeSuite(type);
-
-			SetTestSuiteProperties(type, suite);
-
-			AddTestCases(type);
-
-			if ( this.suite.RunState != RunState.NotRunnable && this.suite.TestCount == 0)
-			{
-				this.suite.RunState = RunState.NotRunnable;
-				this.suite.IgnoreReason = suite.TestName.Name + " does not have any tests";
-			}
-
-			return this.suite;
-		}
-
-		/// <summary>
-		/// Method that sets properties of the test suite based on the
-		/// information in the provided Type.
-		/// 
-		/// Derived classes normally override this method and should
-		/// call the base method or include equivalent code.
-		/// </summary>
-		/// <param name="type">The type to examine</param>
-		/// <param name="suite">The test suite being constructed</param>
-		protected virtual void SetTestSuiteProperties( Type type, TestSuite suite )
-		{
-			string reason = null;
-			if (!IsValidFixtureType(type, ref reason) )
-			{
-				this.suite.RunState = RunState.NotRunnable;
-				this.suite.IgnoreReason = reason;
-			}
-		}
-
-		/// <summary>
-		/// Virtual method that returns true if the fixture type is valid
-		/// for use by the builder. If not, it returns false and sets
-		/// reason to an appropriate message. As implemented in this class,
-		/// the method checks that a default constructor is available. You
-		/// may override this method in a derived class in order to make 
-		/// different or additional checks.
-		/// </summary>
-		/// <param name="fixtureType">The fixture type</param>
-		/// <param name="reason">The reason this fixture is not valid</param>
-		/// <returns>True if the fixture type is valid, false if not</returns>
-		protected virtual bool IsValidFixtureType( Type fixtureType, ref string reason )
-		{
-            if (fixtureType.IsAbstract)
-            {
-                reason = string.Format("{0} is an abstract class", fixtureType.FullName);
-                return false;
-            }
-
-            if (Reflect.GetConstructor(fixtureType) == null)
-			{
-				reason = string.Format( "{0} does not have a valid constructor", fixtureType.FullName );
-				return false;
-			}
-
-			return true;
-		}
-
-		/// <summary>
-		/// Method to add test cases to the newly constructed suite.
-		/// The default implementation looks at each candidate method
-		/// and tries to build a test case from it. It will only need
-		/// to be overridden if some other approach, such as reading a 
-		/// datafile is used to generate test cases.
-		/// </summary>
-		/// <param name="fixtureType"></param>
-		protected virtual void AddTestCases( Type fixtureType )
-		{
-			IList methods = GetCandidateTestMethods( fixtureType );
-			foreach(MethodInfo method in methods)
-			{
-				Test test = BuildTestCase(method);
-
-				if(test != null)
-				{
-					this.suite.Add( test );
-				}
-			}
-		}
-
-		/// <summary>
-		/// Method to create a test case from a MethodInfo and add
-		/// it to the suite being built. It first checks to see if
-		/// any global TestCaseBuilder addin wants to build the
-		/// test case. If not, it uses the internal builder
-		/// collection maintained by this fixture builder. After
-		/// building the test case, it applies any decorators
-		/// that have been installed.
-		/// 
-		/// The default implementation has no test case builders.
-		/// Derived classes should add builders to the collection
-		/// in their constructor.
-		/// </summary>
-		/// <param name="method"></param>
-		/// <returns></returns>
-		protected virtual Test BuildTestCase( MethodInfo method )
-		{
-			// TODO: Review order of using builders
-			Test test = CoreExtensions.Host.TestBuilders.BuildFrom( method );
-
-			if ( test == null && this.testCaseBuilders.CanBuildFrom( method ) )
-				test = this.testCaseBuilders.BuildFrom( method );
-
-			if ( test != null )
-				test = CoreExtensions.Host.TestDecorators.Decorate( test, method );
-
-			return test;
-		}
-
-		/// <summary>
-		/// Method to return all methods in a fixture that should be examined
-		/// to see if they are test methods. The default returns all methods
-		/// of the fixture: public and private, instance and static, declared
-		/// and inherited.
-        /// 
-        /// While this method may be overridden, it should normally not be.
-        /// If it is overridden to eliminate certain methods, they will be
-        /// silently ignored. Generally, it is better to include them in the
-        /// list and let the TestCaseBuilders decide how to handle them.
-		/// </summary>
-		/// <param name="fixtureType"></param>
-		/// <returns></returns>
-		protected IList GetCandidateTestMethods( Type fixtureType )
-		{
-			return fixtureType.GetMethods( BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static );
-		}
-		#endregion
-	}
-}
diff --git a/src/NUnitCore/core/Builders/AbstractTestCaseBuilder.cs b/src/NUnitCore/core/Builders/AbstractTestCaseBuilder.cs
deleted file mode 100644
index 7e22b67..0000000
--- a/src/NUnitCore/core/Builders/AbstractTestCaseBuilder.cs
+++ /dev/null
@@ -1,105 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-using System.Reflection;
-
-namespace NUnit.Core.Builders
-{
-	/// <summary>
-	/// AbstractTestCaseBuilder may serve as a base class for 
-	/// implementing a test case builder. It provides a templated
-	/// implementation of the BuildFrom method.
-	/// 
-	/// Developers of extended test cases may choose to inherit
-	/// from this class, although NUnitTestCaseBuilder will 
-	/// probably be more useful if the extension is intended
-	/// to work like an NUnit test case. 
-	/// </summary>
-	public abstract class AbstractTestCaseBuilder : Extensibility.ITestCaseBuilder
-	{
-		#region Instance Fields
-		protected int runnerID;
-		protected TestCase testCase;
-		#endregion
-
-		#region Abstract Methods
-		/// <summary>
-		/// Examine the method and determine if it is suitable for
-		/// this builder to use in building a TestCase.
-		/// 
-		/// Note that returning false will cause the method to be ignored 
-		/// in loading the tests. If it is desired to load the method
-		/// but label it as non-runnable, ignored, etc., then this
-		/// method must return true.
-		/// 
-		/// Derived classes must override this method.
-		/// </summary>
-		/// <param name="method">The test method to examine</param>
-		/// <returns>True is the builder can use this method</returns>
-		public abstract bool CanBuildFrom(System.Reflection.MethodInfo method);
-
-		/// <summary>
-		/// Method that actually creates a new test case object.
-		/// 
-		/// Derived classes must override this method.
-		/// </summary>
-		/// <param name="method">The test method to examine</param>
-		/// <returns>An object derived from TestCase</returns>
-		protected abstract TestCase MakeTestCase( MethodInfo method );
-
-		/// <summary>
-		/// Method that sets properties of the test case based on the
-		/// information in the provided MethodInfo.
-		/// 
-		/// Derived classes must override this method.
-		/// </summary>
-		/// <param name="method">The test method to examine</param>
-		/// <param name="testCase">The test case being constructed</param>
-		protected abstract void SetTestProperties( MethodInfo method, TestCase testCase );
-		#endregion
-
-		#region Virtual Methods
-		/// <summary>
-		/// Templated implementaton of ITestCaseBuilder.BuildFrom. 
-		/// 
-		/// Any derived builder may choose to override this method in
-		/// it's entirety or to let it stand and override some of
-		/// the virtual methods that it calls.
-		/// </summary>
-		/// <param name="method">The method for which a test case is to be built</param>
-		/// <returns>A TestCase or null</returns>
-		public virtual Test BuildFrom(System.Reflection.MethodInfo method)
-		{
-			if ( !HasValidTestCaseSignature( method ) )
-				return new NotRunnableTestCase( method );
-
-			TestCase testCase = MakeTestCase( method );
-			if ( testCase != null )
-				SetTestProperties( method , testCase );
-
-			return testCase;
-		}
-		
-		/// <summary>
-		/// Virtual method that checks the signature of a potential test case to
-		/// determine if it is valid. The default implementation requires methods
-		/// to be public, non-abstract instance methods, taking no parameters and
-		/// returning void. Methods not meeting these criteria will be marked by
-		/// NUnit as non-runnable.
-		/// </summary>
-		/// <param name="method">The method to be checked</param>
-		/// <returns>True if the method signature is valid, false if not</returns>
-		protected virtual bool HasValidTestCaseSignature( MethodInfo method )
-		{
-			return !method.IsStatic
-				&& !method.IsAbstract
-				&& method.IsPublic
-				&& method.GetParameters().Length == 0
-				&& method.ReturnType.Equals(typeof(void) );
-		}
-		#endregion
-	}
-}
diff --git a/src/NUnitCore/core/Builders/CombinatorialStrategy.cs b/src/NUnitCore/core/Builders/CombinatorialStrategy.cs
new file mode 100644
index 0000000..9d009c2
--- /dev/null
+++ b/src/NUnitCore/core/Builders/CombinatorialStrategy.cs
@@ -0,0 +1,60 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Reflection;
+using NUnit.Core.Extensibility;
+#if NET_2_0
+using System.Collections.Generic;
+#endif
+
+namespace NUnit.Core.Builders
+{
+    public class CombinatorialStrategy : CombiningStrategy
+    {
+        public CombinatorialStrategy(IEnumerable[] sources) : base(sources) { }
+
+        public override IEnumerable GetTestCases()
+        {
+            IEnumerator[] enumerators = new IEnumerator[Sources.Length];
+            int index = -1;
+
+#if NET_2_0
+            List<ParameterSet> testCases = new List<ParameterSet>();
+#else
+			ArrayList testCases = new ArrayList();
+#endif
+
+            for (; ; )
+            {
+                while (++index < Sources.Length)
+                {
+                    enumerators[index] = Sources[index].GetEnumerator();
+                    if (!enumerators[index].MoveNext())
+						return testCases;
+                }
+
+                object[] testdata = new object[Sources.Length];
+
+                for (int i = 0; i < Sources.Length; i++)
+                    testdata[i] = enumerators[i].Current;
+
+                ParameterSet testCase = new ParameterSet();
+                testCase.Arguments = testdata;
+				testCases.Add(testCase);
+
+                index = Sources.Length;
+
+                while (--index >= 0 && !enumerators[index].MoveNext()) ;
+
+                if (index < 0) break;
+            }
+
+			return testCases;
+        }
+    }
+}
diff --git a/src/NUnitCore/core/Builders/CombinatorialTestCaseProvider.cs b/src/NUnitCore/core/Builders/CombinatorialTestCaseProvider.cs
new file mode 100644
index 0000000..5069d8e
--- /dev/null
+++ b/src/NUnitCore/core/Builders/CombinatorialTestCaseProvider.cs
@@ -0,0 +1,75 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Reflection;
+using System.Collections;
+using NUnit.Core.Extensibility;
+
+namespace NUnit.Core.Builders
+{
+    public class CombinatorialTestCaseProvider : ITestCaseProvider2
+    {
+        #region Static Members
+        static IDataPointProvider2 dataPointProvider =
+            (IDataPointProvider2)CoreExtensions.Host.GetExtensionPoint("DataPointProviders");
+
+        //static readonly string CombinatorialAttribute = "NUnit.Framework.CombinatorialAttribute";
+        static readonly string PairwiseAttribute = "NUnit.Framework.PairwiseAttribute";
+        static readonly string SequentialAttribute = "NUnit.Framework.SequentialAttribute";
+        #endregion
+
+        #region ITestCaseProvider Members
+        public bool HasTestCasesFor(System.Reflection.MethodInfo method)
+        {
+            if (method.GetParameters().Length == 0)
+                return false;
+
+            foreach (ParameterInfo parameter in method.GetParameters())
+                if (!dataPointProvider.HasDataFor(parameter))
+                    return false;
+
+            return true;
+        }
+
+        public IEnumerable GetTestCasesFor(MethodInfo method)
+        {
+            return GetStrategy(method, null).GetTestCases();
+        }
+        #endregion
+
+        #region ITestCaseProvider2 Members
+        public bool HasTestCasesFor(System.Reflection.MethodInfo method, Test suite)
+        {
+            return HasTestCasesFor(method);
+        }
+
+        public IEnumerable GetTestCasesFor(MethodInfo method, Test suite)
+        {
+            return GetStrategy(method, suite).GetTestCases();
+        }
+        #endregion
+
+        #region GetStrategy
+        private CombiningStrategy GetStrategy(MethodInfo method, Test suite)
+        {
+            ParameterInfo[] parameters = method.GetParameters();
+            IEnumerable[] sources = new IEnumerable[parameters.Length];
+            for (int i = 0; i < parameters.Length; i++)
+                sources[i] = dataPointProvider.GetDataFor(parameters[i], suite);
+
+            if (Reflect.HasAttribute(method, SequentialAttribute, false))
+                return new SequentialStrategy(sources);
+
+            if (Reflect.HasAttribute(method, PairwiseAttribute, false) &&
+                method.GetParameters().Length > 2)
+                    return new PairwiseStrategy(sources);
+
+            return new CombinatorialStrategy(sources);
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/core/Builders/CombiningStrategy.cs b/src/NUnitCore/core/Builders/CombiningStrategy.cs
new file mode 100644
index 0000000..40214eb
--- /dev/null
+++ b/src/NUnitCore/core/Builders/CombiningStrategy.cs
@@ -0,0 +1,49 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Reflection;
+using NUnit.Core.Extensibility;
+
+namespace NUnit.Core.Builders
+{
+    public abstract class CombiningStrategy
+    {
+        protected IDataPointProvider dataPointProvider =
+            (IDataPointProvider)CoreExtensions.Host.GetExtensionPoint("DataPointProviders");
+
+        private IEnumerable[] sources;
+        private IEnumerator[] enumerators;
+
+        public CombiningStrategy(IEnumerable[] sources)
+        {
+            this.sources = sources;
+        }
+
+        public IEnumerable[] Sources
+        {
+            get { return sources; }
+        }
+
+        public IEnumerator[] Enumerators
+        {
+            get
+            {
+                if (enumerators == null)
+                {
+                    enumerators = new IEnumerator[Sources.Length];
+                    for (int i = 0; i < Sources.Length; i++)
+                        enumerators[i] = Sources[i].GetEnumerator();
+                }
+
+                return enumerators;
+            }
+        }
+
+        public abstract IEnumerable GetTestCases();
+    }
+}
diff --git a/src/NUnitCore/core/Builders/DatapointProvider.cs b/src/NUnitCore/core/Builders/DatapointProvider.cs
new file mode 100644
index 0000000..f88c04e
--- /dev/null
+++ b/src/NUnitCore/core/Builders/DatapointProvider.cs
@@ -0,0 +1,151 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Reflection;
+using System.Collections;
+using NUnit.Core.Extensibility;
+
+namespace NUnit.Core.Builders
+{
+    /// <summary>
+    /// Provides data from fields marked with the DatapointAttribute or the
+    /// DatapointsAttribute.
+    /// </summary>
+    public class DatapointProvider : IDataPointProvider
+    {
+        private static readonly string DatapointAttribute = "NUnit.Framework.DatapointAttribute";
+        private static readonly string DatapointsAttribute = "NUnit.Framework.DatapointsAttribute";
+
+        #region IDataPointProvider Members
+
+        public bool HasDataFor(System.Reflection.ParameterInfo parameter)
+        {
+            Type parameterType = parameter.ParameterType;
+            MemberInfo method = parameter.Member;
+            Type fixtureType = method.ReflectedType;
+
+            if (!Reflect.HasAttribute(method, NUnitFramework.TheoryAttribute, true))
+                return false;
+
+            if (parameterType == typeof(bool) || parameterType.IsEnum)
+                return true;
+
+            foreach (MemberInfo member in fixtureType.GetMembers(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance))
+            {
+                if (Reflect.HasAttribute(member, DatapointAttribute, true) &&
+                    GetTypeFromMemberInfo(member) == parameterType)
+                        return true;
+                else if (Reflect.HasAttribute(member, DatapointsAttribute, true) &&
+                    GetElementTypeFromMemberInfo(member) == parameterType)
+                        return true;
+            }
+
+            return false;
+        }
+
+        public System.Collections.IEnumerable GetDataFor(System.Reflection.ParameterInfo parameter)
+        {
+            ArrayList datapoints = new ArrayList();
+
+            Type parameterType = parameter.ParameterType;
+            Type fixtureType = parameter.Member.ReflectedType;
+
+            foreach (MemberInfo member in fixtureType.GetMembers(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance))
+            {
+                if (Reflect.HasAttribute(member, DatapointAttribute, true))
+                {
+                    if (GetTypeFromMemberInfo(member) == parameterType &&
+                        member.MemberType == MemberTypes.Field)
+                    {
+                        FieldInfo field = member as FieldInfo;
+                        if (field.IsStatic)
+                            datapoints.Add(field.GetValue(null));
+                        else
+                            datapoints.Add(field.GetValue(ProviderCache.GetInstanceOf(fixtureType)));
+                    }
+                }
+                else if (Reflect.HasAttribute(member, DatapointsAttribute, true))
+                {
+                    if (GetElementTypeFromMemberInfo(member) == parameterType)
+                    {
+                        object instance;
+
+                        switch(member.MemberType)
+                        {
+                            case MemberTypes.Field:
+                                FieldInfo field = member as FieldInfo;
+                                instance = field.IsStatic ? null : ProviderCache.GetInstanceOf(fixtureType);
+                                datapoints.AddRange((ICollection)field.GetValue(instance));
+                                break;
+                            case MemberTypes.Property:
+                                PropertyInfo property = member as PropertyInfo;
+                                MethodInfo getMethod = property.GetGetMethod(true);
+                                instance = getMethod.IsStatic ? null : ProviderCache.GetInstanceOf(fixtureType);
+                                datapoints.AddRange((ICollection)property.GetValue(instance,null));
+                                break;
+                            case MemberTypes.Method:
+                                MethodInfo method = member as MethodInfo;
+                                instance = method.IsStatic ? null : ProviderCache.GetInstanceOf(fixtureType);
+                                datapoints.AddRange((ICollection)method.Invoke(instance, Type.EmptyTypes));
+                                break;
+                        }
+                    }
+                }
+            }
+
+            if (datapoints.Count == 0)
+            {
+                if (parameterType == typeof(bool))
+                {
+                    datapoints.Add(true);
+                    datapoints.Add(false);
+                }
+                else if (parameterType.IsEnum)
+                {
+                    datapoints.AddRange(System.Enum.GetValues(parameterType));
+                }
+            }
+
+            return datapoints;
+        }
+
+        private Type GetTypeFromMemberInfo(MemberInfo member)
+        {
+            switch (member.MemberType)
+            {
+                case MemberTypes.Field:
+                    return ((FieldInfo)member).FieldType;
+                case MemberTypes.Property:
+                    return ((PropertyInfo)member).PropertyType;
+                case MemberTypes.Method:
+                    return ((MethodInfo)member).ReturnType;
+                default:
+                    return null;
+            }
+        }
+
+        private Type GetElementTypeFromMemberInfo(MemberInfo member)
+        {
+            Type type = GetTypeFromMemberInfo(member);
+
+            if (type == null)
+                return null;
+
+            if (type.IsArray)
+                return type.GetElementType();
+
+#if NET_2_0
+            if (type.IsGenericType && type.Name == "IEnumerable`1")
+                return type.GetGenericArguments()[0];
+#endif
+
+            return null;
+        }
+
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/core/Builders/InlineDataPointProvider.cs b/src/NUnitCore/core/Builders/InlineDataPointProvider.cs
new file mode 100644
index 0000000..9a8498f
--- /dev/null
+++ b/src/NUnitCore/core/Builders/InlineDataPointProvider.cs
@@ -0,0 +1,40 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Reflection;
+using System.Collections;
+using NUnit.Core.Extensibility;
+
+namespace NUnit.Core.Builders
+{
+    public class InlineDataPointProvider : IDataPointProvider
+    {
+        private static readonly string ParameterDataAttribute = "NUnit.Framework.ParameterDataAttribute";
+
+        private static readonly string GetDataMethod = "GetData";
+
+        #region IDataPointProvider Members
+
+        public bool HasDataFor(ParameterInfo parameter)
+        {
+            return Reflect.HasAttribute(parameter, ParameterDataAttribute, false);
+        }
+                public IEnumerable GetDataFor(ParameterInfo parameter)
+        {
+            Attribute attr = Reflect.GetAttribute(parameter, ParameterDataAttribute, false);
+            if (attr == null) return null;
+
+            MethodInfo getData = attr.GetType().GetMethod(
+                GetDataMethod,
+                new Type[] { typeof(ParameterInfo) });
+            if ( getData == null) return null;
+            
+            return getData.Invoke(attr, new object[] { parameter }) as IEnumerable;
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/core/Builders/LegacySuiteBuilder.cs b/src/NUnitCore/core/Builders/LegacySuiteBuilder.cs
index 4255a91..9bf711a 100644
--- a/src/NUnitCore/core/Builders/LegacySuiteBuilder.cs
+++ b/src/NUnitCore/core/Builders/LegacySuiteBuilder.cs
@@ -1,10 +1,12 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
+using System.Collections;
+using System.Reflection;
 
 namespace NUnit.Core.Builders
 {
@@ -12,15 +14,108 @@ namespace NUnit.Core.Builders
 	/// Built-in SuiteBuilder for LegacySuite
 	/// </summary>
 	public class LegacySuiteBuilder : Extensibility.ISuiteBuilder
-	{
-		public bool CanBuildFrom( Type type )
+    {
+        #region ISuiteBuilderMembers
+        /// <summary>
+        /// Checks to see if the fixture type has the a property
+        /// with the SuiteAttribute.
+        /// </summary>
+        /// <param name="type">The fixture type to check</param>
+        /// <returns>True if the fixture can be built, false if not</returns>
+        public bool CanBuildFrom(Type type)
 		{
-			return LegacySuite.GetSuiteProperty( type ) != null;
+			return GetSuiteProperty( type ) != null;
 		}
 
 		public Test BuildFrom( Type type )
 		{
-			return new LegacySuite( type );
-		}
-	}
+            TestSuite suite = new LegacySuite( type );
+
+            string reason = null;
+            if (!IsValidFixtureType(type, ref reason))
+            {
+                suite.RunState = RunState.NotRunnable;
+                suite.IgnoreReason = reason;
+            }
+
+            PropertyInfo suiteProperty = GetSuiteProperty(type);
+            MethodInfo method = suiteProperty.GetGetMethod(true);
+
+            if (method.GetParameters().Length > 0)
+            {
+                suite.RunState = RunState.NotRunnable;
+                suite.IgnoreReason = "Suite property may not be indexed";
+            }
+            else if (method.ReturnType.FullName == "NUnit.Core.TestSuite")
+            {
+                TestSuite s = (TestSuite)suiteProperty.GetValue(null, new Object[0]);
+                foreach (Test test in s.Tests)
+                    suite.Add(test);
+            }
+            else if (typeof(IEnumerable).IsAssignableFrom(method.ReturnType))
+            {
+                foreach (object obj in (IEnumerable)suiteProperty.GetValue(null, new object[0]))
+                {
+                    Type objType = obj as Type;
+                    if (objType != null && TestFixtureBuilder.CanBuildFrom(objType))
+                        suite.Add(TestFixtureBuilder.BuildFrom(objType));
+                    else
+                        suite.Add(obj);
+                }
+            }
+            else
+            {
+                suite.RunState = RunState.NotRunnable;
+                suite.IgnoreReason = "Suite property must return either TestSuite or IEnumerable";
+            }
+
+            return suite;
+        }
+        #endregion
+
+        #region Helper Methods
+        private bool IsValidFixtureType(Type type, ref string reason)
+        {
+            if (type.IsAbstract)
+            {
+                reason = string.Format("{0} is an abstract class", type.FullName);
+                return false;
+            }
+
+            if (Reflect.GetConstructor(type) == null)
+            {
+                reason = string.Format("{0} does not have a valid constructor", type.FullName);
+                return false;
+            }
+
+            if (!NUnitFramework.CheckSetUpTearDownMethods(type, NUnitFramework.FixtureSetUpAttribute, ref reason) )
+                return false;
+            
+            if (!NUnitFramework.CheckSetUpTearDownMethods(type, NUnitFramework.FixtureTearDownAttribute, ref reason))
+                return false;
+
+            if (Reflect.HasMethodWithAttribute(type, NUnitFramework.SetUpAttribute, true))
+            {
+                reason = "SetUp method not allowed on a legacy suite";
+                return false;
+            }
+
+            if (Reflect.HasMethodWithAttribute(type, NUnitFramework.TearDownAttribute, true))
+            {
+                reason = "TearDown method not allowed on a legacy suite";
+                return false;
+            }
+
+            return true;
+        }
+
+        public static PropertyInfo GetSuiteProperty(Type testClass)
+        {
+            //if (testClass == null)
+            //    return null;
+
+            return Reflect.GetPropertyWithAttribute(testClass, NUnitFramework.SuiteAttribute);
+        }
+        #endregion
+    }
 }
diff --git a/src/NUnitCore/core/Builders/MultiCultureDecorator.cs b/src/NUnitCore/core/Builders/MultiCultureDecorator.cs
deleted file mode 100644
index 1b7a57e..0000000
--- a/src/NUnitCore/core/Builders/MultiCultureDecorator.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using System;
-using System.Reflection;
-
-namespace NUnit.Core.Builders
-{
-    public class MultiCultureDecorator : Extensibility.ITestDecorator
-    {
-        public Test Decorate(Test test, MemberInfo member)
-        {
-            Attribute attr = Reflect.GetAttribute( member, "NUnit.Framework.MultiCultureAttribute", true );
-            if (attr == null) return test;
-            
-            string cultures = Reflect.GetPropertyValue( attr, "Cultures" ) as string;
-            if ( cultures == null ) return test;
-
-            return new MultiCultureTestSuite(test, cultures);
-        }
-    }
-}
diff --git a/src/NUnitCore/core/Builders/NUnitTestCaseBuilder.cs b/src/NUnitCore/core/Builders/NUnitTestCaseBuilder.cs
index 4fa6af0..5bb8c68 100644
--- a/src/NUnitCore/core/Builders/NUnitTestCaseBuilder.cs
+++ b/src/NUnitCore/core/Builders/NUnitTestCaseBuilder.cs
@@ -1,76 +1,390 @@
 // ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 
 using System;
 using System.Reflection;
-using System.Collections;
-using System.Collections.Specialized;
-using System.Text.RegularExpressions;
-using System.Configuration;
-using System.Diagnostics;
+using NUnit.Core.Extensibility;
 
 namespace NUnit.Core.Builders
 {
-	public class NUnitTestCaseBuilder : AbstractTestCaseBuilder
+    /// <summary>
+    /// Class to build ether a parameterized or a normal NUnitTestMethod.
+    /// There are four cases that the builder must deal with:
+    ///   1. The method needs no params and none are provided
+    ///   2. The method needs params and they are provided
+    ///   3. The method needs no params but they are provided in error
+    ///   4. The method needs params but they are not provided
+    /// This could have been done using two different builders, but it
+    /// turned out to be simpler to have just one. The BuildFrom method
+    /// takes a different branch depending on whether any parameters are
+    /// provided, but all four cases are dealt with in lower-level methods
+    /// </summary>
+    public class NUnitTestCaseBuilder : ITestCaseBuilder2
 	{
-		private bool allowOldStyleTests = NUnitFramework.AllowOldStyleTests;
+        private readonly bool allowOldStyleTests = NUnitConfiguration.AllowOldStyleTests;
+
+        #region ITestCaseBuilder Methods
+        /// <summary>
+        /// Determines if the method can be used to build an NUnit test
+        /// test method of some kind. The method must normally be marked
+        /// with an identifying attriute for this to be true. If the test
+        /// config file sets AllowOldStyleTests to true, then any method beginning 
+        /// "test..." (case-insensitive) is treated as a test unless 
+        /// it is also marked as a setup or teardown method.
+        /// 
+        /// Note that this method does not check that the signature
+        /// of the method for validity. If we did that here, any
+        /// test methods with invalid signatures would be passed
+        /// over in silence in the test run. Since we want such
+        /// methods to be reported, the check for validity is made
+        /// in BuildFrom rather than here.
+        /// </summary>
+        /// <param name="method">A MethodInfo for the method being used as a test method</param>
+        /// <param name="suite">The test suite being built, to which the new test would be added</param>
+        /// <returns>True if the builder can create a test case from this method</returns>
+        public bool CanBuildFrom(MethodInfo method)
+        {
+            return Reflect.HasAttribute(method, NUnitFramework.TestAttribute, false)
+                || Reflect.HasAttribute(method, NUnitFramework.TestCaseAttribute, false)
+                || Reflect.HasAttribute(method, NUnitFramework.TestCaseSourceAttribute, false)
+                || Reflect.HasAttribute(method, NUnitFramework.TheoryAttribute, false)
+                || allowOldStyleTests && method.Name.ToLower().StartsWith("test")
+                && !Reflect.HasAttribute(method, NUnitFramework.SetUpAttribute, true)
+                && !Reflect.HasAttribute(method, NUnitFramework.TearDownAttribute, true)
+                && !Reflect.HasAttribute(method, NUnitFramework.FixtureSetUpAttribute, true)
+                && !Reflect.HasAttribute(method, NUnitFramework.FixtureTearDownAttribute, true);
+        }
 
-        #region AbstractTestCaseBuilder Overrides
 		/// <summary>
-		/// Determine if the method is an NUnit test method.
-		/// The method must normally be marked with the test
-		/// attribute for this to be true. If the test config
-		/// file sets AllowOldStyleTests to true, then any 
-		/// method beginning "test..." (case-insensitive)
-		/// is treated as a test unless it is also marked
-		/// as a setup or teardown method.
-		/// </summary>
-		/// <param name="method">A MethodInfo for the method being used as a test method</param>
-		/// <returns>True if the builder can create a test case from this method</returns>
-        public override bool CanBuildFrom(MethodInfo method)
+        /// Build a Test from the provided MethodInfo. Depending on
+        /// whether the method takes arguments and on the availability
+        /// of test case data, this method may return a single test
+        /// or a group of tests contained in a ParameterizedMethodSuite.
+        /// </summary>
+        /// <param name="method">The MethodInfo for which a test is to be built</param>
+        /// <param name="suite">The test fixture being populated, or null</param>
+        /// <returns>A Test representing one or more method invocations</returns>
+        public Test BuildFrom(MethodInfo method)
+		{
+            return BuildFrom(method, null);
+        }
+
+        #region ITestCaseBuilder2 Members
+
+        public bool CanBuildFrom(MethodInfo method, Test parentSuite)
+        {
+            return CanBuildFrom(method);
+        }
+
+        public Test BuildFrom(MethodInfo method, Test parentSuite)
+        {
+            return CoreExtensions.Host.TestCaseProviders.HasTestCasesFor(method)
+                ? BuildParameterizedMethodSuite(method, parentSuite)
+                : BuildSingleTestMethod(method, parentSuite, null);
+        }
+
+        #endregion
+
+        /// <summary>
+        /// Builds a ParameterizedMetodSuite containing individual
+        /// test cases for each set of parameters provided for
+        /// this method.
+        /// </summary>
+        /// <param name="method">The MethodInfo for which a test is to be built</param>
+        /// <returns>A ParameterizedMethodSuite populated with test cases</returns>
+        public static Test BuildParameterizedMethodSuite(MethodInfo method, Test parentSuite)
         {
-            if ( Reflect.HasAttribute( method, NUnitFramework.TestAttribute, false ) )
-                return true;
+            ParameterizedMethodSuite methodSuite = new ParameterizedMethodSuite(method);
+            NUnitFramework.ApplyCommonAttributes(method, methodSuite);
 
-            if (allowOldStyleTests)
+            foreach (object source in CoreExtensions.Host.TestCaseProviders.GetTestCasesFor(method, parentSuite))
             {
-                Regex regex = new Regex("^(?i:test)");
-                if ( regex.Match(method.Name).Success 
-					&& !NUnitFramework.IsSetUpMethod( method )
-					&& !NUnitFramework.IsTearDownMethod( method )
-					&& !NUnitFramework.IsFixtureSetUpMethod( method )
-					&& !NUnitFramework.IsFixtureTearDownMethod( method ) )
-						return true;
+                ParameterSet parms;
+
+                if (source == null)
+                {
+                    parms = new ParameterSet();
+                    parms.Arguments = new object[] { null };
+                }
+                else
+                    parms = source as ParameterSet;
+
+                if (parms == null)
+                {
+                    if (source.GetType().GetInterface("NUnit.Framework.ITestCaseData") != null)
+                        parms = ParameterSet.FromDataSource(source);
+                    else
+                    {
+                        parms = new ParameterSet();
+
+                        ParameterInfo[] parameters = method.GetParameters();
+                        Type sourceType = source.GetType();
+
+                        if (parameters.Length == 1 && parameters[0].ParameterType.IsAssignableFrom(sourceType))
+                            parms.Arguments = new object[] { source };
+                        else if (source is object[])
+                            parms.Arguments = (object[])source;
+                        else if (source is Array)
+                        {
+                            Array array = (Array)source;
+                            if (array.Rank == 1)
+                            {
+                                parms.Arguments = new object[array.Length];
+                                for (int i = 0; i < array.Length; i++)
+                                    parms.Arguments[i] = (object)array.GetValue(i);
+                            }
+                        }
+                        else
+                            parms.Arguments = new object[] { source };
+                    }
+                }
+
+                TestMethod test = BuildSingleTestMethod(method, parentSuite, parms);
+
+                methodSuite.Add(test);
             }
 
-            return false;
+            return methodSuite;
         }
 
-		/// <summary>
-		/// Create an NUnitTestMethod
-		/// </summary>
-		/// <param name="method">A MethodInfo for the method being used as a test method</param>
-		/// <returns>A new NUnitTestMethod</returns>
-        protected override TestCase MakeTestCase(MethodInfo method)
+        /// <summary>
+        /// Builds a single NUnitTestMethod, either as a child of the fixture 
+        /// or as one of a set of test cases under a ParameterizedTestMethodSuite.
+        /// </summary>
+        /// <param name="method">The MethodInfo from which to construct the TestMethod</param>
+        /// <param name="parms">The ParameterSet to be used, or null</param>
+        /// <returns></returns>
+        public static NUnitTestMethod BuildSingleTestMethod(MethodInfo method, Test parentSuite, ParameterSet parms)
         {
-			return new NUnitTestMethod( method );
+            NUnitTestMethod testMethod = new NUnitTestMethod(method);
+
+            string prefix = method.ReflectedType.FullName;
+
+            if (parentSuite != null)
+            {
+                prefix = parentSuite.TestName.FullName;
+                testMethod.TestName.FullName = prefix + "." + testMethod.TestName.Name;
+            }
+
+            if (CheckTestMethodSignature(testMethod, parms))
+            {
+                if (parms == null)
+                    NUnitFramework.ApplyCommonAttributes(method, testMethod);
+                NUnitFramework.ApplyExpectedExceptionAttribute(method, testMethod);
+            }
+
+            if (parms != null)
+            {
+                // NOTE: After the call to CheckTestMethodSignature, the Method
+                // property of testMethod may no longer be the same as the
+                // original MethodInfo, so we reassign it here.
+                method = testMethod.Method;
+
+                if (parms.TestName != null)
+                {
+                    testMethod.TestName.Name = parms.TestName;
+                    testMethod.TestName.FullName = prefix + "." + parms.TestName;
+                }
+                else if (parms.OriginalArguments != null)
+                {
+                    string name = MethodHelper.GetDisplayName(method, parms.OriginalArguments);
+                    testMethod.TestName.Name = name;
+                    testMethod.TestName.FullName = prefix + "." + name;
+                }
+
+                if (parms.Ignored)
+                {
+                    testMethod.RunState = RunState.Ignored;
+                    testMethod.IgnoreReason = parms.IgnoreReason;
+                }
+
+                if (parms.ExpectedExceptionName != null)
+                    testMethod.exceptionProcessor = new ExpectedExceptionProcessor(testMethod, parms);
+
+                foreach (string key in parms.Properties.Keys)
+                    testMethod.Properties[key] = parms.Properties[key];
+
+                // Description is stored in parms.Properties
+                if (parms.Description != null)
+                    testMethod.Description = parms.Description;
+            }
+
+            if (testMethod.BuilderException != null)
+                testMethod.RunState = RunState.NotRunnable;
+
+            return testMethod;
         }
+		#endregion
 
-		/// <summary>
-		/// Set additional properties of the newly created test case based
-		/// on its attributes. As implemented, the method sets the test's
-		/// RunState,  Description, Categories and Properties.
-		/// </summary>
-		/// <param name="method">A MethodInfo for the method being used as a test method</param>
-		/// <param name="testCase">The test case being constructed</param>
-		protected override void SetTestProperties( MethodInfo method, TestCase testCase )
+        #region Helper Methods
+        /// <summary>
+        /// Helper method that checks the signature of a TestMethod and
+        /// any supplied parameters to determine if the test is valid.
+        /// 
+        /// Currently, NUnitTestMethods are required to be public, 
+        /// non-abstract methods, either static or instance,
+        /// returning void. They may take arguments but the values must
+        /// be provided or the TestMethod is not considered runnable.
+        /// 
+        /// Methods not meeting these criteria will be marked as
+        /// non-runnable and the method will return false in that case.
+        /// </summary>
+        /// <param name="testMethod">The TestMethod to be checked. If it
+        /// is found to be non-runnable, it will be modified.</param>
+        /// <param name="parms">Parameters to be used for this test, or null</param>
+        /// <returns>True if the method signature is valid, false if not</returns>
+        private static bool CheckTestMethodSignature(TestMethod testMethod, ParameterSet parms)
 		{
-            NUnitFramework.ApplyCommonAttributes( method, testCase );
-			NUnitFramework.ApplyExpectedExceptionAttribute( method, (TestMethod)testCase );
-		}
-		#endregion
+            if (testMethod.Method.IsAbstract)
+            {
+                testMethod.RunState = RunState.NotRunnable;
+                testMethod.IgnoreReason = "Method is abstract";
+                return false;
+            }
+
+            if (!testMethod.Method.IsPublic)
+            {
+                testMethod.RunState = RunState.NotRunnable;
+                testMethod.IgnoreReason = "Method is not public";
+                return false;
+            }
+
+            ParameterInfo[] parameters = testMethod.Method.GetParameters();
+            int argsNeeded = parameters.Length;
+
+            object[] arglist = null;
+            int argsProvided = 0;
+
+            if (parms != null)
+            {
+                testMethod.arguments = parms.Arguments;
+                testMethod.expectedResult = parms.Result;
+                testMethod.hasExpectedResult = parms.HasExpectedResult;
+                testMethod.RunState = parms.RunState;
+                testMethod.IgnoreReason = parms.NotRunReason;
+                testMethod.BuilderException = parms.ProviderException;
+
+                arglist = parms.Arguments;
+
+                if (arglist != null)
+                    argsProvided = arglist.Length;
+
+                if (testMethod.RunState != RunState.Runnable)
+                    return false;
+            }
+
+            if (!testMethod.Method.ReturnType.Equals(typeof(void)) &&
+                (parms == null || !parms.HasExpectedResult && parms.ExpectedExceptionName == null))
+            {
+                testMethod.RunState = RunState.NotRunnable;
+                testMethod.IgnoreReason = "Method has non-void return value";
+                return false;
+            }
+
+            if (argsProvided > 0 && argsNeeded == 0)
+            {
+                testMethod.RunState = RunState.NotRunnable;
+                testMethod.IgnoreReason = "Arguments provided for method not taking any";
+                return false;
+            }
+
+            if (argsProvided == 0 && argsNeeded > 0)
+            {
+                testMethod.RunState = RunState.NotRunnable;
+                testMethod.IgnoreReason = "No arguments were provided";
+                return false;
+            }
+
+            //if (argsProvided > argsNeeded)
+            //{
+            //    ParameterInfo lastParameter = parameters[argsNeeded - 1];
+            //    Type lastParameterType = lastParameter.ParameterType;
+
+            //    if (lastParameterType.IsArray && lastParameter.IsDefined(typeof(ParamArrayAttribute), false))
+            //    {
+            //        object[] newArglist = new object[argsNeeded];
+            //        for (int i = 0; i < argsNeeded; i++)
+            //            newArglist[i] = arglist[i];
+
+            //        int length = argsProvided - argsNeeded + 1;
+            //        Array array = Array.CreateInstance(lastParameterType.GetElementType(), length);
+            //        for (int i = 0; i < length; i++)
+            //            array.SetValue(arglist[argsNeeded + i - 1], i);
+
+            //        newArglist[argsNeeded - 1] = array;
+            //        testMethod.arguments = arglist = newArglist;
+            //        argsProvided = argsNeeded;
+            //    }
+            //}
+
+            if (argsProvided != argsNeeded )
+            {
+                testMethod.RunState = RunState.NotRunnable;
+                testMethod.IgnoreReason = "Wrong number of arguments provided";
+                return false;
+            }
+
+#if NET_2_0
+            if (testMethod.Method.IsGenericMethodDefinition)
+            {
+                Type[] typeArguments = GetTypeArgumentsForMethod(testMethod.Method, arglist);
+                foreach (object o in typeArguments)
+                    if (o == null)
+                    {
+                        testMethod.RunState = RunState.NotRunnable;
+                        testMethod.IgnoreReason = "Unable to determine type arguments for fixture";
+                        return false;
+                    }
+
+                testMethod.method = testMethod.Method.MakeGenericMethod(typeArguments);
+                parameters = testMethod.Method.GetParameters();
+
+                for (int i = 0; i < parameters.Length; i++)
+                {
+                    if (arglist[i].GetType() != parameters[i].ParameterType && arglist[i] is IConvertible)
+                    {
+                        try
+                        {
+                            arglist[i] = Convert.ChangeType(arglist[i], parameters[i].ParameterType);
+                        }
+                        catch (Exception)
+                        {
+                            // Do nothing - the incompatible argument will be reported below
+                        }
+                    }
+                }
+            }
+#endif
+
+            return true;
+        }
+
+#if NET_2_0
+        private static Type[] GetTypeArgumentsForMethod(MethodInfo method, object[] arglist)
+        {
+            Type[] typeParameters = method.GetGenericArguments();
+            Type[] typeArguments = new Type[typeParameters.Length];
+            ParameterInfo[] parameters = method.GetParameters();
+
+            for (int typeIndex = 0; typeIndex < typeArguments.Length; typeIndex++)
+            {
+                Type typeParameter = typeParameters[typeIndex];
+
+                for (int argIndex = 0; argIndex < parameters.Length; argIndex++)
+                {
+                    if (parameters[argIndex].ParameterType.Equals(typeParameter))
+                        typeArguments[typeIndex] = TypeHelper.BestCommonType(
+                            typeArguments[typeIndex],
+                            arglist[argIndex].GetType());
+                }
+            }
+
+            return typeArguments;
+        }
+#endif
+        #endregion
     }
 }
diff --git a/src/NUnitCore/core/Builders/NUnitTestFixtureBuilder.cs b/src/NUnitCore/core/Builders/NUnitTestFixtureBuilder.cs
index 1b8b346..e0b8215 100644
--- a/src/NUnitCore/core/Builders/NUnitTestFixtureBuilder.cs
+++ b/src/NUnitCore/core/Builders/NUnitTestFixtureBuilder.cs
@@ -1,129 +1,306 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
 using System.Collections;
 using System.Reflection;
 using System.Text.RegularExpressions;
+using System.Text;
 
 namespace NUnit.Core.Builders
 {
 	/// <summary>
 	/// Built-in SuiteBuilder for NUnit TestFixture
 	/// </summary>
-	public class NUnitTestFixtureBuilder : AbstractFixtureBuilder
+	public class NUnitTestFixtureBuilder : Extensibility.ISuiteBuilder
 	{
-		public NUnitTestFixtureBuilder()
+		#region Instance Fields
+		/// <summary>
+		/// The NUnitTestFixture being constructed;
+		/// </summary>
+		private NUnitTestFixture fixture;
+
+	    private Extensibility.ITestCaseBuilder2 testBuilders = CoreExtensions.Host.TestBuilders;
+
+	    private Extensibility.ITestDecorator testDecorators = CoreExtensions.Host.TestDecorators;
+
+		#endregion
+
+        #region ISuiteBuilder Methods
+        /// <summary>
+		/// Checks to see if the fixture type has the TestFixtureAttribute
+		/// </summary>
+		/// <param name="type">The fixture type to check</param>
+		/// <returns>True if the fixture can be built, false if not</returns>
+		public bool CanBuildFrom(Type type)
 		{
-			this.testCaseBuilders.Install( new NUnitTestCaseBuilder() );
+            if (type.IsAbstract && !type.IsSealed)
+                return false;
+
+			return Reflect.HasAttribute( type, NUnitFramework.TestFixtureAttribute, true ) ||
+                   Reflect.HasMethodWithAttribute(type, NUnitFramework.TestAttribute, true) ||
+                   Reflect.HasMethodWithAttribute(type, NUnitFramework.TestCaseAttribute, true) ||
+                   Reflect.HasMethodWithAttribute(type, NUnitFramework.TheoryAttribute, true);
 		}
 
-		#region AbstractFixtureBuilder Overrides
 		/// <summary>
-		/// Makes an NUnitTestFixture instance
+		/// Build a TestSuite from type provided.
 		/// </summary>
-		/// <param name="type">The type to be used</param>
-		/// <returns>An NUnitTestFixture as a TestSuite</returns>
-		protected override TestSuite MakeSuite( Type type )
+		/// <param name="type"></param>
+		/// <returns></returns>
+		public Test BuildFrom(Type type)
 		{
-			return new NUnitTestFixture( type );
+            Attribute[] attrs = GetTestFixtureAttributes(type);
+
+#if NET_2_0
+            if (type.IsGenericType)
+                return BuildMultipleFixtures(type, attrs);
+#endif
+
+            switch (attrs.Length)
+            {
+                case 0:
+                    return BuildSingleFixture(type, null);
+                case 1:
+                    object[] args = (object[])Reflect.GetPropertyValue(attrs[0], "Arguments");
+                    return args == null || args.Length == 0
+                        ? BuildSingleFixture(type, attrs[0])
+                        : BuildMultipleFixtures(type, attrs);
+                default:
+                    return BuildMultipleFixtures(type, attrs);
+            }
+        }
+
+		#endregion
+
+		#region Helper Methods
+
+        private Test BuildMultipleFixtures(Type type, Attribute[] attrs)
+        {
+            TestSuite suite = new ParameterizedFixtureSuite(type);
+
+            if (attrs.Length > 0)
+            {
+                foreach (Attribute attr in attrs)
+                    suite.Add(BuildSingleFixture(type, attr));
+            }
+            else
+            {
+                suite.RunState = RunState.NotRunnable;
+                suite.IgnoreReason = "Generic fixture has no type arguments provided";
+            }
+
+            return suite;
+        }
+
+        private Test BuildSingleFixture(Type type, Attribute attr)
+        {
+            object[] arguments = null;
+            IList categories = null;
+
+            if (attr != null)
+            {
+                arguments = (object[])Reflect.GetPropertyValue(attr, "Arguments");
+
+                categories = Reflect.GetPropertyValue(attr, "Categories") as IList;
+#if NET_2_0
+                if (type.ContainsGenericParameters)
+                {
+                    Type[] typeArgs = (Type[])Reflect.GetPropertyValue(attr, "TypeArgs");
+                    if( typeArgs.Length > 0 || 
+                        TypeHelper.CanDeduceTypeArgsFromArgs(type, arguments, ref typeArgs))
+                    {
+                        type = TypeHelper.MakeGenericType(type, typeArgs);
+                    }
+                }
+#endif
+            }
+
+            this.fixture = new NUnitTestFixture(type, arguments);
+            CheckTestFixtureIsValid(fixture);
+
+            NUnitFramework.ApplyCommonAttributes(type, fixture);
+
+            if (categories != null)
+                foreach (string category in categories)
+                    fixture.Categories.Add(category);
+
+            if (fixture.RunState == RunState.Runnable && attr != null)
+            {
+                object objIgnore = Reflect.GetPropertyValue(attr, "Ignore");
+                if (objIgnore != null && (bool)objIgnore == true)
+                {
+                    fixture.RunState = RunState.Ignored;
+                    fixture.IgnoreReason = (string)Reflect.GetPropertyValue(attr, "IgnoreReason");
+                }
+            }
+
+            AddTestCases(type);
+
+            return this.fixture;
+        }
+
+        /// <summary>
+		/// Method to add test cases to the newly constructed fixture.
+		/// The default implementation looks at each candidate method
+		/// and tries to build a test case from it. It will only need
+		/// to be overridden if some other approach, such as reading a 
+		/// datafile is used to generate test cases.
+		/// </summary>
+		/// <param name="fixtureType"></param>
+		protected virtual void AddTestCases( Type fixtureType )
+		{
+			IList methods = fixtureType.GetMethods( 
+				BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static );
+
+			foreach(MethodInfo method in methods)
+			{
+				Test test = BuildTestCase(method, this.fixture);
+
+				if(test != null)
+				{
+					this.fixture.Add( test );
+				}
+			}
 		}
 
 		/// <summary>
-		/// Method that sets properties of the test suite based on the
-		/// information in the provided Type.
+		/// Method to create a test case from a MethodInfo and add
+		/// it to the fixture being built. It first checks to see if
+		/// any global TestCaseBuilder addin wants to build the
+		/// test case. If not, it uses the internal builder
+		/// collection maintained by this fixture builder. After
+		/// building the test case, it applies any decorators
+		/// that have been installed.
+		/// 
+		/// The default implementation has no test case builders.
+		/// Derived classes should add builders to the collection
+		/// in their constructor.
 		/// </summary>
-		/// <param name="type">The type to examine</param>
-		/// <param name="suite">The test suite being constructed</param>
-		protected override void SetTestSuiteProperties( Type type, TestSuite suite )
+		/// <param name="method"></param>
+		/// <returns></returns>
+		private Test BuildTestCase( MethodInfo method, TestSuite suite )
 		{
-			base.SetTestSuiteProperties( type, suite );
+            Test test = testBuilders.BuildFrom( method, suite );
 
-            NUnitFramework.ApplyCommonAttributes( type, suite );
+			if ( test != null )
+				test = testDecorators.Decorate( test, method );
+
+			return test;
 		}
 
-        /// <summary>
-        /// Checks to see if the fixture type has the test fixture
-        /// attribute type specified in the parameters. Override
-        /// to allow additional types - based on name, for example.
-        /// </summary>
-        /// <param name="type">The fixture type to check</param>
-        /// <returns>True if the fixture can be built, false if not</returns>
-        public override bool CanBuildFrom(Type type)
+        private void CheckTestFixtureIsValid(TestFixture fixture)
         {
-            return Reflect.HasAttribute( type, NUnitFramework.TestFixtureAttribute, true );
+            Type fixtureType = fixture.FixtureType;
+
+            string reason = null;
+            if (!IsValidFixtureType(fixtureType, ref reason))
+            {
+                fixture.RunState = RunState.NotRunnable;
+                fixture.IgnoreReason = reason;
+            }
+            else if( !IsStaticClass( fixtureType ) )
+            {
+                // Postpone checking for constructor with arguments till we invoke it
+                // since Type.GetConstructor doesn't handle null arguments well.
+                if ( fixture.arguments == null || fixture.arguments.Length == 0 )
+                    if (Reflect.GetConstructor(fixtureType) == null)
+                    {
+                        fixture.RunState = RunState.NotRunnable;
+                        fixture.IgnoreReason = "No suitable constructor was found";
+                    }
+            }
         }
 
-        /// <summary>
-        /// Check that the fixture is valid. In addition to the base class
-        /// check for a valid constructor, this method ensures that there 
-        /// is no more than one of each setup or teardown method and that
-        /// their signatures are correct.
+        private static bool IsStaticClass(Type type)
+        {
+            return type.IsAbstract && type.IsSealed;
+        }
+
+		/// <summary>
+        /// Check that the fixture type is valid. This method ensures that 
+        /// the type is not abstract and that there is no more than one of 
+        /// each setup or teardown method and that their signatures are correct.
         /// </summary>
         /// <param name="fixtureType">The type of the fixture to check</param>
         /// <param name="reason">A message indicating why the fixture is invalid</param>
         /// <returns>True if the fixture is valid, false if not</returns>
-        protected override bool IsValidFixtureType(Type fixtureType, ref string reason)
+        private bool IsValidFixtureType(Type fixtureType, ref string reason)
         {
-            if (!base.IsValidFixtureType(fixtureType, ref reason))
-                return false;
+            //if (fixtureType.IsAbstract && !fixtureType.IsSealed)
+            //{
+            //    reason = string.Format("{0} is an abstract class", fixtureType.FullName);
+            //    return false;
+            //}
 
-            if (!fixtureType.IsPublic && !fixtureType.IsNestedPublic)
+#if NET_2_0
+            if ( fixtureType.ContainsGenericParameters )
             {
-                reason = "Fixture class is not public";
+                reason = "Fixture type contains generic parameters. You must either provide "
+                        + "Type arguments or specify constructor arguments that allow NUnit "
+                        + "to deduce the Type arguments.";
                 return false;
             }
+#endif
 
-            return CheckSetUpTearDownMethod(fixtureType, "SetUp", NUnitFramework.SetUpAttribute, ref reason)
-                && CheckSetUpTearDownMethod(fixtureType, "TearDown", NUnitFramework.TearDownAttribute, ref reason)
-                && CheckSetUpTearDownMethod(fixtureType, "TestFixtureSetUp", NUnitFramework.FixtureSetUpAttribute, ref reason)
-                && CheckSetUpTearDownMethod(fixtureType, "TestFixtureTearDown", NUnitFramework.FixtureTearDownAttribute, ref reason);
+            return NUnitFramework.CheckSetUpTearDownMethods(fixtureType, NUnitFramework.SetUpAttribute, ref reason)
+                && NUnitFramework.CheckSetUpTearDownMethods(fixtureType, NUnitFramework.TearDownAttribute, ref reason)
+                && NUnitFramework.CheckSetUpTearDownMethods(fixtureType, NUnitFramework.FixtureSetUpAttribute, ref reason)
+                && NUnitFramework.CheckSetUpTearDownMethods(fixtureType, NUnitFramework.FixtureTearDownAttribute, ref reason);
         }
 
         /// <summary>
-        /// Internal helper to check a single setup or teardown method
+        /// Get TestFixtureAttributes following a somewhat obscure
+        /// set of rules to eliminate spurious duplication of fixtures.
+        /// 1. If there are any attributes with args, they are the only
+        ///    ones returned and those without args are ignored.
+        /// 2. No more than one attribute without args is ever returned.
         /// </summary>
-        /// <param name="fixtureType">The type to be checked</param>
-        /// <param name="attributeName">The short name of the attribute to be checked</param>
-        /// <returns>True if the method is present no more than once and has a valid signature</returns>
-        private bool CheckSetUpTearDownMethod(Type fixtureType, string name, string attributeName, ref string reason)
+        private static Attribute[] GetTestFixtureAttributes(Type type)
         {
-            int count = Reflect.CountMethodsWithAttribute(
-                fixtureType, attributeName,
-                BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.DeclaredOnly,
-                true);
+            Attribute[] attrs = Reflect.GetAttributes(type, NUnitFramework.TestFixtureAttribute, true);
+            
+            // Just return - no possibility of duplication
+            if (attrs.Length <= 1) 
+                return attrs;
 
-            if (count == 0) return true;
+            int withArgs = 0;
+            bool[] hasArgs = new bool[attrs.Length];
 
-            if (count > 1)
+            // Count and record those attrs with arguments            
+            for (int i = 0; i < attrs.Length; i++)
             {
-                reason = string.Format("More than one {0} method", name);
-                return false;
-            }
+                object[] args = (object[])Reflect.GetPropertyValue(attrs[i], "Arguments");
+                object[] typeArgs = (object[])Reflect.GetPropertyValue(attrs[i], "TypeArgs");
 
-            MethodInfo theMethod = Reflect.GetMethodWithAttribute(
-                fixtureType, attributeName,
-                BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.DeclaredOnly,
-                true);
-
-            if (theMethod != null)
-            {
-                if (theMethod.IsStatic ||
-                    theMethod.IsAbstract ||
-                    !theMethod.IsPublic && !theMethod.IsFamily ||
-                    theMethod.GetParameters().Length != 0 ||
-                    !theMethod.ReturnType.Equals(typeof(void)))
+                if (args.Length > 0 || typeArgs != null && typeArgs.Length > 0)
                 {
-                    reason = string.Format("Invalid {0} method signature", name);
-                    return false;
+                    withArgs++;
+                    hasArgs[i] = true;
                 }
             }
 
-            return true;
+            // If all attributes have args, just return them
+            if (withArgs == attrs.Length)
+                return attrs;
+
+            // If all attributes are without args, just return the first found
+            if (withArgs == 0)
+                return new Attribute[] { attrs[0] };
+
+            // Some of each type, so extract those with args
+            int count = 0;
+            Attribute[] result = new Attribute[withArgs];
+            for (int i = 0; i < attrs.Length; i++)
+                if (hasArgs[i])
+                    result[count++] = attrs[i];
+
+            return result;
         }
-		#endregion
+        
+        #endregion
 	}
 }
\ No newline at end of file
diff --git a/src/NUnitCore/core/Builders/PairwiseStrategy.cs b/src/NUnitCore/core/Builders/PairwiseStrategy.cs
new file mode 100644
index 0000000..93f55b5
--- /dev/null
+++ b/src/NUnitCore/core/Builders/PairwiseStrategy.cs
@@ -0,0 +1,695 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+#if NET_2_0
+using System.Collections.Generic;
+#endif
+using System.Reflection;
+using System.Text;
+using NUnit.Core.Extensibility;
+
+namespace NUnit.Core.Builders
+{
+	public class PairwiseStrategy : CombiningStrategy
+	{
+		internal class FleaRand
+		{
+			private const int FleaRandSize = 256;
+
+			private uint b;
+			private uint c;
+			private uint d;
+			private uint z;
+
+			private uint[] m = new uint[FleaRandSize];
+			private uint[] r = new uint[FleaRandSize];
+
+			private uint q;
+
+			public FleaRand(uint seed)
+			{
+				this.b = seed;
+				this.c = seed;
+				this.d = seed;
+				this.z = seed;
+
+				for (int i = 0; i < this.m.Length; i++)
+				{
+					this.m[i] = seed;
+				}
+
+				for (int i = 0; i < 10; i++)
+				{
+					this.Batch();
+				}
+
+				this.q = 0;
+			}
+
+			public uint Next()
+			{
+				if (this.q == 0)
+				{
+					this.Batch();
+					this.q = (uint)this.r.Length - 1;
+				}
+				else
+				{
+					this.q--;
+				}
+
+				return this.r[this.q];
+			}
+
+			private void Batch()
+			{
+				uint a;
+				uint b = this.b;
+				uint c = this.c + (++this.z);
+				uint d = this.d;
+
+				for (int i = 0; i < this.r.Length; i++)
+				{
+					a = this.m[b % this.m.Length];
+					this.m[b % this.m.Length] = d;
+					d = (c << 19) + (c >> 13) + b;
+					c = b ^ this.m[i];
+					b = a + d;
+					this.r[i] = c;
+				}
+
+				this.b = b;
+				this.c = c;
+				this.d = d;
+			}
+		}
+
+		internal class FeatureInfo
+		{
+			public const string Names = "abcdefghijklmnopqrstuvwxyz";
+
+			public readonly int Dimension;
+			public readonly int Feature;
+
+			public FeatureInfo(int dimension, int feature)
+			{
+				this.Dimension = dimension;
+				this.Feature = feature;
+			}
+
+#if DEBUG
+			public override string ToString()
+			{
+				return (this.Dimension + 1).ToString() + FeatureInfo.Names[this.Feature];
+			}
+#endif
+		}
+
+		internal class Tuple
+		{
+			private readonly ArrayList features = new ArrayList();
+
+			public int Count
+			{
+				get
+				{
+					return this.features.Count;
+				}
+			}
+
+			public FeatureInfo this[int index]
+			{
+				get
+				{
+					return (FeatureInfo)this.features[index];
+				}
+			}
+
+			public void Add(FeatureInfo feature)
+			{
+				this.features.Add(feature);
+			}
+
+#if DEBUG
+			public override string ToString()
+			{
+				StringBuilder sb = new StringBuilder();
+
+				sb.Append('(');
+
+				for (int i = 0; i < this.features.Count; i++)
+				{
+					if (i > 0)
+					{
+						sb.Append(' ');
+					}
+
+					sb.Append(this.features[i].ToString());
+				}
+
+				sb.Append(')');
+
+				return sb.ToString();
+			}
+#endif
+		}
+
+		internal class TupleCollection
+		{
+			private readonly ArrayList tuples = new ArrayList();
+
+			public int Count
+			{
+				get
+				{
+					return this.tuples.Count;
+				}
+			}
+
+			public Tuple this[int index]
+			{
+				get
+				{
+					return (Tuple)this.tuples[index];
+				}
+			}
+
+			public void Add(Tuple tuple)
+			{
+				this.tuples.Add(tuple);
+			}
+
+			public void RemoveAt(int index)
+			{
+				this.tuples.RemoveAt(index);
+			}
+		}
+
+		internal class TestCase
+		{
+			public readonly int[] Features;
+
+			public TestCase(int numberOfDimensions)
+			{
+				this.Features = new int[numberOfDimensions];
+			}
+
+			public bool IsTupleCovered(Tuple tuple)
+			{
+				for (int i = 0; i < tuple.Count; i++)
+				{
+					if (this.Features[tuple[i].Dimension] != tuple[i].Feature)
+					{
+						return false;
+					}
+				}
+
+				return true;
+			}
+
+#if DEBUG
+			public override string ToString()
+			{
+				StringBuilder sb = new StringBuilder();
+
+				for (int i = 0; i < this.Features.Length; i++)
+				{
+					if (i > 0)
+					{
+						sb.Append(' ');
+					}
+
+					sb.Append(i + 1);
+					sb.Append(FeatureInfo.Names[this.Features[i]]);
+				}
+
+				return sb.ToString();
+			}
+#endif
+		}
+
+		internal class TestCaseCollection : IEnumerable
+		{
+			private readonly ArrayList testCases = new ArrayList();
+
+			public void Add(TestCase testCase)
+			{
+				this.testCases.Add(testCase);
+			}
+
+			public IEnumerator GetEnumerator()
+			{
+				return this.testCases.GetEnumerator();
+			}
+
+			public bool IsTupleCovered(Tuple tuple)
+			{
+				foreach (TestCase testCase in this.testCases)
+				{
+					if (testCase.IsTupleCovered(tuple))
+					{
+						return true;
+					}
+				}
+
+				return false;
+			}
+		}
+
+		internal class PairwiseTestCaseGenerator
+		{
+			private const int MaxTupleLength = 2;
+
+			private readonly FleaRand random = new FleaRand(0);
+
+			private readonly int[] dimensions;
+
+			private readonly TupleCollection[][] uncoveredTuples;
+
+			private readonly int[][] currentTupleLength;
+
+			private readonly TestCaseCollection testCases = new TestCaseCollection();
+
+			public PairwiseTestCaseGenerator(int[] dimensions)
+			{
+				this.dimensions = dimensions;
+
+				this.uncoveredTuples = new TupleCollection[this.dimensions.Length][];
+
+				for (int d = 0; d < this.uncoveredTuples.Length; d++)
+				{
+					this.uncoveredTuples[d] = new TupleCollection[this.dimensions[d]];
+
+					for (int f = 0; f < this.dimensions[d]; f++)
+					{
+						this.uncoveredTuples[d][f] = new TupleCollection();
+					}
+				}
+
+				this.currentTupleLength = new int[this.dimensions.Length][];
+
+				for (int d = 0; d < this.dimensions.Length; d++)
+				{
+					this.currentTupleLength[d] = new int[this.dimensions[d]];
+				}
+			}
+
+			public IEnumerable GetTestCases()
+			{
+				this.CreateTestCases();
+
+				this.SelfTest();
+
+				return this.testCases;
+			}
+
+			private void CreateTestCases()
+			{
+				while (true)
+				{
+					this.ExtendTupleSet();
+
+					Tuple tuple = this.FindTupleToCover();
+
+					if (tuple == null)
+					{
+						return;
+					}
+
+					TestCase testCase = this.FindGoodTestCase(tuple);
+
+					this.RemoveTuplesCoveredBy(testCase);
+
+					this.testCases.Add(testCase);
+				}
+			}
+
+			private void ExtendTupleSet()
+			{
+				for (int d = 0; d < this.dimensions.Length; d++)
+				{
+					for (int f = 0; f < this.dimensions[d]; f++)
+					{
+						this.ExtendTupleSet(d, f);
+					}
+				}
+			}
+
+			private void ExtendTupleSet(int dimension, int feature)
+			{
+				// If tuples for [dimension][feature] already exists, it's no needs to add more tuples.
+				if (this.uncoveredTuples[dimension][feature].Count > 0)
+				{
+					return;
+				}
+
+				// If maximum tuple length for [dimension][feature] is reached, it's no needs to add more tuples.
+				if (this.currentTupleLength[dimension][feature] == MaxTupleLength)
+				{
+					return;
+				}
+
+				this.currentTupleLength[dimension][feature]++;
+
+				int tupleLength = this.currentTupleLength[dimension][feature];
+
+				if (tupleLength == 1)
+				{
+					Tuple tuple = new Tuple();
+
+					tuple.Add(new FeatureInfo(dimension, feature));
+
+					if (this.testCases.IsTupleCovered(tuple))
+					{
+						return;
+					}
+
+					this.uncoveredTuples[dimension][feature].Add(tuple);
+				}
+				else
+				{
+					for (int d = 0; d < this.dimensions.Length; d++)
+					{
+						for (int f = 0; f < this.dimensions[d]; f++)
+						{
+							Tuple tuple = new Tuple();
+							tuple.Add(new FeatureInfo(d, f));
+
+							if (tuple[0].Dimension == dimension)
+							{
+								continue;
+							}
+
+							tuple.Add(new FeatureInfo(dimension, feature));
+
+							if (this.testCases.IsTupleCovered(tuple))
+							{
+								continue;
+							}
+
+							this.uncoveredTuples[dimension][feature].Add(tuple);
+						}
+					}
+				}
+			}
+
+			private Tuple FindTupleToCover()
+			{
+				int tupleLength = MaxTupleLength;
+				int tupleCount = 0;
+				Tuple tuple = null;
+
+				for (int d = 0; d < this.dimensions.Length; d++)
+				{
+					for (int f = 0; f < this.dimensions[d]; f++)
+					{
+						if (this.currentTupleLength[d][f] < tupleLength)
+						{
+							tupleLength = this.currentTupleLength[d][f];
+							tupleCount = this.uncoveredTuples[d][f].Count;
+							tuple = this.uncoveredTuples[d][f][0];
+						}
+						else
+						{
+							if (this.currentTupleLength[d][f] == tupleLength && this.uncoveredTuples[d][f].Count > tupleCount)
+							{
+								tupleCount = this.uncoveredTuples[d][f].Count;
+								tuple = this.uncoveredTuples[d][f][0];
+							}
+						}
+					}
+				}
+
+				return tuple;
+			}
+
+			private TestCase FindGoodTestCase(Tuple tuple)
+			{
+				TestCase bestTest = null;
+				int bestCoverage = -1;
+
+				for (int i = 0; i < 5; i++)
+				{
+					TestCase test = new TestCase(this.dimensions.Length);
+
+					int coverage = this.CreateTestCase(tuple, test);
+
+					if (coverage > bestCoverage)
+					{
+						bestTest = test;
+						bestCoverage = coverage;
+					}
+				}
+
+				return bestTest;
+			}
+
+			private int CreateTestCase(Tuple tuple, TestCase test)
+			{
+				// Create a random test case...
+				for (int i = 0; i < test.Features.Length; i++)
+				{
+					test.Features[i] = (int)(this.random.Next() % this.dimensions[i]);
+				}
+
+				// ...and inject the tuple into it!
+				for (int i = 0; i < tuple.Count; i++)
+				{
+					test.Features[tuple[i].Dimension] = tuple[i].Feature;
+				}
+
+				return this.MaximizeCoverage(test, tuple);
+			}
+
+			private int MaximizeCoverage(TestCase test, Tuple tuple)
+			{
+				int[] dimensionOrder = this.GetMutableDimensions(tuple);
+
+				while (true)
+				{
+					bool progress = false;
+					int totalCoverage = 1;
+
+					// Scramble dimensions.
+					for (int i = dimensionOrder.Length; i > 1; i--)
+					{
+						int j = (int)(this.random.Next() % i);
+						int t = dimensionOrder[i - 1];
+						dimensionOrder[i - 1] = dimensionOrder[j];
+						dimensionOrder[j] = t;
+					}
+
+					// For each dimension that can be modified...
+					for (int i = 0; i < dimensionOrder.Length; i++)
+					{
+						int d = dimensionOrder[i];
+
+						ArrayList bestFeatures = new ArrayList();
+
+						int bestCoverage = this.CountTuplesCovered(test, d, test.Features[d]);
+
+						int bestTupleLength = this.currentTupleLength[d][test.Features[d]];
+
+						// For each feature that can be modified, check if it can extend coverage.
+						for (int f = 0; f < this.dimensions[d]; f++)
+						{
+							test.Features[d] = f;
+
+							int coverage = this.CountTuplesCovered(test, d, f);
+
+							if (this.currentTupleLength[d][f] < bestTupleLength)
+							{
+								progress = true;
+								bestTupleLength = this.currentTupleLength[d][f];
+								bestCoverage = coverage;
+								bestFeatures.Clear();
+								bestFeatures.Add(f);
+							}
+							else
+							{
+								if (this.currentTupleLength[d][f] == bestTupleLength && coverage >= bestCoverage)
+								{
+									if (coverage > bestCoverage)
+									{
+										progress = true;
+										bestCoverage = coverage;
+										bestFeatures.Clear();
+									}
+
+									bestFeatures.Add(f);
+								}
+							}
+						}
+
+						if (bestFeatures.Count == 1)
+						{
+							test.Features[d] = (int)bestFeatures[0];
+						}
+						else
+						{
+							test.Features[d] = (int)bestFeatures[(int)(this.random.Next() % bestFeatures.Count)];
+						}
+
+						totalCoverage += bestCoverage;
+					}
+
+					if (!progress)
+					{
+						return totalCoverage;
+					}
+				}
+			}
+
+			private int[] GetMutableDimensions(Tuple tuple)
+			{
+				bool[] immutableDimensions = new bool[this.dimensions.Length];
+
+				for (int i = 0; i < tuple.Count; i++)
+				{
+					immutableDimensions[tuple[i].Dimension] = true;
+				}
+
+				ArrayList mutableDimensions = new ArrayList();
+
+				for (int i = 0; i < this.dimensions.Length; i++)
+				{
+					if (!immutableDimensions[i])
+					{
+						mutableDimensions.Add(i);
+					}
+				}
+
+				return (int[])mutableDimensions.ToArray(typeof(int));
+			}
+
+			private int CountTuplesCovered(TestCase test, int dimension, int feature)
+			{
+				int tuplesCovered = 0;
+
+				TupleCollection tuples = this.uncoveredTuples[dimension][feature];
+
+				for (int i = 0; i < tuples.Count; i++)
+				{
+					if (test.IsTupleCovered(tuples[i]))
+					{
+						tuplesCovered++;
+					}
+				}
+
+				return tuplesCovered;
+			}
+
+			private void RemoveTuplesCoveredBy(TestCase testCase)
+			{
+				for (int d = 0; d < this.uncoveredTuples.Length; d++)
+				{
+					for (int f = 0; f < this.uncoveredTuples[d].Length; f++)
+					{
+						TupleCollection tuples = this.uncoveredTuples[d][f];
+
+						for (int i = tuples.Count - 1; i >= 0; i--)
+						{
+							if (testCase.IsTupleCovered(tuples[i]))
+							{
+								tuples.RemoveAt(i);
+							}
+						}
+					}
+				}
+			}
+
+			private void SelfTest()
+			{
+				for (int d1 = 0; d1 < this.dimensions.Length - 1; d1++)
+				{
+					for (int d2 = d1 + 1; d2 < this.dimensions.Length; d2++)
+					{
+						for (int f1 = 0; f1 < this.dimensions[d1]; f1++)
+						{
+							for (int f2 = 0; f2 < this.dimensions[d2]; f2++)
+							{
+								Tuple tuple = new Tuple();
+								tuple.Add(new FeatureInfo(d1, f1));
+								tuple.Add(new FeatureInfo(d2, f2));
+
+								if (!this.testCases.IsTupleCovered(tuple))
+								{
+									throw new ApplicationException("PairwiseStrategy self-test failed : Not all pairs are covered!");
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+
+		public PairwiseStrategy(IEnumerable[] sources) : base(sources) { }
+
+		public override IEnumerable GetTestCases()
+		{
+			ArrayList[] valueSet = CreateValueSet();
+			int[] dimensions = CreateDimensions(valueSet);
+
+			IEnumerable pairwiseTestCases = new PairwiseTestCaseGenerator(dimensions).GetTestCases();
+
+#if NET_2_0
+            List<ParameterSet> testCases = new List<ParameterSet>();
+#else
+            ArrayList testCases = new ArrayList();
+#endif
+
+			foreach (TestCase pairwiseTestCase in pairwiseTestCases)
+			{
+				object[] testData = new object[pairwiseTestCase.Features.Length];
+
+				for (int i = 0; i < pairwiseTestCase.Features.Length; i++)
+				{
+					testData[i] = valueSet[i][pairwiseTestCase.Features[i]];
+				}
+
+                ParameterSet testCase = new ParameterSet();
+                testCase.Arguments = testData;
+
+				testCases.Add(testCase);
+			}
+
+			return testCases;
+		}
+
+		private ArrayList[] CreateValueSet()
+		{
+			ArrayList[] valueSet = new ArrayList[Sources.Length];
+
+			for (int i = 0; i < valueSet.Length; i++)
+			{
+				ArrayList values = new ArrayList();
+
+				foreach (object value in Sources[i])
+				{
+					values.Add(value);
+				}
+
+				valueSet[i] = values;
+			}
+
+			return valueSet;
+		}
+
+		private int[] CreateDimensions(ArrayList[] valueSet)
+		{
+			int[] dimensions = new int[valueSet.Length];
+
+			for (int i = 0; i < valueSet.Length; i++)
+			{
+				dimensions[i] = valueSet[i].Count;
+			}
+
+			return dimensions;
+		}
+	}
+}
diff --git a/src/NUnitCore/core/Builders/ProviderCache.cs b/src/NUnitCore/core/Builders/ProviderCache.cs
new file mode 100644
index 0000000..c8f3ded
--- /dev/null
+++ b/src/NUnitCore/core/Builders/ProviderCache.cs
@@ -0,0 +1,62 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Text;
+
+namespace NUnit.Core.Builders
+{
+    class ProviderCache
+    {
+        private static IDictionary instances = new Hashtable();
+
+        public static object GetInstanceOf(Type providerType)
+        {
+            CacheEntry entry = new CacheEntry(providerType);
+
+            object instance = instances[entry];
+            return instance == null
+                ? instances[entry] = Reflect.Construct(providerType)
+                : instance;
+        }
+
+        public static void Clear()
+        {
+            foreach (object key in instances.Keys)
+            {
+                IDisposable provider = instances[key] as IDisposable;
+                if (provider != null)
+                    provider.Dispose();
+            }
+
+            instances.Clear();
+        }
+
+        class CacheEntry
+        {
+            private Type providerType;
+
+            public CacheEntry(Type providerType)
+            {
+                this.providerType = providerType;
+            }
+
+            public override bool Equals(object obj)
+            {
+                CacheEntry other = obj as CacheEntry;
+                if (other == null) return false;
+
+                return this.providerType == other.providerType;
+            }
+
+            public override int GetHashCode()
+            {
+                return providerType.GetHashCode();
+            }
+        }
+    }
+}
diff --git a/src/NUnitCore/core/Builders/ProviderInfo.cs b/src/NUnitCore/core/Builders/ProviderInfo.cs
new file mode 100644
index 0000000..5ff2654
--- /dev/null
+++ b/src/NUnitCore/core/Builders/ProviderInfo.cs
@@ -0,0 +1,91 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Reflection;
+
+namespace NUnit.Core.Builders
+{
+    class ProviderReference
+    {
+        private Type providerType;
+        private string providerName;
+        private object[] providerArgs;
+
+        public ProviderReference(Type providerType, string providerName)
+        {
+            if (providerType == null)
+                throw new ArgumentNullException("providerType");
+            if (providerName == null)
+                throw new ArgumentNullException("providerName");
+
+            this.providerType = providerType;
+            this.providerName = providerName;
+        }
+
+        public ProviderReference(Type providerType, object[] args, string providerName)
+            : this(providerType, providerName)
+        {
+            this.providerArgs = args;
+        }
+
+        public string Name
+        {
+            get { return this.providerName; }
+        }
+
+        public IEnumerable GetInstance()
+        {
+                MemberInfo[] members = providerType.GetMember(
+                    providerName,
+                    MemberTypes.Field | MemberTypes.Method | MemberTypes.Property,
+                    BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
+
+                if (members.Length == 0)
+                    throw new Exception(string.Format(
+                        "Unable to locate {0}.{1}", providerType.FullName, providerName));
+
+                return (IEnumerable)GetProviderObjectFromMember(members[0]);
+        }
+
+        private object GetProviderObjectFromMember(MemberInfo member)
+        {
+            object providerObject = null;
+            object instance = null;
+
+            switch (member.MemberType)
+            {
+                case MemberTypes.Property:
+                    PropertyInfo providerProperty = member as PropertyInfo;
+                    MethodInfo getMethod = providerProperty.GetGetMethod(true);
+                    if (!getMethod.IsStatic)
+                        //instance = ProviderCache.GetInstanceOf(providerType);
+                        instance = Reflect.Construct(providerType, providerArgs);
+                    providerObject = providerProperty.GetValue(instance, null);
+                    break;
+
+                case MemberTypes.Method:
+                    MethodInfo providerMethod = member as MethodInfo;
+                    if (!providerMethod.IsStatic)
+                        //instance = ProviderCache.GetInstanceOf(providerType);
+                        instance = Reflect.Construct(providerType, providerArgs);
+                    providerObject = providerMethod.Invoke(instance, null);
+                    break;
+
+                case MemberTypes.Field:
+                    FieldInfo providerField = member as FieldInfo;
+                    if (!providerField.IsStatic)
+                        //instance = ProviderCache.GetInstanceOf(providerType);
+                        instance = Reflect.Construct(providerType, providerArgs);
+                    providerObject = providerField.GetValue(instance);
+                    break;
+            }
+
+            return providerObject;
+        }
+    }
+}
diff --git a/src/NUnitCore/core/Builders/SequentialStrategy.cs b/src/NUnitCore/core/Builders/SequentialStrategy.cs
new file mode 100644
index 0000000..fbee9c8
--- /dev/null
+++ b/src/NUnitCore/core/Builders/SequentialStrategy.cs
@@ -0,0 +1,55 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+#if NET_2_0
+using System.Collections.Generic;
+#endif
+using System.Reflection;
+using NUnit.Core.Extensibility;
+
+namespace NUnit.Core.Builders
+{
+    public class SequentialStrategy : CombiningStrategy
+    {
+        public SequentialStrategy(IEnumerable[] sources) : base(sources) { }
+
+        public override IEnumerable GetTestCases()
+        {
+#if NET_2_0
+            List<ParameterSet> testCases = new List<ParameterSet>();
+#else
+            ArrayList testCases = new ArrayList();
+#endif
+
+            for (; ; )
+            {
+                bool gotData = false;
+                object[] testdata = new object[Sources.Length];
+
+                for (int i = 0; i < Sources.Length; i++)
+                    if (Enumerators[i].MoveNext())
+                    {
+                        testdata[i] = Enumerators[i].Current;
+                        gotData = true;
+                    }
+                    else
+                        testdata[i] = null;
+
+                if (!gotData)
+                    break;
+
+                ParameterSet testcase = new ParameterSet();
+                testcase.Arguments = testdata;
+
+                testCases.Add(testcase);
+            }
+
+            return testCases;
+        }
+    }
+}
diff --git a/src/NUnitCore/core/Builders/SetUpFixtureBuilder.cs b/src/NUnitCore/core/Builders/SetUpFixtureBuilder.cs
index 9e76e8d..d880e87 100644
--- a/src/NUnitCore/core/Builders/SetUpFixtureBuilder.cs
+++ b/src/NUnitCore/core/Builders/SetUpFixtureBuilder.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -13,17 +13,19 @@ namespace NUnit.Core.Builders
 	/// </summary>
 	public class SetUpFixtureBuilder : Extensibility.ISuiteBuilder
 	{	
-		public SetUpFixtureBuilder()
-		{
-			//
-			// TODO: Add constructor logic here	//
-		}
-
 		#region ISuiteBuilder Members
-
 		public Test BuildFrom(Type type)
 		{
-			return new SetUpFixture( type );
+			SetUpFixture fixture = new SetUpFixture( type );
+
+            string reason = null;
+            if (!IsValidFixtureType(type, ref reason))
+            {
+                fixture.RunState = RunState.NotRunnable;
+                fixture.IgnoreReason = reason;
+            }
+
+            return fixture;
 		}
 
 		public bool CanBuildFrom(Type type)
@@ -31,5 +33,38 @@ namespace NUnit.Core.Builders
 			return Reflect.HasAttribute( type, NUnitFramework.SetUpFixtureAttribute, false );
 		}
 		#endregion
+
+        private bool IsValidFixtureType(Type type, ref string reason)
+        {
+            if (type.IsAbstract)
+            {
+                reason = string.Format("{0} is an abstract class", type.FullName);
+                return false;
+            }
+
+            if (Reflect.GetConstructor(type) == null)
+            {
+                reason = string.Format("{0} does not have a valid constructor", type.FullName);
+                return false;
+            }
+
+            if (!NUnitFramework.CheckSetUpTearDownMethods(type, NUnitFramework.SetUpAttribute, ref reason) ||
+                !NUnitFramework.CheckSetUpTearDownMethods(type, NUnitFramework.TearDownAttribute, ref reason) )
+                    return false;
+
+            if ( Reflect.HasMethodWithAttribute(type, NUnitFramework.FixtureSetUpAttribute, true) )
+            {
+                reason = "TestFixtureSetUp method not allowed on a SetUpFixture";
+                return false;
+            }
+
+            if ( Reflect.HasMethodWithAttribute(type, NUnitFramework.FixtureTearDownAttribute, true) )
+            {
+                reason = "TestFixtureTearDown method not allowed on a SetUpFixture";
+                return false;
+            }
+
+            return true;
+        }
 	}
 }
diff --git a/src/NUnitCore/core/Builders/TestAssemblyBuilder.cs b/src/NUnitCore/core/Builders/TestAssemblyBuilder.cs
index e1f31b8..586db7d 100644
--- a/src/NUnitCore/core/Builders/TestAssemblyBuilder.cs
+++ b/src/NUnitCore/core/Builders/TestAssemblyBuilder.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -17,6 +17,7 @@ namespace NUnit.Core.Builders
 	/// </summary>
 	public class TestAssemblyBuilder
 	{
+		static Logger log = InternalTrace.GetLogger("TestAssemblyBuilder");
 
 		#region Instance Fields
 		/// <summary>
@@ -46,11 +47,10 @@ namespace NUnit.Core.Builders
 			{ 
 				if ( assemblyInfo == null && assembly != null )
 				{
-					string path = TestFixtureBuilder.GetAssemblyPath( assembly );
-					AssemblyReader rdr = new AssemblyReader( path );
-					Version runtimeVersion = new Version( rdr.ImageRuntimeVersion.Substring( 1 ) );
+					AssemblyReader rdr = new AssemblyReader( assembly );
+					Version imageRuntimeVersion = new Version( rdr.ImageRuntimeVersion.Substring( 1 ) );
 					IList frameworks = CoreExtensions.Host.TestFrameworks.GetReferencedFrameworks( assembly );
-					assemblyInfo = new TestAssemblyInfo( path, runtimeVersion, frameworks );
+					assemblyInfo = new TestAssemblyInfo( rdr.AssemblyPath, imageRuntimeVersion, RuntimeFramework.CurrentFramework, frameworks );
 				}
 
 				return assemblyInfo;
@@ -75,29 +75,40 @@ namespace NUnit.Core.Builders
 			if ( testName == null || testName == string.Empty )
 				return Build( assemblyName, autoSuites );
 
-			this.assembly = Load( assemblyName );
-			if ( assembly == null ) return null;
-
-			// If provided test name is actually the name of
-			// a type, we handle it specially
-			Type testType = assembly.GetType(testName);
-			if( testType != null )
-				return Build( assemblyName, testType, autoSuites );
-		
-			// Assume that testName is a namespace and get all fixtures in it
-			IList fixtures = GetFixtures( assembly, testName );
-			if ( fixtures.Count > 0 ) 
-				return BuildTestAssembly( assemblyName, fixtures, autoSuites );
-			return null;
+            // Change currentDirectory in case assembly references unmanaged dlls
+            // and so that any addins are able to access the directory easily.
+            using (new DirectorySwapper(Path.GetDirectoryName(assemblyName)))
+            {
+                this.assembly = Load(assemblyName);
+                if (assembly == null) return null;
+
+                // If provided test name is actually the name of
+                // a type, we handle it specially
+                Type testType = assembly.GetType(testName);
+                if (testType != null)
+                    return Build(assemblyName, testType, autoSuites);
+
+                // Assume that testName is a namespace and get all fixtures in it
+                IList fixtures = GetFixtures(assembly, testName);
+                if (fixtures.Count > 0)
+                    return BuildTestAssembly(assemblyName, fixtures, autoSuites);
+
+                return null;
+            }
 		}
 
 		public TestSuite Build( string assemblyName, bool autoSuites )
 		{
-			this.assembly = Load( assemblyName );
-			if ( this.assembly == null ) return null;
-
-			IList fixtures = GetFixtures( assembly, null );
-			return BuildTestAssembly( assemblyName, fixtures, autoSuites );
+            // Change currentDirectory in case assembly references unmanaged dlls
+            // and so that any addins are able to access the directory easily.
+            using (new DirectorySwapper(Path.GetDirectoryName(assemblyName)))
+            {
+                this.assembly = Load(assemblyName);
+                if (this.assembly == null) return null;
+
+                IList fixtures = GetFixtures(assembly, null);
+                return BuildTestAssembly(assemblyName, fixtures, autoSuites);
+            }
 		}
 
 		private Test Build( string assemblyName, Type testType, bool autoSuites )
@@ -115,7 +126,7 @@ namespace NUnit.Core.Builders
 
 		private TestSuite BuildTestAssembly( string assemblyName, IList fixtures, bool autoSuites )
 		{
-			TestSuite testAssembly = new TestSuite( assemblyName );
+			TestSuite testAssembly = new TestAssembly( assemblyName );
 
 			if ( autoSuites )
 			{
@@ -127,23 +138,24 @@ namespace NUnit.Core.Builders
 			else 
 			foreach( TestSuite fixture in fixtures )
 			{
-				if ( fixture is SetUpFixture )
-				{
-					fixture.RunState = RunState.NotRunnable;
-					fixture.IgnoreReason = "SetUpFixture cannot be used when loading tests as a flat list of fixtures";
-				}
-
-				testAssembly.Add( fixture );
+                if (fixture != null)
+                {
+                    if (fixture is SetUpFixture)
+                    {
+                        fixture.RunState = RunState.NotRunnable;
+                        fixture.IgnoreReason = "SetUpFixture cannot be used when loading tests as a flat list of fixtures";
+                    }
+
+                    testAssembly.Add(fixture);
+                }
 			}
 
-			if ( fixtures.Count == 0 )
-			{
-				testAssembly.RunState = RunState.NotRunnable;
-				testAssembly.IgnoreReason = "Has no TestFixtures";
-			}
-			
             NUnitFramework.ApplyCommonAttributes( assembly, testAssembly );
 
+            testAssembly.Properties["_PID"] = System.Diagnostics.Process.GetCurrentProcess().Id;
+            testAssembly.Properties["_APPDOMAIN"] = AppDomain.CurrentDomain.FriendlyName;
+
+
 			// TODO: Make this an option? Add Option to sort assemblies as well?
 			testAssembly.Sort();
 
@@ -156,39 +168,47 @@ namespace NUnit.Core.Builders
 
 		private Assembly Load(string path)
 		{
-			Assembly assembly = null;
+            Assembly assembly = null;
 
-			// Change currentDirectory in case assembly references unmanaged dlls
-			using( new DirectorySwapper( Path.GetDirectoryName( path ) ) )
-			{
-                // Throws if this isn't a managed assembly or if it was built
-				// with a later version of the same assembly. 
-				AssemblyName.GetAssemblyName( Path.GetFileName( path ) );
-				
-				// TODO: Figure out why we can't load using the assembly name
-				// in all cases. Might be a problem with the tests themselves.
-                assembly = Assembly.Load(Path.GetFileNameWithoutExtension(path));
-				
-                if ( assembly != null )
-                    CoreExtensions.Host.InstallAdhocExtensions( assembly );
+            // Throws if this isn't a managed assembly or if it was built
+			// with a later version of the same assembly. 
+			AssemblyName assemblyName = AssemblyName.GetAssemblyName( Path.GetFileName( path ) );
+			
+            assembly = Assembly.Load(assemblyName);
+			
+            if ( assembly != null )
+                CoreExtensions.Host.InstallAdhocExtensions( assembly );
 
-				NTrace.Info( "Loaded assembly " + assembly.FullName, "'TestAssemblyBuilder'" );
+			log.Info( "Loaded assembly " + assembly.FullName );
 
-				return assembly;
-			}
+			return assembly;
 		}
 
 		private IList GetFixtures( Assembly assembly, string ns )
 		{
 			ArrayList fixtures = new ArrayList();
+            log.Debug("Examining assembly for test fixtures");
 
 			IList testTypes = GetCandidateFixtureTypes( assembly, ns );
+
+            log.Debug("Found {0} classes to examine", testTypes.Count);
+#if NET_2_0
+            System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();
+            timer.Start();
+#endif
+
 			foreach(Type testType in testTypes)
 			{
 				if( TestFixtureBuilder.CanBuildFrom( testType ) )
 					fixtures.Add( TestFixtureBuilder.BuildFrom( testType ) );
 			}
 
+#if NET_2_0
+            log.Debug("Found {0} fixtures in {1} seconds", fixtures.Count, timer.Elapsed);
+#else
+            log.Debug("Found {0} fixtures", fixtures.Count);
+#endif
+
 			return fixtures;
 		}
 	
diff --git a/src/NUnitCore/core/Builders/TestCaseParameterProvider.cs b/src/NUnitCore/core/Builders/TestCaseParameterProvider.cs
new file mode 100644
index 0000000..d96f21e
--- /dev/null
+++ b/src/NUnitCore/core/Builders/TestCaseParameterProvider.cs
@@ -0,0 +1,151 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Reflection;
+using System.Text;
+using NUnit.Core.Extensibility;
+
+namespace NUnit.Core.Builders
+{
+    public class TestCaseParameterProvider : ITestCaseProvider 
+    {
+        /// <summary>
+        /// Determine whether any test cases are available for a parameterized method.
+        /// </summary>
+        /// <param name="method">A MethodInfo representing a parameterized test</param>
+        /// <returns>True if any cases are available, otherwise false.</returns>
+        public bool HasTestCasesFor(MethodInfo method)
+        {
+            return Reflect.HasAttribute(method, NUnitFramework.TestCaseAttribute, false);
+        }
+
+        /// <summary>
+        /// Return an IEnumerable providing test cases for use in
+        /// running a parameterized test.
+        /// </summary>
+        /// <param name="method"></param>
+        /// <returns></returns>
+        public IEnumerable GetTestCasesFor(MethodInfo method)
+        {
+			ArrayList list = new ArrayList();
+
+            Attribute[] attrs = Reflect.GetAttributes(method, NUnitFramework.TestCaseAttribute, false);
+
+            ParameterInfo[] parameters = method.GetParameters();
+            int argsNeeded = parameters.Length;
+
+            foreach (Attribute attr in attrs)
+            {
+                ParameterSet parms;
+
+                try
+                {
+                    parms = ParameterSet.FromDataSource(attr);
+                    int argsProvided = parms.Arguments.Length;
+
+                    // Special handling for params arguments
+                    if (argsProvided > argsNeeded)
+                    {
+                        ParameterInfo lastParameter = parameters[argsNeeded - 1];
+                        Type lastParameterType = lastParameter.ParameterType;
+
+                        if (lastParameterType.IsArray && lastParameter.IsDefined(typeof(ParamArrayAttribute), false))
+                        {
+                            object[] newArglist = new object[argsNeeded];
+                            for (int i = 0; i < argsNeeded; i++)
+                                newArglist[i] = parms.Arguments[i];
+
+                            int length = argsProvided - argsNeeded + 1;
+                            Array array = Array.CreateInstance(lastParameterType.GetElementType(), length);
+                            for (int i = 0; i < length; i++)
+                                array.SetValue(parms.Arguments[argsNeeded + i - 1], i);
+
+                            newArglist[argsNeeded - 1] = array;
+                            parms.Arguments = newArglist;
+                            argsProvided = argsNeeded;
+                        }
+                    }
+
+                    //if (method.GetParameters().Length == 1 && method.GetParameters()[0].ParameterType == typeof(object[]))
+                    //    parms.Arguments = new object[]{parms.Arguments};
+
+                    // Special handling when sole argument is an object[]
+                    if (argsNeeded == 1 && method.GetParameters()[0].ParameterType == typeof(object[]))
+                    {
+                        if (argsProvided > 1 ||
+                            argsProvided == 1 && parms.Arguments[0].GetType() != typeof(object[]))
+                        {
+                            parms.Arguments = new object[] { parms.Arguments };
+                        }
+                    }
+
+
+                    if (argsProvided == argsNeeded)
+                        PerformSpecialConversions(parms.Arguments, parameters);
+                }
+                catch (Exception ex)
+                {
+                    parms = new ParameterSet( ex );
+                }
+
+                list.Add( parms );
+			}
+
+			return list;
+        }
+        
+        /// <summary>
+        /// Performs several special conversions allowed by NUnit in order to
+        /// permit arguments with types that cannot be used in the constructor
+        /// of an Attribute such as TestCaseAttribute or to simplify their use.
+        /// </summary>
+        /// <param name="arglist">The arguments to be converted</param>
+        /// <param name="parameters">The ParameterInfo array for the method</param>
+        private static void PerformSpecialConversions(object[] arglist, ParameterInfo[] parameters)
+        {
+            for (int i = 0; i < arglist.Length; i++)
+            {
+                object arg = arglist[i];
+                Type targetType = parameters[i].ParameterType;
+
+                if (arg == null)
+                    continue;
+
+                if (arg.GetType().FullName == "NUnit.Framework.SpecialValue" &&
+                    arg.ToString() == "Null" )
+                {
+                    arglist[i] = null;
+                    continue;
+                }
+
+                if (targetType.IsAssignableFrom(arg.GetType()))
+                    continue;
+
+                if (arg is DBNull)
+                {
+                    arglist[i] = null;
+                    continue;
+                }
+
+                bool convert = false;
+
+                if (targetType == typeof(short) || targetType == typeof(byte) || targetType == typeof(sbyte))
+                    convert = arg is int;
+                else
+                if (targetType == typeof(decimal))
+                    convert = arg is double || arg is string || arg is int;
+                else 
+                if (targetType == typeof(DateTime) || targetType == typeof(TimeSpan))
+                    convert = arg is string;
+
+                if (convert)
+                    arglist[i] = Convert.ChangeType(arg, targetType, System.Globalization.CultureInfo.InvariantCulture);
+            }
+        }
+    }
+}
diff --git a/src/NUnitCore/core/Builders/TestCaseSourceProvider.cs b/src/NUnitCore/core/Builders/TestCaseSourceProvider.cs
new file mode 100644
index 0000000..7d1db69
--- /dev/null
+++ b/src/NUnitCore/core/Builders/TestCaseSourceProvider.cs
@@ -0,0 +1,109 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Reflection;
+using NUnit.Core.Extensibility;
+
+namespace NUnit.Core.Builders
+{
+    /// <summary>
+    /// TestCaseSourceProvider provides data for methods
+    /// annotated with the TestCaseSourceAttribute.
+    /// </summary>
+    public class TestCaseSourceProvider : ITestCaseProvider2
+    {
+        #region Constants
+        public const string SourceTypeProperty = "SourceType";
+        public const string SourceNameProperty = "SourceName";
+        #endregion
+
+        #region ITestCaseProvider Members
+
+        /// <summary>
+        /// Determine whether any test cases are available for a parameterized method.
+        /// </summary>
+        /// <param name="method">A MethodInfo representing a parameterized test</param>
+        /// <returns>True if any cases are available, otherwise false.</returns>
+        public bool HasTestCasesFor(MethodInfo method)
+        {
+            return Reflect.HasAttribute(method, NUnitFramework.TestCaseSourceAttribute, false);
+        }
+
+        /// <summary>
+        /// Return an IEnumerable providing test cases for use in
+        /// running a parameterized test.
+        /// </summary>
+        /// <param name="method"></param>
+        /// <returns></returns>
+        public IEnumerable GetTestCasesFor(MethodInfo method)
+        {
+            return GetTestCasesFor(method, null);
+        }
+        #endregion
+
+        #region ITestCaseProvider2 Members
+
+        /// <summary>
+        /// Determine whether any test cases are available for a parameterized method.
+        /// </summary>
+        /// <param name="method">A MethodInfo representing a parameterized test</param>
+        /// <returns>True if any cases are available, otherwise false.</returns>
+        public bool HasTestCasesFor(MethodInfo method, Test suite)
+        {
+            return HasTestCasesFor(method);
+        }
+
+        /// <summary>
+        /// Return an IEnumerable providing test cases for use in
+        /// running a parameterized test.
+        /// </summary>
+        /// <param name="method"></param>
+        /// <returns></returns>
+        public IEnumerable GetTestCasesFor(MethodInfo method, Test parentSuite)
+        {
+            ArrayList parameterList = new ArrayList();
+
+            foreach (ProviderReference info in GetSourcesFor(method, parentSuite))
+            {
+                foreach (object o in info.GetInstance())
+                    parameterList.Add(o);
+            }
+
+            return parameterList;
+        }
+        #endregion
+
+        #region Helper Methods
+        private static IList GetSourcesFor(MethodInfo method, Test parent)
+        {
+            ArrayList sources = new ArrayList();
+            TestFixture parentSuite = parent as TestFixture;
+
+            foreach (Attribute sourceAttr in Reflect.GetAttributes(method, NUnitFramework.TestCaseSourceAttribute, false))
+            {
+                Type sourceType = Reflect.GetPropertyValue(sourceAttr, SourceTypeProperty) as Type;
+                string sourceName = Reflect.GetPropertyValue(sourceAttr, SourceNameProperty) as string;
+
+                if (sourceType == null)
+                {
+                    if (parentSuite != null)
+                        sources.Add(new ProviderReference(parentSuite.FixtureType, parentSuite.arguments, sourceName));
+                    else
+                        sources.Add(new ProviderReference(method.ReflectedType, sourceName));
+                }
+                else
+                {
+                    sources.Add(new ProviderReference(sourceType, sourceName));
+                }
+
+            }
+            return sources;
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/core/Builders/ValueSourceProvider.cs b/src/NUnitCore/core/Builders/ValueSourceProvider.cs
new file mode 100644
index 0000000..df20713
--- /dev/null
+++ b/src/NUnitCore/core/Builders/ValueSourceProvider.cs
@@ -0,0 +1,108 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Reflection;
+using System.Collections;
+using NUnit.Core.Extensibility;
+
+namespace NUnit.Core.Builders
+{
+    /// <summary>
+    /// ValueSourceProvider supplies data items for individual parameters
+    /// from named data sources in the test class or a separate class.
+    /// </summary>
+    public class ValueSourceProvider : IDataPointProvider2
+    {
+        #region Constants
+        public const string SourcesAttribute = "NUnit.Framework.ValueSourceAttribute";
+        public const string SourceTypeProperty = "SourceType";
+        public const string SourceNameProperty = "SourceName";
+        #endregion
+
+        #region IDataPointProvider Members
+
+        /// <summary>
+        /// Determine whether any data sources are available for a parameter.
+        /// </summary>
+        /// <param name="parameter">A ParameterInfo test parameter</param>
+        /// <returns>True if any data is available, otherwise false.</returns>
+        public bool HasDataFor(ParameterInfo parameter)
+        {
+            return Reflect.HasAttribute(parameter, SourcesAttribute, false);
+        }
+
+        /// <summary>
+        /// Return an IEnumerable providing test data for use with
+        /// one parameter of a parameterized test.
+        /// </summary>
+        /// <param name="parameter"></param>
+        /// <returns></returns>
+        public IEnumerable GetDataFor(ParameterInfo parameter)
+        {
+            return GetDataFor(parameter, null);
+        }
+        #endregion
+
+        #region IDataPointProvider2 Members
+
+        /// <summary>
+        /// Determine whether any data sources are available for a parameter.
+        /// </summary>
+        /// <param name="parameter">A ParameterInfo test parameter</param>
+        /// <param name="parentSuite">The test suite for which the test is being built</param>
+        /// <returns>True if any data is available, otherwise false.</returns>
+        public bool HasDataFor(ParameterInfo parameter, Test parentSuite)
+        {
+            return HasDataFor(parameter);
+        }
+
+        /// <summary>
+        /// Return an IEnumerable providing test data for use with
+        /// one parameter of a parameterized test.
+        /// </summary>
+        /// <param name="parameter"></param>
+        /// <param name="parentSuite">The test suite for which the test is being built</param>
+        /// <returns></returns>
+        public IEnumerable GetDataFor(ParameterInfo parameter, Test parentSuite)
+        {
+            ArrayList parameterList = new ArrayList();
+
+            foreach (ProviderReference providerRef in GetSourcesFor(parameter, parentSuite))
+            {
+                IEnumerable instance = providerRef.GetInstance();
+                if (instance != null)
+                    foreach (object o in instance)
+                        parameterList.Add(o);
+            }
+
+            return parameterList;
+        }
+        #endregion
+
+        #region Helper Methods
+        private static IList GetSourcesFor(ParameterInfo parameter, Test parent)
+        {
+            ArrayList sources = new ArrayList();
+            TestFixture parentSuite = parent as TestFixture;
+
+            foreach (Attribute sourceAttr in Reflect.GetAttributes(parameter, SourcesAttribute, false))
+            {
+                Type sourceType = Reflect.GetPropertyValue(sourceAttr, SourceTypeProperty) as Type;
+                string sourceName = Reflect.GetPropertyValue(sourceAttr, SourceNameProperty) as string;
+
+                if (sourceType != null)
+                    sources.Add(new ProviderReference(sourceType, sourceName));
+                else if (parentSuite != null)
+                    sources.Add(new ProviderReference(parentSuite.FixtureType, parentSuite.arguments, sourceName));
+                else
+                    sources.Add(new ProviderReference(parameter.Member.ReflectedType, sourceName));
+            }
+            return sources;
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/core/CoreExtensions.cs b/src/NUnitCore/core/CoreExtensions.cs
index 9f8d7d5..863df5b 100644
--- a/src/NUnitCore/core/CoreExtensions.cs
+++ b/src/NUnitCore/core/CoreExtensions.cs
@@ -1,13 +1,14 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
 using System.IO;
 using System.Collections;
 using System.Reflection;
+using NUnit.Core.Builders;
 using NUnit.Core.Extensibility;
 
 namespace NUnit.Core
@@ -20,6 +21,8 @@ namespace NUnit.Core
 	/// </summary>
 	public class CoreExtensions : ExtensionHost, IService
 	{
+		static Logger log = InternalTrace.GetLogger("CoreExtensions");
+
 		#region Instance Fields
 		private IAddinRegistry addinRegistry;
 		private bool initialized;
@@ -28,8 +31,10 @@ namespace NUnit.Core
 		private TestCaseBuilderCollection testBuilders;
 		private TestDecoratorCollection testDecorators;
 		private EventListenerCollection listeners;
+		private FrameworkRegistry frameworks;
+	    private TestCaseProviders testcaseProviders;
+        private DataPointProviders dataPointProviders;
 
-//		private log4net.Appender.ConsoleAppender appender;
 		#endregion
 
 		#region CoreExtensions Singleton
@@ -53,9 +58,19 @@ namespace NUnit.Core
 			this.testBuilders = new TestCaseBuilderCollection(this);
 			this.testDecorators = new TestDecoratorCollection(this);
 			this.listeners = new EventListenerCollection(this);
+			this.frameworks = new FrameworkRegistry(this);
+            this.testcaseProviders = new TestCaseProviders(this);
+            this.dataPointProviders = new DataPointProviders(this);
+
+		    this.extensions = new ArrayList();
+		    extensions.Add(suiteBuilders);
+		    extensions.Add(testBuilders);
+		    extensions.Add(testDecorators);
+		    extensions.Add(listeners);
+		    extensions.Add(frameworks);
+		    extensions.Add(testcaseProviders);
+            extensions.Add(dataPointProviders);
 
-			this.extensions = new IExtensionPoint[]
-				{ suiteBuilders, testBuilders, testDecorators, listeners };
 			this.supportedTypes = ExtensionType.Core;
 
 			// TODO: This should be somewhere central
@@ -74,7 +89,7 @@ namespace NUnit.Core
 		}
 		#endregion
 
-		#region Properties
+		#region Public Properties
 
 		public bool Initialized
 		{
@@ -95,52 +110,72 @@ namespace NUnit.Core
 			}
 			set { addinRegistry = value; }
 		}
+		#endregion
 
-		public ISuiteBuilder SuiteBuilders
+		#region Internal Properties
+		internal ISuiteBuilder SuiteBuilders
 		{
 			get { return suiteBuilders; }
 		}
 
-		public ITestCaseBuilder TestBuilders
+		internal ITestCaseBuilder2 TestBuilders
 		{
 			get { return testBuilders; }
 		}
 
-		public ITestDecorator TestDecorators
+		internal ITestDecorator TestDecorators
 		{
 			get { return testDecorators; }
 		}
 
-		public EventListener Listeners
+		internal EventListener Listeners
 		{
 			get { return listeners; }
 		}
 
-		public FrameworkRegistry TestFrameworks
+		internal FrameworkRegistry TestFrameworks
 		{
 			get { return frameworks; }
 		}
-		#endregion
+
+        internal TestCaseProviders TestCaseProviders
+	    {
+            get { return testcaseProviders; }
+	    }
+
+	    #endregion
 
 		#region Public Methods	
 		public void InstallBuiltins()
 		{
-			NTrace.Info( "Installing Builtins" );
+			log.Info( "Installing Builtins" );
+
+			// Define NUnit Frameworks
+			frameworks.Register( "NUnit", "nunit.framework" );
+            frameworks.Register("NUnitLite", "NUnitLite");
+
+			// Install builtin SuiteBuilders
+			suiteBuilders.Install( new NUnitTestFixtureBuilder() );
+			suiteBuilders.Install( new SetUpFixtureBuilder() );
 
-			// Define NUnit Framework
-			FrameworkRegistry.Register( "NUnit", "nunit.framework" );
+            // Install builtin TestCaseBuilder
+            testBuilders.Install( new NUnitTestCaseBuilder() );
+            //testBuilders.Install(new TheoryBuilder());
 
-			// Install builtin SuiteBuilders - Note that the
-			// NUnitTestCaseBuilder is installed whenever
-			// an NUnitTestFixture is being populated and
-			// removed afterward.
-			suiteBuilders.Install( new Builders.NUnitTestFixtureBuilder() );
-			suiteBuilders.Install( new Builders.SetUpFixtureBuilder() );
+            // Install builtin TestCaseProviders
+            testcaseProviders.Install(new TestCaseParameterProvider());
+            testcaseProviders.Install(new TestCaseSourceProvider());
+            testcaseProviders.Install(new CombinatorialTestCaseProvider());
+
+            // Install builtin DataPointProvider
+            dataPointProviders.Install(new InlineDataPointProvider());
+            dataPointProviders.Install(new ValueSourceProvider());
+            dataPointProviders.Install(new DatapointProvider());
 		}
 
 		public void InstallAddins()
 		{
-			NTrace.Info( "Installing Addins" );
+			log.Info( "Installing Addins" );
 
 			if( AddinRegistry != null )
 			{
@@ -148,26 +183,38 @@ namespace NUnit.Core
 				{
 					if ( (this.ExtensionTypes & addin.ExtensionType) != 0 )
 					{
+						AddinStatus status = AddinStatus.Unknown;
+						string message = null;
+
 						try
 						{
 							Type type = Type.GetType(addin.TypeName);
 							if ( type == null )
 							{
-								AddinRegistry.SetStatus( addin.Name, AddinStatus.Error, "Could not locate type" );
-								NTrace.Error( "Failed to load  " + addin.Name + " - Could not locate type" );
+								status = AddinStatus.Error;
+								message = string.Format( "Unable to locate {0} Type", addin.TypeName );
 							}
 							else if ( !InstallAddin( type ) )
 							{
-								AddinRegistry.SetStatus( addin.Name, AddinStatus.Error, "Install returned false" );
-								NTrace.Error( "Failed to load " +addin.Name + " - Install returned false" );
+								status = AddinStatus.Error;
+								message = "Install method returned false";
 							}
 							else
-								AddinRegistry.SetStatus( addin.Name, AddinStatus.Loaded, null );
+							{
+								status = AddinStatus.Loaded;
+							}
 						}
 						catch( Exception ex )
 						{
-							AddinRegistry.SetStatus( addin.Name, AddinStatus.Error, ex.Message );
-							NTrace.Error( "Exception loading " + addin.Name + " - " + ex.Message );
+							status = AddinStatus.Error;
+							message = ex.ToString(); 				
+						}
+
+						AddinRegistry.SetStatus( addin.Name, status, message );
+						if ( status != AddinStatus.Loaded )
+						{
+							log.Error( "Failed to load {0}", addin.Name );
+							log.Error( message );
 						}
 					}
 				}
diff --git a/src/NUnitCore/core/CoreExtensions.save.cs b/src/NUnitCore/core/CoreExtensions.save.cs
deleted file mode 100644
index 437af0a..0000000
--- a/src/NUnitCore/core/CoreExtensions.save.cs
+++ /dev/null
@@ -1,215 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-using System;
-using System.IO;
-using System.Collections;
-using System.Reflection;
-using System.Diagnostics;
-using NUnit.Core.Extensibility;
-
-namespace NUnit.Core
-{
-	/// <summary>
-	/// CoreExtensions is a singleton class that groups together all 
-	/// the extension points that are supported in the test domain.
-	/// It also provides access to the test builders and decorators
-	/// by other parts of the NUnit core.
-	/// </summary>
-	public class CoreExtensions : ExtensionHost, IService
-	{
-		#region Instance Fields
-		private IAddinRegistry addinRegistry;
-		private bool initialized;
-
-		private SuiteBuilderCollection suiteBuilders;
-		private TestCaseBuilderCollection testBuilders;
-		private TestDecoratorCollection testDecorators;
-		private EventListenerCollection listeners;
-		#endregion
-
-		#region CoreExtensions Singleton
-		private static CoreExtensions host;
-		public static CoreExtensions Host
-		{
-			get
-			{
-				if (host == null)
-				{
-					host = new CoreExtensions();
-//					host.InitializeService();
-				}
-
-				return host;
-			}
-		}
-		#endregion
-
-		#region Constructors
-		public CoreExtensions() 
-		{
-			this.suiteBuilders = new SuiteBuilderCollection();
-			this.testBuilders = new TestCaseBuilderCollection();
-			this.testDecorators = new TestDecoratorCollection();
-			this.listeners = new EventListenerCollection();
-
-			this.extensions = new IExtensionPoint[]
-				{ suiteBuilders, testBuilders, testDecorators };
-			this.supportedTypes = ExtensionType.Core;
-		}
-		#endregion
-
-		#region Properties
-
-		public bool Initialized
-		{
-			get { return initialized; }
-		}
-
-		/// <summary>
-		/// Our AddinRegistry may be set from outside or passed into the domain
-		/// </summary>
-		public IAddinRegistry AddinRegistry
-		{
-			get 
-			{
-				if ( addinRegistry == null )
-					addinRegistry = AppDomain.CurrentDomain.GetData( "AddinRegistry" ) as IAddinRegistry;
-
-				return addinRegistry; 
-			}
-			set { addinRegistry = value; }
-		}
-
-		public ISuiteBuilder SuiteBuilders
-		{
-			get { return suiteBuilders; }
-		}
-
-		public TestCaseBuilderCollection TestBuilders
-		{
-			get { return testBuilders; }
-		}
-
-		public ITestDecorator TestDecorators
-		{
-			get { return testDecorators; }
-		}
-
-		public FrameworkRegistry TestFrameworks
-		{
-			get { return frameworks; }
-		}
-		#endregion
-
-		#region Public Methods	
-		public void InstallBuiltins()
-		{
-			//Trace.WriteLine( "Installing Builtins" );
-
-			// Define NUnit Framework
-			FrameworkRegistry.Register( "NUnit", "nunit.framework" );
-
-			// Install builtin SuiteBuilders - Note that the
-			// NUnitTestCaseBuilder is installed whenever
-			// an NUnitTestFixture is being populated and
-			// removed afterward.
-			suiteBuilders.Install( new Builders.NUnitTestFixtureBuilder() );
-			suiteBuilders.Install( new Builders.SetUpFixtureBuilder() );
-
-            //testDecorators.InstallFinal(new Builders.MultiCultureDecorator());
-		}
-
-		public void InstallAddins()
-		{
-			//Trace.WriteLine( "Installing Addins" );
-
-			if( AddinRegistry != null )
-			{
-				foreach (Addin addin in AddinRegistry.Addins)
-				{
-					if ( (this.ExtensionTypes & addin.ExtensionType) != 0 )
-					{
-						try
-						{
-							Type type = Type.GetType(addin.TypeName);
-							if ( type == null )
-								AddinRegistry.SetStatus( addin.Name, AddinStatus.Error, "Could not locate type" );
-							else if ( !InstallAddin( type ) )
-								AddinRegistry.SetStatus( addin.Name, AddinStatus.Error, "Install returned false" );
-							else
-								AddinRegistry.SetStatus( addin.Name, AddinStatus.Loaded, null );
-						}
-						catch( Exception ex )
-						{
-							AddinRegistry.SetStatus( addin.Name, AddinStatus.Error, ex.Message );
-						}
-					}
-				}
-			}
-		}
-
-		public void InstallAdhocExtensions( Assembly assembly )
-		{
-			foreach ( Type type in assembly.GetExportedTypes() )
-			{
-				if ( type.GetCustomAttributes(typeof(NUnitAddinAttribute), false).Length == 1 )
-					InstallAddin( type );
-			}
-		}
-		#endregion
-
-		#region Helper Methods
-		private bool InstallAddin( Type type )
-		{
-			ConstructorInfo ctor = type.GetConstructor(Type.EmptyTypes);
-			object obj = ctor.Invoke( new object[0] );
-			IAddin theAddin = (IAddin)obj;
-
-			return theAddin.Install(this);
-		}
-		#endregion
-
-		#region Type Safe Install Helpers
-        //internal void Install( ISuiteBuilder builder )
-        //{
-        //    suiteBuilders.Install( builder );
-        //}
-
-        //internal void Install( ITestCaseBuilder builder )
-        //{
-        //    testBuilders.Install( builder );
-        //}
-
-        //internal void Install( ITestDecorator decorator )
-        //{
-        //    testDecorators.Install( decorator );
-        //}
-
-        //internal void Install( EventListener listener )
-        //{
-        //    listeners.Install( listener );
-        //}
-		#endregion
-
-		#region IService Members
-
-		public void UnloadService()
-		{
-			// TODO:  Add CoreExtensions.UnloadService implementation
-		}
-
-		public void InitializeService()
-		{
-			InstallBuiltins();
-			InstallAddins();
-
-			initialized = true;
-		}
-
-		#endregion
-	}
-}
diff --git a/src/NUnitCore/core/CultureDetector.cs b/src/NUnitCore/core/CultureDetector.cs
index 9569a08..91b60ba 100644
--- a/src/NUnitCore/core/CultureDetector.cs
+++ b/src/NUnitCore/core/CultureDetector.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitCore/core/DelegatingTestRunner.cs b/src/NUnitCore/core/DelegatingTestRunner.cs
deleted file mode 100644
index b018527..0000000
--- a/src/NUnitCore/core/DelegatingTestRunner.cs
+++ /dev/null
@@ -1,174 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-namespace NUnit.Core
-{
-	using System;
-	using System.Collections;
-	using System.IO;
-
-	/// <summary>
-	/// DelegatingTestRUnner is the abstract base for core TestRunner
-	/// implementations that operate by controlling a downstream
-	/// TestRunner. All calls are simply passed on to the
-	/// TestRunner that is provided to the constructor.
-	/// 
-	/// Although the class is abstract, it has no abstract 
-	/// methods specified because each implementation will
-	/// need to override different methods. All methods are
-	/// specified using interface syntax and the derived class
-	/// must explicitly implement TestRunner in order to 
-	/// redefine the selected methods.
-	/// </summary>
-	public abstract class DelegatingTestRunner : MarshalByRefObject, TestRunner
-	{
-		#region Instance Variables
-
-		/// <summary>
-		/// Our runner ID
-		/// </summary>
-		protected int runnerID;
-
-		/// <summary>
-		/// The downstream TestRunner
-		/// </summary>
-		private TestRunner testRunner;
-
-		/// <summary>
-		/// The event listener for the currently running test
-		/// </summary>
-		protected EventListener listener;
-
-		#endregion
-
-		#region Construction
-		public DelegatingTestRunner(TestRunner testRunner)
-		{
-			this.testRunner = testRunner;
-			this.runnerID = testRunner.ID;
-		}
-
-		/// <summary>
-		/// Protected constructor for runners that delay creation
-		/// of their downstream runner.
-		/// </summary>
-		protected DelegatingTestRunner( int runnerID )
-		{
-			this.runnerID = runnerID;
-		}
-		#endregion
-
-		#region Properties
-		public virtual int ID
-		{
-			get { return runnerID; }
-		}
-
-		public virtual bool Running
-		{
-			get { return testRunner != null && testRunner.Running; }
-		}
-
-		public virtual IList AssemblyInfo
-		{
-			get { return testRunner == null ? null : testRunner.AssemblyInfo; }
-		}
-
-		public virtual ITest Test
-		{
-			get { return testRunner == null ? null : testRunner.Test; }
-		}
-
-		public virtual TestResult TestResult
-		{
-			get { return testRunner == null ? null : testRunner.TestResult; }
-		}
-
-		/// <summary>
-		/// Protected property copies any settings to the downstream test runner
-		/// when it is set. Derived runners overriding this should call the base
-		/// or copy the settings themselves.
-		/// </summary>
-		protected virtual TestRunner TestRunner
-		{
-			get { return testRunner; }
-			set { testRunner = value; }
-		}
-		#endregion
-
-		#region Load and Unload Methods
-		public virtual bool Load( TestPackage package )
-		{
-			return this.testRunner.Load( package );
-		}
-
-		public virtual void Unload()
-		{
-            if ( this.testRunner != null )
-			    this.testRunner.Unload();
-		}
-		#endregion
-
-		#region CountTestCases
-		public virtual int CountTestCases( ITestFilter filter )
-		{
-			return this.testRunner.CountTestCases( filter );
-		}
-		#endregion
-
-		#region Methods for Running Tests
-		public virtual TestResult Run(EventListener listener)
-		{
-			// Save active listener for derived classes
-			this.listener = listener;
-			return this.testRunner.Run(listener);
-		}
-
-		public virtual TestResult Run(EventListener listener, ITestFilter filter)
-		{
-			// Save active listener for derived classes
-			this.listener = listener;
-			return this.testRunner.Run(listener, filter);
-		}
-
-		public virtual void BeginRun( EventListener listener )
-		{
-			// Save active listener for derived classes
-			this.listener = listener;
-			this.testRunner.BeginRun( listener );
-		}
-
-		public virtual void BeginRun( EventListener listener, ITestFilter filter )
-		{
-			// Save active listener for derived classes
-			this.listener = listener;
-			this.testRunner.BeginRun( listener, filter );
-		}
-
-		public virtual TestResult EndRun()
-		{
-			return this.testRunner.EndRun();
-		}
-
-		public virtual void CancelRun()
-		{
-			this.testRunner.CancelRun();
-		}
-
-		public virtual void Wait()
-		{
-			this.testRunner.Wait();
-		}
-		#endregion
-
-		#region InitializeLifetimeService Override
-		public override object InitializeLifetimeService()
-		{
-			return null;
-		}
-		#endregion
-
-	}
-}
diff --git a/src/NUnitCore/core/DirectorySwapper.cs b/src/NUnitCore/core/DirectorySwapper.cs
index 88eaa09..eb80b30 100644
--- a/src/NUnitCore/core/DirectorySwapper.cs
+++ b/src/NUnitCore/core/DirectorySwapper.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitCore/core/DomainAgent.cs b/src/NUnitCore/core/DomainAgent.cs
new file mode 100644
index 0000000..5dd3cd2
--- /dev/null
+++ b/src/NUnitCore/core/DomainAgent.cs
@@ -0,0 +1,151 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Reflection;
+using System.Diagnostics;
+
+namespace NUnit.Core
+{
+	/// <summary>
+	/// Represesents an agent that controls running of tests in
+    /// an application domain.
+	/// </summary>
+	public class DomainAgent : TestAgent
+	{
+        static Logger log = InternalTrace.GetLogger(typeof(DomainAgent));
+
+        /// <summary>
+        /// Factory method used to create a DomainAgent in an AppDomain.
+        /// </summary>
+        /// <param name="targetDomain">The domain in which to create the agent</param>
+        /// <param name="traceLevel">The level of internal tracing to use</param>
+        /// <returns>A proxy for the DomainAgent in the other domain</returns>
+        static public DomainAgent CreateInstance(AppDomain targetDomain)
+        {
+#if NET_2_0
+            System.Runtime.Remoting.ObjectHandle oh = Activator.CreateInstance(
+                targetDomain,
+#else
+			System.Runtime.Remoting.ObjectHandle oh = targetDomain.CreateInstance(
+#endif
+ Assembly.GetExecutingAssembly().FullName,
+                typeof(DomainAgent).FullName,
+                false, BindingFlags.Default, null, null, null, null, null);
+
+            object obj = oh.Unwrap();
+            return (DomainAgent)obj;
+        }
+
+        private bool isActive;
+
+        /// <summary>
+        /// Constructs a DomainAgent specifying the trace level.
+        /// </summary>
+        /// <param name="traceLevel">The level of internal tracing to use</param>
+		public DomainAgent() : base( Guid.NewGuid() ) { }
+
+		#region Public Methods
+        /// <summary>
+        /// Creates a TestRunner for use in loading and running
+        /// tests in this domain. DomainAgent always creates
+        /// a RemoteTestRunner.
+        /// </summary>
+        /// <param name="runnerID">Runner ID to be used</param>
+        /// <returns>A TestRunner</returns>
+		public override TestRunner CreateRunner(int runnerID)
+		{
+            log.Info("Creating RemoteTestRunner");
+			return new RemoteTestRunner(runnerID);
+		}
+
+        /// <summary>
+        /// Starts the agent if it is no aready started.
+        /// </summary>
+        /// <returns></returns>
+        public override bool Start()
+        {
+            if (!this.isActive)
+            {
+                log.Info("Starting");
+                this.isActive = true;
+            }
+
+            return true;
+        }
+
+        /// <summary>
+        /// Stops the agent if it is running
+        /// </summary>
+        public override void Stop()
+        {
+            if (this.isActive)
+            {
+                log.Info("Stopping");
+                this.isActive = false;
+            }
+        }
+
+        public AppDomain AppDomain
+        {
+            get { return AppDomain.CurrentDomain; }
+        }
+		#endregion
+    }
+
+    public class DomainInitializer : MarshalByRefObject
+    {
+        static Logger log;
+
+        /// <summary>
+        /// Factory method used to create a DomainInitializer in an AppDomain.
+        /// </summary>
+        /// <param name="targetDomain">The domain in which to create the agent</param>
+        /// <param name="traceLevel">The level of internal tracing to use</param>
+        /// <returns>A proxy for the DomainAgent in the other domain</returns>
+        static public DomainInitializer CreateInstance(AppDomain targetDomain)
+        {
+#if NET_2_0
+            System.Runtime.Remoting.ObjectHandle oh = Activator.CreateInstanceFrom(
+                targetDomain,
+#else
+			System.Runtime.Remoting.ObjectHandle oh = targetDomain.CreateInstanceFrom(
+#endif
+                typeof(DomainInitializer).Assembly.CodeBase,
+                typeof(DomainInitializer).FullName,
+                false, BindingFlags.Default, null, null, null, null, null);
+
+            object obj = oh.Unwrap();
+            return (DomainInitializer)obj;
+        }
+
+        public void InitializeDomain(int level)
+        {
+            InternalTraceLevel traceLevel = (InternalTraceLevel)level;
+
+            InternalTrace.Initialize("%a_%p.log", traceLevel);
+            log = InternalTrace.GetLogger(typeof(DomainInitializer));
+
+            AppDomain domain = AppDomain.CurrentDomain;
+            
+            log.Info("Initializing domain {0}", domain.FriendlyName);
+            log.Debug("  Base Directory: {0}", domain.BaseDirectory);
+            log.Debug("  Probing Path: {0}", domain.SetupInformation.PrivateBinPath);
+
+            domain.DomainUnload += new EventHandler(OnDomainUnload);
+
+            AssemblyResolver resolver = new AssemblyResolver();
+            resolver.AddDirectory(NUnitConfiguration.NUnitLibDirectory);
+            resolver.AddDirectory(NUnitConfiguration.AddinDirectory);
+        }
+
+        void OnDomainUnload(object sender, EventArgs e)
+        {
+            log.Info("Unloading domain " + AppDomain.CurrentDomain.FriendlyName);
+            InternalTrace.Flush();
+        }
+    }
+}
diff --git a/src/NUnitCore/core/EventListenerTextWriter.cs b/src/NUnitCore/core/EventListenerTextWriter.cs
index 98a1c30..86c5ba9 100644
--- a/src/NUnitCore/core/EventListenerTextWriter.cs
+++ b/src/NUnitCore/core/EventListenerTextWriter.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 namespace NUnit.Core
 {
diff --git a/src/NUnitCore/core/EventPump.cs b/src/NUnitCore/core/EventPump.cs
index 26f1cc3..4fefd5a 100644
--- a/src/NUnitCore/core/EventPump.cs
+++ b/src/NUnitCore/core/EventPump.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 namespace NUnit.Core
@@ -9,6 +9,17 @@ namespace NUnit.Core
 	using System;
 	using System.Threading;
 
+    /// <summary>
+    /// The EventPumpState enum represents the state of an
+    /// EventPump.
+    /// </summary>
+    public enum EventPumpState
+    {
+        Stopped,
+        Pumping,
+        Stopping
+    }
+
 	/// <summary>
 	/// EventPump pulls events out of an EventQueue and sends
 	/// them to a listener. It is used to send events back to
@@ -17,39 +28,47 @@ namespace NUnit.Core
 	/// </summary>
 	public class EventPump : IDisposable
 	{
+        private static Logger log = InternalTrace.GetLogger(typeof(EventPump));
+
 		#region Instance Variables
+
+        /// <summary>
+        /// The handle on which a thread enqueuing an event with <see cref="Event.IsSynchronous"/> == <c>true</c>
+        /// waits, until the EventPump has sent the event to its listeners.
+        /// </summary>
+        private readonly AutoResetEvent synchronousEventSent = new AutoResetEvent(false);
+
 		/// <summary>
 		/// The downstream listener to which we send events
 		/// </summary>
-		EventListener eventListener;
+		private EventListener eventListener;
 		
 		/// <summary>
 		/// The queue that holds our events
 		/// </summary>
-		EventQueue events;
+		private EventQueue events;
 		
 		/// <summary>
 		/// Thread to do the pumping
 		/// </summary>
-		Thread pumpThread;
+		private Thread pumpThread;
 
 		/// <summary>
-		/// Indicator that we are pumping events
-		/// </summary>
-		private bool pumping;
-		
-		/// <summary>
-		/// Indicator that we are stopping
+		/// The current state of the eventpump
 		/// </summary>
-		private bool stopping;
+		private volatile EventPumpState pumpState = EventPumpState.Stopped;
 
 		/// <summary>
 		/// If true, stop after sending RunFinished
 		/// </summary>
 		private bool autostop;
+
+        private string name;
+
 		#endregion
 
 		#region Constructor
+
 		/// <summary>
 		/// Constructor
 		/// </summary>
@@ -60,49 +79,78 @@ namespace NUnit.Core
 		{
 			this.eventListener = eventListener;
 			this.events = events;
-			this.autostop = autostop;
+            this.events.SetWaitHandleForSynchronizedEvents(this.synchronousEventSent);
+            this.autostop = autostop;
 		}
+
 		#endregion
 
 		#region Properties
-		// TODO: Replace booleans with a state?
-		/// <summary>
-		/// Returns true if we are pumping events
-		/// </summary>
-		public bool Pumping
-		{
-			get { return pumping; }
-		}
 
 		/// <summary>
-		/// Returns true if a stop is in progress
+		/// Gets or sets the current state of the pump
 		/// </summary>
-		public bool Stopping
+        /// <remarks>
+        /// On <c>volatile</c> and <see cref="Thread.MemoryBarrier"/>, see
+        /// "http://www.albahari.com/threading/part4.aspx".
+        /// </remarks>
+		public EventPumpState PumpState
 		{
-			get { return stopping; }
+		    get
+		    {
+                Thread.MemoryBarrier();
+		        return pumpState;
+		    }
+
+		    set
+		    {
+		        this.pumpState = value;
+                Thread.MemoryBarrier();
+		    }
 		}
+
+        /// <summary>
+        /// Gets or sets the name of this EventPump
+        /// (used only internally and for testing).
+        /// </summary>
+	    public string Name
+	    {
+	        get
+	        {
+	            return this.name;
+	        }
+	        set
+	        {
+	            this.name = value;
+	        }
+	    }
+
 		#endregion
 
 		#region Public Methods
+
 		/// <summary>
-		/// Dispose stops the pump
+		/// Disposes and stops the pump.
+		/// Disposes the used WaitHandle, too.
 		/// </summary>
 		public void Dispose()
 		{
 			Stop();
-		}
+            ((IDisposable)this.synchronousEventSent).Dispose();
+        }
 
 		/// <summary>
 		/// Start the pump
 		/// </summary>
 		public void Start()
 		{
-			if ( !this.Pumping )  // Ignore if already started
+			if ( this.PumpState == EventPumpState.Stopped )  // Ignore if already started
 			{
 				this.pumpThread = new Thread( new ThreadStart( PumpThreadProc ) );
-				this.pumpThread.Name = "EventPumpThread";
-				pumping = true;
-				this.pumpThread.Start();
+                this.pumpThread.Name = "EventPumpThread" + this.Name;
+                this.pumpThread.Priority = ThreadPriority.Highest;
+                this.PumpState = EventPumpState.Pumping;
+                this.pumpThread.Start();
 			}
 		}
 
@@ -111,19 +159,18 @@ namespace NUnit.Core
 		/// </summary>
 		public void Stop()
 		{
-			if ( this.Pumping && !this.Stopping ) // Ignore extra calls
+			if ( this.PumpState == EventPumpState.Pumping ) // Ignore extra calls
 			{
-				lock( events )
-				{
-					stopping = true;
-					Monitor.Pulse( events ); // In case thread is waiting
-				}
-				this.pumpThread.Join();
+                this.PumpState = EventPumpState.Stopping;
+                this.events.Stop();
+                this.pumpThread.Join();
 			}
 		}
+
 		#endregion
 
 		#region PumpThreadProc
+
 		/// <summary>
 		/// Our thread proc for removing items from the event
 		/// queue and sending them on. Note that this would
@@ -133,35 +180,40 @@ namespace NUnit.Core
 		private void PumpThreadProc()
 		{
 			EventListener hostListeners = CoreExtensions.Host.Listeners;
-			Monitor.Enter( events );
             try
             {
-                while (this.events.Count > 0 || !stopping)
+                while (true)
                 {
-                    while (this.events.Count > 0)
+                    Event e = this.events.Dequeue( this.PumpState == EventPumpState.Pumping );
+                    if ( e == null )
+                        break;
+                    try
                     {
-                        Event e = this.events.Dequeue();
                         e.Send(this.eventListener);
 						e.Send(hostListeners);
-                        if (autostop && e is RunFinishedEvent)
-                            stopping = true;
                     }
-                    // Will be pulsed if there are any events added
-                    // or if it's time to stop the pump.
-                    if (!stopping)
-                        Monitor.Wait(events);
+                    catch (Exception ex)
+                    {
+                        log.Error( "Exception in event handler", ex );
+                    }
+                    finally
+                    {
+                        if ( e.IsSynchronous )
+                            this.synchronousEventSent.Set();
+                    }
+
+                    if ( this.autostop && e is RunFinishedEvent )
+                        this.PumpState = EventPumpState.Stopping;
                 }
             }
             catch (Exception ex)
             {
-                throw new ApplicationException("Exception in pump thread", ex);
+                log.Error( "Exception in pump thread", ex );
             }
 			finally
 			{
-				Monitor.Exit( events );
-				pumping = false;
-				stopping = false;
-				//pumpThread = null;
+                this.PumpState = EventPumpState.Stopped;
+                //pumpThread = null;
 			}
 		}
 		#endregion
diff --git a/src/NUnitCore/core/EventQueue.cs b/src/NUnitCore/core/EventQueue.cs
index 1732018..1fc7c23 100644
--- a/src/NUnitCore/core/EventQueue.cs
+++ b/src/NUnitCore/core/EventQueue.cs
@@ -1,10 +1,12 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 using System;
 using System.Collections;
+using System.Globalization;
+using System.Runtime.Serialization;
 using System.Threading;
 
 namespace NUnit.Core
@@ -21,6 +23,32 @@ namespace NUnit.Core
 	public abstract class Event
 	{
 		abstract public void Send( EventListener listener );
+
+        /// <summary>
+        /// Gets a value indicating whether this event is delivered synchronously by the NUnit <see cref="EventPump"/>.
+        /// <para>
+        /// If <c>true</c>, and if <see cref="EventQueue.SetWaitHandleForSynchronizedEvents"/> has been used to 
+        /// set a WaitHandle, <see cref="EventQueue.Enqueue"/> blocks its calling thread until the <see cref="EventPump"/>
+        /// thread has delivered the event and sets the WaitHandle.
+        /// </para>
+        /// </summary>
+	    public virtual bool IsSynchronous
+	    {
+	        get
+	        {
+	            return false;
+	        }
+	    }
+
+        protected static Exception WrapUnserializableException(Exception ex)
+        {
+            string message = string.Format(
+                CultureInfo.InvariantCulture,
+                "(failed to serialize original Exception - original Exception follows){0}{1}",
+                Environment.NewLine,
+                ex);
+            return new Exception(message);
+        }
 	}
 
 	public class RunStartedEvent : Event
@@ -34,6 +62,14 @@ namespace NUnit.Core
 			this.testCount = testCount;
 		}
 
+        public override bool IsSynchronous
+        {
+            get
+            {
+                return true;
+            }
+		}
+
 		public override void Send( EventListener listener )
 		{
 			listener.RunStarted(name, testCount);
@@ -58,7 +94,17 @@ namespace NUnit.Core
 		public override void Send( EventListener listener )
 		{
 			if ( this.exception != null )
-				listener.RunFinished( this.exception );
+            {
+                try
+                {
+					listener.RunFinished( this.exception );
+                }
+                catch (SerializationException)
+                {
+                    Exception wrapped = WrapUnserializableException(this.exception);
+                    listener.RunFinished(wrapped);
+                }
+            }
 			else
 				listener.RunFinished( this.result );
 		}
@@ -73,6 +119,14 @@ namespace NUnit.Core
 			this.testName = testName;
 		}
 
+        public override bool IsSynchronous
+        {
+            get
+            {
+                return true;
+            }
+        }
+        
 		public override void Send( EventListener listener )
 		{
 			listener.TestStarted( this.testName );
@@ -81,9 +135,9 @@ namespace NUnit.Core
 			
 	public class TestFinishedEvent : Event
 	{
-		TestCaseResult result;
+		TestResult result;
 
-		public TestFinishedEvent( TestCaseResult result )
+		public TestFinishedEvent( TestResult result )
 		{
 			this.result = result;
 		}
@@ -103,6 +157,14 @@ namespace NUnit.Core
 			this.suiteName = suiteName;
 		}
 
+        public override bool IsSynchronous
+        {
+            get
+            {
+                return true;
+            }
+        }
+        
 		public override void Send( EventListener listener )
 		{
 			listener.SuiteStarted( this.suiteName );
@@ -111,9 +173,9 @@ namespace NUnit.Core
 
 	public class SuiteFinishedEvent : Event
 	{
-		TestSuiteResult result;
+		TestResult result;
 
-		public SuiteFinishedEvent( TestSuiteResult result )
+		public SuiteFinishedEvent( TestResult result )
 		{
 			this.result = result;
 		}
@@ -135,7 +197,15 @@ namespace NUnit.Core
 
 		public override void Send( EventListener listener )
 		{
-			listener.UnhandledException( this.exception );
+            try
+            {
+				listener.UnhandledException( this.exception );
+            }
+            catch (SerializationException)
+            {
+                Exception wrapped = WrapUnserializableException(this.exception);
+                listener.UnhandledException(wrapped);
+            }
 		}
 	}
 
@@ -162,34 +232,119 @@ namespace NUnit.Core
 	/// </summary>
 	public class EventQueue
 	{
-		private Queue queue = new Queue();
+		private readonly Queue queue = new Queue();
+	    private readonly object syncRoot;
+        private bool stopped;
+
+        /// <summary>
+        /// WaitHandle for synchronous event delivery in <see cref="Enqueue"/>.
+        /// <para>
+        /// Having just one handle for the whole <see cref="EventQueue"/> implies that 
+        /// there may be only one producer (the test thread) for synchronous events.
+        /// If there can be multiple producers for synchronous events, one would have
+        /// to introduce one WaitHandle per event.
+        /// </para>
+        /// </summary>
+        private AutoResetEvent synchronousEventSent;
 
 		public int Count
 		{
 			get 
 			{
-				lock( this )
+				lock( this.syncRoot )
 				{
 					return this.queue.Count; 
 				}
 			}
 		}
 
+        public EventQueue()
+        {
+            this.syncRoot = queue.SyncRoot;
+        }
+
+        /// <summary>
+        /// Sets a handle on which to wait, when <see cref="Enqueue"/> is called
+        /// for an <see cref="Event"/> with <see cref="Event.IsSynchronous"/> == true.
+        /// </summary>
+        /// <param name="synchronousEventWaitHandle">
+        /// The wait handle on which to wait, when <see cref="Enqueue"/> is called
+        /// for an <see cref="Event"/> with <see cref="Event.IsSynchronous"/> == true.
+        /// <para>The caller is responsible for disposing this wait handle.</para>
+        /// </param>
+        public void SetWaitHandleForSynchronizedEvents( AutoResetEvent synchronousEventWaitHandle )
+        {
+            this.synchronousEventSent = synchronousEventWaitHandle;
+        }
+
 		public void Enqueue( Event e )
 		{
-			lock( this )
+			lock( this.syncRoot )
 			{
 				this.queue.Enqueue( e );
-				Monitor.Pulse( this );
+				Monitor.Pulse( this.syncRoot );
 			}
+
+            if ( this.synchronousEventSent != null && e.IsSynchronous )
+            {
+                this.synchronousEventSent.WaitOne();
+            }
+            else
+            {
+                Thread.Sleep( 0 ); // give EventPump thread a chance to process the event
+            }
 		}
 
-		public Event Dequeue()
+        /// <summary>
+        /// Removes the first element from the queue and returns it (or <c>null</c>).
+        /// </summary>
+        /// <param name="blockWhenEmpty">
+        /// If <c>true</c> and the queue is empty, the calling thread is blocked until
+        /// either an element is enqueued, or <see cref="Stop"/> is called.
+        /// </param>
+        /// <returns>
+        /// <list type="bullet">
+        ///   <item>
+        ///     <term>If the queue not empty</term>
+        ///     <description>the first element.</description>
+        ///   </item>
+        ///   <item>
+        ///     <term>otherwise, if <paramref name="blockWhenEmpty"/>==<c>false</c> 
+        ///       or <see cref="Stop"/> has been called</term>
+        ///     <description><c>null</c>.</description>
+        ///   </item>
+        /// </list>
+        /// </returns>
+		public Event Dequeue( bool blockWhenEmpty )
 		{
-			lock( this )
+			lock( this.syncRoot )
 			{
+                while ( this.queue.Count == 0 )
+                {
+                    if ( blockWhenEmpty && !this.stopped )
+                    {
+                        Monitor.Wait( this.syncRoot );
+                    }
+                    else
+                    {
+                        return null;
+                    }
+                }
+
 				return (Event)this.queue.Dequeue();
 			}
 		}
+
+        public void Stop()
+        {
+            lock( this.syncRoot )
+            {
+                if ( !this.stopped )
+                {
+                    this.stopped = true;
+                    Monitor.Pulse( this.syncRoot );
+                }
+            }
+        }
 	}
 }
diff --git a/src/NUnitCore/core/ExpectedExceptionProcessor.cs b/src/NUnitCore/core/ExpectedExceptionProcessor.cs
new file mode 100644
index 0000000..11a193a
--- /dev/null
+++ b/src/NUnitCore/core/ExpectedExceptionProcessor.cs
@@ -0,0 +1,279 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Reflection;
+using System.Text.RegularExpressions;
+
+namespace NUnit.Core
+{
+    public class ExpectedExceptionProcessor
+    {
+        #region Fields
+        /// <summary>
+        /// The TestMethod to which this exception processor applies
+        /// </summary>
+        internal TestMethod testMethod;
+
+        /// <summary>
+        /// The exception handler method
+        /// </summary>
+        internal MethodInfo exceptionHandler;
+
+        /// <summary>
+        /// The type of any expected exception
+        /// </summary>
+        internal Type expectedExceptionType;
+
+        /// <summary>
+        /// The full name of any expected exception type
+        /// </summary>
+        internal string expectedExceptionName;
+
+        /// <summary>
+        /// The value of any message associated with an expected exception
+        /// </summary>
+        internal string expectedMessage;
+
+        /// <summary>
+        /// A string indicating how to match the expected message
+        /// </summary>
+        internal string matchType;
+
+        /// <summary>
+        /// A string containing any user message specified for the expected exception
+        /// </summary>
+        internal string userMessage;
+        #endregion
+
+        #region Constructor
+        public ExpectedExceptionProcessor( TestMethod testMethod )
+        {
+            this.testMethod = testMethod;
+        }
+
+        public ExpectedExceptionProcessor(TestMethod testMethod, object source)
+        {
+            this.testMethod = testMethod;
+
+            this.expectedExceptionType = GetExceptionType(source);
+            this.expectedExceptionName = GetExceptionName(source);
+            this.expectedMessage = GetExpectedMessage(source);
+            this.matchType = GetMatchType(source);
+            this.userMessage = GetUserMessage(source);
+
+            string handlerName = GetHandler(source);
+            if (handlerName == null)
+                this.exceptionHandler = GetDefaultExceptionHandler(testMethod.FixtureType);
+            else
+            {
+                MethodInfo handler = GetExceptionHandler(testMethod.FixtureType, handlerName);
+                if (handler != null)
+                    this.exceptionHandler = handler;
+                else
+                {
+                    testMethod.RunState = RunState.NotRunnable;
+                    testMethod.IgnoreReason = string.Format(
+                        "The specified exception handler {0} was not found", handlerName);
+                }
+            }
+        }
+        #endregion
+
+        #region Public Methods
+        public void ProcessNoException(TestResult testResult)
+        {
+            testResult.Failure(NoExceptionMessage(), null);
+        }
+
+        public void ProcessException(Exception exception, TestResult testResult)
+        {
+            if (exception is NUnitException)
+                exception = exception.InnerException;
+
+            if (IsExpectedExceptionType(exception))
+            {
+                if (IsExpectedMessageMatch(exception))
+                {
+                    if (exceptionHandler != null)
+                        Reflect.InvokeMethod(exceptionHandler, testMethod.Fixture, exception);
+
+                    testResult.Success();
+                }
+                else
+                {
+                    testResult.Failure(WrongTextMessage(exception), GetStackTrace(exception));
+                }
+            }
+            else
+            {
+                switch (NUnitFramework.GetResultState(exception))
+                {
+                    case ResultState.Failure:
+                        testResult.Failure(exception.Message, exception.StackTrace);
+                        break;
+                    case ResultState.Ignored:
+                        testResult.Ignore(exception);
+                        break;
+                    case ResultState.Inconclusive:
+                        testResult.SetResult(ResultState.Inconclusive, exception, FailureSite.Test);
+                        break;
+                    case ResultState.Success:
+                        testResult.Success(exception.Message);
+                        break;
+                    default:
+                        testResult.Failure(WrongTypeMessage(exception), GetStackTrace(exception));
+                        break;
+                }
+            }
+		}
+        #endregion
+
+        #region Helper Methods
+        private bool IsExpectedExceptionType(Exception exception)
+        {
+            return expectedExceptionName == null ||
+                expectedExceptionName.Equals(exception.GetType().FullName);
+        }
+
+        private bool IsExpectedMessageMatch(Exception exception)
+        {
+            if (expectedMessage == null)
+                return true;
+
+            switch (matchType)
+            {
+                case "Exact":
+                default:
+                    return expectedMessage.Equals(exception.Message);
+                case "Contains":
+                    return exception.Message.IndexOf(expectedMessage) >= 0;
+                case "Regex":
+                    return Regex.IsMatch(exception.Message, expectedMessage);
+                case "StartsWith":
+                    return exception.Message.StartsWith(expectedMessage);
+            }
+        }
+
+        private string NoExceptionMessage()
+        {
+            string expectedType = expectedExceptionName == null ? "An Exception" : expectedExceptionName;
+            return CombineWithUserMessage(expectedType + " was expected");
+        }
+
+        private string WrongTypeMessage(Exception exception)
+        {
+            return CombineWithUserMessage(
+                "An unexpected exception type was thrown" + Environment.NewLine +
+                "Expected: " + expectedExceptionName + Environment.NewLine +
+                " but was: " + exception.GetType().FullName + " : " + exception.Message);
+        }
+
+        private string WrongTextMessage(Exception exception)
+        {
+            string expectedText;
+            switch (matchType)
+            {
+                default:
+                case "Exact":
+                    expectedText = "Expected: ";
+                    break;
+                case "Contains":
+                    expectedText = "Expected message containing: ";
+                    break;
+                case "Regex":
+                    expectedText = "Expected message matching: ";
+                    break;
+                case "StartsWith":
+                    expectedText = "Expected message starting: ";
+                    break;
+            }
+
+            return CombineWithUserMessage(
+                "The exception message text was incorrect" + Environment.NewLine +
+                expectedText + expectedMessage + Environment.NewLine +
+                " but was: " + exception.Message);
+        }
+
+        private string CombineWithUserMessage(string message)
+        {
+            if (userMessage == null)
+                return message;
+            return userMessage + Environment.NewLine + message;
+        }
+
+        private string GetStackTrace(Exception exception)
+        {
+            try
+            {
+                return exception.StackTrace;
+            }
+            catch (Exception)
+            {
+                return "No stack trace available";
+            }
+        }
+
+        private static MethodInfo GetDefaultExceptionHandler(Type fixtureType)
+        {
+            return Reflect.HasInterface(fixtureType, NUnitFramework.ExpectExceptionInterface)
+                ? GetExceptionHandler(fixtureType, "HandleException")
+                : null;
+        }
+
+        private static MethodInfo GetExceptionHandler(Type fixtureType, string name)
+        {
+            return Reflect.GetNamedMethod(
+                fixtureType,
+                name,
+                new string[] { "System.Exception" });
+        }
+
+        private static string GetHandler(object source)
+        {
+            return Reflect.GetPropertyValue(source, "Handler") as string;
+        }
+
+        private static Type GetExceptionType(object source)
+        {
+            Type type = Reflect.GetPropertyValue(source, PropertyNames.ExpectedException) as Type;
+
+            // Prior to 2.5, NUnit used an 'ExceptionType' property
+            if (type == null)
+                type = Reflect.GetPropertyValue(source, PropertyNames.LegacyExceptionType) as Type;
+
+            return type;
+        }
+
+        private static string GetExceptionName(object source)
+        {
+            string name = Reflect.GetPropertyValue(source, PropertyNames.ExpectedExceptionName) as string;
+
+            // Prior to 2.5, NUnit used an 'ExceptionName' property
+            if (name == null)
+                name = Reflect.GetPropertyValue(source, PropertyNames.LegacyExceptionName) as string;
+
+            return name;
+        }
+
+        private static string GetExpectedMessage(object source)
+        {
+            return Reflect.GetPropertyValue(source, PropertyNames.ExpectedMessage) as string;
+        }
+
+        private static string GetMatchType(object source)
+        {
+            object matchEnum = Reflect.GetPropertyValue(source, "MatchType");
+            return matchEnum != null ? matchEnum.ToString() : null;
+        }
+
+        private static string GetUserMessage(object source)
+        {
+            return Reflect.GetPropertyValue(source, "UserMessage") as string;
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/core/Extensibility/AddinRegistry.cs b/src/NUnitCore/core/Extensibility/AddinRegistry.cs
deleted file mode 100644
index 8377e19..0000000
--- a/src/NUnitCore/core/Extensibility/AddinRegistry.cs
+++ /dev/null
@@ -1,66 +0,0 @@
-using System;
-using System.Collections;
-using System.Reflection;
-
-namespace NUnit.Core.Extensibility
-{
-	/// <summary>
-	/// Summary description for AddinRegistry.
-	/// </summary>
-	public class AddinRegistry : MarshalByRefObject, IAddinRegistry, IService
-    {
-        #region Instance Fields
-        private ArrayList addins = new ArrayList();
-		#endregion
-
-		#region IAddinRegistry Members
-
-        //public void Register(Type type)
-        //{
-        //    addins.Add( new Addin( type ) );
-        //}
-
-		public void Register(Addin addin)
-		{
-			addins.Add( addin );
-		}
-
-        public void Register(Assembly assembly)
-        {
-            foreach (Type type in assembly.GetExportedTypes())
-            {
-                if (type.GetCustomAttributes(typeof(NUnitAddinAttribute), false).Length == 1)
-                {
-                    Addin addin = new Addin(type);
-                    Register(addin);
-                }
-            }
-        }
-
-		public  IList Addins
-		{
-			get
-			{
-				return addins;
-			}
-		}
-
-		public void SetStatus( string name, AddinStatus status )
-		{
-			foreach( Addin addin in addins )
-				if ( addin.Name == name )
-					addin.Status = status;
-		}
-		#endregion
-
-		#region IService Members
-		public void InitializeService()
-		{
-		}
-
-		public void UnloadService()
-		{
-		}
-		#endregion
-	}
-}
diff --git a/src/NUnitCore/core/Extensibility/DataPointProviders.cs b/src/NUnitCore/core/Extensibility/DataPointProviders.cs
new file mode 100644
index 0000000..079498d
--- /dev/null
+++ b/src/NUnitCore/core/Extensibility/DataPointProviders.cs
@@ -0,0 +1,116 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Reflection;
+using System.Collections;
+
+namespace NUnit.Core.Extensibility
+{
+    class DataPointProviders : ExtensionPoint, IDataPointProvider2
+    {
+        public DataPointProviders(ExtensionHost host)
+            : base("DataPointProviders", host) { }
+
+        #region IDataPointProvider Members
+
+        /// <summary>
+        /// Determine whether any data is available for a parameter.
+        /// </summary>
+        /// <param name="parameter">A ParameterInfo representing one
+        /// argument to a parameterized test</param>
+        /// <returns>True if any data is available, otherwise false.</returns>
+        public bool HasDataFor(ParameterInfo parameter)
+        {
+            foreach (IDataPointProvider provider in Extensions)
+                if (provider.HasDataFor(parameter))
+                    return true;
+
+            return false;
+        }
+
+        /// <summary>
+        /// Return an IEnumerable providing data for use with the
+        /// supplied parameter.
+        /// </summary>
+        /// <param name="parameter">A ParameterInfo representing one
+        /// argument to a parameterized test</param>
+        /// <returns>An IEnumerable providing the required data</returns>
+        public IEnumerable GetDataFor(ParameterInfo parameter)
+        {
+            ArrayList list = new ArrayList();
+
+            foreach (IDataPointProvider provider in Extensions)
+                if (provider.HasDataFor(parameter))
+                    foreach (object o in provider.GetDataFor(parameter))
+                        list.Add(o);
+
+            return list;
+        }
+        #endregion
+
+        #region IDataPointProvider2 Members
+
+        /// <summary>
+        /// Determine whether any data is available for a parameter.
+        /// </summary>
+        /// <param name="parameter">A ParameterInfo representing one
+        /// argument to a parameterized test</param>
+        /// <returns>True if any data is available, otherwise false.</returns>
+        public bool HasDataFor(ParameterInfo parameter, Test suite)
+        {
+            foreach (IDataPointProvider provider in Extensions)
+            {
+                if (provider is IDataPointProvider2)
+                {
+                    IDataPointProvider2 provider2 = (IDataPointProvider2)provider;
+                    if (provider2.HasDataFor(parameter, suite))
+                        return true;
+                }
+                else if (provider.HasDataFor(parameter))
+                    return true;
+            }
+
+            return false;
+        }
+
+        /// <summary>
+        /// Return an IEnumerable providing data for use with the
+        /// supplied parameter.
+        /// </summary>
+        /// <param name="parameter">A ParameterInfo representing one
+        /// argument to a parameterized test</param>
+        /// <returns>An IEnumerable providing the required data</returns>
+        public IEnumerable GetDataFor(ParameterInfo parameter, Test suite)
+        {
+            ArrayList list = new ArrayList();
+
+            foreach (IDataPointProvider provider in Extensions)
+            {
+                if (provider is IDataPointProvider2)
+                {
+                    IDataPointProvider2 provider2 = (IDataPointProvider2)provider;
+                    if (provider2.HasDataFor(parameter, suite))
+                        foreach (object o in provider2.GetDataFor(parameter, suite))
+                            list.Add(o);
+                }
+                else if (provider.HasDataFor(parameter))
+                    foreach (object o in provider.GetDataFor(parameter))
+                        list.Add(o);
+            }
+
+            return list;
+        }
+        #endregion
+
+        #region ExtensionPoint Overrides
+        protected override bool IsValidExtension(object extension)
+        {
+            return extension is IDataPointProvider;
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/core/Extensibility/EventListenerCollection.cs b/src/NUnitCore/core/Extensibility/EventListenerCollection.cs
index de1319e..84e50a4 100644
--- a/src/NUnitCore/core/Extensibility/EventListenerCollection.cs
+++ b/src/NUnitCore/core/Extensibility/EventListenerCollection.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 using System;
 using System.Collections;
@@ -22,62 +22,62 @@ namespace NUnit.Core.Extensibility
 		#region EventListener Members
 		public void RunStarted(string name, int testCount)
 		{
-			foreach( EventListener listener in extensions )
+			foreach( EventListener listener in Extensions )
 				listener.RunStarted( name, testCount );
 		}
 
 		public void RunFinished(TestResult result)
 		{
-			foreach( EventListener listener in extensions )
+			foreach( EventListener listener in Extensions )
 				listener.RunFinished( result );
 		}
 
 		public void RunFinished(Exception exception)
 		{
-			foreach( EventListener listener in extensions )
+			foreach( EventListener listener in Extensions )
 				listener.RunFinished( exception );
 		}
 
 		public void SuiteStarted(TestName testName)
 		{
-			foreach( EventListener listener in extensions )
+			foreach( EventListener listener in Extensions )
 				listener.SuiteStarted( testName );
 		}
 
-		public void SuiteFinished(TestSuiteResult result)
+		public void SuiteFinished(TestResult result)
 		{
-			foreach( EventListener listener in extensions )
+			foreach( EventListener listener in Extensions )
 				listener.SuiteFinished( result );
 		}
 
 		public void TestStarted(TestName testName)
 		{
-			foreach( EventListener listener in extensions )
+			foreach( EventListener listener in Extensions )
 				listener.TestStarted( testName );
 		}
 
-		public void TestFinished(TestCaseResult result)
+		public void TestFinished(TestResult result)
 		{
-			foreach( EventListener listener in extensions )
+			foreach( EventListener listener in Extensions )
 				listener.TestFinished( result );
 		}
 
 		public void UnhandledException(Exception exception)
 		{
-			foreach( EventListener listener in extensions )
+			foreach( EventListener listener in Extensions )
 				listener.UnhandledException( exception );
 		}
 
 		public void TestOutput(TestOutput testOutput)
 		{
-			foreach( EventListener listener in extensions )
+			foreach( EventListener listener in Extensions )
 				listener.TestOutput( testOutput );
 		}
 
 		#endregion
 
 		#region ExtensionPoint Overrides
-		protected override bool ValidExtension(object extension)
+		protected override bool IsValidExtension(object extension)
 		{
 			return extension is EventListener; 
 		}
diff --git a/src/NUnitCore/core/Extensibility/FrameworkRegistry.cs b/src/NUnitCore/core/Extensibility/FrameworkRegistry.cs
index 5cf23e3..dedf092 100644
--- a/src/NUnitCore/core/Extensibility/FrameworkRegistry.cs
+++ b/src/NUnitCore/core/Extensibility/FrameworkRegistry.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 using System;
 using System.Reflection;
@@ -9,8 +9,13 @@ using System.Collections;
 
 namespace NUnit.Core.Extensibility
 {
-    public class FrameworkRegistry : IFrameworkRegistry
+    public class FrameworkRegistry : ExtensionPoint, IFrameworkRegistry
     {
+		#region Constructor
+		public FrameworkRegistry( IExtensionHost host )
+			: base( "FrameworkRegistry", host ) { }
+		#endregion Constructor
+
         #region Instance Fields
         /// <summary>
         /// List of FrameworkInfo structs for supported frameworks
@@ -31,6 +36,14 @@ namespace NUnit.Core.Extensibility
         }
 		#endregion
 
+		#region ExtensionPoint overrides
+        protected override bool IsValidExtension(object extension)
+		{
+			return extension is TestFramework;
+		}
+
+		#endregion
+
 		#region Other Methods
         /// <summary>
         /// Get a list of known frameworks referenced by an assembly
diff --git a/src/NUnitCore/core/Extensibility/SuiteBuilderCollection.cs b/src/NUnitCore/core/Extensibility/SuiteBuilderCollection.cs
index 57a2413..73d6a5c 100644
--- a/src/NUnitCore/core/Extensibility/SuiteBuilderCollection.cs
+++ b/src/NUnitCore/core/Extensibility/SuiteBuilderCollection.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -37,7 +37,7 @@ namespace NUnit.Core.Extensibility
 		/// <returns>True if the type can be used to build a TestSuite</returns>
 		public bool CanBuildFrom(Type type)
 		{
-			foreach( ISuiteBuilder builder in extensions )
+			foreach( ISuiteBuilder builder in Extensions )
 				if ( builder.CanBuildFrom( type ) )
 					return true;
 			return false;
@@ -50,7 +50,7 @@ namespace NUnit.Core.Extensibility
 		/// <returns>A TestSuite or null</returns>
 		public Test BuildFrom(Type type)
 		{
-			foreach( ISuiteBuilder builder in extensions )
+			foreach( ISuiteBuilder builder in Extensions )
 				if ( builder.CanBuildFrom( type ) )
 					return builder.BuildFrom( type );
 			return null;
@@ -59,7 +59,7 @@ namespace NUnit.Core.Extensibility
 		#endregion
 
 		#region ExtensionPoint Overrides
-		protected override bool ValidExtension(object extension)
+		protected override bool IsValidExtension(object extension)
 		{
 			return extension is ISuiteBuilder; 
 		}
diff --git a/src/NUnitCore/core/Extensibility/TestCaseBuilderCollection.cs b/src/NUnitCore/core/Extensibility/TestCaseBuilderCollection.cs
index 7e17402..229f86b 100644
--- a/src/NUnitCore/core/Extensibility/TestCaseBuilderCollection.cs
+++ b/src/NUnitCore/core/Extensibility/TestCaseBuilderCollection.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 using System;
 using System.Collections;
@@ -17,48 +17,95 @@ namespace NUnit.Core.Extensibility
 	/// The builders are added to the collection by inserting them at
 	/// the start, as to take precedence over those added earlier. 
 	/// </summary>
-	public class TestCaseBuilderCollection : ExtensionPoint, ITestCaseBuilder
+	public class TestCaseBuilderCollection : ExtensionPoint, ITestCaseBuilder2
 	{
 		#region Constructor
 		public TestCaseBuilderCollection(IExtensionHost host)
 			: base("TestCaseBuilders", host) { }
 		#endregion
-		
-		#region ITestCaseBuilder Members
 
-		/// <summary>
-		/// Examine the method and determine if it is suitable for
-		/// any TestCaseBuilder to use in building a TestCase
-		/// </summary>
-		/// <param name="method">The method to be used as a test case</param>
-		/// <returns>True if the type can be used to build a TestCase</returns>
-		public bool CanBuildFrom( MethodInfo method )
-		{
-			foreach( ITestCaseBuilder builder in extensions )
-				if ( builder.CanBuildFrom( method ) )
-					return true;
-			return false;
-		}
+        #region ITestCaseBuilder Members
+        /// <summary>
+        /// Examine the method and determine if it is suitable for
+        /// any TestCaseBuilder to use in building a Test
+        /// </summary>
+        /// <param name="method">The method to be used as a test case</param>
+        /// <returns>True if the method can be used to build a Test</returns>
+        public bool CanBuildFrom(MethodInfo method)
+        {
+            foreach (ITestCaseBuilder builder in Extensions)
+                if (builder.CanBuildFrom(method))
+                    return true;
+            return false;
+        }
 
-		/// <summary>
-		/// Build a TestCase from the method provided.
-		/// </summary>
-		/// <param name="method">The method to be used</param>
-		/// <returns>A TestCase or null</returns>
-		public Test BuildFrom( MethodInfo method )
-		{
-			foreach( ITestCaseBuilder builder in extensions )
-			{
-				if ( builder.CanBuildFrom( method ) )
-					return builder.BuildFrom( method );
-			}
+        /// <summary>
+        /// Build a Test from the method provided.
+        /// </summary>
+        /// <param name="method">The method to be used</param>
+        /// <returns>A Test or null</returns>
+        public Test BuildFrom(MethodInfo method)
+        {
+            foreach (ITestCaseBuilder builder in Extensions)
+            {
+                if (builder.CanBuildFrom(method))
+                    return builder.BuildFrom(method);
+            }
 
-			return null;
-		}
-		#endregion
+            return null;
+        }
+        #endregion
+
+        #region ITestCaseBuilder2 Members
+
+        /// <summary>
+        /// Examine the method and determine if it is suitable for
+        /// any TestCaseBuilder to use in building a Test
+        /// </summary>
+        /// <param name="method">The method to be used as a test case</param>
+        /// <returns>True if the method can be used to build a Test</returns>
+        public bool CanBuildFrom(MethodInfo method, Test suite)
+        {
+            foreach (ITestCaseBuilder builder in Extensions)
+            {
+                if (builder is ITestCaseBuilder2)
+                {
+                    ITestCaseBuilder2 builder2 = (ITestCaseBuilder2)builder;
+                    if (builder2.CanBuildFrom(method, suite))
+                        return true;
+                }
+                else if (builder.CanBuildFrom(method))
+                    return true;
+            }
+            
+            return false;
+        }
+
+        /// <summary>
+        /// Build a Test from the method provided.
+        /// </summary>
+        /// <param name="method">The method to be used</param>
+        /// <returns>A Test or null</returns>
+        public Test BuildFrom(MethodInfo method, Test suite)
+        {
+            foreach (ITestCaseBuilder builder in Extensions)
+            {
+                if (builder is ITestCaseBuilder2)
+                {
+                    ITestCaseBuilder2 builder2 = (ITestCaseBuilder2)builder;
+                    if (builder2.CanBuildFrom(method, suite))
+                        return builder2.BuildFrom(method, suite);
+                }
+                else if (builder.CanBuildFrom(method))
+                    return builder.BuildFrom(method);
+            }
+
+            return null;
+        }
+        #endregion
 
-		#region ExtensionPoint Overrides
-		protected override bool ValidExtension(object extension)
+        #region ExtensionPoint Overrides
+		protected override bool IsValidExtension(object extension)
 		{
 			return extension is ITestCaseBuilder; 
 		}
diff --git a/src/NUnitCore/core/Extensibility/TestCaseProviders.cs b/src/NUnitCore/core/Extensibility/TestCaseProviders.cs
new file mode 100644
index 0000000..35e420d
--- /dev/null
+++ b/src/NUnitCore/core/Extensibility/TestCaseProviders.cs
@@ -0,0 +1,133 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System.Collections;
+using System.Reflection;
+
+namespace NUnit.Core.Extensibility
+{
+    class TestCaseProviders : ExtensionPoint, ITestCaseProvider2
+    {
+        public TestCaseProviders(IExtensionHost host) : base( "TestCaseProviders", host ) { }
+
+        #region ITestCaseProvider Members
+
+        /// <summary>
+        /// Determine whether any test cases are available for a parameterized method.
+        /// </summary>
+        /// <param name="method">A MethodInfo representing a parameterized test</param>
+        /// <returns>True if any cases are available, otherwise false.</returns>
+        public bool HasTestCasesFor(MethodInfo method)
+        {
+            foreach (ITestCaseProvider provider in Extensions)
+                if (provider.HasTestCasesFor(method))
+                    return true;
+
+            return false;
+        }
+
+        /// <summary>
+        /// Return an enumeration providing test cases for use in
+        /// running a paramterized test.
+        /// </summary>
+        /// <param name="method"></param>
+        /// <returns></returns>
+        public IEnumerable GetTestCasesFor(MethodInfo method)
+        {
+            ArrayList testcases = new ArrayList();
+
+            foreach (ITestCaseProvider provider in Extensions)
+                try
+                {
+                    if (provider.HasTestCasesFor(method))
+                        foreach (object o in provider.GetTestCasesFor(method))
+                            testcases.Add(o);
+                }
+                catch (System.Reflection.TargetInvocationException ex)
+                {
+                    testcases.Add(new ParameterSet(ex.InnerException));
+                }
+                catch (System.Exception ex)
+                {
+                    testcases.Add(new ParameterSet(ex));
+                }
+
+            return testcases;
+        }
+
+        #endregion
+
+        #region ITestCaseProvider2 Members
+
+        /// <summary>
+        /// Determine whether any test cases are available for a parameterized method.
+        /// </summary>
+        /// <param name="method">A MethodInfo representing a parameterized test</param>
+        /// <param name="suite">The suite for which the test case is being built</param>
+        /// <returns>True if any cases are available, otherwise false.</returns>
+        public bool HasTestCasesFor(MethodInfo method, Test suite)
+        {
+            foreach (ITestCaseProvider provider in Extensions)
+            {
+                if (provider is ITestCaseProvider2)
+                {
+                    ITestCaseProvider2 provider2 = (ITestCaseProvider2)provider;
+                    if (provider2.HasTestCasesFor(method, suite))
+                        return true;
+                }
+                else if (provider.HasTestCasesFor(method))
+                    return true;
+            }
+
+            return false;
+        }
+
+        /// <summary>
+        /// Return an enumeration providing test cases for use in
+        /// running a paramterized test.
+        /// </summary>
+        /// <param name="method">A MethodInfo representing a parameterized test</param>
+        /// <param name="suite">The suite for which the test case is being built</param>
+        /// <returns></returns>
+        public IEnumerable GetTestCasesFor(MethodInfo method, Test suite)
+        {
+            ArrayList testcases = new ArrayList();
+
+            foreach (ITestCaseProvider provider in Extensions)
+                try
+                {
+                    if (provider is ITestCaseProvider2)
+                    {
+                        ITestCaseProvider2 provider2 = (ITestCaseProvider2)provider;
+                        if (provider2.HasTestCasesFor(method, suite))
+                            foreach (object o in provider2.GetTestCasesFor(method, suite))
+                                testcases.Add(o);
+                    }
+                    else if (provider.HasTestCasesFor(method))
+                        foreach (object o in provider.GetTestCasesFor(method))
+                            testcases.Add(o);
+                }
+                catch (System.Reflection.TargetInvocationException ex)
+                {
+                    testcases.Add(new ParameterSet(ex.InnerException));
+                }
+                catch (System.Exception ex)
+                {
+                    testcases.Add(new ParameterSet(ex));
+                }
+
+            return testcases;
+        }
+        #endregion
+
+        #region IsValidExtension
+        protected override bool IsValidExtension(object extension)
+        {
+            return extension is ITestCaseProvider;
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/core/Extensibility/TestDecoratorCollection.cs b/src/NUnitCore/core/Extensibility/TestDecoratorCollection.cs
index e224ab9..c510e35 100644
--- a/src/NUnitCore/core/Extensibility/TestDecoratorCollection.cs
+++ b/src/NUnitCore/core/Extensibility/TestDecoratorCollection.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 using System;
 using System.Collections;
@@ -14,19 +14,20 @@ namespace NUnit.Core.Extensibility
 	/// implements the ITestDecorator interface itself, passing calls 
 	/// on to the individual decorators.
 	/// </summary>
-	public class TestDecoratorCollection : ExtensionPoint, ITestDecorator
+	public class TestDecoratorCollection : ExtensionPoint, IExtensionPoint2, ITestDecorator
 	{
 		#region Constructor
 		public TestDecoratorCollection(IExtensionHost host)
-			: base( "TestDecorators", host ) { }
+			: base( "TestDecorators", host, 10 ) { }
 		#endregion
 
 		#region ITestDecorator Members
+
 		public Test Decorate(Test test, MemberInfo member)
 		{
 			Test decoratedTest = test;
 
-			foreach( ITestDecorator decorator in extensions )
+			foreach( ITestDecorator decorator in Extensions )
 				decoratedTest = decorator.Decorate( decoratedTest, member );
 
 			return decoratedTest;
@@ -34,7 +35,7 @@ namespace NUnit.Core.Extensibility
 		#endregion
 
 		#region ExtensionPoint Overrides
-		protected override bool ValidExtension(object extension)
+		protected override bool IsValidExtension(object extension)
 		{
 			return extension is ITestDecorator; 
 		}
diff --git a/src/NUnitCore/core/Extensibility/TestDecoratorCollection.save.cs b/src/NUnitCore/core/Extensibility/TestDecoratorCollection.save.cs
deleted file mode 100644
index b5dfaa0..0000000
--- a/src/NUnitCore/core/Extensibility/TestDecoratorCollection.save.cs
+++ /dev/null
@@ -1,84 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-using System;
-using System.Collections;
-using System.Reflection;
-
-namespace NUnit.Core.Extensibility
-{
-	/// <summary>
-	/// TestDecoratorCollection is an ExtensionPoint for TestDecorators and
-	/// implements the ITestDecorator interface itself, passing calls 
-	/// on to the individual decorators.
-	/// </summary>
-	public class TestDecoratorCollection : ITestDecorator, IExtensionPoint
-	{
-		private ArrayList decorators = new ArrayList();
-        private ArrayList finalDecorators = new ArrayList();
-
-		#region Constructors
-		public TestDecoratorCollection() { }
-
-		public TestDecoratorCollection( TestDecoratorCollection other )
-		{
-			decorators.AddRange( other.decorators );
-		}
-		#endregion
-
-		#region ITestDecorator Members
-		public Test Decorate(Test test, MemberInfo member)
-		{
-			Test decoratedTest = test;
-
-            foreach (ITestDecorator decorator in decorators)
-                decoratedTest = decorator.Decorate(decoratedTest, member);
-            foreach (ITestDecorator decorator in finalDecorators)
-                decoratedTest = decorator.Decorate(decoratedTest, member);
-
-			return decoratedTest;
-		}
-		#endregion
-
-		#region IExtensionPoint Members
-		public string Name
-		{
-			get { return "TestDecorators"; }
-		}
-
-        public IExtensionHost Host
-        {
-            get { return CoreExtensions.Host; }
-        }
-
-		public void Install(object extension)
-		{
-			ITestDecorator decorator = extension as ITestDecorator;
-			if ( decorator == null )
-				throw new ArgumentException( 
-					extension.GetType().FullName + " is not an ITestDecorator", "exception" );
-
-			decorators.Add( extension );
-		}
-
-		public void Remove( object extension )
-		{
-			decorators.Remove( extension );
-		}
-		#endregion
-
-        #region Public non-Interface Methods
-        /// <summary>
-        /// Used internally by NUnit to install decorators that
-        /// are run after all other decorators have run.
-        /// </summary>
-        /// <param name="decorator"></param>
-        public void InstallFinal(ITestDecorator decorator)
-        {
-            finalDecorators.Add(decorator);
-        }
-        #endregion
-    }
-}
diff --git a/src/NUnitCore/core/ExtensionHost.cs b/src/NUnitCore/core/ExtensionHost.cs
index dda7390..0d08d98 100644
--- a/src/NUnitCore/core/ExtensionHost.cs
+++ b/src/NUnitCore/core/ExtensionHost.cs
@@ -1,9 +1,10 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 using System;
+using System.Collections;
 using NUnit.Core.Extensibility;
 
 namespace NUnit.Core
@@ -17,27 +18,23 @@ namespace NUnit.Core
 	/// </summary>
 	public abstract class ExtensionHost : IExtensionHost
 	{
-		protected FrameworkRegistry frameworks;
+		#region Protected Fields
 
-		protected IExtensionPoint[] extensions;
+	    protected ArrayList extensions;
 
 		protected ExtensionType supportedTypes;
-
-		public ExtensionHost()
-		{
-			frameworks = new FrameworkRegistry();
-		}
+		#endregion
 
 		#region IExtensionHost Interface
 		public IExtensionPoint[] ExtensionPoints
 		{
-			get { return extensions; }
+			get { return (IExtensionPoint[])extensions.ToArray(typeof(IExtensionPoint)); }
 		}
 
-		public IFrameworkRegistry FrameworkRegistry
-		{
-			get { return frameworks; }
-		}
+        public IFrameworkRegistry FrameworkRegistry
+        {
+            get { return (IFrameworkRegistry)GetExtensionPoint("FrameworkRegistry"); }
+        }
 
 		public IExtensionPoint GetExtensionPoint( string name )
 		{
diff --git a/src/NUnitCore/core/ExtensionPoint.cs b/src/NUnitCore/core/ExtensionPoint.cs
index 786d849..747101f 100644
--- a/src/NUnitCore/core/ExtensionPoint.cs
+++ b/src/NUnitCore/core/ExtensionPoint.cs
@@ -1,25 +1,145 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
 using System;
 using System.Collections;
 using NUnit.Core.Extensibility;
 
 namespace NUnit.Core
 {
+	public class ExtensionsCollection : IEnumerable
+	{
+		private static readonly int DEFAULT_LEVEL = 0;
+		private static readonly int MAX_LEVELS = 10;
+
+		private ArrayList[] lists;
+
+		public ExtensionsCollection() : this(1) {}
+
+		public ExtensionsCollection( int levels )
+		{
+			if ( levels < 1 )
+				levels = 1;
+			else if ( levels > MAX_LEVELS )
+				levels = MAX_LEVELS;
+
+			lists = new ArrayList[levels];
+		}
+
+	    public int Levels
+	    {
+            get { return lists.Length; }   
+	    }
+
+		public void Add( object extension )
+		{
+			Add( extension, DEFAULT_LEVEL );
+		}
+
+		public void Add( object extension, int level )
+		{
+			if ( level < 0 || level >= lists.Length )
+				throw new ArgumentOutOfRangeException("level", level, 
+					"Value must be between 0 and " + lists.Length );
+
+			if ( lists[level] == null )
+				lists[level] = new ArrayList();
+
+			lists[level].Insert( 0, extension );
+		}
+
+		public void Remove( object extension )
+		{
+			foreach( IList list in lists )
+				list.Remove( extension );
+		}
+
+		#region IEnumerable Members
+
+		public IEnumerator GetEnumerator()
+		{
+			return new ExtensionsEnumerator( lists );
+		}
+
+		public class ExtensionsEnumerator : IEnumerator
+		{
+			private ArrayList[] lists;
+			private IEnumerator listEnum;
+			private int currentLevel;
+
+			public ExtensionsEnumerator( ArrayList[] lists )
+			{
+				this.lists = lists;
+				Reset();
+			}
+
+			#region IEnumerator Members
+
+			public void Reset()
+			{
+				this.listEnum = null;
+				this.currentLevel = -1;
+			}
+
+			public object Current
+			{
+				get
+				{
+					return listEnum.Current;
+				}
+			}
+
+			public bool MoveNext()
+			{
+				if ( listEnum != null && listEnum.MoveNext() )
+					return true;
+
+				while ( ++currentLevel < lists.Length )
+				{
+					IList list = lists[currentLevel];
+					if ( list != null )
+					{
+						listEnum = list.GetEnumerator();
+						if ( listEnum.MoveNext() )
+							return true;
+					}
+				}
+
+				return false;
+			}
+
+			#endregion
+		}
+
+		#endregion
+	}
+
 	/// <summary>
 	/// ExtensionPoint is used as a base class for all 
 	/// extension points.
 	/// </summary>
 	public abstract class ExtensionPoint : IExtensionPoint
 	{
-		private string name;
-		private IExtensionHost host;
+		private readonly string name;
+		private readonly IExtensionHost host;
+		private readonly ExtensionsCollection extensions;
 
-		protected ArrayList extensions = new ArrayList();
+		protected IEnumerable Extensions
+		{
+			get { return extensions; }
+		}
 
 		#region Constructor
-		public ExtensionPoint(string name, IExtensionHost host)
+        public ExtensionPoint(string name, IExtensionHost host) : this( name, host, 0) { }
+
+	    public ExtensionPoint(string name, IExtensionHost host, int priorityLevels)
 		{
 			this.name = name;
 			this.host = host;
+            extensions = new ExtensionsCollection(priorityLevels);
 		}
 		#endregion
 
@@ -40,22 +160,44 @@ namespace NUnit.Core
 			get { return this.host; }
 		}
 
-		/// <summary>
-		/// Install an extension at this extension point. If the
-		/// extension object does not meet the requirements for
-		/// this extension point, an exception is thrown.
-		/// </summary>
-		/// <param name="extension">The extension to install</param>
-		public void Install(object extension)
-		{
-			if ( !ValidExtension( extension ) )
-				throw new ArgumentException( 
-					extension.GetType().FullName + " is not {0} extension point", "extension" );
+        /// <summary>
+        /// Install an extension at this extension point. If the
+        /// extension object does not meet the requirements for
+        /// this extension point, an exception is thrown.
+        /// </summary>
+        /// <param name="extension">The extension to install</param>
+        public void Install(object extension)
+        {
+            if (!IsValidExtension(extension))
+                throw new ArgumentException(
+                    extension.GetType().FullName + " is not {0} extension point", "extension");
 
-			extensions.Add( extension );
-		}
+            extensions.Add(extension);
+        }
 
-		/// <summary>
+        /// <summary>
+        /// Install an extension at this extension point specifying
+        /// an integer priority value for the extension.If the
+        /// extension object does not meet the requirements for
+        /// this extension point, or if the extension point does
+        /// not support the requested priority level, an exception 
+        /// is thrown.
+        /// </summary>
+        /// <param name="extension">The extension to install</param>
+        /// <param name="priority">The priority level for this extension</param>
+        public void Install(object extension, int priority )
+        {
+            if (!IsValidExtension(extension))
+                throw new ArgumentException(
+                    extension.GetType().FullName + " is not {0} extension point", "extension");
+
+            if (priority < 0 || priority >= extensions.Levels)
+                throw new ArgumentException("Priority value not supported", "priority");
+
+            extensions.Add(extension, priority);
+        }
+
+        /// <summary>
 		/// Removes an extension from this extension point. If the
 		/// extension object is not present, the method returns
 		/// without error.
@@ -67,8 +209,8 @@ namespace NUnit.Core
 		}
 		#endregion
 
-		#region Abstract Methods
-		protected abstract bool ValidExtension(object extension);
+		#region Abstract Members
+		protected abstract bool IsValidExtension(object extension);
 		#endregion
 	}
 }
diff --git a/src/NUnitCore/core/IgnoreDecorator.cs b/src/NUnitCore/core/IgnoreDecorator.cs
index 4a983d4..b0e4057 100644
--- a/src/NUnitCore/core/IgnoreDecorator.cs
+++ b/src/NUnitCore/core/IgnoreDecorator.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 using System;
 using System.Reflection;
@@ -21,16 +21,6 @@ namespace NUnit.Core
 
 		#region ITestDecorator Members
 
-//		public Test Decorate(Test test, MethodInfo method)
-//		{
-//			return DecorateTest( test, method );
-//		}
-//
-//		public Test Decorate(Test test, Type fixtureType)
-//		{
-//			return DecorateTest( test, fixtureType );
-//		}
-
 		public Test Decorate( Test test, MemberInfo member )
 		{
 			Attribute ignoreAttribute = Reflect.GetAttribute( member, NUnitFramework.IgnoreAttribute, false );
diff --git a/src/NUnitCore/core/InternalTrace.cs b/src/NUnitCore/core/InternalTrace.cs
new file mode 100644
index 0000000..10ca686
--- /dev/null
+++ b/src/NUnitCore/core/InternalTrace.cs
@@ -0,0 +1,110 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Core
+{
+    /// <summary>
+    /// InternalTraceLevel is an enumeration controlling the
+    /// level of detailed presented in the internal log.
+    /// </summary>
+    public enum InternalTraceLevel
+    {
+        Default,
+        Off,
+        Error,
+        Warning,
+        Info,
+        Verbose
+    }
+    
+    /// <summary>
+	/// Summary description for Logger.
+	/// </summary>
+	public class InternalTrace
+	{
+        private readonly static string TIME_FMT = "HH:mm:ss.fff";
+
+		private static bool initialized;
+
+        private static InternalTraceWriter writer;
+        public static InternalTraceWriter Writer
+        {
+            get { return writer; }
+        }
+
+		public static InternalTraceLevel Level;
+
+        public static void Initialize(string logName)
+        {
+            int lev = (int) new System.Diagnostics.TraceSwitch("NTrace", "NUnit internal trace").Level;
+            Initialize(logName, (InternalTraceLevel)lev);
+        }
+
+        public static void Initialize(string logName, InternalTraceLevel level)
+        {
+			if (!initialized)
+			{
+				Level = level;
+
+				if (writer == null && Level > InternalTraceLevel.Off)
+				{
+					writer = new InternalTraceWriter(logName);
+					writer.WriteLine("InternalTrace: Initializing at level " + Level.ToString());
+				}
+
+				initialized = true;
+			}
+        }
+
+        public static void Flush()
+        {
+            if (writer != null)
+                writer.Flush();
+        }
+
+        public static void Close()
+        {
+            if (writer != null)
+                writer.Close();
+
+            writer = null;
+        }
+
+        public static Logger GetLogger(string name)
+		{
+			return new Logger( name );
+		}
+
+		public static Logger GetLogger( Type type )
+		{
+			return new Logger( type.FullName );
+		}
+
+        public static void Log(InternalTraceLevel level, string message, string category)
+        {
+            Log(level, message, category, null);
+        }
+
+        public static void Log(InternalTraceLevel level, string message, string category, Exception ex)
+        {
+            Writer.WriteLine("{0} {1,-5} [{2,2}] {3}: {4}",
+                DateTime.Now.ToString(TIME_FMT),
+                level == InternalTraceLevel.Verbose ? "Debug" : level.ToString(),
+#if NET_2_0
+                System.Threading.Thread.CurrentThread.ManagedThreadId,
+#else
+                AppDomain.GetCurrentThreadId(),
+#endif
+                category,
+                message);
+
+            if (ex != null)
+                Writer.WriteLine(ex.ToString());
+        }
+    }
+}
diff --git a/src/NUnitCore/core/InternalTraceWriter.cs b/src/NUnitCore/core/InternalTraceWriter.cs
new file mode 100644
index 0000000..527f875
--- /dev/null
+++ b/src/NUnitCore/core/InternalTraceWriter.cs
@@ -0,0 +1,88 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+using System;
+using System.Diagnostics;
+using System.IO;
+
+namespace NUnit.Core
+{
+	/// <summary>
+	/// A trace listener that writes to a separate file per domain
+	/// and process using it.
+	/// </summary>
+	public class InternalTraceWriter : TextWriter
+	{
+        StreamWriter writer;
+
+        static string logDirectory;
+        public static string LogDirectory
+        {
+            get
+            {
+                if (logDirectory == null)
+                {
+                    logDirectory = Path.Combine(
+                        NUnitConfiguration.ApplicationDirectory, "logs");
+
+                    if (!Directory.Exists(logDirectory))
+                        Directory.CreateDirectory(logDirectory);
+                }
+
+                return logDirectory;
+            }
+        }
+
+		public InternalTraceWriter(string logName)
+		{
+			int pId = Process.GetCurrentProcess().Id;
+			string domainName = AppDomain.CurrentDomain.FriendlyName;
+
+			string fileName = logName
+				.Replace("%p", pId.ToString() )
+				.Replace("%a", domainName );
+
+            string logPath = Path.Combine(LogDirectory, fileName);
+            this.writer = new StreamWriter(logPath, true);
+            this.writer.AutoFlush = true;
+		}
+
+        public override System.Text.Encoding Encoding
+        {
+            get { return writer.Encoding; }
+        }
+
+        public override void Write(char value)
+        {
+            writer.Write(value);
+        }
+
+        public override void Write(string value)
+        {
+            base.Write(value);
+        }
+
+        public override void WriteLine(string value)
+        {
+            writer.WriteLine(value);
+        }
+
+        public override void Close()
+        {
+            if (writer != null)
+            {
+                writer.Flush();
+                writer.Close();
+                writer = null;
+            }
+        }
+
+        public override void Flush()
+        {
+            if ( writer != null )
+                writer.Flush();
+        }
+	}
+}
diff --git a/src/NUnitCore/core/InvalidSuiteException.cs b/src/NUnitCore/core/InvalidSuiteException.cs
index 0b91b2f..e07e2bc 100644
--- a/src/NUnitCore/core/InvalidSuiteException.cs
+++ b/src/NUnitCore/core/InvalidSuiteException.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 namespace NUnit.Core
diff --git a/src/NUnitCore/core/InvalidTestFixtureException.cs b/src/NUnitCore/core/InvalidTestFixtureException.cs
index 767a1d8..5b10a18 100644
--- a/src/NUnitCore/core/InvalidTestFixtureException.cs
+++ b/src/NUnitCore/core/InvalidTestFixtureException.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 namespace NUnit.Core
diff --git a/src/NUnitCore/core/LegacySuite.cs b/src/NUnitCore/core/LegacySuite.cs
index 944bc31..872afda 100644
--- a/src/NUnitCore/core/LegacySuite.cs
+++ b/src/NUnitCore/core/LegacySuite.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -15,71 +15,12 @@ namespace NUnit.Core
 	/// </summary>
 	public class LegacySuite : TestSuite
 	{
-		#region Static Methods
-
-		public static PropertyInfo GetSuiteProperty( Type testClass )
-		{
-			if( testClass == null )
-				return null;
-
-			PropertyInfo property = Reflect.GetPropertyWithAttribute( 
-				testClass, 
-				NUnitFramework.SuiteAttribute,
-				BindingFlags.Static | BindingFlags.Public | BindingFlags.DeclaredOnly );
-
-			return property;
-		}
-
-		#endregion
-
-		#region Constructors
-
 		public LegacySuite( Type fixtureType ) : base( fixtureType )
 		{
-            PropertyInfo suiteProperty = GetSuiteProperty( fixtureType );
-
-            if (suiteProperty == null)
-                throw new ArgumentException( "Invalid argument to LegacySuite constructor", "fixtureType" );
-
-            this.fixtureSetUp = NUnitFramework.GetFixtureSetUpMethod(fixtureType);
-            this.fixtureTearDown = NUnitFramework.GetFixtureTearDownMethod(fixtureType);
-
-            MethodInfo method = suiteProperty.GetGetMethod(true);
-
-            if (method.GetParameters().Length == 0)
-            {
-                Type returnType = method.ReturnType;
-
-                if (returnType.FullName == "NUnit.Core.TestSuite")
-                {
-                    TestSuite suite = (TestSuite)suiteProperty.GetValue(null, new Object[0]);
-                    foreach (Test test in suite.Tests)
-                        this.Add(test);
-                }
-                else if (typeof(IEnumerable).IsAssignableFrom(returnType))
-                {
-                    foreach (object obj in (IEnumerable)suiteProperty.GetValue(null, new object[0]))
-                    {
-                        Type type = obj as Type;
-						if ( type != null && TestFixtureBuilder.CanBuildFrom(type) )
-							this.Add( TestFixtureBuilder.BuildFrom(type) );
-						else
-							this.Add(obj);
-                    }
-                }
-                else
-                {
-                    this.RunState = RunState.NotRunnable;
-                    this.IgnoreReason = "Suite property must return either TestSuite or IEnumerable";
-                }
-            }
-            else
-            {
-                this.RunState = RunState.NotRunnable;
-                this.IgnoreReason = "Suite property may not be indexed";
-            }
-		}
-
-		#endregion
+            this.fixtureSetUpMethods =
+                Reflect.GetMethodsWithAttribute(fixtureType, NUnitFramework.FixtureSetUpAttribute, true);
+            this.fixtureTearDownMethods =
+                Reflect.GetMethodsWithAttribute(fixtureType, NUnitFramework.FixtureTearDownAttribute, true);
+        }
 	}
 }
diff --git a/src/NUnitCore/core/Log4NetCapture.cs b/src/NUnitCore/core/Log4NetCapture.cs
index f7c07a2..38158ed 100644
--- a/src/NUnitCore/core/Log4NetCapture.cs
+++ b/src/NUnitCore/core/Log4NetCapture.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2008, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitCore/core/LogCapture.cs b/src/NUnitCore/core/LogCapture.cs
index e0a13bc..79a930b 100644
--- a/src/NUnitCore/core/LogCapture.cs
+++ b/src/NUnitCore/core/LogCapture.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2008, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 
 using System.Collections.Specialized;
@@ -27,7 +27,11 @@ namespace NUnit.Core
                     defaultThreshold = "Error";
 
                     NameValueCollection settings = (NameValueCollection)
+#if NET_2_0
+                        ConfigurationManager.GetSection("NUnit/TestRunner");
+#else
                         ConfigurationSettings.GetConfig("NUnit/TestRunner");
+#endif
 
                     if (settings != null)
                     {
diff --git a/src/NUnitCore/core/Logger.cs b/src/NUnitCore/core/Logger.cs
new file mode 100644
index 0000000..49b7629
--- /dev/null
+++ b/src/NUnitCore/core/Logger.cs
@@ -0,0 +1,93 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+using System;
+
+namespace NUnit.Core
+{
+    public class Logger
+    {
+        private string name;
+        private string fullname;
+
+        public Logger(string name)
+        {
+            this.fullname = this.name = name;
+            int index = fullname.LastIndexOf('.');
+            if (index >= 0)
+                this.name = fullname.Substring(index + 1);
+        }
+
+        #region Error
+        public void Error(string message)
+        {
+            Log(InternalTraceLevel.Error, message);
+        }
+
+        public void Error(string message, params object[] args)
+        {
+            Log(InternalTraceLevel.Error, message, args);
+        }
+
+        public void Error(string message, Exception ex)
+        {
+            if (InternalTrace.Level >= InternalTraceLevel.Error)
+            {
+                InternalTrace.Log(InternalTraceLevel.Error, message, name, ex);
+            }
+        }
+        #endregion
+
+        #region Warning
+        public void Warning(string message)
+        {
+            Log(InternalTraceLevel.Warning, message);
+        }
+
+        public void Warning(string message, params object[] args)
+        {
+            Log(InternalTraceLevel.Warning, message, args);
+        }
+        #endregion
+
+        #region Info
+        public void Info(string message)
+        {
+            Log(InternalTraceLevel.Info, message);
+        }
+
+        public void Info(string message, params object[] args)
+        {
+            Log(InternalTraceLevel.Info, message, args);
+        }
+        #endregion
+
+        #region Debug
+        public void Debug(string message)
+        {
+            Log(InternalTraceLevel.Verbose, message);
+        }
+
+        public void Debug(string message, params object[] args)
+        {
+            Log(InternalTraceLevel.Verbose, message, args);
+        }
+        #endregion
+
+        #region Helper Methods
+        public void Log(InternalTraceLevel level, string message)
+        {
+            if (InternalTrace.Level >= level)
+                InternalTrace.Log(level, message, name);
+        }
+
+        private void Log(InternalTraceLevel level, string format, params object[] args)
+        {
+            if (InternalTrace.Level >= level)
+                Log(level, string.Format( format, args ) );
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/core/MethodHelper.cs b/src/NUnitCore/core/MethodHelper.cs
new file mode 100644
index 0000000..8a33b3e
--- /dev/null
+++ b/src/NUnitCore/core/MethodHelper.cs
@@ -0,0 +1,191 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Reflection;
+using System.Text;
+
+namespace NUnit.Core
+{
+    public class MethodHelper
+    {
+        public static string GetDisplayName(MethodInfo method, object[] arglist)
+        {
+            StringBuilder sb = new StringBuilder(method.Name);
+
+#if NET_2_0
+            if (method.IsGenericMethod)
+            {
+                sb.Append("<");
+                int cnt = 0;
+                foreach (Type t in method.GetGenericArguments())
+                {
+                    if (cnt++ > 0) sb.Append(",");
+                    sb.Append(t.Name);
+                }
+                sb.Append(">");
+            }
+#endif
+
+            if (arglist != null)
+            {
+                sb.Append("(");
+
+                for (int i = 0; i < arglist.Length; i++)
+                {
+                    if (i > 0) sb.Append(",");
+                    sb.Append(GetDisplayString(arglist[i]));
+                }
+
+                sb.Append(")");
+            }
+
+            return sb.ToString();
+        }
+
+        private static string GetDisplayString(object arg)
+        {
+            string display = arg == null 
+                ? "null" 
+                : Convert.ToString( arg, System.Globalization.CultureInfo.InvariantCulture);
+
+            if (arg is double)
+            {
+                double d = (double)arg;
+
+                if (double.IsNaN(d))
+                    display = "double.NaN";
+                else if (double.IsPositiveInfinity(d))
+                    display = "double.PositiveInfinity";
+                else if (double.IsNegativeInfinity(d))
+                    display = "double.NegativeInfinity";
+                else if (d == double.MaxValue)
+                    display = "double.MaxValue";
+                else if (d == double.MinValue)
+                    display = "double.MinValue";
+                else
+                {
+                    if (display.IndexOf('.') == -1)
+                        display += ".0";
+                    display += "d";
+                }
+            }
+            else if (arg is float)
+            {
+                float f = (float)arg;
+
+                if (float.IsNaN(f))
+                    display = "float.NaN";
+                else if (float.IsPositiveInfinity(f))
+                    display = "float.PositiveInfinity";
+                else if (float.IsNegativeInfinity(f))
+                    display = "float.NegativeInfinity";
+                else if (f == float.MaxValue)
+                    display = "float.MaxValue";
+                else if (f == float.MinValue)
+                    display = "float.MinValue";
+                else
+                {
+                    if (display.IndexOf('.') == -1)
+                        display += ".0";
+                    display += "f";
+                }
+            }
+            else if (arg is decimal)
+            {
+                decimal d = (decimal)arg;
+                if (d == decimal.MinValue)
+                    display = "decimal.MinValue";
+                else if (d == decimal.MaxValue)
+                    display = "decimal.MaxValue";
+                else
+                    display += "m";
+            }
+            else if (arg is long)
+            {
+                long l = (long)arg;
+                if (l == long.MinValue)
+                    display = "long.MinValue";
+                else if (l == long.MinValue)
+                    display = "long.MaxValue";
+                else
+                    display += "L";
+            }
+            else if (arg is ulong)
+            {
+                ulong ul = (ulong)arg;
+                if (ul == ulong.MinValue)
+                    display = "ulong.MinValue";
+                else if (ul == ulong.MinValue)
+                    display = "ulong.MaxValue";
+                else
+                    display += "UL";
+            }
+            else if (arg is string)
+            {
+                StringBuilder sb = new StringBuilder();
+                sb.Append("\"");
+                foreach (char c in (string)arg)
+                    sb.Append(EscapeControlChar(c));
+                sb.Append("\"");
+                display = sb.ToString();
+            }
+            else if (arg is char)
+            {
+                display = "\'" + EscapeControlChar((char)arg) + "\'";
+            }
+            else if (arg is int)
+            {
+                int ival = (int)arg;
+                if (ival == int.MaxValue)
+                    display = "int.MaxValue";
+                else if (ival == int.MinValue)
+                    display = "int.MinValue";
+            }
+
+            return display;
+        }
+
+        private static string EscapeControlChar(char c)
+        {
+            switch (c)
+            {
+                case '\'':
+                    return "\\\'";
+                case '\"':
+                    return "\\\"";
+                case '\\':
+                    return "\\\\";
+                case '\0':
+                    return "\\0";
+                case '\a':
+                    return "\\a";
+                case '\b':
+                    return "\\b";
+                case '\f':
+                    return "\\f";
+                case '\n':
+                    return "\\n";
+                case '\r':
+                    return "\\r";
+                case '\t':
+                    return "\\t";
+                case '\v':
+                    return "\\v";
+
+                case '\x0085':
+                case '\x2028':
+                case '\x2029':
+                    return string.Format("\\x{0:X4}", (int)c);
+
+                default:
+                    return char.IsControl(c) || (int)c > 128
+                        ? string.Format("\\x{0:X4}", (int)c)
+                        : c.ToString();
+            }
+        }
+    }
+}
diff --git a/src/NUnitCore/core/NTrace.cs b/src/NUnitCore/core/NTrace.cs
deleted file mode 100644
index cd90fd0..0000000
--- a/src/NUnitCore/core/NTrace.cs
+++ /dev/null
@@ -1,123 +0,0 @@
-using System;
-using System.Diagnostics;
-
-namespace NUnit.Core
-{
-	/// <summary>
-	/// Summary description for Logger.
-	/// </summary>
-	public class NTrace
-	{
-		private readonly static TraceSwitch Level = new TraceSwitch( "NTrace", "NUnit internal trace" ); 
-		private readonly static string NL = Environment.NewLine;
-
-		#region Error
-		public static void Error( string message )
-		{
-			if ( Level.TraceError )
-				WriteLine( message );
-		}
-
-		public static void Error( string message, string category )
-		{
-			if ( Level.TraceError )
-				WriteLine( message, category );
-		}
-
-		public static void ErrorFormat( string message, params object[] args )
-		{
-			if ( Level.TraceError )
-				WriteFormat( message, args );
-		}
-
-		public static void Error( string message, Exception ex )
-		{
-			if ( Level.TraceError )
-			{
-				WriteLine( message );
-				WriteLine( ex.ToString() );
-			}
-		}
-		#endregion
-
-		#region Warning
-		public static void Warning( string message )
-		{
-			if ( Level.TraceWarning )
-				WriteLine( message );
-		}
-
-		public static void Warning( string message, string category )
-		{
-			if ( Level.TraceWarning )
-				WriteLine( message, category );
-		}
-
-		public static void WarningFormat( string message, params object[] args )
-		{
-			if ( Level.TraceWarning )
-				WriteFormat( message, args );
-		}
-		#endregion
-
-		#region Info
-		public static void Info( string message )
-		{
-			if ( Level.TraceInfo )
-				WriteLine( message );
-		}
-
-		public static void Info( string message, string category )
-		{
-			if ( Level.TraceInfo )
-				WriteLine( message, category );
-		}
-
-		public static void InfoFormat( string message, params object[] args )
-		{
-			if ( Level.TraceInfo )
-				WriteFormat( message, args );
-		}
-		#endregion
-
-		#region Debug
-		public static void Debug( string message )
-		{
-			if ( Level.TraceVerbose )
-				WriteLine( message );
-		}
-
-		public static void Debug( string message, string category )
-		{
-			if ( Level.TraceVerbose )
-				WriteLine( message, category );
-		}
-
-		public static void DebugFormat( string message, params object[] args )
-		{
-			if ( Level.TraceVerbose )
-				WriteFormat( message, args );
-		}
-		#endregion
-
-		#region Helper Methods
-		private static void WriteLine( string message )
-		{
-			Trace.WriteLine( message );
-		}
-
-		private static void WriteLine( string message, string category )
-		{
-			Trace.WriteLine( message, category );
-		}
-
-		private static void WriteFormat( string format, params object[] args )
-		{
-			string message = string.Format( format, args );
-			Trace.WriteLine( message );
-		}
-		#endregion
-
-		private NTrace() { }
-	}
-}
diff --git a/src/NUnitCore/core/NUnitConfiguration.cs b/src/NUnitCore/core/NUnitConfiguration.cs
new file mode 100644
index 0000000..0b6a7b9
--- /dev/null
+++ b/src/NUnitCore/core/NUnitConfiguration.cs
@@ -0,0 +1,383 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.IO;
+using System.Reflection;
+using System.Configuration;
+using System.Collections.Specialized;
+using System.Threading;
+using Microsoft.Win32;
+
+namespace NUnit.Core
+{
+    /// <summary>
+    /// Provides static methods for accessing the NUnit config
+    /// file 
+    /// </summary>
+    public class NUnitConfiguration
+    {
+        #region Class Constructor
+        /// <summary>
+        /// Class constructor initializes fields from config file
+        /// </summary>
+        static NUnitConfiguration()
+        {
+            try
+            {
+                NameValueCollection settings = GetConfigSection("NUnit/TestCaseBuilder");
+                if (settings != null)
+                {
+                    string oldStyle = settings["OldStyleTestCases"];
+                    if (oldStyle != null)
+                            allowOldStyleTests = Boolean.Parse(oldStyle);
+                }
+
+                settings = GetConfigSection("NUnit/TestRunner");
+                if (settings != null)
+                {
+                    string apartment = settings["ApartmentState"];
+                    if (apartment != null)
+                        apartmentState = (ApartmentState)
+                            System.Enum.Parse(typeof(ApartmentState), apartment, true);
+
+                    string priority = settings["ThreadPriority"];
+                    if (priority != null)
+                        threadPriority = (ThreadPriority)
+                            System.Enum.Parse(typeof(ThreadPriority), priority, true);
+                }
+            }
+            catch (Exception ex)
+            {
+                string msg = string.Format("Invalid configuration setting in {0}",
+                    AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
+                throw new ApplicationException(msg, ex);
+            }
+        }
+
+        private static NameValueCollection GetConfigSection( string name )
+        {
+#if NET_2_0
+            return (NameValueCollection)System.Configuration.ConfigurationManager.GetSection(name);
+#else
+			return (NameValueCollection)System.Configuration.ConfigurationSettings.GetConfig(name);
+#endif
+        }
+        #endregion
+
+        #region Public Properties
+
+        #region AllowOldStyleTests
+        private static bool allowOldStyleTests = false;
+        public static bool AllowOldStyleTests
+        {
+            get { return allowOldStyleTests; }
+        }
+        #endregion
+
+        #region ThreadPriority
+        private static ThreadPriority threadPriority = ThreadPriority.Normal;
+        public static ThreadPriority ThreadPriority
+        {
+            get { return threadPriority; }
+        }
+        #endregion
+
+        #region ApartmentState
+        private static ApartmentState apartmentState = ApartmentState.Unknown;
+        public static ApartmentState ApartmentState
+        {
+            get { return apartmentState; }
+            //set { apartmentState = value; }
+        }
+        #endregion
+
+        #region BuildConfiguration
+        public static string BuildConfiguration
+        {
+            get
+            {
+#if DEBUG
+                    return "Debug";
+#else
+					return "Release";
+#endif
+            }
+        }
+        #endregion
+
+        #region NUnitLibDirectory
+        private static string nunitLibDirectory;
+        /// <summary>
+        /// Gets the path to the lib directory for the version and build
+        /// of NUnit currently executing.
+        /// </summary>
+        public static string NUnitLibDirectory
+        {
+            get
+            {
+                if (nunitLibDirectory == null)
+                {
+                    nunitLibDirectory =
+                        AssemblyHelper.GetDirectoryName(Assembly.GetExecutingAssembly());
+                }
+
+                return nunitLibDirectory;
+            }
+        }
+        #endregion
+
+        #region NUnitBinDirectory
+        private static string nunitBinDirectory;
+        public static string NUnitBinDirectory
+        {
+            get
+            {
+                if (nunitBinDirectory == null)
+                {
+                    nunitBinDirectory = NUnitLibDirectory;
+                    if (Path.GetFileName(nunitBinDirectory).ToLower() == "lib")
+                        nunitBinDirectory = Path.GetDirectoryName(nunitBinDirectory);
+                }
+
+                return nunitBinDirectory;
+            }
+        }
+        #endregion
+
+        #region AddinDirectory
+        private static string addinDirectory;
+        public static string AddinDirectory
+        {
+            get
+            {
+                if (addinDirectory == null)
+                {
+                    addinDirectory = Path.Combine(NUnitBinDirectory, "addins");
+                }
+
+                return addinDirectory;
+            }
+        }
+        #endregion
+
+        #region TestAgentExePath
+        //private static string testAgentExePath;
+        //private static string TestAgentExePath
+        //{
+        //    get
+        //    {
+        //        if (testAgentExePath == null)
+        //            testAgentExePath = Path.Combine(NUnitBinDirectory, "nunit-agent.exe");
+
+        //        return testAgentExePath;
+        //    }
+        //}
+        #endregion
+
+        #region MonoExePath
+        private static string monoExePath;
+        public static string MonoExePath
+        {
+            get
+            {
+                if (monoExePath == null)
+                {
+                    string[] searchNames = IsWindows()
+                        ? new string[] { "mono.bat", "mono.cmd", "mono.exe" }
+                        : new string[] { "mono", "mono.exe" };
+                    
+                    monoExePath = FindOneOnPath(searchNames);
+
+                    if (monoExePath == null && IsWindows())
+                    {
+                        RegistryKey key = Registry.LocalMachine.OpenSubKey(@"Software\Novell\Mono");
+                        if (key != null)
+                        {
+                            string version = key.GetValue("DefaultCLR") as string;
+                            if (version != null)
+                            {
+                                key = key.OpenSubKey(version);
+                                if (key != null)
+                                {
+                                    string installDir = key.GetValue("SdkInstallRoot") as string;
+                                    if (installDir != null)
+                                        monoExePath = Path.Combine(installDir, @"bin\mono.exe");
+                                }
+                            }
+                        }
+                    }
+
+                    if (monoExePath == null)
+                        return "mono";
+                }
+
+                return monoExePath;
+            }
+        }
+
+        private static string FindOneOnPath(string[] names)
+        {
+            //foreach (string dir in Environment.GetEnvironmentVariable("path").Split(new char[] { Path.PathSeparator }))
+            //    foreach (string name in names)
+            //    {
+            //        string fullPath = Path.Combine(dir, name);
+            //        if (File.Exists(fullPath))
+            //            return name;
+            //    }
+
+            return null;
+        }
+
+        private static bool IsWindows()
+        {
+            return Environment.OSVersion.Platform == PlatformID.Win32NT;
+        }
+        #endregion
+
+        #region ApplicationDataDirectory
+        private static string applicationDirectory;
+        public static string ApplicationDirectory
+        {
+            get
+            {
+                if (applicationDirectory == null)
+                {
+                    applicationDirectory = Path.Combine(
+                        Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
+                        "NUnit");
+                }
+
+                return applicationDirectory;
+            }
+        }
+        #endregion
+
+        #region HelpUrl
+        public static string HelpUrl
+        {
+            get
+            {
+#if NET_2_0
+                string helpUrl = ConfigurationManager.AppSettings["helpUrl"];
+#else
+                string helpUrl = ConfigurationSettings.AppSettings["helpUrl"];
+#endif
+
+                if (helpUrl == null)
+                {
+                    helpUrl = "http://nunit.org";
+                    string dir = Path.GetDirectoryName(NUnitBinDirectory);
+                    if ( dir != null )
+                    {
+                        dir = Path.GetDirectoryName(dir);
+                        if ( dir != null )
+                        {
+                            string localPath = Path.Combine(dir, @"doc/index.html");
+                            if (File.Exists(localPath))
+                            {
+                                UriBuilder uri = new UriBuilder();
+                                uri.Scheme = "file";
+                                uri.Host = "localhost";
+                                uri.Path = localPath;
+                                helpUrl = uri.ToString();
+                            }
+                        }
+                    }
+                }
+
+                return helpUrl;
+            }
+        }
+        #endregion
+
+        #endregion
+
+        #region Public Methods
+
+        /// <summary>
+        /// Return the NUnit Bin Directory for a particular
+        /// runtime version, or null if it's not installed.
+        /// For normal installations, there are only 1.1 and
+        /// 2.0 directories. However, this method accomodates
+        /// 3.5 and 4.0 directories for the benefit of NUnit
+        /// developers using those runtimes.
+        /// </summary>
+        public static string GetNUnitBinDirectory(Version v)
+        {
+            string dir = NUnitBinDirectory;
+
+            if ((Environment.Version.Major >= 2) == (v.Major >= 2))
+                return dir;
+
+            string[] v1Strings = new string[] { "1.0", "1.1" };
+            string[] v2Strings = new string[] { "2.0", "3.0", "3.5", "4.0" };
+            
+            string[] search;
+            string[] replace;
+
+            if (Environment.Version.Major == 1)
+            {
+                search = v1Strings;
+                replace = v2Strings;
+            }
+            else
+            {
+                search = v2Strings;
+                replace = v1Strings;
+            }
+
+            // Look for current value in path so it can be replaced
+            string current = null;
+            foreach (string s in search)
+                if (dir.IndexOf(s) >= 0)
+                {
+                    current = s;
+                    break;
+                }
+
+            // If nothing found, we can't do it
+            if (current == null)
+                return null;
+
+            // First try exact replacement
+            string altDir = dir.Replace(current, v.ToString(2));
+            if (Directory.Exists(altDir))
+                return altDir;
+
+            // Now try all the alternatives
+            foreach (string target in replace)
+            {
+                altDir = dir.Replace(current, target);
+                if (Directory.Exists(altDir))
+                    return altDir;
+            }
+
+            // Nothing was found
+            return null;
+        }
+
+        public static string GetTestAgentExePath(Version v)
+        {
+            string binDir = GetNUnitBinDirectory(v);
+            if ( binDir == null ) return null;
+
+#if NET_2_0
+            Assembly a = System.Reflection.Assembly.GetEntryAssembly();
+            string agentName = v.Major > 1 && a != null && a.GetName().ProcessorArchitecture == ProcessorArchitecture.X86
+                ? "nunit-agent-x86.exe" 
+                : "nunit-agent.exe";
+#else
+            string agentName = "nunit-agent.exe";
+#endif
+
+            string agentExePath = Path.Combine(binDir, agentName);
+            return File.Exists(agentExePath) ? agentExePath : null;
+        }
+
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/core/NUnitException.cs b/src/NUnitCore/core/NUnitException.cs
index 8d70f96..adc631f 100644
--- a/src/NUnitCore/core/NUnitException.cs
+++ b/src/NUnitCore/core/NUnitException.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 namespace NUnit.Core 
diff --git a/src/NUnitCore/core/NUnitFramework.cs b/src/NUnitCore/core/NUnitFramework.cs
index 9c4dfda..35aa6f1 100644
--- a/src/NUnitCore/core/NUnitFramework.cs
+++ b/src/NUnitCore/core/NUnitFramework.cs
@@ -1,13 +1,12 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 using System;
 using System.Reflection;
 using System.Collections;
 using System.Collections.Specialized;
-using System.Configuration;
 using System.Diagnostics;
 using NUnit.Core.Extensibility;
 
@@ -21,9 +20,6 @@ namespace NUnit.Core
 	/// </summary>
 	public class NUnitFramework
 	{
-		private static Type assertType;
-        //private static Hashtable frameworkByAssembly = new Hashtable();
-
         #region Constants
 
 		#region Attribute Names
@@ -37,6 +33,7 @@ namespace NUnit.Core
         public const string CategoryAttribute = "NUnit.Framework.CategoryAttribute";
         public const string PropertyAttribute = "NUnit.Framework.PropertyAttribute";
 		public const string DescriptionAttribute = "NUnit.Framework.DescriptionAttribute";
+        public const string RequiredAddinAttribute = "NUnit.Framework.RequiredAddinAttribute";
 
         // Attributes that apply only to Classes
         public const string TestFixtureAttribute = "NUnit.Framework.TestFixtureAttribute";
@@ -44,6 +41,9 @@ namespace NUnit.Core
 
         // Attributes that apply only to Methods
         public const string TestAttribute = "NUnit.Framework.TestAttribute";
+        public const string TestCaseAttribute = "NUnit.Framework.TestCaseAttribute";
+        public const string TestCaseSourceAttribute = "NUnit.Framework.TestCaseSourceAttribute";
+        public const string TheoryAttribute = "NUnit.Framework.TheoryAttribute";
         public static readonly string SetUpAttribute = "NUnit.Framework.SetUpAttribute";
         public static readonly string TearDownAttribute = "NUnit.Framework.TearDownAttribute";
         public static readonly string FixtureSetUpAttribute = "NUnit.Framework.TestFixtureSetUpAttribute";
@@ -57,6 +57,8 @@ namespace NUnit.Core
         #region Other Framework Types
         public static readonly string AssertException = "NUnit.Framework.AssertionException";
         public static readonly string IgnoreException = "NUnit.Framework.IgnoreException";
+        public static readonly string InconclusiveException = "NUnit.Framework.InconclusiveException";
+        public static readonly string SuccessException = "NUnit.Framework.SuccessException";
         public static readonly string AssertType = "NUnit.Framework.Assert";
 		public static readonly string ExpectExceptionInterface = "NUnit.Framework.IExpectException";
         #endregion
@@ -74,128 +76,64 @@ namespace NUnit.Core
 
         #endregion
 
-        #region Identify SetUp and TearDown Methods
-        public static bool IsSetUpMethod(MethodInfo method)
+        #region Properties
+        private static Assembly frameworkAssembly;
+        private static bool frameworkAssemblyInitialized;
+        private static Assembly FrameworkAssembly
         {
-            return Reflect.HasAttribute(method, NUnitFramework.SetUpAttribute, false);
-        }
+            get
+            {
+                if (!frameworkAssemblyInitialized)
+                    foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
+                        if (assembly.GetName().Name == "nunit.framework" ||
+                            assembly.GetName().Name == "NUnitLite")
+                        {
+                            frameworkAssembly = assembly;
+                            break;
+                        }
 
-        public static bool IsTearDownMethod(MethodInfo method)
-        {
-            return Reflect.HasAttribute(method, NUnitFramework.TearDownAttribute, false);
-        }
+                frameworkAssemblyInitialized = true;
 
-        public static bool IsFixtureSetUpMethod(MethodInfo method)
-        {
-            return Reflect.HasAttribute(method, NUnitFramework.FixtureSetUpAttribute, false);
+                return frameworkAssembly;
+            }
         }
+        #endregion
 
-        public static bool IsFixtureTearDownMethod(MethodInfo method)
+        #region Check SetUp and TearDown methods
+        public static bool CheckSetUpTearDownMethods(Type fixtureType, string attributeName, ref string reason)
         {
-            return Reflect.HasAttribute(method, NUnitFramework.FixtureTearDownAttribute, false);
-        }
+            foreach( MethodInfo theMethod in Reflect.GetMethodsWithAttribute(fixtureType, attributeName, true ))
+                if ( theMethod.IsAbstract ||
+                     !theMethod.IsPublic && !theMethod.IsFamily ||
+                     theMethod.GetParameters().Length > 0 ||
+                     !theMethod.ReturnType.Equals(typeof(void)))
+                {
+                    reason = string.Format( "Invalid signature for SetUp or TearDown method: {0}", theMethod.Name );
+                    return false;
+                }
 
+            return true;
+        }
         #endregion
 
-        #region Locate SetUp and TearDown Methods
-        public static MethodInfo GetSetUpMethod(Type fixtureType)
-		{
-			return Reflect.GetMethodWithAttribute(fixtureType, SetUpAttribute,
-				BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance,
-				true);
-		}
-
-        public static MethodInfo GetTearDownMethod(Type fixtureType)
-		{
-			return Reflect.GetMethodWithAttribute(fixtureType, TearDownAttribute,
-				BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance,
-				true);
-		}
-
-		public static MethodInfo GetFixtureSetUpMethod(Type fixtureType)
-		{
-			return Reflect.GetMethodWithAttribute(fixtureType, FixtureSetUpAttribute,
-				BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance,
-				true);
-		}
-
-        public static MethodInfo GetFixtureTearDownMethod(Type fixtureType)
-		{
-			return Reflect.GetMethodWithAttribute(fixtureType, FixtureTearDownAttribute,
-				BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance,
-				true);
-		}
-		#endregion
-
-		#region Locate ExceptionHandler
-		public static MethodInfo GetDefaultExceptionHandler( Type fixtureType )
-		{
-			return Reflect.HasInterface( fixtureType, ExpectExceptionInterface )
-				? GetExceptionHandler( fixtureType, "HandleException" )
-				: null;
-		}
-
-		public static MethodInfo GetExceptionHandler( Type fixtureType, string name )
-		{
-			return Reflect.GetNamedMethod( 
-				fixtureType, 
-				name,
-				new string[] { "System.Exception" },
-				BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static );
-		}
-		#endregion
-
-		#region Get Special Properties of Attributes
+        #region Get Special Properties of Attributes
 
-		#region IgnoreReason
-		public static string GetIgnoreReason( System.Attribute attribute )
+        #region IgnoreReason
+        public static string GetIgnoreReason( System.Attribute attribute )
 		{
-			return Reflect.GetPropertyValue( attribute, "Reason" ) as string;
+            return Reflect.GetPropertyValue(attribute, PropertyNames.Reason) as string;
 		}
 		#endregion
 
 		#region Description
 		/// <summary>
-		/// Method to return the description from an attribute
+		/// Method to return the description from an source
 		/// </summary>
-		/// <param name="attribute">The attribute to check</param>
+		/// <param name="source">The source to check</param>
 		/// <returns>The description, if any, or null</returns>
 		public static string GetDescription(System.Attribute attribute)
 		{
-			return Reflect.GetPropertyValue( attribute, "Description" ) as string;
-		}
-		#endregion
-
-		#region ExpectedException Attrributes
-		public static string GetHandler(System.Attribute attribute)
-		{
-			return Reflect.GetPropertyValue( attribute, "Handler" ) as string;
-		}
-
-		public static Type GetExceptionType(System.Attribute attribute)
-		{
-			return Reflect.GetPropertyValue( attribute, "ExceptionType" ) as Type;
-		}
-
-		public static string GetExceptionName(System.Attribute attribute)
-		{
-			return Reflect.GetPropertyValue( attribute, "ExceptionName" ) as string;
-		}
-
-		public static string GetExpectedMessage(System.Attribute attribute)
-		{
-			return Reflect.GetPropertyValue( attribute, "ExpectedMessage" ) as string;
-		}
-
-		public static string GetMatchType(System.Attribute attribute)
-		{
-			object matchEnum = Reflect.GetPropertyValue( attribute, "MatchType" );
-			return matchEnum != null ? matchEnum.ToString() : null;
-		}
-
-		public static string GetUserMessage(System.Attribute attribute)
-		{
-			return Reflect.GetPropertyValue( attribute, "UserMessage" ) as string;
+            return Reflect.GetPropertyValue(attribute, PropertyNames.Description) as string;
 		}
 		#endregion
 
@@ -210,7 +148,7 @@ namespace NUnit.Core
         /// <param name="test">The test to which the attributes apply</param>
         public static void ApplyCommonAttributes(MemberInfo member, Test test)
         {
-            ApplyCommonAttributes( Reflect.GetAttributes( member, false ), test );
+            ApplyCommonAttributes( Reflect.GetAttributes( member, true ), test );
         }
 
         /// <summary>
@@ -234,9 +172,6 @@ namespace NUnit.Core
         /// <param name="test">The test to which the attributes apply</param>
         public static void ApplyCommonAttributes(Attribute[] attributes, Test test)
         {
-			IList categories = new ArrayList();
-			ListDictionary properties = new ListDictionary();
-
             foreach (Attribute attribute in attributes)
             {
 				Type attributeType = attribute.GetType();
@@ -253,20 +188,6 @@ namespace NUnit.Core
 					case DescriptionAttribute:
 						test.Description = GetDescription( attribute );
 						break;
-					case ExplicitAttribute:
-                        if (isValid)
-                        {
-                            test.RunState = RunState.Explicit;
-                            test.IgnoreReason = GetIgnoreReason(attribute);
-                        }
-                        break;
-                    case IgnoreAttribute:
-                        if (isValid)
-                        {
-                            test.RunState = RunState.Ignored;
-                            test.IgnoreReason = GetIgnoreReason(attribute);
-                        }
-                        break;
                     case PlatformAttribute:
                         PlatformHelper pHelper = new PlatformHelper();
                         if (isValid && !pHelper.IsPlatformSupported(attribute))
@@ -285,98 +206,81 @@ namespace NUnit.Core
 							test.IgnoreReason = cultureDetector.Reason;
 						}
 						break;
-					default:
+                    case RequiredAddinAttribute:
+                        string required = (string)Reflect.GetPropertyValue(attribute, PropertyNames.RequiredAddin);
+                        if (!IsAddinAvailable(required))
+                        {
+                            test.RunState = RunState.NotRunnable;
+                            test.IgnoreReason = string.Format("Required addin {0} not available", required);
+                        }
+                        break;
+                    case "System.STAThreadAttribute":
+                        test.Properties.Add("APARTMENT_STATE", System.Threading.ApartmentState.STA);
+                        break;
+                    case "System.MTAThreadAttribute":
+                        test.Properties.Add("APARTMENT_STATE", System.Threading.ApartmentState.MTA);
+                        break;
+                    default:
 						if ( Reflect.InheritsFrom( attributeType, CategoryAttribute ) )
-						{	
-							categories.Add( Reflect.GetPropertyValue( attribute, "Name" ) );
-						}
+						{
+                            string categoryName = (string)Reflect.GetPropertyValue(attribute, PropertyNames.CategoryName);
+                            test.Categories.Add(categoryName);
+
+                            if (categoryName.IndexOfAny(new char[] { ',', '!', '+', '-' }) >= 0)
+                            {
+                                test.RunState = RunState.NotRunnable;
+                                test.IgnoreReason = "Category name must not contain ',', '!', '+' or '-'";
+                            }
+                        }
 						else if ( Reflect.InheritsFrom( attributeType, PropertyAttribute ) )
 						{
-							string name = (string)Reflect.GetPropertyValue( attribute, "Name" );
-							if ( name != null && name != string.Empty )
-							{
-								object val = Reflect.GetPropertyValue( attribute, "Value" );
-								properties[name] = val;
-							}
+							IDictionary props = (IDictionary)Reflect.GetPropertyValue( attribute, PropertyNames.Properties );
+							if ( props != null )
+                                foreach( DictionaryEntry entry in props )
+                                    test.Properties.Add(entry.Key, entry.Value);
 						}
+                        else if ( Reflect.InheritsFrom( attributeType, ExplicitAttribute ) )
+                         {
+                             if (isValid)
+                             {
+                                 test.RunState = RunState.Explicit;
+                                 test.IgnoreReason = GetIgnoreReason(attribute);
+                             }
+                         }
+                         else if ( Reflect.InheritsFrom( attributeType, IgnoreAttribute ) )
+                         {
+                             if (isValid)
+                             {
+                                 test.RunState = RunState.Ignored;
+                                 test.IgnoreReason = GetIgnoreReason(attribute);
+                             }
+                         }
 						break;
                 }
             }
-
-			test.Categories = categories;
-			test.Properties = properties;
         }
 		#endregion
 
-		#region ApplyExpectedExceptionAttribute
-		// TODO: Handle this with a separate ExceptionProcessor object
-		public static void ApplyExpectedExceptionAttribute(MethodInfo method, TestMethod testMethod)
-		{
-			Attribute attribute = Reflect.GetAttribute(
-                method, NUnitFramework.ExpectedExceptionAttribute, false );
-
-			if (attribute != null)
-			{
-				testMethod.ExceptionExpected = true;
-
-				Type expectedExceptionType = GetExceptionType( attribute );
-				string expectedExceptionName = GetExceptionName( attribute );
-				if ( expectedExceptionType != null )
-					testMethod.ExpectedExceptionType = expectedExceptionType;
-				else if ( expectedExceptionName != null )
-					testMethod.ExpectedExceptionName = expectedExceptionName;
-				
-				testMethod.ExpectedMessage = GetExpectedMessage( attribute );
-				testMethod.MatchType = GetMatchType( attribute );
-				testMethod.UserMessage = GetUserMessage( attribute );
-
-				string handlerName = GetHandler( attribute );
-				if ( handlerName == null )
-					testMethod.ExceptionHandler = GetDefaultExceptionHandler( testMethod.FixtureType );
-				else
-				{
-					MethodInfo handler = GetExceptionHandler( testMethod.FixtureType, handlerName );
-					if ( handler != null )
-						testMethod.ExceptionHandler = handler;
-					else
-					{
-						testMethod.RunState = RunState.NotRunnable;
-						testMethod.IgnoreReason = string.Format( 
-							"The specified exception handler {0} was not found", handlerName );
-					}
-				}
-			}
-		}
-		#endregion
-
-		#region GetAssertCount
-		public static int GetAssertCount()
-		{
-			if ( assertType == null )
-				foreach( Assembly assembly in AppDomain.CurrentDomain.GetAssemblies() )
-					if ( assembly.GetName().Name == "nunit.framework" )
-					{
-						assertType = assembly.GetType( AssertType );
-						break;
-					}
-
-			if ( assertType == null )
-				return 0;
+        #region ApplyExpectedExceptionAttribute
+        /// <summary>
+        /// Modify a newly constructed test by checking for ExpectedExceptionAttribute
+        /// and setting properties on the test accordingly.
+        /// </summary>
+        /// <param name="attributes">An array of attributes possibly including NUnit attributes
+        /// <param name="test">The test to which the attributes apply</param>
+        public static void ApplyExpectedExceptionAttribute(MethodInfo method, TestMethod testMethod)
+        {
+            Attribute attribute = Reflect.GetAttribute(
+                method, NUnitFramework.ExpectedExceptionAttribute, false);
 
-			PropertyInfo property = Reflect.GetNamedProperty( 
-				assertType,
-				"Counter", 
-				BindingFlags.Public | BindingFlags.Static );
+            if (attribute != null)
+                testMethod.ExceptionProcessor = new ExpectedExceptionProcessor(testMethod, attribute);
+        }
 
-			if ( property == null )
-				return 0;
-		
-			return (int)property.GetValue( null, new object[0] );
-		}
-		#endregion
+        #endregion
 
-		#region IsSuiteBuilder
-		public static bool IsSuiteBuilder( Type type )
+        #region IsSuiteBuilder
+        public static bool IsSuiteBuilder( Type type )
 		{
 			return Reflect.HasAttribute( type, SuiteBuilderAttribute, false )
 				&& Reflect.HasInterface( type, SuiteBuilderInterface );
@@ -399,50 +303,135 @@ namespace NUnit.Core
 		}
 		#endregion
 
-		#region AllowOldStyleTests
-		public static bool AllowOldStyleTests
-		{
-			get
-			{
-				try
-				{
-					NameValueCollection settings = (NameValueCollection)
-						ConfigurationSettings.GetConfig("NUnit/TestCaseBuilder");
-					if (settings != null)
-					{
-						string oldStyle = settings["OldStyleTestCases"];
-						if (oldStyle != null)
-							return Boolean.Parse(oldStyle);
-					}
-				}
-				catch( Exception e )
-				{
-					Debug.WriteLine( e );
-				}
-
-				return false;
-			}
-		}
-		#endregion
+        #region IsAddinAvailable
+        public static bool IsAddinAvailable(string name)
+        {
+            foreach (Addin addin in CoreExtensions.Host.AddinRegistry.Addins)
+                if (addin.Name == name && addin.Status == AddinStatus.Loaded)
+                    return true;
 
-		#region BuildConfiguration
-		public static string BuildConfiguration
-		{
-			get
-			{
-#if DEBUG
-				if (Environment.Version.Major == 2)
-					return "Debug2005";
-				else
-					return "Debug";
-#else
-				if (Environment.Version.Major == 2)
-					return "Release2005";
-				else
-					return "Release";
-#endif
-			}
-		}
-		#endregion
-	}
+            return false;
+        }
+        #endregion
+
+        #region Framework Assert Access
+
+        /// <summary>
+        /// NUnitFramework.Assert is a nested class that implements
+        /// a few of the framework operations by reflection, 
+        /// using whatever framework version is available.
+        /// </summary>
+        public class Assert
+        {
+            #region Properties
+            private static Type assertType;
+            private static Type AssertType
+            {
+                get
+                {
+                    if (assertType == null && FrameworkAssembly != null)
+                        assertType = FrameworkAssembly.GetType(NUnitFramework.AssertType);
+
+                    return assertType;
+                }
+            }
+
+            private static MethodInfo areEqualMethod;
+            private static MethodInfo AreEqualMethod
+            {
+                get
+                {
+                    if (areEqualMethod == null && AssertType != null)
+                        areEqualMethod = AssertType.GetMethod(
+                            "AreEqual", 
+                            BindingFlags.Static | BindingFlags.Public, 
+                            null, 
+                            new Type[] { typeof(object), typeof(object) },
+                            null );
+
+                    return areEqualMethod;
+                }
+            }
+
+            private static PropertyInfo counterProperty;
+            private static PropertyInfo CounterProperty
+            {
+                get
+                {
+                    if (counterProperty == null && AssertType != null)
+                        counterProperty = Reflect.GetNamedProperty(
+                            AssertType,
+                            "Counter",
+                            BindingFlags.Public | BindingFlags.Static);
+
+                    return counterProperty;
+                }
+            }
+            #endregion
+
+            /// <summary>
+            /// Invoke Assert.AreEqual by reflection
+            /// </summary>
+            /// <param name="expected">The expected value</param>
+            /// <param name="actual">The actual value</param>
+            public static void AreEqual(object expected, object actual)
+            {
+                if (AreEqualMethod != null)
+                    try
+                    {
+                        AreEqualMethod.Invoke(null, new object[] { expected, actual });
+                    }
+                    catch (TargetInvocationException e)
+                    {
+                        Exception inner = e.InnerException;
+                        throw new NUnitException("Rethrown", inner);
+                    }
+            }
+
+            /// <summary>
+            /// Get the assertion counter. It clears itself automatically
+            /// on each call.
+            /// </summary>
+            /// <returns>Count of number of asserts since last call</returns>
+            public static int GetAssertCount()
+            {
+                return CounterProperty == null
+                    ? 0
+                    : (int)CounterProperty.GetValue(null, new object[0]);
+            }
+        }
+
+        #endregion
+
+        #region GetResultState
+        /// <summary>
+        /// Returns a result state for a special exception.
+        /// If the exception is not handled specially, returns
+        /// ResultState.Error.
+        /// </summary>
+        /// <param name="ex">The exception to be examined</param>
+        /// <returns>A ResultState</returns>
+        public static ResultState GetResultState(Exception ex)
+        {
+            if (ex is System.Threading.ThreadAbortException)
+                return ResultState.Cancelled;
+
+            string name = ex.GetType().FullName;
+
+            if (name == NUnitFramework.AssertException)
+                return ResultState.Failure;
+            else
+                if (name == NUnitFramework.IgnoreException)
+                    return ResultState.Ignored;
+                else
+                    if (name == NUnitFramework.InconclusiveException)
+                        return ResultState.Inconclusive;
+                    else
+                        if (name == NUnitFramework.SuccessException)
+                            return ResultState.Success;
+                        else
+                            return ResultState.Error;
+        }
+        #endregion
+    }
 }
diff --git a/src/NUnitCore/core/NUnitTestFixture.cs b/src/NUnitCore/core/NUnitTestFixture.cs
index cec2a85..31d2042 100644
--- a/src/NUnitCore/core/NUnitTestFixture.cs
+++ b/src/NUnitCore/core/NUnitTestFixture.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -14,24 +14,34 @@ namespace NUnit.Core
     /// </summary>
     public class NUnitTestFixture : TestFixture
     {
-        public NUnitTestFixture(Type fixtureType) : base( fixtureType)
+        public NUnitTestFixture(Type fixtureType)
+            : this(fixtureType, null) { }
+
+        public NUnitTestFixture(Type fixtureType, object[] arguments)
+            : base(fixtureType, arguments)
         {
-            this.fixtureSetUp = NUnitFramework.GetFixtureSetUpMethod( fixtureType );
-            this.fixtureTearDown = NUnitFramework.GetFixtureTearDownMethod( fixtureType );
+            this.fixtureSetUpMethods =
+                Reflect.GetMethodsWithAttribute(fixtureType, NUnitFramework.FixtureSetUpAttribute, true);
+            this.fixtureTearDownMethods =
+                Reflect.GetMethodsWithAttribute(fixtureType, NUnitFramework.FixtureTearDownAttribute, true);
+            this.setUpMethods = 
+                Reflect.GetMethodsWithAttribute(this.FixtureType, NUnitFramework.SetUpAttribute, true);
+            this.tearDownMethods = 
+                Reflect.GetMethodsWithAttribute(this.FixtureType, NUnitFramework.TearDownAttribute, true);
         }
 
         protected override void DoOneTimeSetUp(TestResult suiteResult)
         {
             base.DoOneTimeSetUp(suiteResult);
 
-			suiteResult.AssertCount = NUnitFramework.GetAssertCount(); ;
+			suiteResult.AssertCount = NUnitFramework.Assert.GetAssertCount(); ;
         }
 
         protected override void DoOneTimeTearDown(TestResult suiteResult)
         {
             base.DoOneTimeTearDown(suiteResult);
 
-			suiteResult.AssertCount += NUnitFramework.GetAssertCount();
+			suiteResult.AssertCount += NUnitFramework.Assert.GetAssertCount();
         }
     }
 }
diff --git a/src/NUnitCore/core/NUnitTestMethod.cs b/src/NUnitCore/core/NUnitTestMethod.cs
index 477e85a..2dc8fba 100644
--- a/src/NUnitCore/core/NUnitTestMethod.cs
+++ b/src/NUnitCore/core/NUnitTestMethod.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 using System;
 using System.Reflection;
@@ -16,43 +16,24 @@ namespace NUnit.Core
 		#region Constructor
 		public NUnitTestMethod(MethodInfo method) : base(method) 
         {
-            this.setUpMethod = NUnitFramework.GetSetUpMethod(this.FixtureType);
-            this.tearDownMethod = NUnitFramework.GetTearDownMethod(this.FixtureType);
         }
 		#endregion
 
 		#region TestMethod Overrides
-		/// <summary>
+
+        /// <summary>
 		/// Run a test returning the result. Overrides TestMethod
 		/// to count assertions.
 		/// </summary>
 		/// <param name="testResult"></param>
-		public override void Run(TestCaseResult testResult)
-		{
-			base.Run(testResult);
-
-			testResult.AssertCount = NUnitFramework.GetAssertCount();
-		}
-
-		/// <summary>
-		/// Determine if an exception is an NUnit AssertionException
-		/// </summary>
-		/// <param name="ex">The exception to be examined</param>
-		/// <returns>True if it's an NUnit AssertionException</returns>
-		protected override bool IsAssertException(Exception ex)
+		public override TestResult RunTest()
 		{
-            return ex.GetType().FullName == NUnitFramework.AssertException;
-		}
+			TestResult testResult = base.RunTest();
 
-		/// <summary>
-		/// Determine if an exception is an NUnit IgnoreException
-		/// </summary>
-		/// <param name="ex">The exception to be examined</param>
-		/// <returns>True if it's an NUnit IgnoreException</returns>
-		protected override bool IsIgnoreException(Exception ex)
-		{
-            return ex.GetType().FullName == NUnitFramework.IgnoreException;
+			testResult.AssertCount = NUnitFramework.Assert.GetAssertCount();
+			
+			return testResult;
 		}
-		#endregion
+        #endregion
 	}
 }
diff --git a/src/NUnitCore/core/NamespaceSuite.cs b/src/NUnitCore/core/NamespaceSuite.cs
new file mode 100644
index 0000000..be60ac1
--- /dev/null
+++ b/src/NUnitCore/core/NamespaceSuite.cs
@@ -0,0 +1,38 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Core
+{
+    /// <summary>
+    /// TestAssembly is a TestSuite that represents the execution
+    /// of tests in a managed assembly.
+    /// </summary>
+    public class NamespaceSuite : TestSuite
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="NamespaceSuite"/> class.
+        /// </summary>
+        /// <param name="path">The path.</param>
+        public NamespaceSuite(string path) : base(path) { }
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="NamespaceSuite"/> class.
+        /// </summary>
+        /// <param name="parentNamespace">The parent namespace.</param>
+        /// <param name="suiteName">Name of the suite.</param>
+        public NamespaceSuite(string parentNamespace, string suiteName) : base(parentNamespace, suiteName) { }
+
+        /// <summary>
+        /// Gets the type of the test.
+        /// </summary>
+        public override string TestType
+        {
+            get { return "Namespace"; }
+        }
+    }
+}
diff --git a/src/NUnitCore/core/NamespaceTreeBuilder.cs b/src/NUnitCore/core/NamespaceTreeBuilder.cs
index 2e2546c..617be22 100644
--- a/src/NUnitCore/core/NamespaceTreeBuilder.cs
+++ b/src/NUnitCore/core/NamespaceTreeBuilder.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System.Collections;
@@ -60,41 +60,45 @@ namespace NUnit.Core
 
 		public void Add( TestSuite fixture )
 		{
-            
-			string ns = fixture.TestName.FullName;
-            int index = ns.LastIndexOf( '.' );
-            ns = index > 0 ? ns.Substring( 0, index ) : string.Empty;
-			TestSuite containingSuite = BuildFromNameSpace( ns );
-
-            if (fixture is SetUpFixture)
+            if (fixture != null)
             {
-                // The SetUpFixture must replace the namespace suite
-                // in which it is "contained". 
-                //
-                // First, add the old suite's children
-                foreach (TestSuite child in containingSuite.Tests)
-                    fixture.Add(child);
-
-                // Make the parent of the containing suite point to this
-                // fixture instead
-                // TODO: Get rid of this somehow?
-                TestSuite parent = (TestSuite)containingSuite.Parent;
-                if (parent == null)
+                string ns = fixture.TestName.FullName;
+                int index = ns.IndexOf("[");
+                if (index >= 0) ns = ns.Substring(0, index);
+                index = ns.LastIndexOf('.');
+                ns = index > 0 ? ns.Substring(0, index) : string.Empty;
+                TestSuite containingSuite = BuildFromNameSpace(ns);
+
+                if (fixture is SetUpFixture)
                 {
-                    fixture.TestName.Name = rootSuite.TestName.Name;
-                    rootSuite = fixture;
+                    // The SetUpFixture must replace the namespace suite
+                    // in which it is "contained". 
+                    //
+                    // First, add the old suite's children
+                    foreach (TestSuite child in containingSuite.Tests)
+                        fixture.Add(child);
+
+                    // Make the parent of the containing suite point to this
+                    // fixture instead
+                    // TODO: Get rid of this somehow?
+                    TestSuite parent = (TestSuite)containingSuite.Parent;
+                    if (parent == null)
+                    {
+                        fixture.TestName.Name = rootSuite.TestName.Name;
+                        rootSuite = fixture;
+                    }
+                    else
+                    {
+                        parent.Tests.Remove(containingSuite);
+                        parent.Add(fixture);
+                    }
+
+                    // Update the hashtable
+                    namespaceSuites[ns] = fixture;
                 }
                 else
-                {
-                    parent.Tests.Remove(containingSuite);
-                    parent.Add(fixture);
-                }
-
-                // Update the hashtable
-                namespaceSuites[ns] = fixture;
+                    containingSuite.Add(fixture);
             }
-            else
-			    containingSuite.Add( fixture );
 		}
 
         //public void Add( SetUpFixture fixture )
@@ -140,7 +144,7 @@ namespace NUnit.Core
 			//string prefix = string.Format( "[{0}]" );
 			if( index == -1 )
 			{
-				suite = new TestSuite( nameSpace );
+				suite = new NamespaceSuite( nameSpace );
 				if ( rootSuite == null )
 					rootSuite = suite;
 				else
@@ -152,7 +156,7 @@ namespace NUnit.Core
 				string parentNameSpace = nameSpace.Substring( 0,index );
 				TestSuite parent = BuildFromNameSpace( parentNameSpace );
 				string suiteName = nameSpace.Substring( index+1 );
-				suite = new TestSuite( parentNameSpace, suiteName );
+				suite = new NamespaceSuite( parentNameSpace, suiteName );
 				parent.Add( suite );
 				namespaceSuites[nameSpace] = suite;
 			}
diff --git a/src/NUnitCore/core/NoTestFixturesException.cs b/src/NUnitCore/core/NoTestFixturesException.cs
index c894369..93eb132 100644
--- a/src/NUnitCore/core/NoTestFixturesException.cs
+++ b/src/NUnitCore/core/NoTestFixturesException.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 namespace NUnit.Core
diff --git a/src/NUnitCore/core/NotRunnableTestCase.cs b/src/NUnitCore/core/NotRunnableTestCase.cs
deleted file mode 100644
index a2c02af..0000000
--- a/src/NUnitCore/core/NotRunnableTestCase.cs
+++ /dev/null
@@ -1,50 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-using System;
-using System.Reflection;
-
-namespace NUnit.Core
-{
-	/// <summary>
-	/// Summary description for NotRunnableTestCase.
-	/// </summary>
-	public class NotRunnableTestCase : TestCase
-	{
-		public NotRunnableTestCase(MethodInfo method, string reason) : base(method.DeclaringType.FullName, method.Name)
-		{
-			RunState = RunState.NotRunnable;
-			IgnoreReason = reason;
-		}
-
-		public NotRunnableTestCase(MethodInfo method) : base(method.DeclaringType.FullName, method.Name)
-		{
-			string reason;
-
-			if (method.IsAbstract)
-				reason = "it must not be abstract";
-			else if (method.IsStatic)
-				reason = "it must be an instance method";
-			else if (!method.IsPublic)
-				reason = "it must be a public method";
-			else if (method.GetParameters().Length != 0)
-				reason = "it must not have parameters";
-			else if (!method.ReturnType.Equals(typeof(void)))
-				reason = "it must return void";
-			else
-				reason = "reason not known";
-
-			RunState = RunState.NotRunnable;
-			IgnoreReason = String.Format("Method {0}'s signature is not correct: {1}.", method.Name, reason);
-		}
-
-		public override void Run(TestCaseResult result)
-		{
-			result.Ignore(base.IgnoreReason);
-		}
-	}
-}
-
diff --git a/src/NUnitCore/core/NullListener.cs b/src/NUnitCore/core/NullListener.cs
index 283b06b..b2abd82 100644
--- a/src/NUnitCore/core/NullListener.cs
+++ b/src/NUnitCore/core/NullListener.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -23,11 +23,11 @@ namespace NUnit.Core
 
 		public void TestStarted(TestName testName){}
 			
-		public void TestFinished(TestCaseResult result){}
+		public void TestFinished(TestResult result){}
 
 		public void SuiteStarted(TestName testName){}
 
-		public void SuiteFinished(TestSuiteResult result){}
+		public void SuiteFinished(TestResult result){}
 
 		public void UnhandledException( Exception exception ) {}
 
diff --git a/src/NUnitCore/core/ParameterizedFixtureSuite.cs b/src/NUnitCore/core/ParameterizedFixtureSuite.cs
new file mode 100644
index 0000000..50daa4a
--- /dev/null
+++ b/src/NUnitCore/core/ParameterizedFixtureSuite.cs
@@ -0,0 +1,55 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Core
+{
+    /// <summary>
+    /// ParameterizedFixtureSuite serves as a container for the set of test 
+    /// fixtures created from a given Type using various parameters.
+    /// </summary>
+    public class ParameterizedFixtureSuite : TestSuite
+    {
+        private Type type;
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="ParameterizedFixtureSuite"/> class.
+        /// </summary>
+        /// <param name="type">The type.</param>
+        public ParameterizedFixtureSuite(Type type)
+            : base(type.Namespace, TypeHelper.GetDisplayName(type))
+        {
+            this.type = type;
+        }
+
+        /// <summary>
+        /// Gets the type of the test.
+        /// </summary>
+        /// <value>The type of the test.</value>
+        public override string TestType
+        {
+            get
+            {
+#if NET_2_0
+                if (type.IsGenericType)
+                    return "GenericFixture";
+#endif
+
+                return "ParameterizedFixture";
+            }
+        }
+
+        /// <summary>
+        /// Gets the Type represented by this suite.
+        /// </summary>
+        /// <value>A Sysetm.Type.</value>
+        public Type ParameterizedType
+        {
+            get { return type; }
+        }
+    }
+}
diff --git a/src/NUnitCore/core/ParameterizedTestMethodSuite.cs b/src/NUnitCore/core/ParameterizedTestMethodSuite.cs
new file mode 100644
index 0000000..a3c1d9f
--- /dev/null
+++ b/src/NUnitCore/core/ParameterizedTestMethodSuite.cs
@@ -0,0 +1,100 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+using System.Reflection;
+using System.Text;
+
+namespace NUnit.Core
+{
+    /// <summary>
+    /// ParameterizedMethodSuite holds a collection of individual
+    /// TestMethods with their arguments applied.
+    /// </summary>
+    public class ParameterizedMethodSuite : TestSuite
+    {
+        private bool isTheory;
+
+        /// <summary>
+        /// Construct from a MethodInfo
+        /// </summary>
+        /// <param name="method"></param>
+        public ParameterizedMethodSuite(MethodInfo method)
+            : base(method.ReflectedType.FullName, method.Name)
+        {
+            this.maintainTestOrder = true;
+            this.isTheory = Reflect.HasAttribute(method, NUnitFramework.TheoryAttribute, true);
+        }
+
+        /// <summary>
+        /// Gets a string representing the kind of test
+        /// that this object represents, for use in display.
+        /// </summary>
+        public override string TestType
+        {
+            get 
+            { 
+                return this.isTheory
+                    ? "Theory"
+                    : "ParameterizedTest"; 
+            }
+        }
+
+        /// <summary>
+        /// Override Run, setting Fixture to that of the Parent.
+        /// </summary>
+        /// <param name="listener"></param>
+        /// <param name="filter"></param>
+        /// <returns></returns>
+        public override TestResult Run(EventListener listener, ITestFilter filter)
+        {
+            if (this.Parent != null)
+            {
+                this.Fixture = this.Parent.Fixture;
+                TestSuite suite = this.Parent as TestSuite;
+                if (suite != null)
+                {
+                    this.setUpMethods = suite.GetSetUpMethods();
+                    this.tearDownMethods = suite.GetTearDownMethods();
+                }
+            }
+
+            // DYNAMIC: Get the parameters, and add the methods here.
+            
+            TestResult result = base.Run(listener, filter);
+			
+            if (this.isTheory && result.ResultState == ResultState.Inconclusive)
+                result.SetResult(
+                    ResultState.Failure,
+                    this.TestCount == 0
+                        ? "No test cases were provided"
+                        : "All test cases were inconclusive",
+                    null);
+
+			this.Fixture = null;
+			this.setUpMethods = null;
+			this.tearDownMethods = null;
+
+            return result;
+        }
+
+        /// <summary>
+        /// Override DoOneTimeSetUp to avoid executing any
+        /// TestFixtureSetUp method for this suite
+        /// </summary>
+        /// <param name="suiteResult"></param>
+        protected override void DoOneTimeSetUp(TestResult suiteResult)
+        {
+        }
+
+        /// <summary>
+        /// Override DoOneTimeTearDown to avoid executing any
+        /// TestFixtureTearDown method for this suite.
+        /// </summary>
+        /// <param name="suiteResult"></param>
+        protected override void DoOneTimeTearDown(TestResult suiteResult)
+        {
+        }
+    }
+}
diff --git a/src/NUnitCore/core/PlatformHelper.cs b/src/NUnitCore/core/PlatformHelper.cs
index bb63d31..737f627 100644
--- a/src/NUnitCore/core/PlatformHelper.cs
+++ b/src/NUnitCore/core/PlatformHelper.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -11,22 +11,17 @@ namespace NUnit.Core
 {
 	public class PlatformHelper
 	{
-		private OperatingSystem os;
+		private OSPlatform os;
 		private RuntimeFramework rt;
 
 		// Set whenever we fail to support a list of platforms
 		private string reason = string.Empty;
 
-		// Defined here and used in tests. We can't use PlatformID.Unix
-		// if we are building on .NET 1.0 or 1.1 and the values are different on Mono
-		public static readonly PlatformID UnixPlatformID_Microsoft = (PlatformID) 4;
-        public static readonly PlatformID UnixPlatformID_Mono = (PlatformID)128;
-
-		/// <summary>
+        /// <summary>
 		/// Comma-delimited list of all supported OS platform constants
 		/// </summary>
 		public static readonly string OSPlatforms =
-			"Win,Win32,Win32S,Win32NT,Win32Windows,WinCE,Win95,Win98,WinMe,NT3,NT4,NT5,Win2K,WinXP,Unix,Linux";
+			"Win,Win32,Win32S,Win32NT,Win32Windows,WinCE,Win95,Win98,WinMe,NT3,NT4,NT5,NT6,Win2K,WinXP,Win2003Server,Vista,Win2008Server,Win2008ServerR2,Windows7,Unix,Linux";
 		
 		/// <summary>
 		/// Comma-delimited list of all supported Runtime platform constants
@@ -40,7 +35,7 @@ namespace NUnit.Core
 		/// </summary>
 		public PlatformHelper()
 		{
-			this.os = Environment.OSVersion;
+			this.os = OSPlatform.CurrentPlatform;
 			this.rt = RuntimeFramework.CurrentFramework;
 		}
 
@@ -49,7 +44,7 @@ namespace NUnit.Core
 		/// system and common language runtime. Used in testing.
 		/// </summary>
 		/// <param name="os">OperatingSystem to be used</param>
-		public PlatformHelper( OperatingSystem os, RuntimeFramework rt )
+		public PlatformHelper( OSPlatform os, RuntimeFramework rt )
 		{
 			this.os = os;
 			this.rt = rt;
@@ -114,7 +109,7 @@ namespace NUnit.Core
 		/// Test to determine if the a particular platform or comma-
 		/// delimited set of platforms is in use.
 		/// </summary>
-		/// <param name="platform">Name of the platform or comma-separated list of platfomr names</param>
+		/// <param name="platform">Name of the platform or comma-separated list of platform names</param>
 		/// <returns>True if the platform is in use on the system</returns>
 		public bool IsPlatformSupported( string platform )
 		{
@@ -137,51 +132,65 @@ namespace NUnit.Core
 			{
 				case "WIN":
 				case "WIN32":
-					nameOK = os.Platform.ToString().StartsWith( "Win" );
+					nameOK = os.IsWindows;
 					break;
 				case "WIN32S":
-					nameOK = os.Platform == PlatformID.Win32S;
+                    nameOK = os.IsWin32S;
 					break;
 				case "WIN32WINDOWS":
-					nameOK = os.Platform == PlatformID.Win32Windows;
+					nameOK = os.IsWin32Windows;
 					break;
 				case "WIN32NT":
-					nameOK = os.Platform == PlatformID.Win32NT;
+					nameOK = os.IsWin32NT;
 					break;
 				case "WINCE":
-					nameOK = (int)os.Platform == 3;  // Not defined in .NET 1.0
+                    nameOK = os.IsWinCE;
 					break;
 				case "WIN95":
-					nameOK = os.Platform == PlatformID.Win32Windows && os.Version.Major == 4 && os.Version.Minor == 0;
+                    nameOK = os.IsWin95;
 					break;
-				case "WIN98": 
-					nameOK = os.Platform == PlatformID.Win32Windows && os.Version.Major == 4 && os.Version.Minor == 10;
+				case "WIN98":
+                    nameOK = os.IsWin98;
 					break;
 				case "WINME":
-					nameOK = os.Platform == PlatformID.Win32Windows && os.Version.Major == 4 && os.Version.Minor == 90;
+					nameOK = os.IsWinME;
 					break;
 				case "NT3":
-					nameOK = os.Platform == PlatformID.Win32NT && os.Version.Major == 3;
+                    nameOK = os.IsNT3;
 					break;
 				case "NT4":
-					nameOK = os.Platform == PlatformID.Win32NT && os.Version.Major == 4;
+                    nameOK = os.IsNT4;
 					break;
-				case "NT5":
-					nameOK = os.Platform == PlatformID.Win32NT && os.Version.Major == 5;
-					break;
-				case "WIN2K":
-					nameOK = os.Platform == PlatformID.Win32NT && os.Version.Major == 5 && os.Version.Minor == 0;
+                case "NT5":
+                    nameOK = os.IsNT5;
+                    break;
+                case "WIN2K":
+                    nameOK = os.IsWin2K;
 					break;
 				case "WINXP":
-					nameOK = os.Platform == PlatformID.Win32NT && os.Version.Major == 5 && os.Version.Minor == 1;
+                    nameOK = os.IsWinXP;
 					break;
 				case "WIN2003SERVER":
-					nameOK = os.Platform == PlatformID.Win32NT && os.Version.Major == 5 && os.Version.Minor == 2;
-					break;
-				case "UNIX":
+                    nameOK = os.IsWin2003Server;
+					break;
+                case "NT6":
+                    nameOK = os.IsNT6;
+                    break;
+                case "VISTA":
+                    nameOK = os.IsVista;
+                    break;
+                case "WIN2008SERVER":
+                    nameOK = os.IsWin2008Server;
+                    break;
+                case "WIN2008SERVERR2":
+                    nameOK = os.IsWin2008ServerR2;
+                    break;
+				case "WINDOWS7":
+					nameOK = os.IsWindows7;
+					break;
+                case "UNIX":
 				case "LINUX":
-					nameOK = os.Platform == UnixPlatformID_Microsoft
-                          || os.Platform == UnixPlatformID_Mono;
+                    nameOK = os.IsUnix;
 					break;
 				case "NET":
 					nameOK = rt.Runtime == RuntimeType.Net;
@@ -194,7 +203,7 @@ namespace NUnit.Core
 					nameOK = rt.Runtime == RuntimeType.SSCLI;
 					break;
 				case "MONO":
-					nameOK = rt.Runtime == RuntimeType.Mono;
+                    nameOK = rt.Runtime == RuntimeType.Mono;
 					// Special handling because Mono 1.0 profile has version 1.1
 					if ( versionSpecification == "1.0" )
 						versionSpecification = "1.1";
@@ -210,10 +219,10 @@ namespace NUnit.Core
 
 				Version version = new Version( versionSpecification );
 
-				if ( rt.Version.Major == version.Major &&
-					 rt.Version.Minor == version.Minor &&
-				   ( version.Build == -1 || rt.Version.Build == version.Build ) &&
-				   ( version.Revision == -1 || rt.Version.Revision == version.Revision ) )
+				if ( rt.ClrVersion.Major == version.Major &&
+					 rt.ClrVersion.Minor == version.Minor &&
+				   ( version.Build == -1 || rt.ClrVersion.Build == version.Build ) &&
+				   ( version.Revision == -1 || rt.ClrVersion.Revision == version.Revision ) )
 						return true;
 			}
 
diff --git a/src/NUnitCore/core/ProjectRootSuite.cs b/src/NUnitCore/core/ProjectRootSuite.cs
new file mode 100644
index 0000000..fe90c45
--- /dev/null
+++ b/src/NUnitCore/core/ProjectRootSuite.cs
@@ -0,0 +1,31 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Core
+{
+    /// <summary>
+    /// TestAssembly is a TestSuite that represents the execution
+    /// of tests in a managed assembly.
+    /// </summary>
+    public class ProjectRootSuite : TestSuite
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="ProjectRootSuite"/> class.
+        /// </summary>
+        /// <param name="path">The path.</param>
+        public ProjectRootSuite(string path) : base(path) { }
+
+        /// <summary>
+        /// Gets the type of the test.
+        /// </summary>
+        public override string TestType
+        {
+            get { return "Project"; }
+        }
+    }
+}
diff --git a/src/NUnitCore/core/ProxyTestRunner.cs b/src/NUnitCore/core/ProxyTestRunner.cs
index e171aa6..f03a4c1 100644
--- a/src/NUnitCore/core/ProxyTestRunner.cs
+++ b/src/NUnitCore/core/ProxyTestRunner.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 namespace NUnit.Core
 {
@@ -170,5 +170,14 @@ namespace NUnit.Core
 		}
 		#endregion
 
-	}
+        #region IDisposable Implementation
+
+        public virtual void Dispose()
+        {
+            if (testRunner != null)
+                testRunner.Dispose();
+        }
+
+        #endregion
+    }
 }
diff --git a/src/NUnitCore/core/QueuingEventListener.cs b/src/NUnitCore/core/QueuingEventListener.cs
index eef442e..005b055 100644
--- a/src/NUnitCore/core/QueuingEventListener.cs
+++ b/src/NUnitCore/core/QueuingEventListener.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 using System;
 
@@ -64,7 +64,7 @@ namespace NUnit.Core
 		/// A test case finished
 		/// </summary>
 		/// <param name="result">Result of the test case</param>
-		public void TestFinished(TestCaseResult result)
+		public void TestFinished(TestResult result)
 		{
 			events.Enqueue( new TestFinishedEvent( result ) );
 		}
@@ -82,7 +82,7 @@ namespace NUnit.Core
 		/// A suite finished
 		/// </summary>
 		/// <param name="result">Result of the suite</param>
-		public void SuiteFinished(TestSuiteResult result)
+		public void SuiteFinished(TestResult result)
 		{
 			events.Enqueue( new SuiteFinishedEvent( result ) );
 		}
diff --git a/src/NUnitCore/core/Reflect.cs b/src/NUnitCore/core/Reflect.cs
index 38a49eb..1e6bef4 100644
--- a/src/NUnitCore/core/Reflect.cs
+++ b/src/NUnitCore/core/Reflect.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -13,9 +13,9 @@ namespace NUnit.Core
 	/// <summary>
 	/// Helper methods for inspecting a type by reflection. 
 	/// 
-	/// Many of these methods take a MemberInfo as an argument to avoid
-	/// duplication, even though certain attributes can only appear on
-	/// specific types of members, like MethodInfo or Type.
+	/// Many of these methods take ICustomAttributeProvider as an 
+	/// argument to avoid duplication, even though certain attributes can 
+	/// only appear on specific types of members, like MethodInfo or Type.
 	/// 
 	/// In the case where a type is being examined for the presence of
 	/// an attribute, interface or named member, the Reflect methods
@@ -27,7 +27,9 @@ namespace NUnit.Core
 	/// </summary>
 	public class Reflect
 	{
-		#region Attributes 
+        private static readonly BindingFlags AllMembers = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.FlattenHierarchy;
+
+        #region Attributes 
 
 		/// <summary>
 		/// Check presence of attribute of a given type on a member.
@@ -36,10 +38,9 @@ namespace NUnit.Core
 		/// <param name="attrName">The FullName of the attribute type to look for</param>
 		/// <param name="inherit">True to include inherited attributes</param>
 		/// <returns>True if the attribute is present</returns>
-		public static bool HasAttribute( MemberInfo member, string attrName, bool inherit )
+		public static bool HasAttribute( ICustomAttributeProvider member, string attrName, bool inherit )
 		{
-			object[] attributes = member.GetCustomAttributes( inherit );
-			foreach( Attribute attribute in attributes )
+			foreach( Attribute attribute in GetAttributes( member, inherit ) )
 				if ( IsInstanceOfType( attrName, attribute ) )
 					return true;
 			return false;
@@ -53,44 +54,26 @@ namespace NUnit.Core
         /// <param name="attrName">The FullName of the attribute type to look for</param>
         /// <param name="inherit">True to include inherited attributes</param>
         /// <returns>The attribute or null</returns>
-        public static System.Attribute GetAttribute(MemberInfo member, string attrName, bool inherit)
+        public static System.Attribute GetAttribute(ICustomAttributeProvider member, string attrName, bool inherit)
         {
-            object[] attributes = member.GetCustomAttributes(inherit);
-            foreach (Attribute attribute in attributes)
+            foreach (Attribute attribute in GetAttributes( member, inherit ) )
                 if ( IsInstanceOfType( attrName, attribute ) )
                     return attribute;
             return null;
         }
 
         /// <summary>
-        /// Get attribute of a given type on an assembly. If multiple attributes
-        /// of a type are present, the first one found is returned.
-        /// </summary>
-        /// <param name="assembly">The assembly to examine</param>
-        /// <param name="attrName">The FullName of the attribute type to look for</param>
-        /// <param name="inherit">True to include inherited attributes</param>
-        /// <returns>The attribute or null</returns>
-        public static System.Attribute GetAttribute(Assembly assembly, string attrName, bool inherit)
-        {
-            object[] attributes = assembly.GetCustomAttributes(inherit);
-            foreach (Attribute attribute in attributes)
-                if ( IsInstanceOfType(attrName, attribute) )
-                    return attribute;
-            return null;
-        }
-
-        /// <summary>
 		/// Get all attributes of a given type on a member.
 		/// </summary>
 		/// <param name="member">The member to examine</param>
 		/// <param name="attrName">The FullName of the attribute type to look for</param>
 		/// <param name="inherit">True to include inherited attributes</param>
 		/// <returns>The attribute or null</returns>
-		public static System.Attribute[] GetAttributes( MemberInfo member, string attrName, bool inherit )
+        public static System.Attribute[] GetAttributes(
+            ICustomAttributeProvider member, string attrName, bool inherit)
 		{
-			object[] attributes = member.GetCustomAttributes( inherit );
 			ArrayList result = new ArrayList();
-			foreach( Attribute attribute in attributes )
+			foreach( Attribute attribute in GetAttributes( member, inherit ) )
 				if ( IsInstanceOfType( attrName, attribute ) )
 					result.Add( attribute );
 			return (System.Attribute[])result.ToArray( typeof( System.Attribute ) );
@@ -102,29 +85,15 @@ namespace NUnit.Core
         /// <param name="member">The member to examine</param>
         /// <param name="inherit">True to include inherited attributes</param>
         /// <returns>The attribute or null</returns>
-        public static System.Attribute[] GetAttributes(MemberInfo member, bool inherit)
+        public static System.Attribute[] GetAttributes(
+            ICustomAttributeProvider member, bool inherit)
         {
             object[] attributes = member.GetCustomAttributes(inherit);
             System.Attribute[] result = new System.Attribute[attributes.Length];
             int n = 0;
             foreach (Attribute attribute in attributes)
                 result[n++] = attribute;
-            return result;
-        }
 
-        /// <summary>
-        /// Get all attributes on an assembly.
-        /// </summary>
-        /// <param name="assembly">The assembly to examine</param>
-        /// <param name="inherit">True to include inherited attributes</param>
-        /// <returns>The attributes or null</returns>
-        public static System.Attribute[] GetAttributes(Assembly assembly, bool inherit)
-        {
-            object[] attributes = assembly.GetCustomAttributes(inherit);
-            System.Attribute[] result = new System.Attribute[attributes.Length];
-            int n = 0;
-            foreach (Attribute attribute in attributes)
-                result[n++] = attribute;
             return result;
         }
 
@@ -189,55 +158,75 @@ namespace NUnit.Core
 			return fixtureType.GetConstructor( Type.EmptyTypes );
 		}
 
-		/// <summary>
-		/// Find the default constructor on a type
-		/// </summary>
-		/// <param name="fixtureType"></param>
-		/// <returns></returns>
-		public static ConstructorInfo GetConstructor( Type fixtureType, Type[] types )
-		{
-			return fixtureType.GetConstructor( types );
-		}
+        /// <summary>
+        /// Examine a fixture type and return an array of methods having a 
+        /// particular attribute. The array is order with base methods first.
+        /// </summary>
+        /// <param name="fixtureType">The type to examine</param>
+        /// <param name="attributeName">The FullName of the attribute to look for</param>
+        /// <returns>The array of methods found</returns>
+        public static MethodInfo[] GetMethodsWithAttribute(Type fixtureType, string attributeName, bool inherit)
+        {
+            ArrayList list = new ArrayList();
 
-		/// <summary>
-		/// Examine a fixture type and return a method having a particular attribute.
-		/// In the case of multiple methods, the first one found is returned.
-		/// </summary>
-		/// <param name="fixtureType">The type to examine</param>
-		/// <param name="attributeName">The FullName of the attribute to look for</param>
-		/// <param name="bindingFlags">BindingFlags to use in looking for method</param>
-		/// <returns>A MethodInfo or null</returns>
-		public static MethodInfo GetMethodWithAttribute( Type fixtureType, string attributeName, BindingFlags bindingFlags, bool inherit )
-		{
-			foreach(MethodInfo method in fixtureType.GetMethods( bindingFlags ) )
-			{
-				if( HasAttribute( method, attributeName, inherit ) ) 
-					return method;
-			}
+            foreach (MethodInfo method in GetMethods(fixtureType))
+            {
+                if (HasAttribute(method, attributeName, inherit))
+                    list.Add(method);
+            }
 
-			return null;
-		}
+            list.Sort(new BaseTypesFirstComparer());
 
-		/// <summary>
-		/// Examine a fixture type and return a count of the methods having a 
-		/// particular attribute.
-		/// </summary>
-		/// <param name="fixtureType">The type to examine</param>
-		/// <param name="attributeName">The FullName of the attribute to look for</param>
-		/// <param name="bindingFlags">BindingFlags to use in looking for method</param>
-		/// <returns>The number of such methods found</returns>
-		public static int CountMethodsWithAttribute( Type fixtureType, string attributeName, BindingFlags bindingFlags, bool inherit )
-		{
-			int count = 0;
+            return (MethodInfo[])list.ToArray(typeof(MethodInfo));
+        }
 
-			foreach(MethodInfo method in fixtureType.GetMethods( bindingFlags ) )
-			{
-				if( HasAttribute( method, attributeName, inherit ) ) 
-					count++;
-			}
+        private static MethodInfo[] GetMethods(Type fixtureType)
+        {
+            MethodInfo[] result = fixtureType.GetMethods(AllMembers);
 
-			return count;
-		}
+            return result;
+        }
+
+        private class BaseTypesFirstComparer : IComparer
+        {
+            #region IComparer Members
+
+            public int Compare(object x, object y)
+            {
+                MethodInfo m1 = x as MethodInfo;
+                MethodInfo m2 = y as MethodInfo;
+
+                if (m1 == null || m2 == null) return 0;
+
+                Type m1Type = m1.DeclaringType;
+                Type m2Type = m2.DeclaringType;
+
+                if ( m1Type == m2Type ) return 0;
+                if ( m1Type.IsAssignableFrom(m2Type) ) return -1;
+
+                return 1;
+            }
+
+            #endregion
+        }
+
+        /// <summary>
+        /// Examine a fixture type and return true if it has a method with
+        /// a particular attribute. 
+        /// </summary>
+        /// <param name="fixtureType">The type to examine</param>
+        /// <param name="attributeName">The FullName of the attribute to look for</param>
+        /// <returns>True if found, otherwise false</returns>
+        public static bool HasMethodWithAttribute(Type fixtureType, string attributeName, bool inherit)
+        {
+            foreach (MethodInfo method in GetMethods( fixtureType ))
+            {
+                if (HasAttribute(method, attributeName, inherit))
+                    return true;
+            }
+
+            return false;
+        }
 
         /// <summary>
         /// Examine a fixture type and get a method with a particular name.
@@ -245,11 +234,10 @@ namespace NUnit.Core
         /// </summary>
         /// <param name="fixtureType">The type to examine</param>
         /// <param name="methodName">The name of the method</param>
-        /// <param name="bindingFlags">BindingFlags to use in the search</param>
         /// <returns>A MethodInfo or null</returns>
-        public static MethodInfo GetNamedMethod(Type fixtureType, string methodName, BindingFlags bindingFlags)
+        public static MethodInfo GetNamedMethod(Type fixtureType, string methodName)
         {
-            foreach (MethodInfo method in fixtureType.GetMethods(bindingFlags))
+            foreach (MethodInfo method in GetMethods( fixtureType ))
             {
                 if (method.Name == methodName)
                     return method;
@@ -265,12 +253,11 @@ namespace NUnit.Core
         /// <param name="fixtureType">The type to examine</param>
         /// <param name="methodName">The name of the method</param>
         /// <param name="argTypes">The full names of the argument types to search for</param>
-        /// <param name="bindingFlags">BindingFlags to use in the search</param>
         /// <returns>A MethodInfo or null</returns>
         public static MethodInfo GetNamedMethod(Type fixtureType, string methodName, 
-            string[] argTypes, BindingFlags bindingFlags)
+            string[] argTypes)
         {
-            foreach (MethodInfo method in fixtureType.GetMethods(bindingFlags))
+            foreach (MethodInfo method in GetMethods(fixtureType) )
             {
                 if (method.Name == methodName)
                 {
@@ -297,18 +284,16 @@ namespace NUnit.Core
         #endregion
 
 		#region Get Properties of a type
-
 		/// <summary>
 		/// Examine a type and return a property having a particular attribute.
 		/// In the case of multiple methods, the first one found is returned.
 		/// </summary>
 		/// <param name="fixtureType">The type to examine</param>
 		/// <param name="attributeName">The FullName of the attribute to look for</param>
-		/// <param name="bindingFlags">Binding flags to use in searching</param>
 		/// <returns>A PropertyInfo or null</returns>
-		public static PropertyInfo GetPropertyWithAttribute( Type fixtureType, string attributeName, BindingFlags bindingFlags )
+		public static PropertyInfo GetPropertyWithAttribute( Type fixtureType, string attributeName )
 		{
-			foreach(PropertyInfo property in fixtureType.GetProperties( bindingFlags ) )
+			foreach(PropertyInfo property in fixtureType.GetProperties( AllMembers ) )
 			{
 				if( HasAttribute( property, attributeName, true ) ) 
 					return property;
@@ -354,47 +339,73 @@ namespace NUnit.Core
 				return property.GetValue( obj, null );
 			return null;
 		}
-
-		/// <summary>
-		/// Set the value of a named property on an object
-		/// </summary>
-		/// <param name="obj">The object for which the property value is to be set</param>
-		/// <param name="name">The name of a non-indexed property of the object</param>
-		/// <param name="val">The value to which the property is to be set</param>
-		/// <param name="bindingFlags">BindingFlags for use in determining which properties are needed</param>param>
-		public static void SetPropertyValue( object obj, string name, object val, BindingFlags bindingFlags )
-		{
-			PropertyInfo property = GetNamedProperty( obj.GetType(), name, bindingFlags );
-			if ( property != null )
-				property.SetValue( obj, val, null );
-		}
-
 		#endregion
 
 		#region Invoke Methods
 
-		/// <summary>
-		/// Invoke the default constructor on a type
-		/// </summary>
-		/// <param name="type">The type to be constructed</param>
-		/// <returns>An instance of the type</returns>
-		public static object Construct( Type type )
-		{
-			ConstructorInfo ctor = GetConstructor( type );
-			if ( ctor == null )
-				throw new InvalidTestFixtureException(type.FullName + " does not have a valid constructor");
-			
-			return ctor.Invoke( Type.EmptyTypes );
-		}
+        /// <summary>
+        /// Invoke the default constructor on a Type
+        /// </summary>
+        /// <param name="type">The Type to be constructed</param>
+        /// <returns>An instance of the Type</returns>
+        public static object Construct(Type type)
+        {
+            ConstructorInfo ctor = GetConstructor(type);
+            if (ctor == null)
+                throw new InvalidTestFixtureException(type.FullName + " does not have a default constructor");
 
-		/// <summary>
+            return ctor.Invoke(null);
+        }
+
+        /// <summary>
+        /// Invoke a constructor on a Type with arguments
+        /// </summary>
+        /// <param name="type">The Type to be constructed</param>
+        /// <param name="arguments">Arguments to the constructor</param>
+        /// <returns>An instance of the Type</returns>
+        public static object Construct(Type type, object[] arguments)
+        {
+            if (arguments == null) return Construct(type);
+
+            //Type[] argTypes = GetTypeArray(arguments);
+            //ConstructorInfo ctor = GetConstructor(type, argTypes);
+            //if (ctor == null)
+            //    throw new InvalidTestFixtureException(type.FullName + " does not have a suitable constructor");
+
+            try
+            {
+                return type.InvokeMember(type.Name, BindingFlags.CreateInstance, null, null, arguments);
+            }
+            catch (Exception ex)
+            {
+                throw new InvalidTestFixtureException(type.FullName + " does not have a suitable constructor", ex);
+            }
+        }
+
+        /// <summary>
+        /// Returns an array of types from an array of objects.
+        /// Used because the compact framework doesn't support
+        /// Type.GetTypeArray()
+        /// </summary>
+        /// <param name="objects">An array of objects</param>
+        /// <returns>An array of Types</returns>
+        public static Type[] GetTypeArray(object[] objects)
+        {
+            Type[] types = new Type[objects.Length];
+            int index = 0;
+            foreach (object o in objects)
+                types[index++] = o == null ? null : o.GetType();
+            return types;
+        }
+
+        /// <summary>
 		/// Invoke a parameterless method returning void on an object.
 		/// </summary>
 		/// <param name="method">A MethodInfo for the method to be invoked</param>
 		/// <param name="fixture">The object on which to invoke the method</param>
-		public static void InvokeMethod( MethodInfo method, object fixture ) 
+		public static object InvokeMethod( MethodInfo method, object fixture ) 
 		{
-			InvokeMethod( method, fixture, null );
+			return InvokeMethod( method, fixture, null );
 		}
 
 		/// <summary>
@@ -403,13 +414,13 @@ namespace NUnit.Core
 		/// </summary>
 		/// <param name="method">A MethodInfo for the method to be invoked</param>
 		/// <param name="fixture">The object on which to invoke the method</param>
-		public static void InvokeMethod( MethodInfo method, object fixture, params object[] args )
+		public static object InvokeMethod( MethodInfo method, object fixture, params object[] args )
 		{
 			if(method != null)
 			{
 				try
 				{
-					method.Invoke( fixture, args );
+					return method.Invoke( fixture, args );
 				}
 				catch(TargetInvocationException e)
 				{
@@ -417,6 +428,8 @@ namespace NUnit.Core
 					throw new NUnitException("Rethrown",inner);
 				}
 			}
+
+		    return null;
 		}
 
 		#endregion
diff --git a/src/NUnitCore/core/RemoteTestRunner.cs b/src/NUnitCore/core/RemoteTestRunner.cs
index b4a69c5..f54e388 100644
--- a/src/NUnitCore/core/RemoteTestRunner.cs
+++ b/src/NUnitCore/core/RemoteTestRunner.cs
@@ -1,13 +1,15 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 
 namespace NUnit.Core
 {
-	using System.Collections;
 	using System;
+    using System.Reflection;
+	using System.Collections;
+	using System.Diagnostics;
 
 	/// <summary>
 	/// RemoteTestRunner is tailored for use as the initial runner to
@@ -17,6 +19,32 @@ namespace NUnit.Core
 	/// </summary>
 	public class RemoteTestRunner : ProxyTestRunner
 	{
+		/// <summary>
+		/// Returns a RemoteTestRunner in the target domain. This method
+		/// is used in the domain that wants to get a reference to 
+		/// a RemoteTestRunnner and not in the test domain itself.
+		/// </summary>
+		/// <param name="targetDomain">AppDomain in which to create the runner</param>
+		/// <param name="ID">Id for the new runner to use</param>
+		/// <returns></returns>
+        public static RemoteTestRunner CreateInstance(AppDomain targetDomain, int ID)
+        {
+#if NET_2_0
+            System.Runtime.Remoting.ObjectHandle oh = Activator.CreateInstance(
+                targetDomain,
+#else
+			System.Runtime.Remoting.ObjectHandle oh = targetDomain.CreateInstance(
+#endif
+                Assembly.GetExecutingAssembly().FullName,
+                typeof(RemoteTestRunner).FullName,
+                false, BindingFlags.Default, null, new object[] { ID }, null, null, null);
+
+            object obj = oh.Unwrap();
+            return (RemoteTestRunner)obj;
+        }
+
+		static Logger log = InternalTrace.GetLogger("RemoteTestRunner");
+
 		#region Constructors
 		public RemoteTestRunner() : this( 0 ) { }
 
@@ -26,7 +54,7 @@ namespace NUnit.Core
 		#region Method Overrides
 		public override bool Load(TestPackage package)
 		{
-			NTrace.Info( "Loading test package " + package.Name );
+			log.Info("Loading Test Package " + package.Name );
 
 			// Initialize ExtensionHost if not already done
 			if ( !CoreExtensions.Host.Initialized )
@@ -42,18 +70,34 @@ namespace NUnit.Core
 
 			this.TestRunner = runner;
 
-			return base.Load (package);
+			if( base.Load (package) )
+			{
+				log.Info("Loaded package successfully" );
+				return true;
+			}
+			else
+			{
+				log.Info("Package load failed" );
+				return false;
+			}
 		}
 
-		public override TestResult Run( EventListener listener )
+        public override void Unload()
+        {
+            log.Info("Unloading test package");
+            base.Unload();
+        }
+
+        public override TestResult Run(EventListener listener)
 		{
 			return Run( listener, TestFilter.Empty );
 		}
 
 		public override TestResult Run( EventListener listener, ITestFilter filter )
 		{
-			NTrace.Debug( "Running test synchronously" );
-			QueuingEventListener queue = new QueuingEventListener();
+            log.Debug("Run");
+
+            QueuingEventListener queue = new QueuingEventListener();
 
 			StartTextCapture( queue );
 
@@ -71,7 +115,8 @@ namespace NUnit.Core
 
 		public override void BeginRun( EventListener listener, ITestFilter filter )
 		{
-			NTrace.Debug( "Running test asynchronously" );
+            log.Debug("BeginRun");
+
 			QueuingEventListener queue = new QueuingEventListener();
 
 			StartTextCapture( queue );
@@ -85,13 +130,19 @@ namespace NUnit.Core
 
 		private void StartTextCapture( EventListener queue )
 		{
-			TestContext.Out = new EventListenerTextWriter( queue, TestOutputType.Out );
-			TestContext.Error = new EventListenerTextWriter( queue, TestOutputType.Error );
-			TestContext.TraceWriter = new EventListenerTextWriter( queue, TestOutputType.Trace );
-			TestContext.Tracing = true;
-			TestContext.LogWriter = new EventListenerTextWriter( queue, TestOutputType.Log );
-			TestContext.Logging = true;
+            TestExecutionContext.CurrentContext.Out = new EventListenerTextWriter(queue, TestOutputType.Out);
+            TestExecutionContext.CurrentContext.Error = new EventListenerTextWriter(queue, TestOutputType.Error);
+            TestExecutionContext.CurrentContext.TraceWriter = new EventListenerTextWriter(queue, TestOutputType.Trace);
+            TestExecutionContext.CurrentContext.Tracing = true;
+            TestExecutionContext.CurrentContext.LogWriter = new EventListenerTextWriter(queue, TestOutputType.Log);
+            TestExecutionContext.CurrentContext.Logging = true;
 		}
 		#endregion
+
+		private void CurrentDomain_DomainUnload(object sender, EventArgs e)
+		{
+			log.Debug(AppDomain.CurrentDomain.FriendlyName + " unloaded");
+			InternalTrace.Flush();
+		}
 	}
 }
diff --git a/src/NUnitCore/core/Results.xsd b/src/NUnitCore/core/Results.xsd
deleted file mode 100644
index c1697e3..0000000
--- a/src/NUnitCore/core/Results.xsd
+++ /dev/null
@@ -1,99 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
-	<xs:complexType name="failureType">
-		<xs:sequence>
-			<xs:element ref="message" />
-			<xs:element ref="stack-trace" />
-		</xs:sequence>
-	</xs:complexType>
-	<xs:complexType name="reasonType">
-		<xs:sequence>
-			<xs:element ref="message" />
-		</xs:sequence>
-	</xs:complexType>
-	<xs:element name="message" type="xs:string" />
-	<xs:complexType name="resultsType">
-		<xs:choice>
-			<xs:element name="test-suite" type="test-suiteType" maxOccurs="unbounded" />
-			<xs:element name="test-case" type="test-caseType" maxOccurs="unbounded" minOccurs="0" />
-		</xs:choice>
-	</xs:complexType>
-	<xs:element name="stack-trace" type="xs:string" />
-	<xs:element name="test-results" type="resultType" />
-	<xs:complexType name="categoriesType">
-		<xs:sequence>
-			<xs:element name="category" type="categoryType" maxOccurs="unbounded" minOccurs="1" />
-		</xs:sequence>
-	</xs:complexType>
-	<xs:complexType name="categoryType">
-		<xs:attribute name="name" type="xs:string" use="required" />
-	</xs:complexType>
-	<xs:complexType name="propertiesType">
-		<xs:sequence>
-			<xs:element name="property" type="propertyType" maxOccurs="unbounded" minOccurs="1" />
-		</xs:sequence>
-	</xs:complexType>
-	<xs:complexType name="propertyType">
-		<xs:attribute name="name" type="xs:string" use="required" />
-		<xs:attribute name="value" type="xs:string" use="required" />
-	</xs:complexType>
-	<xs:complexType name="environmentType">
-		<xs:attribute name="nunit-version" type="xs:string" use="required" />
-		<xs:attribute name="clr-version" type="xs:string" use="required" />
-		<xs:attribute name="os-version" type="xs:string" use="required" />
-		<xs:attribute name="platform" type="xs:string" use="required" />
-		<xs:attribute name="cwd" type="xs:string" use="required" />
-		<xs:attribute name="machine-name" type="xs:string" use="required" />
-		<xs:attribute name="user" type="xs:string" use="required" />
-		<xs:attribute name="user-domain" type="xs:string" use="required" />
-	</xs:complexType>
-	<xs:complexType name="culture-infoType">
-		<xs:attribute name="current-culture" type="xs:string" use="required" />
-		<xs:attribute name="current-uiculture" type="xs:string" use="required" />
-	</xs:complexType>
-	<xs:complexType name="resultType">
-		<xs:sequence>
-			<xs:element name="environment" type="environmentType" />
-			<xs:element name="culture-info" type="culture-infoType" />
-			<xs:element name="test-suite" type="test-suiteType" />
-		</xs:sequence>
-		<xs:attribute name="name" type="xs:string" use="required" />
-		<xs:attribute name="total" type="xs:decimal" use="required" />
-		<xs:attribute name="failures" type="xs:decimal" use="required" />
-		<xs:attribute name="not-run" type="xs:decimal" use="required" />
-		<xs:attribute name="date" type="xs:string" use="required" />
-		<xs:attribute name="time" type="xs:string" use="required" />
-	</xs:complexType>
-	<xs:complexType name="test-caseType">
-		<xs:sequence>
-			<xs:element name="categories" type="categoriesType" minOccurs="0" maxOccurs="1" />
-			<xs:element name="properties" type="propertiesType" minOccurs="0" maxOccurs="1" />
-			<xs:choice>
-				<xs:element name="failure" type="failureType" minOccurs="0" />
-				<xs:element name="reason" type="reasonType" minOccurs="0" />
-			</xs:choice>
-		</xs:sequence>
-		<xs:attribute name="name" type="xs:string" use="required" />
-		<xs:attribute name="description" type="xs:string" use="optional" />
-		<xs:attribute name="success" type="xs:string" use="optional" />
-		<xs:attribute name="time" type="xs:string" use="optional" />
-		<xs:attribute name="executed" type="xs:string" use="required" />
-		<xs:attribute name="asserts" type="xs:string" use="optional" />
-	</xs:complexType>
-	<xs:complexType name="test-suiteType">
-		<xs:sequence>
-			<xs:element name="categories" type="categoriesType" minOccurs="0" maxOccurs="1" />
-			<xs:element name="properties" type="propertiesType" minOccurs="0" maxOccurs="1" />
-      <xs:choice>
-        <xs:element name="failure" type="failureType" minOccurs="0" />
-        <xs:element name="reason" type="reasonType" minOccurs="0" />
-      </xs:choice>
-      <xs:element name="results" type="resultsType" />
-		</xs:sequence>
-		<xs:attribute name="name" type="xs:string" use="required" />
-		<xs:attribute name="description" type="xs:string" use="optional" />
-		<xs:attribute name="success" type="xs:string" use="required" />
-		<xs:attribute name="time" type="xs:string" use="required" />
-		<xs:attribute name="asserts" type="xs:string" use="optional" />
-	</xs:complexType>
-</xs:schema>
\ No newline at end of file
diff --git a/src/NUnitCore/core/SetUpFixture.cs b/src/NUnitCore/core/SetUpFixture.cs
index 3542dce..90710f1 100644
--- a/src/NUnitCore/core/SetUpFixture.cs
+++ b/src/NUnitCore/core/SetUpFixture.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -26,15 +26,25 @@ namespace NUnit.Core
             if (index > 0)
                 this.TestName.Name = this.TestName.Name.Substring(index + 1);
             
-			this.fixtureSetUp = NUnitFramework.GetSetUpMethod( type );
-			this.fixtureTearDown = NUnitFramework.GetTearDownMethod( type );
+			this.fixtureSetUpMethods = Reflect.GetMethodsWithAttribute( type, NUnitFramework.SetUpAttribute, true );
+			this.fixtureTearDownMethods = Reflect.GetMethodsWithAttribute( type, NUnitFramework.TearDownAttribute, true );
 		}
 		#endregion
 
 		#region TestSuite Overrides
+
+        /// <summary>
+        /// Gets a string representing the kind of test
+        /// that this object represents, for use in display.
+        /// </summary>
+        public override string TestType
+        {
+            get { return "SetUpFixture"; }
+        }
+
 		public override TestResult Run(EventListener listener, ITestFilter filter)
 		{
-			using ( new DirectorySwapper( Path.GetDirectoryName( TestFixtureBuilder.GetAssemblyPath( FixtureType ) ) ) )
+			using ( new DirectorySwapper( AssemblyHelper.GetDirectoryName( FixtureType.Assembly ) ) )
 			{
 				return base.Run(listener, filter);
 			}
diff --git a/src/NUnitCore/core/SimpleTestRunner.cs b/src/NUnitCore/core/SimpleTestRunner.cs
index 94d0375..e631648 100644
--- a/src/NUnitCore/core/SimpleTestRunner.cs
+++ b/src/NUnitCore/core/SimpleTestRunner.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 using System;
 using System.IO;
@@ -22,6 +22,8 @@ namespace NUnit.Core
 	/// </summary>
 	public class SimpleTestRunner : MarshalByRefObject, TestRunner
 	{
+        static Logger log = InternalTrace.GetLogger(typeof(SimpleTestRunner));
+
 		#region Instance Variables
 
 		/// <summary>
@@ -102,6 +104,8 @@ namespace NUnit.Core
 		/// <returns>True on success, false on failure</returns>
 		public bool Load( TestPackage package )
 		{
+            log.Debug("Loading package " + package.Name);
+
 			this.builder = new TestSuiteBuilder();
 
 			this.test = builder.Build( package );
@@ -116,6 +120,7 @@ namespace NUnit.Core
 		/// </summary>
 		public void Unload()
 		{
+            log.Debug("Unloading");
 			this.test = null; // All for now
 		}
 		#endregion
@@ -137,6 +142,8 @@ namespace NUnit.Core
 		{
 			try
 			{
+                log.Debug("Starting test run");
+
 				// Take note of the fact that we are running
 				this.runThread = Thread.CurrentThread;
 
@@ -146,6 +153,7 @@ namespace NUnit.Core
 
 				// Signal that we are done
 				listener.RunFinished( testResult );
+                log.Debug("Test run complete");
 
 				// Return result array
 				return testResult;
@@ -214,5 +222,14 @@ namespace NUnit.Core
             return null;
         }
 	#endregion
-	}
+
+        #region IDisposable Members
+
+        public void Dispose()
+        {
+            Unload();
+        }
+
+        #endregion
+    }
 }
diff --git a/src/NUnitCore/core/StringTextWriter.cs b/src/NUnitCore/core/StringTextWriter.cs
index 4e70608..8213497 100644
--- a/src/NUnitCore/core/StringTextWriter.cs
+++ b/src/NUnitCore/core/StringTextWriter.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System.IO;
diff --git a/src/NUnitCore/core/SuiteBuilderAttribute.cs b/src/NUnitCore/core/SuiteBuilderAttribute.cs
index e79b3ec..a309099 100644
--- a/src/NUnitCore/core/SuiteBuilderAttribute.cs
+++ b/src/NUnitCore/core/SuiteBuilderAttribute.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitCore/core/Summary.xslt b/src/NUnitCore/core/Summary.xslt
index c5156c3..036283a 100644
--- a/src/NUnitCore/core/Summary.xslt
+++ b/src/NUnitCore/core/Summary.xslt
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8" ?>
+t<?xml version="1.0" encoding="UTF-8" ?>
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method='text'/>
 
@@ -9,15 +9,24 @@
 <xsl:template match="test-results">
 <xsl:text>Tests run: </xsl:text>
 <xsl:value-of select="@total"/>
+<xsl:text>, Errors: </xsl:text>
+<xsl:value-of select="@errors"/>
 <xsl:text>, Failures: </xsl:text>
 <xsl:value-of select="@failures"/>
-<xsl:text>, Not run: </xsl:text>
-<xsl:value-of select="@not-run"/>
 <xsl:text>, Time: </xsl:text>
 <xsl:value-of select="test-suite/@time"/>
 <xsl:text> seconds
 </xsl:text>
+<xsl:text>  Not run: </xsl:text>
+<xsl:value-of select="@not-run"/>
+<xsl:text>, Invalid: </xsl:text>
+<xsl:value-of select="@invalid"/>
+<xsl:text>, Ignored: </xsl:text>
+<xsl:value-of select="@ignored"/>
+<xsl:text>, Skipped: </xsl:text>
+<xsl:value-of select="@skipped"/>
 <xsl:text>
+
 </xsl:text>
 
 <xsl:if test="//test-suite[failure]"><xsl:text>Test Fixture SetUp Failures:
diff --git a/src/NUnitCore/core/TestAssembly.cs b/src/NUnitCore/core/TestAssembly.cs
new file mode 100644
index 0000000..4e3816f
--- /dev/null
+++ b/src/NUnitCore/core/TestAssembly.cs
@@ -0,0 +1,31 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Core
+{
+    /// <summary>
+    /// TestAssembly is a TestSuite that represents the execution
+    /// of tests in a managed assembly.
+    /// </summary>
+    public class TestAssembly : TestSuite
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="TestAssembly"/> class.
+        /// </summary>
+        /// <param name="path">The path.</param>
+        public TestAssembly(string path) : base(path) { }
+
+        /// <summary>
+        /// Gets the type of the test.
+        /// </summary>
+        public override string TestType
+        {
+            get { return "Assembly"; }
+        }
+    }
+}
diff --git a/src/NUnitCore/core/TestBuilderAttribute.cs b/src/NUnitCore/core/TestBuilderAttribute.cs
index 7d8228f..b8b7355 100644
--- a/src/NUnitCore/core/TestBuilderAttribute.cs
+++ b/src/NUnitCore/core/TestBuilderAttribute.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitCore/core/TestCase.cs b/src/NUnitCore/core/TestCase.cs
deleted file mode 100644
index 4722bcb..0000000
--- a/src/NUnitCore/core/TestCase.cs
+++ /dev/null
@@ -1,96 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-namespace NUnit.Core
-{
-	using System;
-	using System.Collections;
-	using System.Reflection;
-
-	/// <summary>
-	/// The abstract TestCase class represents a single test case.
-	/// In the present implementation, the only derived class is
-	/// TestMethod, but we allow for future test cases which are
-	/// implemented in other ways.
-	/// </summary>
-	public abstract class TestCase : Test
-	{
-		public TestCase( string path, string name ) : base( path, name ) { }
-
-		public TestCase( MethodInfo method ) : base ( method ) { }
-
-		public TestCase( TestName testName ) : base ( testName ) { }
-
-		public override int CountTestCases( ITestFilter filter ) 
-		{
-			if (filter.Pass(this))
-				return 1;
-
-			return 0;
-		}
-
-		protected virtual TestCaseResult MakeTestCaseResult()
-		{
-			return new TestCaseResult( new TestInfo(this) );
-		}
-
-		public override TestResult Run(EventListener listener, ITestFilter filter)
-		{
-			return Run( listener ); // Ignore filter for now
-		}
-
-		public override TestResult Run( EventListener listener )
-		{
-			using( new TestContext() )
-			{
-				TestCaseResult testResult = MakeTestCaseResult();
-
-				listener.TestStarted( this.TestName );
-				long startTime = DateTime.Now.Ticks;
-
-				switch (this.RunState)
-				{
-					case RunState.Runnable:
-					case RunState.Explicit:
-						Run(testResult);
-						break;
-					case RunState.Skipped:
-						testResult.Skip(IgnoreReason);
-						break;
-					default:
-					case RunState.NotRunnable:
-					case RunState.Ignored:
-						testResult.Ignore(IgnoreReason);
-						break;
-				}
-
-				long stopTime = DateTime.Now.Ticks;
-				double time = ((double)(stopTime - startTime)) / (double)TimeSpan.TicksPerSecond;
-				testResult.Time = time;
-
-				listener.TestFinished(testResult);
-				return testResult;
-			}
-		}
-
-		public override string TestType
-		{
-			get { return "Test Case"; }
-		}
-
-		public override bool IsSuite
-		{
-			get { return false; }
-		}
-
-		public override IList Tests
-		{
-			get { return null; }
-		}
-
-		public abstract void Run(TestCaseResult result);
-	}
-}
diff --git a/src/NUnitCore/core/TestCaseBuilder.cs b/src/NUnitCore/core/TestCaseBuilder.cs
deleted file mode 100644
index 8aec8c7..0000000
--- a/src/NUnitCore/core/TestCaseBuilder.cs
+++ /dev/null
@@ -1,45 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-using System;
-using System.Reflection;
-
-namespace NUnit.Core
-{
-	/// <summary>
-	/// This class collects static methods that build test cases.
-	public class TestCaseBuilder
-	{
-		/// <summary>
-		/// Makes a test case from a given method if any builders
-		/// know how to do it and returns null otherwise.
-		/// </summary>
-		/// <param name="method">MethodInfo for the particular method</param>
-		/// <returns>A test case or null</returns>
-//		public static Test BuildFrom( MethodInfo method )
-//		{
-//			Test test = CoreExtensions.Host.TestBuilders.BuildFrom( method );
-//
-//			if ( test != null )
-//				test = CoreExtensions.Host.TestDecorators.Decorate( test, method );
-//
-//			return test;
-//		}
-//
-//		public static Test Decorate( test, method )
-//		{
-//			if ( test != null )
-//				test = CoreExtensions.Host.TestDecorators.Decorate( test, method );
-//
-//			return test;
-//		}
-//
-		/// <summary>
-		/// Private constructor to prevent object creation
-		/// </summary>
-		private TestCaseBuilder() { }
-	}
-}
diff --git a/src/NUnitCore/core/TestCaseBuilderAttribute.cs b/src/NUnitCore/core/TestCaseBuilderAttribute.cs
index 55009dc..a4beee3 100644
--- a/src/NUnitCore/core/TestCaseBuilderAttribute.cs
+++ b/src/NUnitCore/core/TestCaseBuilderAttribute.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitCore/core/TestContext.cs b/src/NUnitCore/core/TestContext.cs
deleted file mode 100644
index b819d04..0000000
--- a/src/NUnitCore/core/TestContext.cs
+++ /dev/null
@@ -1,362 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-using System;
-using System.Collections.Specialized;
-using System.Configuration;
-using System.IO;
-using System.Diagnostics;
-using System.Globalization;
-using System.Threading;
-
-namespace NUnit.Core
-{
-	/// <summary>
-	/// Helper class used to save and restore certain static or
-	/// singleton settings in the environment that affect tests 
-	/// or which might be changed by the user tests.
-	/// 
-	/// An internal class is used to hold settings and a stack
-	/// of these objects is pushed and popped as Save and Restore
-	/// are called.
-	/// 
-	/// Static methods for each setting forward to the internal 
-	/// object on the top of the stack.
-	/// 
-	/// When TestContext itself is instantiated, it is used to
-	/// save and restore settings for a block. It should be 
-	/// used with using() or Disposed in a finally block.
-	/// </summary>
-	public class TestContext : IDisposable
-	{
-		#region Instance Variables
-		/// <summary>
-		/// The current context, head of the list of saved contexts.
-		/// </summary>
-		private static ContextHolder current = new ContextHolder();
-		#endregion
-
-		#region Static Methods
-		public static bool Tracing
-		{
-			get { return current.Tracing; }
-			set { current.Tracing = value; }
-		}
-
-		public static bool Logging
-		{
-			get { return current.Logging; }
-			set { current.Logging = value; }
-		}
-
-		/// <summary>
-		/// Controls where Console.Out is directed
-		/// </summary>
-		public static TextWriter Out
-		{
-			get { return current.Out; }
-			set { current.Out = value; }
-		}
-		
-		/// <summary>
-		/// Controls where Console.Error is directed
-		/// </summary>
-		public static TextWriter Error
-		{
-			get { return current.Error; }
-			set { current.Error = value; }
-		}
-
-		/// <summary>
-		/// Controls where Trace output is directed
-		/// </summary>
-		public static TextWriter TraceWriter
-		{
-			get { return current.TraceWriter; }
-			set { current.TraceWriter = value; }
-		}
-
-		public static TextWriter LogWriter
-		{
-			get { return current.LogWriter; }
-			set { current.LogWriter = value; }
-		}
-
-		/// <summary>
-		/// The current directory setting
-		/// </summary>
-		public static string CurrentDirectory
-		{
-			get { return current.CurrentDirectory; }
-			set { current.CurrentDirectory = value; }
-		}
-
-		public static CultureInfo CurrentCulture
-		{
-			get { return current.CurrentCulture; }
-			set { current.CurrentCulture = value; }
-		}
-		
-		/// <summary>
-		/// Saves the old context and makes a fresh one 
-		/// current without changing any settings.
-		/// </summary>
-		public static void Save()
-		{
-			TestContext.current = new ContextHolder( current );
-		}
-
-		/// <summary>
-		/// Restores the last saved context and puts
-		/// any saved settings back into effect.
-		/// </summary>
-		public static void Restore()
-		{
-			current.ReverseChanges();
-			current = current.prior;
-		}
-		#endregion
-
-		#region Construct and Dispose
-		/// <summary>
-		/// The constructor saves the current context.
-		/// </summary>
-		public TestContext() 
-		{ 
-			TestContext.Save();
-		}
-
-		/// <summary>
-		/// Dispose restores the old context
-		/// </summary>
-		public void Dispose()
-		{
-			TestContext.Restore();
-		}
-		#endregion
-
-		#region ContextHolder internal class
-		private class ContextHolder
-		{
-			/// <summary>
-			/// Indicates whether trace is enabled
-			/// </summary>
-			private bool tracing;
-
-			/// <summary>
-			/// Indicates whether logging is enabled
-			/// </summary>
-			private bool logging;
-
-			/// <summary>
-			/// Destination for standard output
-			/// </summary>
-			private TextWriter outWriter;
-
-			/// <summary>
-			/// Destination for standard error
-			/// </summary>
-			private TextWriter errorWriter;
-
-			/// <summary>
-			/// Destination for Trace output
-			/// </summary>
-			private TextWriter traceWriter;
-
-			private Log4NetCapture logCapture;
-
-			/// <summary>
-			/// The current working directory
-			/// </summary>
-			private string currentDirectory;
-
-			/// <summary>
-			/// The current culture
-			/// </summary>
-			private CultureInfo currentCulture;
-
-			/// <summary>
-			/// Link to a prior saved context
-			/// </summary>
-			public ContextHolder prior;
-
-			public ContextHolder()
-			{
-				this.prior = null;
-				this.tracing = false;
-				this.logging = false;
-				this.outWriter = Console.Out;
-				this.errorWriter = Console.Error;
-				this.traceWriter = null;
-				this.logCapture = new Log4NetCapture();
-
-				this.currentDirectory = Environment.CurrentDirectory;
-				this.currentCulture = CultureInfo.CurrentCulture;
-			}
-
-			public ContextHolder( ContextHolder other )
-			{
-				this.prior = other;
-				this.tracing = other.tracing;
-				this.logging = other.logging;
-				this.outWriter = other.outWriter;
-				this.errorWriter = other.errorWriter;
-				this.traceWriter = other.traceWriter;
-				this.logCapture = other.logCapture;
-
-				this.currentDirectory = Environment.CurrentDirectory;
-				this.currentCulture = CultureInfo.CurrentCulture;
-			}
-
-			/// <summary>
-			/// Used to restore settings to their prior
-			/// values before reverting to a prior context.
-			/// </summary>
-			public void ReverseChanges()
-			{ 
-				if ( prior == null )
-					throw new InvalidOperationException( "TestContext: too many Restores" );
-
-				this.Tracing = prior.Tracing;
-				this.Out = prior.Out;
-				this.Error = prior.Error;
-				this.CurrentDirectory = prior.CurrentDirectory;
-				this.CurrentCulture = prior.CurrentCulture;
-			}
-
-			/// <summary>
-			/// Controls whether trace and debug output are written
-			/// to the standard output.
-			/// </summary>
-			public bool Tracing
-			{
-				get { return tracing; }
-				set 
-				{
-					if ( tracing != value )
-					{
-						if ( traceWriter != null && tracing )
-							StopTracing();
-
-						tracing = value; 
-
-						if ( traceWriter != null && tracing )
-							StartTracing();
-					}
-				}
-			}
-
-			/// <summary>
-			/// Controls whether log output is captured
-			/// </summary>
-			public bool Logging
-			{
-				get { return logCapture.Enabled; }
-				set { logCapture.Enabled = value; }
-			}
-
-			/// <summary>
-			/// Controls where Console.Out is directed
-			/// </summary>
-			public TextWriter Out
-			{
-				get { return outWriter; }
-				set 
-				{
-					if ( outWriter != value )
-					{
-						outWriter = value; 
-						Console.Out.Flush();
-						Console.SetOut( outWriter );
-					}
-				}
-			}
-		
-			/// <summary>
-			/// Controls where Console.Error is directed
-			/// </summary>
-			public TextWriter Error
-			{
-				get { return errorWriter; }
-				set 
-				{
-					if ( errorWriter != value )
-					{
-						errorWriter = value; 
-						Console.Error.Flush();
-						Console.SetError( errorWriter );
-					}
-				}
-			}
-
-			public TextWriter TraceWriter
-			{
-				get { return traceWriter; }
-				set
-				{
-					if ( traceWriter != value )
-					{
-						if ( traceWriter != null  && tracing )
-							StopTracing();
-
-						traceWriter = value;
-
-						if ( traceWriter != null && tracing )
-							StartTracing();
-					}
-				}
-			}
-
-			/// <summary>
-			///  Gets or sets the Log writer, which is actually held by a log4net 
-			///  TextWriterAppender. When first set, the appender will be created
-			///  and will thereafter send any log events to the writer.
-			///  
-			///  In normal operation, LogWriter is set to an EventListenerTextWriter
-			///  connected to the EventQueue in the test domain. The events are
-			///  subsequently captured in the Gui an the output displayed in
-			///  the Log tab. The application under test does not need to define
-			///  any additional appenders.
-			/// </summary>
-			public TextWriter LogWriter
-			{
-				get { return logCapture.Writer; }
-				set { logCapture.Writer = value; }
-			}
-
-			private void StopTracing()
-			{
-				traceWriter.Close();
-				System.Diagnostics.Trace.Listeners.Remove( "NUnit" );
-			}
-
-			private void StartTracing()
-			{
-				System.Diagnostics.Trace.Listeners.Add( new TextWriterTraceListener( traceWriter, "NUnit" ) );
-			}
-
-			public string CurrentDirectory
-			{
-				get { return currentDirectory; }
-				set
-				{
-					currentDirectory = value;
-					Environment.CurrentDirectory = currentDirectory;
-				}
-			}
-
-			public CultureInfo CurrentCulture
-			{
-				get { return currentCulture; }
-				set
-				{
-					currentCulture = value;
-					Thread.CurrentThread.CurrentCulture = currentCulture;
-				}
-			}
-		}
-		#endregion
-	}
-}
diff --git a/src/NUnitCore/core/TestDecoratorAttribute.cs b/src/NUnitCore/core/TestDecoratorAttribute.cs
index b05c76f..1883e82 100644
--- a/src/NUnitCore/core/TestDecoratorAttribute.cs
+++ b/src/NUnitCore/core/TestDecoratorAttribute.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 using System;
 
diff --git a/src/NUnitCore/core/TestExecutionContext.cs b/src/NUnitCore/core/TestExecutionContext.cs
new file mode 100644
index 0000000..11b3b8f
--- /dev/null
+++ b/src/NUnitCore/core/TestExecutionContext.cs
@@ -0,0 +1,423 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+using System;
+using System.Collections.Specialized;
+using System.Configuration;
+using System.IO;
+using System.Diagnostics;
+using System.Globalization;
+using System.Security.Principal;
+using System.Threading;
+
+namespace NUnit.Core
+{
+	/// <summary>
+	/// Helper class used to save and restore certain static or
+	/// singleton settings in the environment that affect tests 
+	/// or which might be changed by the user tests.
+	/// 
+	/// An internal class is used to hold settings and a stack
+	/// of these objects is pushed and popped as Save and Restore
+	/// are called.
+	/// 
+	/// Static methods for each setting forward to the internal 
+	/// object on the top of the stack.
+	/// </summary>
+	public class TestExecutionContext
+	{
+		#region Static Fields
+		/// <summary>
+		/// The current context, head of the list of saved contexts.
+		/// </summary>
+        private static TestExecutionContext current = new TestExecutionContext();
+        #endregion
+
+        #region Instance Fields
+
+        /// <summary>
+        /// Indicates whether trace is enabled
+        /// </summary>
+        private bool tracing;
+
+        /// <summary>
+        /// Indicates whether logging is enabled
+        /// </summary>
+        private bool logging;
+
+        /// <summary>
+        /// Destination for standard output
+        /// </summary>
+        private TextWriter outWriter;
+
+        /// <summary>
+        /// Destination for standard error
+        /// </summary>
+        private TextWriter errorWriter;
+
+        /// <summary>
+        /// Destination for Trace output
+        /// </summary>
+        private TextWriter traceWriter;
+
+        /// <summary>
+        /// Default timeout for test cases
+        /// </summary>
+        private int testCaseTimeout;
+
+        private Log4NetCapture logCapture;
+
+        /// <summary>
+        /// The current working directory
+        /// </summary>
+        private string currentDirectory;
+
+        /// <summary>
+        /// The current culture
+        /// </summary>
+        private CultureInfo currentCulture;
+
+        /// <summary>
+        /// The current UI culture
+        /// </summary>
+        private CultureInfo currentUICulture;
+
+        /// <summary>
+        /// The current Principal.
+        /// </summary>
+        private IPrincipal currentPrincipal;
+
+        /// <summary>
+        /// The currently executing test
+        /// </summary>
+        private Test currentTest;
+
+        /// <summary>
+        /// The active TestResult for the current test
+        /// </summary>
+        private TestResult currentResult;
+
+        /// <summary>
+        /// Link to a prior saved context
+        /// </summary>
+        public TestExecutionContext prior;
+
+        #endregion
+
+        #region Constructors
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="TestExecutionContext"/> class.
+        /// </summary>
+        public TestExecutionContext()
+        {
+            this.prior = null;
+            this.tracing = false;
+            this.logging = false;
+            this.outWriter = Console.Out;
+            this.errorWriter = Console.Error;
+            this.traceWriter = null;
+            this.logCapture = new Log4NetCapture();
+            this.testCaseTimeout = 0;
+
+            this.currentDirectory = Environment.CurrentDirectory;
+            this.currentCulture = CultureInfo.CurrentCulture;
+            this.currentUICulture = CultureInfo.CurrentUICulture;
+            this.currentPrincipal = Thread.CurrentPrincipal;
+        }
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="TestExecutionContext"/> class.
+        /// </summary>
+        /// <param name="other">An existing instance of TestExecutionContext.</param>
+        public TestExecutionContext(TestExecutionContext other)
+        {
+            this.prior = other;
+            this.tracing = other.tracing;
+            this.logging = other.logging;
+            this.outWriter = other.outWriter;
+            this.errorWriter = other.errorWriter;
+            this.traceWriter = other.traceWriter;
+            this.logCapture = other.logCapture;
+            this.testCaseTimeout = other.testCaseTimeout;
+
+            this.currentTest = other.currentTest;
+            this.currentResult = other.currentResult;
+
+            this.currentDirectory = Environment.CurrentDirectory;
+            this.currentCulture = CultureInfo.CurrentCulture;
+            this.currentUICulture = CultureInfo.CurrentUICulture;
+            this.currentPrincipal = Thread.CurrentPrincipal;
+        }
+
+        #endregion
+
+        #region Static Singleton Instance
+
+        /// <summary>
+        /// Gets the current context.
+        /// </summary>
+        /// <value>The current context.</value>
+        public static TestExecutionContext CurrentContext
+        {
+            get { return current; }
+        }
+
+        #endregion
+
+        #region Properties
+
+        /// <summary>
+        /// Controls whether trace and debug output are written
+        /// to the standard output.
+        /// </summary>
+        public bool Tracing
+        {
+            get { return tracing; }
+            set
+            {
+                if (tracing != value)
+                {
+                    if (traceWriter != null && tracing)
+                        StopTracing();
+
+                    tracing = value;
+
+                    if (traceWriter != null && tracing)
+                        StartTracing();
+                }
+            }
+        }
+
+        /// <summary>
+        /// Controls whether log output is captured
+        /// </summary>
+        public bool Logging
+        {
+            get { return logCapture.Enabled; }
+            set { logCapture.Enabled = value; }
+        }
+
+        /// <summary>
+        /// Controls where Console.Out is directed
+        /// </summary>
+        public TextWriter Out
+        {
+            get { return outWriter; }
+            set
+            {
+                if (outWriter != value)
+                {
+                    outWriter = value;
+                    Console.Out.Flush();
+                    Console.SetOut(outWriter);
+                }
+            }
+        }
+
+        /// <summary>
+        /// Controls where Console.Error is directed
+        /// </summary>
+        public TextWriter Error
+        {
+            get { return errorWriter; }
+            set
+            {
+                if (errorWriter != value)
+                {
+                    errorWriter = value;
+                    Console.Error.Flush();
+                    Console.SetError(errorWriter);
+                }
+            }
+        }
+
+        /// <summary>
+        /// Controls where Trace output is directed
+        /// </summary>
+        public TextWriter TraceWriter
+        {
+            get { return traceWriter; }
+            set
+            {
+                if (traceWriter != value)
+                {
+                    if (traceWriter != null && tracing)
+                        StopTracing();
+
+                    traceWriter = value;
+
+                    if (traceWriter != null && tracing)
+                        StartTracing();
+                }
+            }
+        }
+
+        /// <summary>
+        ///  Gets or sets the Log writer, which is actually held by a log4net 
+        ///  TextWriterAppender. When first set, the appender will be created
+        ///  and will thereafter send any log events to the writer.
+        ///  
+        ///  In normal operation, LogWriter is set to an EventListenerTextWriter
+        ///  connected to the EventQueue in the test domain. The events are
+        ///  subsequently captured in the Gui an the output displayed in
+        ///  the Log tab. The application under test does not need to define
+        ///  any additional appenders.
+        /// </summary>
+        public TextWriter LogWriter
+        {
+            get { return logCapture.Writer; }
+            set { logCapture.Writer = value; }
+        }
+
+        private void StopTracing()
+        {
+            traceWriter.Close();
+            System.Diagnostics.Trace.Listeners.Remove("NUnit");
+        }
+
+        private void StartTracing()
+        {
+            System.Diagnostics.Trace.Listeners.Add(new TextWriterTraceListener(traceWriter, "NUnit"));
+        }
+
+        /// <summary>
+        /// Saves and restores the CurrentDirectory
+        /// </summary>
+        public string CurrentDirectory
+        {
+            get { return currentDirectory; }
+            set
+            {
+                currentDirectory = value;
+                Environment.CurrentDirectory = currentDirectory;
+            }
+        }
+
+        /// <summary>
+        /// Saves or restores the CurrentCulture
+        /// </summary>
+        public CultureInfo CurrentCulture
+        {
+            get { return currentCulture; }
+            set
+            {
+                currentCulture = value;
+                Thread.CurrentThread.CurrentCulture = currentCulture;
+            }
+        }
+
+        /// <summary>
+        /// Saves or restores the CurrentUICulture
+        /// </summary>
+        public CultureInfo CurrentUICulture
+        {
+            get { return currentUICulture; }
+            set
+            {
+                currentUICulture = value;
+                Thread.CurrentThread.CurrentUICulture = currentUICulture;
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the current <see cref="IPrincipal"/> for the Thread.
+        /// </summary>
+        public IPrincipal CurrentPrincipal
+        {
+            get { return this.currentPrincipal; }
+            set
+            {
+                this.currentPrincipal = value;
+                Thread.CurrentPrincipal = this.currentPrincipal;
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the test case timeout vaue
+        /// </summary>
+        public int TestCaseTimeout
+        {
+            get { return testCaseTimeout; }
+            set { testCaseTimeout = value; }
+        }
+
+        /// <summary>
+        /// Gets or sets the current test
+        /// </summary>
+        public Test CurrentTest
+        {
+            get { return currentTest; }
+            set { currentTest = value; }
+        }
+
+        /// <summary>
+        /// Gets or sets the current test result
+        /// </summary>
+        public TestResult CurrentResult
+        {
+            get { return currentResult; }
+            set { currentResult = value; }
+        }
+
+        #endregion
+
+        #region Static Methods
+
+        /// <summary>
+        /// Saves the old context and makes a fresh one 
+        /// current without changing any settings.
+        /// </summary>
+        public static void Save()
+        {
+            TestExecutionContext.current = new TestExecutionContext(current);
+        }
+
+        /// <summary>
+        /// Restores the last saved context and puts
+        /// any saved settings back into effect.
+        /// </summary>
+        public static void Restore()
+        {
+            current.ReverseChanges();
+            current = current.prior;
+        }
+        #endregion
+
+        #region Instance Methods
+
+        /// <summary>
+        /// Used to restore settings to their prior
+        /// values before reverting to a prior context.
+        /// </summary>
+        public void ReverseChanges()
+        {
+            if (prior == null)
+                throw new InvalidOperationException("TestContext: too many Restores");
+
+            this.Tracing = prior.Tracing;
+            this.Out = prior.Out;
+            this.Error = prior.Error;
+            this.CurrentDirectory = prior.CurrentDirectory;
+            this.CurrentCulture = prior.CurrentCulture;
+            this.CurrentUICulture = prior.CurrentUICulture;
+            this.TestCaseTimeout = prior.TestCaseTimeout;
+            this.CurrentPrincipal = prior.CurrentPrincipal;
+        }
+
+        /// <summary>
+        /// Record any changed values in the current context
+        /// </summary>
+        public void Update()
+        {
+            this.currentDirectory = Environment.CurrentDirectory;
+            this.currentCulture = CultureInfo.CurrentCulture;
+            this.currentUICulture = CultureInfo.CurrentUICulture;
+            this.currentPrincipal = System.Threading.Thread.CurrentPrincipal;
+        }
+
+        #endregion
+	}
+}
diff --git a/src/NUnitCore/core/TestFixture.cs b/src/NUnitCore/core/TestFixture.cs
index e30d1a5..219b072 100644
--- a/src/NUnitCore/core/TestFixture.cs
+++ b/src/NUnitCore/core/TestFixture.cs
@@ -1,11 +1,10 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
-using System.IO;
 
 namespace NUnit.Core
 {
@@ -16,21 +15,26 @@ namespace NUnit.Core
 	public class TestFixture : TestSuite
 	{
 		#region Constructors
-		public TestFixture( Type fixtureType )
-			: base( fixtureType ) { }
-		#endregion
-
-		#region Properties
-		public override string TestType
-		{
-			get	{ return "Test Fixture"; }
-		}
-		#endregion
+        public TestFixture(Type fixtureType)
+            : base(fixtureType) { }
+        public TestFixture(Type fixtureType, object[] arguments)
+            : base(fixtureType, arguments) { }
+        #endregion
 
 		#region TestSuite Overrides
+
+        /// <summary>
+        /// Gets a string representing the kind of test
+        /// that this object represents, for use in display.
+        /// </summary>
+        public override string TestType
+        {
+            get { return "TestFixture"; }
+        }
+
         public override TestResult Run(EventListener listener, ITestFilter filter)
         {
-            using ( new DirectorySwapper( Path.GetDirectoryName( TestFixtureBuilder.GetAssemblyPath( FixtureType ) ) ) )
+            using ( new DirectorySwapper( AssemblyHelper.GetDirectoryName( FixtureType.Assembly ) ) )
             {
                 return base.Run(listener, filter);
             }
diff --git a/src/NUnitCore/core/TestFixtureBuilder.cs b/src/NUnitCore/core/TestFixtureBuilder.cs
index 79bfc9c..2bf2428 100644
--- a/src/NUnitCore/core/TestFixtureBuilder.cs
+++ b/src/NUnitCore/core/TestFixtureBuilder.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -44,36 +44,21 @@ namespace NUnit.Core
 		public static Test BuildFrom( object fixture )
 		{
 			Test suite = BuildFrom( fixture.GetType() );
+			
 			if( suite != null)
+			{
 				suite.Fixture = fixture;
-			return suite;
-		}
-
-		public static string GetAssemblyPath( Type fixtureType )
-		{
-			return GetAssemblyPath( fixtureType.Assembly );
-		}
-
-		// TODO: This logic should be in shared source
-		public static string GetAssemblyPath( Assembly assembly )
-		{
-			string path = assembly.CodeBase;
-			Uri uri = new Uri( path );
+				
+				// TODO: Integrate building from an object as part of NUnitTestFixtureBuilder
+				if (suite.RunState == RunState.NotRunnable &&
+					Reflect.GetConstructor(fixture.GetType()) == null)
+				{
+					suite.RunState = RunState.Runnable;
+					suite.IgnoreReason = null;
+				}
+			}
 			
-			// If it wasn't loaded locally, use the Location
-			if ( !uri.IsFile )
-				return assembly.Location;
-
-			if ( uri.IsUnc )
-				return path.Substring( Uri.UriSchemeFile.Length+1 );
-
-
-			int start = Uri.UriSchemeFile.Length + Uri.SchemeDelimiter.Length;
-			
-			if ( path[start] == '/' && path[start+2] == ':' )
-				++start;
-
-			return path.Substring( start );
+			return suite;
 		}
 
 		/// <summary>
diff --git a/src/NUnitCore/core/TestMethod.cs b/src/NUnitCore/core/TestMethod.cs
index 03a7da5..9036a7e 100644
--- a/src/NUnitCore/core/TestMethod.cs
+++ b/src/NUnitCore/core/TestMethod.cs
@@ -1,176 +1,290 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 namespace NUnit.Core
 {
 	using System;
+    using System.Collections;
+    using System.Runtime.Remoting.Messaging;
+    using System.Threading;
 	using System.Text;
 	using System.Text.RegularExpressions;
 	using System.Reflection;
 
 	/// <summary>
-	/// The TestMethod class represents a TestCase implemented as a method
-	/// call on a fixture object. At the moment, this is the only way we 
-	/// implement a TestCase, but others are expected in the future.
+	/// The TestMethod class represents a Test implemented as a method.
 	/// 
 	/// Because of how exceptions are handled internally, this class
 	/// must incorporate processing of expected exceptions. A change to
-	/// the TestCase interface might make it easier to process exceptions
+	/// the Test interface might make it easier to process exceptions
 	/// in an object that aggregates a TestMethod in the future.
 	/// </summary>
-	public abstract class TestMethod : TestCase
+	public abstract class TestMethod : Test
 	{
+        static Logger log = InternalTrace.GetLogger(typeof(TestMethod));
+        
+        static ContextDictionary context;
+
 		#region Fields
 		/// <summary>
 		/// The test method
 		/// </summary>
-		private MethodInfo method;
+		internal MethodInfo method;
 
 		/// <summary>
 		/// The SetUp method.
 		/// </summary>
-		protected MethodInfo setUpMethod;
+		protected MethodInfo[] setUpMethods;
 
 		/// <summary>
 		/// The teardown method
 		/// </summary>
-		protected MethodInfo tearDownMethod;
+		protected MethodInfo[] tearDownMethods;
 
-		/// <summary>
-		/// The exception handler method
-		/// </summary>
-		internal MethodInfo exceptionHandler;
+        /// <summary>
+        /// The ExpectedExceptionProcessor for this test, if any
+        /// </summary>
+        internal ExpectedExceptionProcessor exceptionProcessor;
 
-		/// <summary>
-		/// True if an exception is expected
-		/// </summary>
-		internal bool exceptionExpected;
+        /// <summary>
+        /// Arguments to be used in invoking the method
+        /// </summary>
+	    internal object[] arguments;
 
-		/// <summary>
-		/// The type of any expected exception
-		/// </summary>
-		internal Type expectedExceptionType;
-        
-		/// <summary>
-		/// The full name of any expected exception type
-		/// </summary>
-		internal string expectedExceptionName;
-        
-		/// <summary>
-		/// The value of any message associated with an expected exception
-		/// </summary>
-		internal string expectedMessage;
-        
-		/// <summary>
-		/// A string indicating how to match the expected message
-		/// </summary>
-		internal string matchType;
+        /// <summary>
+        /// The expected result of the method return value
+        /// </summary>
+	    internal object expectedResult;
 
-		/// <summary>
-		/// A string containing any user message specified for the expected exception
-		/// </summary>
-		internal string userMessage;
+        /// <summary>
+        /// Indicates whether expectedResult was set - thereby allowing null as a value
+        /// </summary>
+        internal bool hasExpectedResult;
+
+        /// <summary>
+        /// The fixture object, if it has been created
+        /// </summary>
+        private object fixture;
+
+        private Exception builderException;
 
 		#endregion
 
 		#region Constructors
 		public TestMethod( MethodInfo method ) 
-			: base( method ) 
+			: base( method.ReflectedType.FullName, method.Name ) 
 		{
-			this.method = method;
+            if( method.DeclaringType != method.ReflectedType)
+                this.TestName.Name = method.DeclaringType.Name + "." + method.Name;
+
+            this.method = method;
 		}
 		#endregion
 
+        #region Static Properties
+	    private static ContextDictionary Context
+	    {
+	        get
+	        {
+	            if (context==null)
+	            {
+	                context = new ContextDictionary();
+	            }
+	            return context;
+	        }
+	    }
+        #endregion
+
 		#region Properties
+
+        public override string TestType
+        {
+            get { return "TestMethod"; }
+        }
+
 		public MethodInfo Method
 		{
 			get { return method; }
 		}
 
-		public bool ExceptionExpected
-		{
-			get { return exceptionExpected; }
-			set { exceptionExpected = value; }
-		}
+        public override Type FixtureType
+        {
+            get { return method.ReflectedType; }
+        }
 
-		public MethodInfo ExceptionHandler
-		{
-			get { return exceptionHandler; }
-			set { exceptionHandler = value; }
-		}
+        public ExpectedExceptionProcessor ExceptionProcessor
+        {
+            get { return exceptionProcessor; }
+            set { exceptionProcessor = value; }
+        }
 
-		public Type ExpectedExceptionType
+		public bool ExceptionExpected
 		{
-			get { return expectedExceptionType; }
-			set 
-			{ 
-				expectedExceptionType = value;
-				expectedExceptionName = expectedExceptionType != null
-					? expectedExceptionType.FullName
-					: null;
-			}
+            get { return exceptionProcessor != null; }
 		}
 
-		public string ExpectedExceptionName
+        public override object Fixture
+        {
+            get { return fixture; }
+            set { fixture = value; }
+        }
+
+        public int Timeout
+        {
+            get
+            {
+                return Properties.Contains("Timeout")
+                    ? (int)Properties["Timeout"]
+                    : TestExecutionContext.CurrentContext.TestCaseTimeout;
+            }
+        }
+		
+		protected override bool ShouldRunOnOwnThread 
 		{
-			get { return expectedExceptionName; }
-			set
+			get 
 			{
-				expectedExceptionType = null;
-				expectedExceptionName = value;
+                return base.ShouldRunOnOwnThread || Timeout > 0;
 			}
 		}
 
-		public string ExpectedMessage
-		{
-			get { return expectedMessage; }
-			set { expectedMessage = value; }
-		}
+        public Exception BuilderException
+        {
+            get { return builderException; }
+            set { builderException = value; }
+        }
+        #endregion
 
-		public string MatchType
+		#region Run Methods
+        public override TestResult Run(EventListener listener, ITestFilter filter)
+        {
+            log.Debug("Test Starting: " + this.TestName.FullName);
+            listener.TestStarted(this.TestName);
+            long startTime = DateTime.Now.Ticks;
+
+            TestResult testResult = this.RunState == RunState.Runnable || this.RunState == RunState.Explicit
+				? RunTestInContext() : SkipTest();
+
+			log.Debug("Test result = " + testResult.ResultState);
+
+            long stopTime = DateTime.Now.Ticks;
+            double time = ((double)(stopTime - startTime)) / (double)TimeSpan.TicksPerSecond;
+            testResult.Time = time;
+
+            listener.TestFinished(testResult);
+            return testResult;
+        }
+		      
+		private TestResult SkipTest()
 		{
-			get { return matchType; }
-			set { matchType = value; }
+			TestResult testResult = new TestResult(this);
+			
+            switch (this.RunState)
+            {
+                case RunState.Skipped:
+                default:
+                    testResult.Skip(IgnoreReason);
+                    break;
+                case RunState.NotRunnable:
+                    if (BuilderException != null)
+                        testResult.Invalid(BuilderException);
+                    else
+                        testResult.Invalid(IgnoreReason);
+                    break;
+                case RunState.Ignored:
+                    testResult.Ignore(IgnoreReason);
+                    break;
+            }
+			
+			return testResult;
 		}
-
-		public string UserMessage
+		
+        private TestResult RunTestInContext()
 		{
-			get { return userMessage; }
-			set { userMessage = value; }
+			TestExecutionContext.Save();
+
+            TestExecutionContext.CurrentContext.CurrentTest = this;
+
+            ContextDictionary context = Context;
+            context._ec = TestExecutionContext.CurrentContext;
+
+            CallContext.SetData("NUnit.Framework.TestContext", context);
+
+            if (this.Parent != null)
+            {
+                this.Fixture = this.Parent.Fixture;
+                TestSuite suite = this.Parent as TestSuite;
+                if (suite != null)
+                {
+                    this.setUpMethods = suite.GetSetUpMethods();
+                    this.tearDownMethods = suite.GetTearDownMethods();
+                }
+            }
+
+            try
+            {
+                // Temporary... to allow for tests that directly execute a test case
+                if (Fixture == null && !method.IsStatic)
+                    Fixture = Reflect.Construct(this.FixtureType);
+
+                if (this.Properties["_SETCULTURE"] != null)
+                    TestExecutionContext.CurrentContext.CurrentCulture =
+                        new System.Globalization.CultureInfo((string)Properties["_SETCULTURE"]);
+
+                if (this.Properties["_SETUICULTURE"] != null)
+                    TestExecutionContext.CurrentContext.CurrentUICulture =
+                        new System.Globalization.CultureInfo((string)Properties["_SETUICULTURE"]);
+
+				return RunRepeatedTest();
+            }
+            catch (Exception ex)
+            {
+				log.Debug("TestMethod: Caught " + ex.GetType().Name);
+				
+                if (ex is ThreadAbortException)
+                    Thread.ResetAbort();
+
+				TestResult testResult = new TestResult(this);
+                RecordException(ex, testResult, FailureSite.Test);
+				
+				return testResult;
+            }
+            finally
+            {
+                Fixture = null;
+
+                CallContext.FreeNamedDataSlot("NUnit.Framework.TestContext");
+                TestExecutionContext.Restore();
+            }
 		}
-		#endregion
-
-		#region Run Methods
-		public override void Run(TestCaseResult testResult)
-		{ 
-			try
-			{
-				if ( this.Parent != null)
-					Fixture = this.Parent.Fixture;
-
-				if (!testResult.IsFailure)
-				{
-					// Temporary... to allow for tests that directly execute a test case
-					if (Fixture == null)
-						Fixture = Reflect.Construct(this.FixtureType);
-
-                    if (this.Properties["_SETCULTURE"] != null)
-                        TestContext.CurrentCulture =
-                            new System.Globalization.CultureInfo((string)Properties["_SETCULTURE"]);
-                    
-                    doRun(testResult);
-				}
-			}
-			catch (Exception ex)
-			{
-				if (ex is NUnitException)
-					ex = ex.InnerException;
-
-				RecordException(ex, testResult);
-			}
+		
+		// TODO: Repeated tests need to be implemented as separate tests
+		// in the tree of tests. Once that is done, this method will no
+		// longer be needed and RunTest can be called directly.
+		private TestResult RunRepeatedTest()
+		{
+			TestResult testResult = null;
+			
+			int repeatCount = this.Properties.Contains("Repeat")
+				? (int)this.Properties["Repeat"] : 1;
+			
+            while (repeatCount-- > 0)
+            {
+                testResult = ShouldRunOnOwnThread
+                    ? new TestMethodThread(this).Run(NullListener.NULL, TestFilter.Empty)
+                    : RunTest();
+
+                if (testResult.ResultState == ResultState.Failure ||
+                    testResult.ResultState == ResultState.Error ||
+                    testResult.ResultState == ResultState.Cancelled)
+                {
+                    break;
+                }
+            }
+			
+			return testResult;
 		}
 
 		/// <summary>
@@ -179,43 +293,84 @@ namespace NUnit.Core
 		/// TestFixtureSetUp and TestFixtureTearDown needed.
 		/// </summary>
 		/// <param name="testResult">The result in which to record success or failure</param>
-		public virtual void doRun( TestCaseResult testResult )
+		public virtual TestResult RunTest()
 		{
 			DateTime start = DateTime.Now;
 
+			TestResult testResult = new TestResult(this);
+			TestExecutionContext.CurrentContext.CurrentResult =  testResult;
+			
 			try 
 			{
-				if ( setUpMethod != null )
-					Reflect.InvokeMethod( setUpMethod, this.Fixture );
+                RunSetUp();
 
-				doTestCase( testResult );
+				RunTestCase( testResult );
 			}
 			catch(Exception ex)
 			{
-				if ( ex is NUnitException )
-					ex = ex.InnerException;
+                // doTestCase handles its own exceptions so
+                // if we're here it's a setup exception
+                if (ex is ThreadAbortException)
+                    Thread.ResetAbort();
 
-				RecordException( ex, testResult );
+                RecordException(ex, testResult, FailureSite.SetUp);
 			}
 			finally 
 			{
-				doTearDown( testResult );
+				RunTearDown( testResult );
 
 				DateTime stop = DateTime.Now;
 				TimeSpan span = stop.Subtract(start);
 				testResult.Time = (double)span.Ticks / (double)TimeSpan.TicksPerSecond;
+
+                if (testResult.IsSuccess)
+				{
+					if (this.Properties.Contains("MaxTime"))
+                	{
+                    int elapsedTime = (int)Math.Round(testResult.Time * 1000.0);
+                    int maxTime = (int)this.Properties["MaxTime"];
+
+                    if (maxTime > 0 && elapsedTime > maxTime)
+                        testResult.Failure(
+                            string.Format("Elapsed time of {0}ms exceeds maximum of {1}ms",
+                                elapsedTime, maxTime),
+                            null);
+					}
+					
+					if (testResult.IsSuccess && testResult.Message == null && 
+					    Environment.CurrentDirectory != TestExecutionContext.CurrentContext.prior.CurrentDirectory)
+					{
+						// TODO: Introduce a warning result state in NUnit 3.0
+						testResult.SetResult(ResultState.Success, "Warning: Test changed the CurrentDirectory", null);
+					}
+				}
 			}
+			
+			log.Debug("Test result = " + testResult.ResultState);
+				
+			return testResult;
 		}
 		#endregion
 
 		#region Invoke Methods by Reflection, Recording Errors
 
-		private void doTearDown( TestCaseResult testResult )
+        private void RunSetUp()
+        {
+            if (setUpMethods != null)
+                foreach( MethodInfo setUpMethod in setUpMethods )
+                    Reflect.InvokeMethod(setUpMethod, setUpMethod.IsStatic ? null : this.Fixture);
+        }
+
+		private void RunTearDown( TestResult testResult )
 		{
 			try
 			{
-				if ( tearDownMethod != null )
-					tearDownMethod.Invoke( this.Fixture, new object[0] );
+                if (tearDownMethods != null)
+                {
+                    int index = tearDownMethods.Length;
+                    while (--index >= 0)
+                        Reflect.InvokeMethod(tearDownMethods[index], tearDownMethods[index].IsStatic ? null : this.Fixture);
+                }
 			}
 			catch(Exception ex)
 			{
@@ -226,172 +381,83 @@ namespace NUnit.Core
 			}
 		}
 
-		private void doTestCase( TestCaseResult testResult )
+		private void RunTestCase( TestResult testResult )
 		{
-			try
-			{
-				RunTestMethod(testResult);
-				ProcessNoException(testResult);
-			}
-			catch( Exception ex )
-			{
-				if ( ex is NUnitException )
-					ex = ex.InnerException;
-
-				if ( IsIgnoreException( ex ) )
-					testResult.Ignore( ex );
-				else
-					ProcessException(ex, testResult);
-			}
+            try
+            {
+                RunTestMethod(testResult);
+                if (testResult.IsSuccess && exceptionProcessor != null)
+                    exceptionProcessor.ProcessNoException(testResult);
+            }
+            catch (Exception ex)
+            {
+                if (ex is ThreadAbortException)
+                    Thread.ResetAbort();
+
+                if (exceptionProcessor == null)
+                    RecordException(ex, testResult, FailureSite.Test);
+                else
+                    exceptionProcessor.ProcessException(ex, testResult);
+            }
 		}
 
-		public virtual void RunTestMethod(TestCaseResult testResult)
+		private void RunTestMethod(TestResult testResult)
 		{
-			Reflect.InvokeMethod( this.method, this.Fixture );
-		}
+		    object fixture = this.method.IsStatic ? null : this.Fixture;
 
-		#endregion
+			object result = Reflect.InvokeMethod( this.method, fixture, this.arguments );
 
-		#region Record Info About An Exception
+            if (this.hasExpectedResult)
+                NUnitFramework.Assert.AreEqual(expectedResult, result);
 
-		protected void RecordException( Exception ex, TestResult testResult )
-		{
-			if ( IsIgnoreException( ex ) )
-				testResult.Ignore( ex.Message );
-			else if ( IsAssertException( ex ) )
-				testResult.Failure( ex.Message, ex.StackTrace );
-			else	
-				testResult.Error( ex );
-		}
-
-		protected string GetStackTrace(Exception exception)
-		{
-			try
-			{
-				return exception.StackTrace;
-			}
-			catch( Exception )
-			{
-				return "No stack trace available";
-			}
-		}
+            testResult.Success();
+        }
 
 		#endregion
 
-		#region Exception Processing
-		protected internal virtual void ProcessNoException(TestCaseResult testResult)
-		{
-			if ( ExceptionExpected )
-				testResult.Failure(NoExceptionMessage(), null);
-			else
-				testResult.Success();
-		}
-		
-		protected internal virtual void ProcessException(Exception exception, TestCaseResult testResult)
+		#region Record Info About An Exception
+		protected virtual void RecordException( Exception exception, TestResult testResult, FailureSite failureSite )
 		{
-			if (!ExceptionExpected)
-			{
-				RecordException(exception, testResult); 
-				return;
-			}
-
-			if (IsExpectedExceptionType(exception))
-			{
-				if (IsExpectedMessageMatch(exception))
-				{
-					if ( exceptionHandler != null )
-						Reflect.InvokeMethod( exceptionHandler, this.Fixture, exception );
+            if (exception is NUnitException)
+                exception = exception.InnerException;
 
-					testResult.Success();
-				}
-				else
-				{
-					testResult.Failure(WrongTextMessage(exception), GetStackTrace(exception));
-				}
-			}
-			else if (IsAssertException(exception))
-			{
-				testResult.Failure(exception.Message, exception.StackTrace);
-			}
-			else
-			{
-				testResult.Failure(WrongTypeMessage(exception), GetStackTrace(exception));
-			}
+            testResult.SetResult(NUnitFramework.GetResultState(exception), exception, failureSite);
 		}
 		#endregion
 
-		#region Abstract Methods
-		protected abstract bool IsAssertException(Exception ex);
-
-		protected abstract bool IsIgnoreException(Exception ex);
-		#endregion
-
-		#region Helper Methods
-		protected bool IsExpectedExceptionType(Exception exception)
-		{
-			return expectedExceptionName == null || expectedExceptionName.Equals(exception.GetType().FullName);
-		}
-
-		protected bool IsExpectedMessageMatch(Exception exception)
-		{
-			if (expectedMessage == null)
-				return true;
-
-			switch (matchType)
-			{
-				case "Exact":
-				default:
-					return expectedMessage.Equals(exception.Message);
-				case "Contains":
-					return exception.Message.IndexOf(expectedMessage) >= 0;
-				case "Regex":
-					return Regex.IsMatch(exception.Message, expectedMessage);
-			}
-		}
-
-		protected string NoExceptionMessage()
-		{
-			string expectedType = expectedExceptionName == null ? "An Exception" : expectedExceptionName;
-			return CombineWithUserMessage( expectedType + " was expected" );
-		}
-
-		protected string WrongTypeMessage(Exception exception)
-		{
-			return CombineWithUserMessage(
-				"An unexpected exception type was thrown" + Environment.NewLine +
-				"Expected: " + expectedExceptionName + Environment.NewLine +
-				" but was: " + exception.GetType().FullName + " : " + exception.Message );
-		}
-
-		protected string WrongTextMessage(Exception exception)
-		{
-			string expectedText;
-			switch (matchType)
-			{
-				default:
-				case "Exact":
-					expectedText = "Expected: ";
-					break;
-				case "Contains":
-					expectedText = "Expected message containing: ";
-					break;
-				case "Regex":
-					expectedText = "Expected message matching: ";
-					break;
-			}
-
-			return CombineWithUserMessage(
-				"The exception message text was incorrect" + Environment.NewLine +
-				expectedText + expectedMessage + Environment.NewLine +
-				" but was: " + exception.Message );
-		}
-
-		private string CombineWithUserMessage( string message )
-		{
-			if ( userMessage == null )
-				return message;
-			return userMessage + Environment.NewLine + message;
-		}
+        #region Inner Classes
+        public class ContextDictionary : Hashtable
+        {
+            internal TestExecutionContext _ec;
+
+            public override object this[object key]
+            {
+                get
+                {
+                    // Get Result values dynamically, since
+                    // they may change as execution proceeds
+                    switch (key as string)
+                    {
+                        case "Test.Name":
+                            return _ec.CurrentTest.TestName.Name;
+                        case "Test.FullName":
+                            return _ec.CurrentTest.TestName.FullName;
+                        case "Test.Properties":
+                            return _ec.CurrentTest.Properties;
+                        case "Result.State":
+                            return (int)_ec.CurrentResult.ResultState;
+                        case "TestDirectory":
+                            return AssemblyHelper.GetDirectoryName(_ec.CurrentTest.FixtureType.Assembly);
+                        default:
+                            return base[key];
+                    }
+                }
+                set
+                {
+                    base[key] = value;
+                }
+            }
+        }
         #endregion
     }
 }
diff --git a/src/NUnitCore/core/TestRunnerThread.cs b/src/NUnitCore/core/TestRunnerThread.cs
index 6c4ebfa..c88bfdb 100644
--- a/src/NUnitCore/core/TestRunnerThread.cs
+++ b/src/NUnitCore/core/TestRunnerThread.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -31,11 +31,6 @@ namespace NUnit.Core
 		private Thread thread;
 
 		/// <summary>
-		/// Collection of TestRunner settings from the config file
-		/// </summary>
-		private NameValueCollection settings;
-
-		/// <summary>
 		/// The EventListener interface to receive test events
 		/// </summary>
 		private NUnit.Core.EventListener listener;
@@ -81,31 +76,13 @@ namespace NUnit.Core
 			this.thread = new Thread( new ThreadStart( TestRunnerThreadProc ) );
 			thread.IsBackground = true;
 			thread.Name = "TestRunnerThread";
-
-			this.settings = (NameValueCollection)
-				ConfigurationSettings.GetConfig( "NUnit/TestRunner" );
-	
-			if ( settings != null )
-			{
-				try
-				{
-					string apartment = settings["ApartmentState"];
-					if ( apartment != null )
-						thread.ApartmentState = (ApartmentState)
-							System.Enum.Parse( typeof( ApartmentState ), apartment, true );
-		
-					string priority = settings["ThreadPriority"];
-					if ( priority != null )
-						thread.Priority = (ThreadPriority)
-							System.Enum.Parse( typeof( ThreadPriority ), priority, true );
-				}
-				catch( ArgumentException ex )
-				{
-					string msg = string.Format( "Invalid configuration setting in {0}", 
-						AppDomain.CurrentDomain.SetupInformation.ConfigurationFile );
-					throw new ArgumentException( msg, ex );
-				}
-			}
+            thread.Priority = NUnitConfiguration.ThreadPriority;
+            if (NUnitConfiguration.ApartmentState != ApartmentState.Unknown)
+#if NET_2_0
+                thread.SetApartmentState(NUnitConfiguration.ApartmentState);
+#else
+                thread.ApartmentState = NUnitConfiguration.ApartmentState;
+#endif
 		}
 
 		#endregion
@@ -154,7 +131,8 @@ namespace NUnit.Core
             }
             catch (Exception ex)
             {
-                throw new ApplicationException("Exception in TestRunnerThread", ex);
+                if ( !(ex is ThreadAbortException) )
+                    throw new ApplicationException("Exception in TestRunnerThread", ex);
             }
 		}
 		#endregion
diff --git a/src/NUnitCore/core/TestSuite.cs b/src/NUnitCore/core/TestSuite.cs
index b6a68c2..98ad6a9 100644
--- a/src/NUnitCore/core/TestSuite.cs
+++ b/src/NUnitCore/core/TestSuite.cs
@@ -1,12 +1,14 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 namespace NUnit.Core
 {
 	using System;
+    using System.Text;
+    using System.Threading;
 	using System.Collections;
 	using System.Reflection;
 	using NUnit.Core.Filters;
@@ -19,22 +21,54 @@ namespace NUnit.Core
 	public class TestSuite : Test
 	{
 		#region Fields
+        static Logger log = InternalTrace.GetLogger(typeof(TestSuite));
+
 		/// <summary>
 		/// Our collection of child tests
 		/// </summary>
 		private ArrayList tests = new ArrayList();
 
-		/// <summary>
-		/// The fixture setup method for this suite
-		/// </summary>
-		protected MethodInfo fixtureSetUp;
+        /// <summary>
+        /// The fixture setup methods for this suite
+        /// </summary>
+        protected MethodInfo[] fixtureSetUpMethods;
 
-		/// <summary>
-		/// The fixture teardown method for this suite
-		/// </summary>
-		protected MethodInfo fixtureTearDown;
+        /// <summary>
+        /// The fixture teardown methods for this suite
+        /// </summary>
+        protected MethodInfo[] fixtureTearDownMethods;
 
-		#endregion
+        /// <summary>
+        /// The setup methods for this suite
+        /// </summary>
+        protected MethodInfo[] setUpMethods;
+
+        /// <summary>
+        /// The teardown methods for this suite
+        /// </summary>
+        protected MethodInfo[] tearDownMethods;
+
+        /// <summary>
+        /// Set to true to suppress sorting this suite's contents
+        /// </summary>
+        protected bool maintainTestOrder;
+
+        /// <summary>
+        /// Arguments for use in creating a parameterized fixture
+        /// </summary>
+        internal object[] arguments;
+
+        /// <summary>
+        /// The System.Type of the fixture for this test suite, if there is one
+        /// </summary>
+        private Type fixtureType;
+
+        /// <summary>
+        /// The fixture object, if it has been created
+        /// </summary>
+        private object fixture;
+
+        #endregion
 
 		#region Constructors
 		public TestSuite( string name ) 
@@ -43,21 +77,38 @@ namespace NUnit.Core
 		public TestSuite( string parentSuiteName, string name ) 
 			: base( parentSuiteName, name ) { }
 
-		public TestSuite( Type fixtureType )
-			: base( fixtureType ) { }
-		#endregion
+        public TestSuite(Type fixtureType)
+            : this(fixtureType, null) { }
+
+        public TestSuite(Type fixtureType, object[] arguments)
+            : base(fixtureType.FullName)
+        {
+            string name = TypeHelper.GetDisplayName(fixtureType, arguments);
+            this.TestName.Name = name;
+            
+            this.TestName.FullName = name;
+            string nspace = fixtureType.Namespace;
+            if (nspace != null && nspace != "")
+                this.TestName.FullName = nspace + "." + name;
+            this.fixtureType = fixtureType;
+            this.arguments = arguments;
+        }
+        #endregion
 
 		#region Public Methods
 		public void Sort()
 		{
-			this.tests.Sort();
+            if (!maintainTestOrder)
+            {
+                this.tests.Sort();
 
-			foreach( Test test in Tests )
-			{
-				TestSuite suite = test as TestSuite;
-				if ( suite != null )
-					suite.Sort();
-			}		
+                foreach (Test test in Tests)
+                {
+                    TestSuite suite = test as TestSuite;
+                    if (suite != null)
+                        suite.Sort();
+                }
+            }
 		}
 
 		public void Sort(IComparer comparer)
@@ -115,13 +166,35 @@ namespace NUnit.Core
 				return count;
 			}
 		}
-		#endregion
+
+        public override Type FixtureType
+        {
+            get { return fixtureType; }
+        }
+
+        public override object Fixture
+        {
+            get { return fixture; }
+            set { fixture = value; }
+        }
+
+        public MethodInfo[] GetSetUpMethods()
+        {
+            return setUpMethods;
+        }
+
+        public MethodInfo[] GetTearDownMethods()
+        {
+            return tearDownMethods;
+        }
+        #endregion
 
 		#region Test Overrides
-		public override string TestType
-		{
-			get	{ return "Test Suite"; }
-		}
+
+        public override string TestType
+        {
+            get { return "TestSuite"; }
+        }
 
 		public override int CountTestCases(ITestFilter filter)
 		{
@@ -137,62 +210,97 @@ namespace NUnit.Core
 			return count;
 		}
 
-		public override TestResult Run(EventListener listener)
+		public override TestResult Run(EventListener listener, ITestFilter filter)
 		{
-			return Run( listener, TestFilter.Empty );
+            listener.SuiteStarted(this.TestName);
+            long startTime = DateTime.Now.Ticks;
+
+			TestResult suiteResult = this.RunState == RunState.Runnable || this.RunState == RunState.Explicit
+				? RunSuiteInContext(listener, filter)
+				: SkipSuite(listener, filter);
+			
+            long stopTime = DateTime.Now.Ticks;
+            double time = ((double)(stopTime - startTime)) / (double)TimeSpan.TicksPerSecond;
+            suiteResult.Time = time;
+
+            listener.SuiteFinished(suiteResult);
+            return suiteResult;
 		}
+		
+		private TestResult SkipSuite(EventListener listener, ITestFilter filter)
+		{
+			TestResult suiteResult = new TestResult(this);
+			
+            switch (this.RunState)
+            {
+                default:
+                case RunState.Skipped:
+                    SkipAllTests(suiteResult, listener, filter);
+                    break;
+                case RunState.NotRunnable:
+                    MarkAllTestsInvalid(suiteResult, listener, filter);
+                    break;
+                case RunState.Ignored:
+                    IgnoreAllTests(suiteResult, listener, filter);
+                    break;
+            }
 
-		public override TestResult Run(EventListener listener, ITestFilter filter)
+			return suiteResult;
+		}
+
+		private TestResult RunSuiteInContext(EventListener listener, ITestFilter filter)
 		{
-			using( new TestContext() )
-			{
-				TestSuiteResult suiteResult = new TestSuiteResult( new TestInfo(this), TestName.Name);
+            TestExecutionContext.Save();
 
-				listener.SuiteStarted( this.TestName );
-				long startTime = DateTime.Now.Ticks;
+            try
+            {
+				return ShouldRunOnOwnThread
+	                ? new TestSuiteThread(this).Run(listener, filter)
+	                : RunSuite(listener, filter);
+            }
+            finally
+            {
+                TestExecutionContext.Restore();
+            }
+		}
 
-				switch (this.RunState)
-				{
-					case RunState.Runnable:
-					case RunState.Explicit:
-						suiteResult.RunState = RunState.Executed;
-						DoOneTimeSetUp(suiteResult);
-						if ( suiteResult.IsFailure )
-							MarkTestsFailed(Tests, suiteResult, listener, filter);
-						else
-						{
-							try
-							{
-								RunAllTests(suiteResult, listener, filter);
-							}
-							finally
-							{
-								DoOneTimeTearDown(suiteResult);
-							}
-						}
-						break;
-
-					case RunState.Skipped:
-						suiteResult.Skip(this.IgnoreReason);
-						MarkTestsNotRun(Tests, RunState.Skipped, IgnoreReason, suiteResult, listener, filter);
-						break;
-
-					default:
-					case RunState.Ignored:
-					case RunState.NotRunnable:
-						suiteResult.Ignore(this.IgnoreReason);
-						MarkTestsNotRun(Tests, RunState.Ignored, IgnoreReason, suiteResult, listener, filter);
-						break;
-				}
+        public TestResult RunSuite(EventListener listener, ITestFilter filter)
+        {
+			TestResult suiteResult = new TestResult(this);
+			
+            DoOneTimeSetUp(suiteResult);
 
-				long stopTime = DateTime.Now.Ticks;
-				double time = ((double)(stopTime - startTime)) / (double)TimeSpan.TicksPerSecond;
-				suiteResult.Time = time;
+            if (this.Properties["_SETCULTURE"] != null)
+                TestExecutionContext.CurrentContext.CurrentCulture =
+                    new System.Globalization.CultureInfo((string)Properties["_SETCULTURE"]);
 
-				listener.SuiteFinished(suiteResult);
-				return suiteResult;
-			}
-		}
+            if (this.Properties["_SETUICULTURE"] != null)
+                TestExecutionContext.CurrentContext.CurrentUICulture =
+                    new System.Globalization.CultureInfo((string)Properties["_SETUICULTURE"]);
+
+            switch (suiteResult.ResultState)
+            {
+                case ResultState.Failure:
+                case ResultState.Error:
+                    MarkTestsFailed(Tests, suiteResult, listener, filter);
+                    break;
+                case ResultState.NotRunnable:
+                    MarkTestsNotRun(this.Tests, ResultState.NotRunnable, suiteResult.Message, suiteResult, listener, filter);
+                    break;
+                default:
+                    try
+                    {
+                        RunAllTests(suiteResult, listener, filter);
+                    }
+                    finally
+                    {
+                        DoOneTimeTearDown(suiteResult);
+                    }
+                    break;
+            }
+			
+			return suiteResult;
+        }
 		#endregion
 
 		#region Virtual Methods
@@ -202,52 +310,61 @@ namespace NUnit.Core
             {
                 try
                 {
-                    if (Fixture == null) // In case TestFixture was created with fixture object
+					// In case TestFixture was created with fixture object
+					if (Fixture == null && !IsStaticClass( FixtureType ) )
 						CreateUserFixture();
 
-                    if (this.Properties["_SETCULTURE"] != null)
-                        TestContext.CurrentCulture =
-                            new System.Globalization.CultureInfo((string)Properties["_SETCULTURE"]);
+                    if (this.fixtureSetUpMethods != null)
+                        foreach( MethodInfo fixtureSetUp in fixtureSetUpMethods )
+                            Reflect.InvokeMethod(fixtureSetUp, fixtureSetUp.IsStatic ? null : Fixture);
 
-                    if (this.fixtureSetUp != null)
-                        Reflect.InvokeMethod(fixtureSetUp, Fixture);
+                    TestExecutionContext.CurrentContext.Update();
                 }
                 catch (Exception ex)
                 {
                     if (ex is NUnitException || ex is System.Reflection.TargetInvocationException)
                         ex = ex.InnerException;
 
-                    if (IsIgnoreException(ex))
+                    if (ex is InvalidTestFixtureException)
+                        suiteResult.Invalid(ex.Message);
+                    else if (IsIgnoreException(ex))
                     {
                         this.RunState = RunState.Ignored;
                         suiteResult.Ignore(ex.Message);
                         suiteResult.StackTrace = ex.StackTrace;
                         this.IgnoreReason = ex.Message;
                     }
-                    else 
-                    {
-                        if (IsAssertException(ex))
-                            suiteResult.Failure(ex.Message, ex.StackTrace, FailureSite.SetUp);
-                        else
-                            suiteResult.Error(ex, FailureSite.SetUp);
-                    }
+                    else if (IsAssertException(ex))
+                        suiteResult.Failure(ex.Message, ex.StackTrace, FailureSite.SetUp);
+                    else
+                        suiteResult.Error(ex, FailureSite.SetUp);
                 }
             }
         }
 
 		protected virtual void CreateUserFixture()
 		{
-			Fixture = Reflect.Construct(FixtureType);
+            if (arguments != null && arguments.Length > 0)
+                Fixture = Reflect.Construct(FixtureType, arguments);
+            else
+			    Fixture = Reflect.Construct(FixtureType);
 		}
 
         protected virtual void DoOneTimeTearDown(TestResult suiteResult)
         {
-            if ( this.Fixture != null)
+            if ( this.FixtureType != null)
             {
                 try
                 {
-                    if (this.fixtureTearDown != null)
-                        Reflect.InvokeMethod(fixtureTearDown, Fixture);
+                    if (this.fixtureTearDownMethods != null)
+                    {
+                        int index = fixtureTearDownMethods.Length;
+                        while (--index >= 0 )
+                        {
+                            MethodInfo fixtureTearDown = fixtureTearDownMethods[index];
+                            Reflect.InvokeMethod(fixtureTearDown, fixtureTearDown.IsStatic ? null : Fixture);
+                        }
+                    }
 
 					IDisposable disposable = Fixture as IDisposable;
 					if (disposable != null)
@@ -269,10 +386,32 @@ namespace NUnit.Core
                 this.Fixture = null;
             }
         }
+
+        protected virtual bool IsAssertException(Exception ex)
+        {
+            return ex.GetType().FullName == NUnitFramework.AssertException;
+        }
+
+        protected virtual bool IsIgnoreException(Exception ex)
+        {
+            return ex.GetType().FullName == NUnitFramework.IgnoreException;
+        }
         
+        #endregion
+
+        #region Helper Methods
+
+        private bool IsStaticClass(Type type)
+        {
+            return type.IsAbstract && type.IsSealed;
+        }
+
         private void RunAllTests(
-			TestSuiteResult suiteResult, EventListener listener, ITestFilter filter )
+			TestResult suiteResult, EventListener listener, ITestFilter filter )
 		{
+            if (Properties.Contains("Timeout"))
+                TestExecutionContext.CurrentContext.TestCaseTimeout = (int)Properties["Timeout"];
+
             foreach (Test test in ArrayList.Synchronized(Tests))
             {
                 if (filter.Pass(test))
@@ -287,51 +426,76 @@ namespace NUnit.Core
 
                     TestResult result = test.Run(listener, filter);
 
+					log.Debug("Test result = " + result.ResultState);
+					
                     suiteResult.AddResult(result);
+					
+					log.Debug("Suite result = " + suiteResult.ResultState);
 
                     if (saveRunState != test.RunState)
                     {
                         test.RunState = saveRunState;
                         test.IgnoreReason = null;
                     }
+
+                    if (result.ResultState == ResultState.Cancelled)
+                        break;
                 }
             }
 		}
 
+        private void SkipAllTests(TestResult suiteResult, EventListener listener, ITestFilter filter)
+        {
+            suiteResult.Skip(this.IgnoreReason);
+            MarkTestsNotRun(this.Tests, ResultState.Skipped, this.IgnoreReason, suiteResult, listener, filter);
+        }
+
+        private void IgnoreAllTests(TestResult suiteResult, EventListener listener, ITestFilter filter)
+        {
+            suiteResult.Ignore(this.IgnoreReason);
+            MarkTestsNotRun(this.Tests, ResultState.Ignored, this.IgnoreReason, suiteResult, listener, filter);
+        }
+
+        private void MarkAllTestsInvalid(TestResult suiteResult, EventListener listener, ITestFilter filter)
+        {
+            suiteResult.Invalid(this.IgnoreReason);
+            MarkTestsNotRun(this.Tests, ResultState.NotRunnable, this.IgnoreReason, suiteResult, listener, filter);
+        }
+       
         private void MarkTestsNotRun(
-            IList tests, RunState runState, string ignoreReason, TestSuiteResult suiteResult, EventListener listener, ITestFilter filter)
+            IList tests, ResultState resultState, string ignoreReason, TestResult suiteResult, EventListener listener, ITestFilter filter)
         {
             foreach (Test test in ArrayList.Synchronized(tests))
             {
                 if (filter.Pass(test))
-                    MarkTestNotRun(test, runState, ignoreReason, suiteResult, listener, filter);
+                    MarkTestNotRun(test, resultState, ignoreReason, suiteResult, listener, filter);
             }
         }
 
         private void MarkTestNotRun(
-            Test test, RunState runState, string ignoreReason, TestSuiteResult suiteResult, EventListener listener, ITestFilter filter)
+            Test test, ResultState resultState, string ignoreReason, TestResult suiteResult, EventListener listener, ITestFilter filter)
         {
             if (test is TestSuite)
             {
                 listener.SuiteStarted(test.TestName);
-                TestSuiteResult result = new TestSuiteResult( new TestInfo(test), test.TestName.FullName);
-				result.NotRun( runState, ignoreReason, null );
-                MarkTestsNotRun(test.Tests, runState, ignoreReason, suiteResult, listener, filter);
+                TestResult result = new TestResult( new TestInfo(test) );
+				result.SetResult( resultState, ignoreReason, null );
+                MarkTestsNotRun(test.Tests, resultState, ignoreReason, suiteResult, listener, filter);
                 suiteResult.AddResult(result);
                 listener.SuiteFinished(result);
             }
             else
             {
                 listener.TestStarted(test.TestName);
-                TestCaseResult result = new TestCaseResult( new TestInfo(test) );
-                result.NotRun( runState, ignoreReason, null );
+                TestResult result = new TestResult( new TestInfo(test) );
+                result.SetResult( resultState, ignoreReason, null );
                 suiteResult.AddResult(result);
                 listener.TestFinished(result);
             }
         }
 
         private void MarkTestsFailed(
-            IList tests, TestSuiteResult suiteResult, EventListener listener, ITestFilter filter)
+            IList tests, TestResult suiteResult, EventListener listener, ITestFilter filter)
         {
             foreach (Test test in ArrayList.Synchronized(tests))
                 if (filter.Pass(test))
@@ -339,12 +503,12 @@ namespace NUnit.Core
         }
 
         private void MarkTestFailed(
-            Test test, TestSuiteResult suiteResult, EventListener listener, ITestFilter filter)
+            Test test, TestResult suiteResult, EventListener listener, ITestFilter filter)
         {
             if (test is TestSuite)
             {
                 listener.SuiteStarted(test.TestName);
-                TestSuiteResult result = new TestSuiteResult( new TestInfo(test), test.TestName.FullName);
+                TestResult result = new TestResult( new TestInfo(test) );
 				string msg = string.Format( "Parent SetUp failed in {0}", this.FixtureType.Name );
 				result.Failure(msg, null, FailureSite.Parent);
                 MarkTestsFailed(test.Tests, suiteResult, listener, filter);
@@ -354,23 +518,13 @@ namespace NUnit.Core
             else
             {
                 listener.TestStarted(test.TestName);
-                TestCaseResult result = new TestCaseResult( new TestInfo(test) );
+                TestResult result = new TestResult( new TestInfo(test) );
 				string msg = string.Format( "TestFixtureSetUp failed in {0}", this.FixtureType.Name );
 				result.Failure(msg, null, FailureSite.Parent);
 				suiteResult.AddResult(result);
                 listener.TestFinished(result);
             }
         }
-
-        protected virtual bool IsAssertException(Exception ex)
-		{
-            return ex.GetType().FullName == NUnitFramework.AssertException;
-		}
-
-		protected virtual bool IsIgnoreException(Exception ex)
-		{
-            return ex.GetType().FullName == NUnitFramework.IgnoreException;
-		}
-		#endregion
-	}
+        #endregion
+    }
 }
diff --git a/src/NUnitCore/core/TestSuiteBuilder.cs b/src/NUnitCore/core/TestSuiteBuilder.cs
index fc79317..ea93ec2 100644
--- a/src/NUnitCore/core/TestSuiteBuilder.cs
+++ b/src/NUnitCore/core/TestSuiteBuilder.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 namespace NUnit.Core
@@ -60,6 +60,7 @@ namespace NUnit.Core
 		{
 			bool autoNamespaceSuites = package.GetSetting( "AutoNamespaceSuites", true );
 			bool mergeAssemblies = package.GetSetting( "MergeAssemblies", false );
+            TestExecutionContext.CurrentContext.TestCaseTimeout = package.GetSetting("DefaultTimeout", 0);
 
 			if ( package.IsSingleAssembly )
 				return BuildSingleAssembly( package );
@@ -70,7 +71,7 @@ namespace NUnit.Core
 				package.TestName = null;
 			}
 			
-			TestSuite rootSuite = new TestSuite( package.FullName );
+			TestSuite rootSuite = new ProjectRootSuite( package.FullName );
 			NamespaceTreeBuilder namespaceTree = 
 				new NamespaceTreeBuilder( rootSuite );
 
@@ -104,7 +105,9 @@ namespace NUnit.Core
 				}
 			}
 
-			if ( rootSuite.Tests.Count == 0 )
+            ProviderCache.Clear();
+            
+            if (rootSuite.Tests.Count == 0)
 				return null;
 
 			return rootSuite;
@@ -116,9 +119,13 @@ namespace NUnit.Core
 			builders.Clear();
 			builders.Add( builder );
 
-			return (TestSuite)builder.Build( 
+			TestSuite suite = (TestSuite)builder.Build( 
 				package.FullName, 
 				package.TestName, package.GetSetting( "AutoNamespaceSuites", true ) );
+
+            ProviderCache.Clear();
+
+            return suite;
 		}
 		#endregion
 	}
diff --git a/src/NUnitCore/core/TestThread.cs b/src/NUnitCore/core/TestThread.cs
new file mode 100644
index 0000000..b660505
--- /dev/null
+++ b/src/NUnitCore/core/TestThread.cs
@@ -0,0 +1,194 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+using System;
+using System.Runtime.Remoting.Messaging;
+using System.Threading;
+
+namespace NUnit.Core
+{
+    /// <summary>
+    /// Represents a thread of test execution and runs a test
+    /// on a thread, implementing timeout and setting the 
+    /// apartment state appropriately.
+    /// </summary>
+    public abstract class TestThread
+    {
+        static Logger log = InternalTrace.GetLogger(typeof(TestThread));
+
+		private Test test;
+		
+        #region Protected Fields
+        /// <summary>
+        /// The Thread object used to run tests
+        /// </summary>
+        protected Thread thread;
+
+		/// <summary>
+		/// The result of running the test, which must be kept
+		/// separate from the returned TestResult while the thread
+        /// is running to avoid race conditions.
+		/// </summary>
+		protected TestResult threadResult;
+		
+        protected EventListener listener;
+
+        protected ITestFilter filter;
+		
+		protected TestMethod.ContextDictionary contextDictionary;
+
+        /// <summary>
+        /// Unexpected exception thrown by test thread
+        /// </summary>
+        protected Exception thrownException;
+        #endregion
+
+        #region Constructor
+        protected TestThread(Test test)
+        {
+			this.test = test;
+			
+            this.thread = new Thread(new ThreadStart(RunTestProc));
+            thread.CurrentCulture = Thread.CurrentThread.CurrentCulture;
+            thread.CurrentUICulture = Thread.CurrentThread.CurrentUICulture;
+
+            // Setting to Unknown causes an error under the Mono 1.0 profile
+            if ( test.ApartmentState != ApartmentState.Unknown )
+                this.ApartmentState = test.ApartmentState;		
+        }
+        #endregion
+
+        #region Properties
+        public ApartmentState ApartmentState
+        {
+#if NET_2_0
+            get { return thread.GetApartmentState(); }
+            set { thread.SetApartmentState(value); }
+#else
+            get { return thread.ApartmentState; }
+            set { thread.ApartmentState = value; }
+#endif
+        }
+        #endregion
+
+        /// <summary>
+        /// Run the test, honoring any timeout value provided. If the
+        /// timeout is exceeded, set the testresult as a failure. As
+        /// currently implemented, the thread proc calls test.doRun,
+        /// which handles all exceptions itself. However, for safety,
+        /// any exception thrown is rethrown upwards.
+        /// 
+        /// TODO: It would be cleaner to call test.Run, since that's
+        /// part of the pubic interface, but it would require some
+        /// restructuring of the Test hierarchy.
+        /// </summary>
+        public TestResult Run(EventListener listener, ITestFilter filter)
+        {
+			TestResult testResult = new TestResult(test);
+			
+            this.thrownException = null;
+            this.listener = listener;
+            this.filter = filter;
+			this.contextDictionary = (TestMethod.ContextDictionary)CallContext.GetData("NUnit.Framework.TestContext");
+
+            log.Debug("Starting test in separate thread");
+            thread.Start();
+            thread.Join(this.Timeout);
+
+            // Timeout?
+            if (thread.IsAlive)
+            {
+				log.Debug("Test timed out - aborting thread");
+                thread.Abort();
+                //thread.Join();
+                testResult.Failure(string.Format("Test exceeded Timeout value of {0}ms", Timeout), null);
+            }
+			else if (thrownException != null)
+			{
+				log.Debug("Test threw " + thrownException.GetType().Name);
+				throw thrownException;
+			}
+			else
+			{
+				log.Debug("Test completed normally");
+                testResult = threadResult;
+            }
+			
+			return testResult;
+        }
+
+        /// <summary>
+        /// This is the engine of this class; the actual call to test.doRun!
+        /// Note that any thrown exception is saved for later use!
+        /// </summary>
+        private void RunTestProc()
+        {
+			CallContext.SetData("NUnit.Framework.TestContext", contextDictionary);
+			
+            try
+            {
+                RunTest();
+            }
+            catch (Exception e)
+            {
+                thrownException = e;
+            }
+			finally
+			{
+				CallContext.FreeNamedDataSlot("NUnit.Framework.TestContext");
+			}
+        }
+
+        protected abstract int Timeout { get; }
+        protected abstract void RunTest();
+    }
+
+    public class TestMethodThread : TestThread
+    {
+        private TestMethod testMethod;
+
+        public TestMethodThread(TestMethod testMethod)
+            : base(testMethod)
+        {
+            this.testMethod = testMethod;
+        }
+
+        protected override int Timeout
+        {
+            get 
+            { 
+                return testMethod.Timeout == 0 //|| System.Diagnostics.Debugger.IsAttached
+                    ? System.Threading.Timeout.Infinite
+                    : testMethod.Timeout;
+            }
+        }
+
+        protected override void RunTest()
+        {
+			this.threadResult = testMethod.RunTest();
+        }
+    }
+
+    public class TestSuiteThread : TestThread
+    {
+        private TestSuite suite;
+
+        public TestSuiteThread(TestSuite suite)
+            : base(suite)
+        {
+            this.suite = suite;
+        }
+
+        protected override int Timeout
+        {
+            get { return System.Threading.Timeout.Infinite; }
+        }
+
+        protected override void RunTest()
+        {
+			this.threadResult = suite.RunSuite(listener, filter);
+        }
+    }
+}
diff --git a/src/NUnitCore/core/TextCapture.cs b/src/NUnitCore/core/TextCapture.cs
index 705f819..d4d2c2e 100644
--- a/src/NUnitCore/core/TextCapture.cs
+++ b/src/NUnitCore/core/TextCapture.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2008, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 
 using System.IO;
diff --git a/src/NUnitCore/core/ThreadedTestRunner.cs b/src/NUnitCore/core/ThreadedTestRunner.cs
index 45017f1..78d8686 100644
--- a/src/NUnitCore/core/ThreadedTestRunner.cs
+++ b/src/NUnitCore/core/ThreadedTestRunner.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 namespace NUnit.Core
 {
@@ -15,6 +15,8 @@ namespace NUnit.Core
 	/// </summary>
 	public class ThreadedTestRunner : ProxyTestRunner
 	{
+        static Logger log = InternalTrace.GetLogger(typeof(ThreadedTestRunner));
+
 		#region Instance Variables
 		private TestRunnerThread testRunnerThread;
 		#endregion
@@ -38,21 +40,22 @@ namespace NUnit.Core
 
 		public override void BeginRun( EventListener listener )
 		{
-			testRunnerThread = new TestRunnerThread( this.TestRunner );
-
-			testRunnerThread.StartRun( listener );
+            log.Info("BeginRun");
+   			testRunnerThread = new TestRunnerThread( this.TestRunner );
+            testRunnerThread.StartRun( listener );
 		}
 
 		public override void BeginRun( EventListener listener, ITestFilter filter )
 		{
-			testRunnerThread = new TestRunnerThread( this.TestRunner );
-
+            log.Info("BeginRun");
+            testRunnerThread = new TestRunnerThread(this.TestRunner);
 			testRunnerThread.StartRun( listener, filter );
 		}
 
 		public override TestResult EndRun()
 		{
-			this.Wait();
+            log.Info("EndRun");
+            this.Wait();
 			return this.TestRunner.TestResult;
 		}
 
diff --git a/src/NUnitCore/core/TypeHelper.cs b/src/NUnitCore/core/TypeHelper.cs
new file mode 100644
index 0000000..375e376
--- /dev/null
+++ b/src/NUnitCore/core/TypeHelper.cs
@@ -0,0 +1,209 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Reflection;
+using System.Text;
+using System.Text.RegularExpressions;
+
+namespace NUnit.Core
+{
+    public class TypeHelper
+    {
+        public static string GetDisplayName(Type type)
+        {
+#if NET_2_0
+            if (type.IsGenericParameter)
+                return type.Name;
+
+            if (type.IsGenericType)
+            {
+                string name = type.FullName;
+
+                int index = name.IndexOf("[[");
+                if (index > 0)
+                {
+                    int index2 = name.LastIndexOf("]]");
+                    if (index2 > index)
+                        name = name.Substring(0, index) + name.Substring(index2 + 2);
+                }
+
+                index = name.LastIndexOf('.');
+                if (index >= 0) name = name.Substring(index + 1);
+
+                index = name.IndexOf('`');
+                while (index >= 0)
+                {
+                    int index2 = name.IndexOf('+', index);
+                    if (index2 >= 0)
+                        name = name.Substring(0, index) + name.Substring(index2);
+                    else
+                        name = name.Substring(0, index);
+
+                    index = name.IndexOf('`');
+                }
+
+                StringBuilder sb = new StringBuilder(name);
+
+                sb.Append("<");
+                int cnt = 0;
+                foreach (Type t in type.GetGenericArguments())
+                {
+                    if (cnt++ > 0) sb.Append(",");
+                    sb.Append(GetDisplayName(t));
+                }
+                sb.Append(">");
+
+                return sb.ToString();
+            }
+#endif
+            int lastdot = type.FullName.LastIndexOf('.');
+            return lastdot >= 0
+                ? type.FullName.Substring(lastdot + 1)
+                : type.FullName;
+        }
+
+        public static string GetDisplayName(Type type, object[] arglist)
+        {
+            string baseName = GetDisplayName(type);
+            if (arglist == null || arglist.Length == 0)
+                return baseName;
+
+            StringBuilder sb = new StringBuilder( baseName );
+
+            sb.Append("(");
+            for (int i = 0; i < arglist.Length; i++)
+            {
+                if (i > 0) sb.Append(",");
+
+                object arg = arglist[i];
+                string display = arg == null ? "null" : arg.ToString();
+
+                if (arg is double || arg is float)
+                {
+                    if (display.IndexOf('.') == -1)
+                        display += ".0";
+                    display += arg is double ? "d" : "f";
+                }
+                else if (arg is decimal) display += "m";
+                else if (arg is long) display += "L";
+                else if (arg is ulong) display += "UL";
+                else if (arg is string) display = "\"" + display + "\"";
+
+                sb.Append(display);
+            }
+            sb.Append(")");
+
+            return sb.ToString();
+        }
+
+        public static Type BestCommonType(Type type1, Type type2)
+        {
+            if (type1 == type2) return type1;
+            if (type1 == null) return type2;
+            if (type2 == null) return type1;
+
+            if (TypeHelper.IsNumeric(type1) && TypeHelper.IsNumeric(type2))
+            {
+                if (type1 == typeof(double)) return type1;
+                if (type2 == typeof(double)) return type2;
+
+                if (type1 == typeof(float)) return type1;
+                if (type2 == typeof(float)) return type2;
+
+                if (type1 == typeof(decimal)) return type1;
+                if (type2 == typeof(decimal)) return type2;
+
+                if (type1 == typeof(UInt64)) return type1;
+                if (type2 == typeof(UInt64)) return type2;
+
+                if (type1 == typeof(Int64)) return type1;
+                if (type2 == typeof(Int64)) return type2;
+
+                if (type1 == typeof(UInt32)) return type1;
+                if (type2 == typeof(UInt32)) return type2;
+
+                if (type1 == typeof(Int32)) return type1;
+                if (type2 == typeof(Int32)) return type2;
+
+                if (type1 == typeof(UInt16)) return type1;
+                if (type2 == typeof(UInt16)) return type2;
+
+                if (type1 == typeof(Int16)) return type1;
+                if (type2 == typeof(Int16)) return type2;
+
+                if (type1 == typeof(byte)) return type1;
+                if (type2 == typeof(byte)) return type2;
+
+                if (type1 == typeof(sbyte)) return type1;
+                if (type2 == typeof(sbyte)) return type2;
+            }
+
+            return type1;
+        }
+
+        public static bool IsNumeric(Type type)
+        {
+            return type == typeof(double) ||
+                    type == typeof(float) ||
+                    type == typeof(decimal) ||
+                    type == typeof(Int64) ||
+                    type == typeof(Int32) ||
+                    type == typeof(Int16) ||
+                    type == typeof(UInt64) ||
+                    type == typeof(UInt32) ||
+                    type == typeof(UInt16) ||
+                    type == typeof(byte) ||
+                    type == typeof(sbyte);
+        }
+
+#if NET_2_0
+        public static Type MakeGenericType(Type type, Type[] typeArgs)
+        {
+            // TODO: Add error handling
+            return type.MakeGenericType(typeArgs);
+        }
+
+        public static bool CanDeduceTypeArgsFromArgs(Type type, object[] arglist, ref Type[] typeArgsOut)
+        {
+            Type[] typeParameters = type.GetGenericArguments();
+
+            foreach (ConstructorInfo ctor in type.GetConstructors())
+            {
+                ParameterInfo[] parameters = ctor.GetParameters();
+                if (parameters.Length != arglist.Length)
+                    continue;
+
+                Type[] typeArgs = new Type[typeParameters.Length];
+                for (int i = 0; i < typeArgs.Length; i++)
+                {
+                    for (int j = 0; j < arglist.Length; j++)
+			        {
+                        if (parameters[j].ParameterType.Equals(typeParameters[i]))
+                            typeArgs[i] = TypeHelper.BestCommonType(
+                                typeArgs[i],
+                                arglist[j].GetType());
+			        }
+
+                    if (typeArgs[i] == null)
+                    {
+                        typeArgs = null;
+                        break;
+                    }
+                }
+
+                if (typeArgs != null)
+                {
+                    typeArgsOut = typeArgs;
+                    return true;
+                }
+            }
+
+            return false;
+        }
+#endif
+    }
+}
diff --git a/src/NUnitCore/core/nunit.core.build b/src/NUnitCore/core/nunit.core.build
index 1565628..6cf2a2e 100644
--- a/src/NUnitCore/core/nunit.core.build
+++ b/src/NUnitCore/core/nunit.core.build
@@ -1,89 +1,123 @@
 <?xml version="1.0"?>
 <project name="NUnitCore" default="build" basedir=".">
 
+  <patternset id="source-files">
+    <include name="AbstractTestCaseDecoration.cs"/>
+    <include name="AssemblyInfo.cs"/>
+    <include name="AssemblyHelper.cs"/>
+    <include name="AssemblyReader.cs"/>
+    <include name="AssemblyResolver.cs"/>
+    <include name="CoreExtensions.cs"/>
+    <include name="CultureDetector.cs"/>
+    <include name="DirectorySwapper.cs"/>
+    <include name="DomainAgent.cs"/>
+    <include name="EventListenerTextWriter.cs"/>
+    <include name="EventPump.cs"/>
+    <include name="EventQueue.cs"/>
+    <include name="ExpectedExceptionProcessor.cs"/>
+    <include name="ExtensionHost.cs"/>
+    <include name="ExtensionPoint.cs"/>
+    <include name="IgnoreDecorator.cs"/>
+    <include name="InternalTrace.cs"/>
+    <include name="InternalTraceWriter.cs"/>
+    <include name="InvalidSuiteException.cs"/>
+    <include name="InvalidTestFixtureException.cs"/>
+    <include name="LegacySuite.cs"/>
+    <include name="Log4NetCapture.cs"/>
+    <include name="LogCapture.cs"/>
+    <include name="Logger.cs"/>
+    <include name="MethodHelper.cs"/>
+    <include name="NamespaceSuite.cs"/>
+    <include name="NamespaceTreeBuilder.cs"/>
+    <include name="NoTestFixturesException.cs"/>
+    <include name="NullListener.cs"/>
+    <include name="NUnitConfiguration.cs"/>
+    <include name="NUnitException.cs"/>
+    <include name="NUnitFramework.cs"/>
+    <include name="NUnitTestFixture.cs"/>
+    <include name="NUnitTestMethod.cs"/>
+    <include name="ParameterizedFixtureSuite.cs"/>
+    <include name="ParameterizedTestMethodSuite.cs"/>
+    <include name="PlatformHelper.cs"/>
+    <include name="ProjectRootSuite.cs"/>
+    <include name="ProxyTestRunner.cs"/>
+    <include name="QueuingEventListener.cs"/>
+    <include name="Reflect.cs"/>
+    <include name="RemoteTestRunner.cs"/>
+    <include name="SetUpFixture.cs"/>
+    <include name="SimpleTestRunner.cs"/>
+    <include name="StringTextWriter.cs"/>
+    <include name="SuiteBuilderAttribute.cs"/>
+    <include name="TestAssembly.cs"/>
+    <include name="TestBuilderAttribute.cs"/>
+    <include name="TestCaseBuilder.cs"/>
+    <include name="TestCaseBuilderAttribute.cs"/>
+    <include name="TestDecoratorAttribute.cs"/>
+    <include name="TestExecutionContext.cs"/>
+    <include name="TestFixture.cs"/>
+    <include name="TestFixtureBuilder.cs"/>
+    <include name="TestMethod.cs"/>
+    <include name="TestRunnerThread.cs"/>
+    <include name="TestSuite.cs"/>
+    <include name="TestSuiteBuilder.cs"/>
+    <include name="TestThread.cs"/>
+    <include name="TextCapture.cs"/>
+    <include name="ThreadedTestRunner.cs"/>
+    <include name="TypeHelper.cs"/>
+    <include name="Builders/CombinatorialStrategy.cs"/>
+    <include name="Builders/CombinatorialTestCaseProvider.cs"/>
+    <include name="Builders/CombiningStrategy.cs"/>
+    <include name="Builders/DatapointProvider.cs"/>
+    <include name="Builders/InlineDataPointProvider.cs"/>
+    <include name="Builders/LegacySuiteBuilder.cs"/>
+    <include name="Builders/NUnitTestCaseBuilder.cs"/>
+    <include name="Builders/NUnitTestFixtureBuilder.cs"/>
+    <include name="Builders/PairwiseStrategy.cs"/>
+    <include name="Builders/ProviderCache.cs"/>
+    <include name="Builders/ProviderInfo.cs"/>
+    <include name="Builders/SequentialStrategy.cs"/>
+    <include name="Builders/SetUpFixtureBuilder.cs"/>
+    <include name="Builders/TestAssemblyBuilder.cs"/>
+    <include name="Builders/TestCaseParameterProvider.cs"/>
+    <include name="Builders/TestCaseSourceProvider.cs"/>
+    <include name="Builders/ValueSourceProvider.cs"/>
+    <include name="Extensibility/DataPointProviders.cs"/>
+    <include name="Extensibility/EventListenerCollection.cs"/>
+    <include name="Extensibility/FrameworkRegistry.cs"/>
+    <include name="Extensibility/SuiteBuilderCollection.cs"/>
+    <include name="Extensibility/TestCaseProviders.cs"/>
+    <include name="Extensibility/TestCaseBuilderCollection.cs"/>
+    <include name="Extensibility/TestDecoratorCollection.cs"/>
+  </patternset>
+
   <target name="build">
     <csc target="library" 
-        output="${current.build.dir}/nunit.core.dll"
+        output="${current.lib.dir}/nunit.core.dll"
         debug="${build.debug}" 
         define="${build.defines}">
       <sources>
-        <include name="AbstractTestCaseDecoration.cs"/>
-        <include name="AssemblyInfo.cs"/>
-        <include name="AssemblyReader.cs"/>
-        <include name="AssemblyResolver.cs"/>
-        <include name="CoreExtensions.cs"/>
-        <include name="CultureDetector.cs"/>
-        <include name="DirectorySwapper.cs"/>
-        <include name="EventListenerTextWriter.cs"/>
-        <include name="EventPump.cs"/>
-        <include name="EventQueue.cs"/>
-        <include name="ExtensionHost.cs"/>
-        <include name="ExtensionPoint.cs"/>
-        <include name="IgnoreDecorator.cs"/>
-        <include name="InvalidSuiteException.cs"/>
-        <include name="InvalidTestFixtureException.cs"/>
-        <include name="LegacySuite.cs"/>
-        <include name="Log4NetCapture.cs"/>
-        <include name="LogCapture.cs"/>
-        <include name="NamespaceTreeBuilder.cs"/>
-        <include name="NoTestFixturesException.cs"/>
-        <include name="NotRunnableTestCase.cs"/>
-        <include name="NTrace.cs"/>
-        <include name="NullListener.cs"/>
-        <include name="NUnitException.cs"/>
-        <include name="NUnitFramework.cs"/>
-        <include name="NUnitTestFixture.cs"/>
-        <include name="NUnitTestMethod.cs"/>
-        <include name="PlatformHelper.cs"/>
-        <include name="ProxyTestRunner.cs"/>
-        <include name="QueuingEventListener.cs"/>
-        <include name="Reflect.cs"/>
-        <include name="RemoteTestRunner.cs"/>
-        <include name="SetUpFixture.cs"/>
-        <include name="SimpleTestRunner.cs"/>
-        <include name="StringTextWriter.cs"/>
-        <include name="SuiteBuilderAttribute.cs"/>
-        <include name="TestBuilderAttribute.cs"/>
-        <include name="TestCase.cs"/>
-        <include name="TestCaseBuilder.cs"/>
-        <include name="TestCaseBuilderAttribute.cs"/>
-        <include name="TestContext.cs"/>
-        <include name="TestDecoratorAttribute.cs"/>
-        <include name="TestFixture.cs"/>
-        <include name="TestFixtureBuilder.cs"/>
-        <include name="TestMethod.cs"/>
-        <include name="TestRunnerThread.cs"/>
-        <include name="TestSuite.cs"/>
-        <include name="TestSuiteBuilder.cs"/>
-        <include name="TextCapture.cs"/>
-        <include name="ThreadedTestRunner.cs"/>
-        <include name="Builders/AbstractFixtureBuilder.cs"/>
-        <include name="Builders/AbstractTestCaseBuilder.cs"/>
-        <include name="Builders/LegacySuiteBuilder.cs"/>
-        <include name="Builders/NUnitTestCaseBuilder.cs"/>
-        <include name="Builders/NUnitTestFixtureBuilder.cs"/>
-        <include name="Builders/SetUpFixtureBuilder.cs"/>
-        <include name="Builders/TestAssemblyBuilder.cs"/>
-        <include name="Extensibility/EventListenerCollection.cs"/>
-        <include name="Extensibility/FrameworkRegistry.cs"/>
-        <include name="Extensibility/SuiteBuilderCollection.cs"/>
-        <include name="Extensibility/TestCaseBuilderCollection.cs"/>
-        <include name="Extensibility/TestDecoratorCollection.cs"/>
-        <include name="../../CommonAssemblyInfo.cs"/>
+        <patternset refid="source-files"/>
+    <include name="../../GeneratedAssemblyInfo.cs"/>
       </sources>
       <nowarn>
-        <warning number="618,1699" if="${runtime.version=='2.0'}"/>
+        <warning number="618,1699" if="${runtime.version>='2.0'}"/>
       </nowarn>
-      <references basedir="${current.build.dir}">
-        <include name="nunit.core.interfaces.dll"/>
+      <references>
+	<include name="System.Configuration.dll"/>
+    <include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
       </references>
     </csc>
   </target>
 
   <target name="package">
     <copy todir="${package.src.dir}/NUnitCore/core">
-      <fileset refid="source-files" />
+      <fileset>
+        <patternset refid="source-files"/>
+        <include name="summary.xslt"/>    <!-- and this -->
+        <include name="nunit.core.dll.csproj"/>
+        <include name="nunit.core.build"/>
+      </fileset>
     </copy>
   </target>
 
-</project>
\ No newline at end of file
+</project>
diff --git a/src/NUnitCore/core/nunit.core.dll.csproj b/src/NUnitCore/core/nunit.core.dll.csproj
index 8b5adaa..303ba82 100644
--- a/src/NUnitCore/core/nunit.core.dll.csproj
+++ b/src/NUnitCore/core/nunit.core.dll.csproj
@@ -1,419 +1,211 @@
-<VisualStudioProject>
-    <CSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = ""
-                AssemblyKeyContainerName = ""
-                AssemblyName = "nunit.core"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "Library"
-                PreBuildEvent = ""
-                PostBuildEvent = ""
-                RootNamespace = "NUnit.Core"
-                RunPostBuildEvent = "OnBuildSuccess"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "true"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-                <Config
-                    Name = "Release"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "false"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "System"
-                    AssemblyName = "System"
-                    HintPath = "E:\WINNT\Microsoft.NET\Framework\v1.1.4322\System.dll"
-                />
-                <Reference
-                    Name = "System.Data"
-                    AssemblyName = "System.Data"
-                    HintPath = "E:\WINNT\Microsoft.NET\Framework\v1.1.4322\System.Data.dll"
-                />
-                <Reference
-                    Name = "System.XML"
-                    AssemblyName = "System.Xml"
-                    HintPath = "E:\WINNT\Microsoft.NET\Framework\v1.1.4322\System.XML.dll"
-                />
-                <Reference
-                    Name = "nunit.core.interfaces.dll"
-                    Project = "{435428F8-5995-4CE4-8022-93D595A8CC0F}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-            </References>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "AbstractTestCaseDecoration.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "AssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "AssemblyReader.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "AssemblyResolver.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CommonAssemblyInfo.cs"
-                    Link = "..\..\CommonAssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CoreExtensions.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CultureDetector.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "DirectorySwapper.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "EventListenerTextWriter.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "EventPump.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "EventQueue.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ExtensionHost.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ExtensionPoint.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "IgnoreDecorator.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "InvalidSuiteException.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "InvalidTestFixtureException.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "LegacySuite.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Log4NetCapture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "LogCapture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "NamespaceTreeBuilder.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "NoTestFixturesException.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "NotRunnableTestCase.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "NTrace.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "NullListener.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "NUnitException.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "NUnitFramework.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "NUnitTestFixture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "NUnitTestMethod.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "PlatformHelper.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ProxyTestRunner.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "QueuingEventListener.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Reflect.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RemoteTestRunner.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Results.xsd"
-                    BuildAction = "Content"
-                />
-                <File
-                    RelPath = "Results.xsx"
-                    DependentUpon = "Results.xsd"
-                    BuildAction = "None"
-                />
-                <File
-                    RelPath = "SetUpFixture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SimpleTestRunner.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "StringTextWriter.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SuiteBuilderAttribute.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Summary.xslt"
-                    BuildAction = "Content"
-                />
-                <File
-                    RelPath = "TestBuilderAttribute.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestCase.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestCaseBuilderAttribute.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestContext.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestDecoratorAttribute.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestFixture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestFixtureBuilder.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestMethod.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestRunnerThread.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestSuite.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestSuiteBuilder.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TextCapture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ThreadedTestRunner.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Builders\AbstractFixtureBuilder.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Builders\AbstractTestCaseBuilder.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Builders\LegacySuiteBuilder.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Builders\NUnitTestCaseBuilder.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Builders\NUnitTestFixtureBuilder.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Builders\SetUpFixtureBuilder.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Builders\TestAssemblyBuilder.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Extensibility\EventListenerCollection.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Extensibility\FrameworkRegistry.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Extensibility\SuiteBuilderCollection.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Extensibility\TestCaseBuilderCollection.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Extensibility\TestDecoratorCollection.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-            </Include>
-        </Files>
-    </CSHARP>
-</VisualStudioProject>
-
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit.core</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.Core</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <PublishUrl>http://localhost/nunit.core/</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Web</InstallFrom>
+    <UpdateEnabled>true</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>true</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\lib\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG;NET_2_0</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>1699</NoWarn>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\lib\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;NET_2_0</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>1699</NoWarn>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\interfaces\nunit.core.interfaces.dll.csproj">
+      <Name>nunit.core.interfaces.dll</Name>
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <Reference Include="System.Configuration" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="AbstractTestCaseDecoration.cs" />
+    <Compile Include="AssemblyHelper.cs" />
+    <Compile Include="AssemblyInfo.cs" />
+    <Compile Include="AssemblyReader.cs" />
+    <Compile Include="AssemblyResolver.cs" />
+    <Compile Include="Builders\CombinatorialStrategy.cs" />
+    <Compile Include="Builders\CombinatorialTestCaseProvider.cs" />
+    <Compile Include="Builders\CombiningStrategy.cs" />
+    <Compile Include="Builders\DatapointProvider.cs" />
+    <Compile Include="Builders\InlineDataPointProvider.cs" />
+    <Compile Include="Builders\LegacySuiteBuilder.cs" />
+    <Compile Include="Builders\NUnitTestCaseBuilder.cs" />
+    <Compile Include="Builders\NUnitTestFixtureBuilder.cs" />
+    <Compile Include="Builders\PairwiseStrategy.cs" />
+    <Compile Include="Builders\ProviderCache.cs" />
+    <Compile Include="Builders\ProviderInfo.cs" />
+    <Compile Include="Builders\SequentialStrategy.cs" />
+    <Compile Include="Builders\SetUpFixtureBuilder.cs" />
+    <Compile Include="Builders\TestAssemblyBuilder.cs" />
+    <Compile Include="Builders\TestCaseParameterProvider.cs" />
+    <Compile Include="Builders\TestCaseSourceProvider.cs" />
+    <Compile Include="Builders\ValueSourceProvider.cs" />
+    <Compile Include="CoreExtensions.cs" />
+    <Compile Include="CultureDetector.cs" />
+    <Compile Include="DirectorySwapper.cs" />
+    <Compile Include="DomainAgent.cs" />
+    <Compile Include="EventListenerTextWriter.cs" />
+    <Compile Include="EventPump.cs" />
+    <Compile Include="EventQueue.cs" />
+    <Compile Include="ExpectedExceptionProcessor.cs" />
+    <Compile Include="Extensibility\DataPointProviders.cs" />
+    <Compile Include="Extensibility\EventListenerCollection.cs" />
+    <Compile Include="Extensibility\FrameworkRegistry.cs" />
+    <Compile Include="Extensibility\SuiteBuilderCollection.cs" />
+    <Compile Include="Extensibility\TestCaseBuilderCollection.cs" />
+    <Compile Include="Extensibility\TestCaseProviders.cs" />
+    <Compile Include="Extensibility\TestDecoratorCollection.cs" />
+    <Compile Include="ExtensionHost.cs" />
+    <Compile Include="ExtensionPoint.cs" />
+    <Compile Include="IgnoreDecorator.cs" />
+    <Compile Include="InternalTrace.cs" />
+    <Compile Include="InternalTraceWriter.cs" />
+    <Compile Include="InvalidSuiteException.cs" />
+    <Compile Include="InvalidTestFixtureException.cs" />
+    <Compile Include="LegacySuite.cs" />
+    <Compile Include="Log4NetCapture.cs" />
+    <Compile Include="LogCapture.cs" />
+    <Compile Include="Logger.cs" />
+    <Compile Include="MethodHelper.cs" />
+    <Compile Include="NamespaceSuite.cs" />
+    <Compile Include="NamespaceTreeBuilder.cs" />
+    <Compile Include="NoTestFixturesException.cs" />
+    <Compile Include="NullListener.cs" />
+    <Compile Include="NUnitConfiguration.cs" />
+    <Compile Include="NUnitException.cs" />
+    <Compile Include="NUnitFramework.cs" />
+    <Compile Include="NUnitTestFixture.cs" />
+    <Compile Include="NUnitTestMethod.cs" />
+    <Compile Include="ParameterizedFixtureSuite.cs" />
+    <Compile Include="ParameterizedTestMethodSuite.cs" />
+    <Compile Include="PlatformHelper.cs" />
+    <Compile Include="ProjectRootSuite.cs" />
+    <Compile Include="ProxyTestRunner.cs" />
+    <Compile Include="QueuingEventListener.cs" />
+    <Compile Include="Reflect.cs" />
+    <Compile Include="RemoteTestRunner.cs" />
+    <Compile Include="SetUpFixture.cs" />
+    <Compile Include="SimpleTestRunner.cs" />
+    <Compile Include="StringTextWriter.cs" />
+    <Compile Include="SuiteBuilderAttribute.cs" />
+    <Compile Include="TestAssembly.cs" />
+    <Compile Include="TestBuilderAttribute.cs" />
+    <Compile Include="TestCaseBuilderAttribute.cs" />
+    <Compile Include="TestDecoratorAttribute.cs" />
+    <Compile Include="TestExecutionContext.cs" />
+    <Compile Include="TestFixture.cs" />
+    <Compile Include="TestFixtureBuilder.cs" />
+    <Compile Include="TestMethod.cs" />
+    <Compile Include="TestRunnerThread.cs" />
+    <Compile Include="TestSuite.cs" />
+    <Compile Include="TestSuiteBuilder.cs" />
+    <Compile Include="TestThread.cs" />
+    <Compile Include="TextCapture.cs" />
+    <Compile Include="ThreadedTestRunner.cs" />
+    <Compile Include="TypeHelper.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit.core.build" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/NUnitCore/core/nunit.core.dll_VS2005.csproj b/src/NUnitCore/core/nunit.core.dll_VS2005.csproj
deleted file mode 100644
index eee7a8c..0000000
--- a/src/NUnitCore/core/nunit.core.dll_VS2005.csproj
+++ /dev/null
@@ -1,221 +0,0 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>8.0.50727</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ApplicationIcon>
-    </ApplicationIcon>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit.core</AssemblyName>
-    <AssemblyOriginatorKeyFile>
-    </AssemblyOriginatorKeyFile>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.Core</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <StartupObject>
-    </StartupObject>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-    <SignAssembly>false</SignAssembly>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release2005|AnyCPU' ">
-    <OutputPath>bin\Release2005\</OutputPath>
-    <DefineConstants>TRACE;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <Optimize>true</Optimize>
-    <NoWarn>618,1699</NoWarn>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug2005|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\Debug2005\</OutputPath>
-    <DefineConstants>TRACE;DEBUG;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <NoWarn>618,1699</NoWarn>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="AbstractTestCaseDecoration.cs" />
-    <Compile Include="AssemblyInfo.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="AssemblyReader.cs" />
-    <Compile Include="AssemblyResolver.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="CoreExtensions.cs" />
-    <Compile Include="CultureDetector.cs" />
-    <Compile Include="ExtensionPoint.cs" />
-    <Compile Include="Log4NetCapture.cs" />
-    <Compile Include="LogCapture.cs" />
-    <Compile Include="NTrace.cs" />
-    <Compile Include="ProxyTestRunner.cs" />
-    <Compile Include="DirectorySwapper.cs" />
-    <Compile Include="EventListenerTextWriter.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="EventPump.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="EventQueue.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="Extensibility\EventListenerCollection.cs" />
-    <Compile Include="Extensibility\FrameworkRegistry.cs" />
-    <Compile Include="Extensibility\SuiteBuilderCollection.cs" />
-    <Compile Include="Extensibility\TestCaseBuilderCollection.cs" />
-    <Compile Include="Extensibility\TestDecoratorCollection.cs" />
-    <Compile Include="ExtensionHost.cs" />
-    <Compile Include="IgnoreDecorator.cs" />
-    <Compile Include="InvalidSuiteException.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="InvalidTestFixtureException.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="LegacySuite.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="NamespaceTreeBuilder.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="NoTestFixturesException.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="NotRunnableTestCase.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="NullListener.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="NUnitException.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="NUnitFramework.cs" />
-    <Compile Include="NUnitTestFixture.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="NUnitTestMethod.cs" />
-    <Compile Include="PlatformHelper.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="QueuingEventListener.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="Reflect.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="RemoteTestRunner.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="SetUpFixture.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="SimpleTestRunner.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="StringTextWriter.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="SuiteBuilderAttribute.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestBuilderAttribute.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestCase.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestCaseBuilder.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestCaseBuilderAttribute.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestContext.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestDecoratorAttribute.cs" />
-    <Compile Include="TestFixture.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestFixtureBuilder.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestMethod.cs" />
-    <Compile Include="TestRunnerThread.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestSuite.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestSuiteBuilder.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TextCapture.cs" />
-    <Compile Include="ThreadedTestRunner.cs" />
-    <Compile Include="Builders\AbstractFixtureBuilder.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="Builders\AbstractTestCaseBuilder.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="Builders\LegacySuiteBuilder.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="Builders\NUnitTestCaseBuilder.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="Builders\NUnitTestFixtureBuilder.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="Builders\SetUpFixtureBuilder.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="Builders\TestAssemblyBuilder.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Content Include="Results.xsd">
-      <SubType>Designer</SubType>
-    </Content>
-    <Content Include="Summary.xslt" />
-    <None Include="Results.xsx">
-      <DependentUpon>Results.xsd</DependentUpon>
-    </None>
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\interfaces\nunit.core.interfaces.dll_VS2005.csproj">
-      <Project>{DCC88998-255A-4247-B658-71DD932E9873}</Project>
-      <Name>nunit.core.interfaces.dll_VS2005</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
-</Project>
\ No newline at end of file
diff --git a/src/NUnitCore/interfaces/AssemblyInfo.cs b/src/NUnitCore/interfaces/AssemblyInfo.cs
index c0a0da2..d08af6e 100644
--- a/src/NUnitCore/interfaces/AssemblyInfo.cs
+++ b/src/NUnitCore/interfaces/AssemblyInfo.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -10,5 +10,5 @@ using System.Reflection;
 [assembly: CLSCompliant(true)]
 
 [assembly: AssemblyDelaySign(false)]
-[assembly: AssemblyKeyFile("../../../../nunit.snk")]
+[assembly: AssemblyKeyFile("../../nunit.snk")]
 [assembly: AssemblyKeyName("")]
diff --git a/src/NUnitCore/interfaces/EventListener.cs b/src/NUnitCore/interfaces/EventListener.cs
index a707a58..dfd5dba 100644
--- a/src/NUnitCore/interfaces/EventListener.cs
+++ b/src/NUnitCore/interfaces/EventListener.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 namespace NUnit.Core
@@ -45,7 +45,7 @@ namespace NUnit.Core
 		/// Called when a test case has finished
 		/// </summary>
 		/// <param name="result">The result of the test</param>
-		void TestFinished(TestCaseResult result);
+		void TestFinished(TestResult result);
 
 		/// <summary>
 		/// Called when a suite is starting
@@ -57,7 +57,7 @@ namespace NUnit.Core
 		/// Called when a suite has finished
 		/// </summary>
 		/// <param name="result">The result of the suite</param>
-		void SuiteFinished(TestSuiteResult result);
+		void SuiteFinished(TestResult result);
 
 		/// <summary>
 		/// Called when an unhandled exception is detected during
diff --git a/src/NUnitCore/interfaces/Extensibility/Addin.cs b/src/NUnitCore/interfaces/Extensibility/Addin.cs
index db621a7..bbd754b 100644
--- a/src/NUnitCore/interfaces/Extensibility/Addin.cs
+++ b/src/NUnitCore/interfaces/Extensibility/Addin.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 using System.Reflection;
@@ -106,5 +106,28 @@ namespace NUnit.Core.Extensibility
 			set { message = value; }
 		}
 		#endregion
-	}
+
+        #region Object Overrides
+        /// <summary>
+        /// Return true if two Addins have teh same type name
+        /// </summary>
+        /// <param name="obj">The other addin to be compared</param>
+        public override bool Equals(object obj)
+        {
+            Addin addin = obj as Addin;
+            if (addin == null)
+                return false;
+
+            return this.typeName.Equals(addin.typeName);
+        }
+
+        /// <summary>
+        /// Return a hash code for this addin
+        /// </summary>
+        public override int GetHashCode()
+        {
+            return this.typeName.GetHashCode();
+        }
+        #endregion
+    }
 }
diff --git a/src/NUnitCore/interfaces/Extensibility/AddinStatus.cs b/src/NUnitCore/interfaces/Extensibility/AddinStatus.cs
index c474651..601504f 100644
--- a/src/NUnitCore/interfaces/Extensibility/AddinStatus.cs
+++ b/src/NUnitCore/interfaces/Extensibility/AddinStatus.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 
diff --git a/src/NUnitCore/interfaces/Extensibility/ExtensionType.cs b/src/NUnitCore/interfaces/Extensibility/ExtensionType.cs
index d22b064..aafbcdc 100644
--- a/src/NUnitCore/interfaces/Extensibility/ExtensionType.cs
+++ b/src/NUnitCore/interfaces/Extensibility/ExtensionType.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 
diff --git a/src/NUnitCore/interfaces/Extensibility/IAddin.cs b/src/NUnitCore/interfaces/Extensibility/IAddin.cs
index ef6ab22..1e355d6 100644
--- a/src/NUnitCore/interfaces/Extensibility/IAddin.cs
+++ b/src/NUnitCore/interfaces/Extensibility/IAddin.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 
diff --git a/src/NUnitCore/interfaces/Extensibility/IAddinManager.cs b/src/NUnitCore/interfaces/Extensibility/IAddinManager.cs
deleted file mode 100644
index 2977206..0000000
--- a/src/NUnitCore/interfaces/Extensibility/IAddinManager.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-using System;
-
-namespace NUnit.Core.Extensibility
-{
-	public interface IAddinManager
-	{
-		Addin[] Addins { get; }
-
-		TestFramework[] Frameworks { get; }
-	}
-
-}
diff --git a/src/NUnitCore/interfaces/Extensibility/IAddinRegistry.cs b/src/NUnitCore/interfaces/Extensibility/IAddinRegistry.cs
index f05d2ce..5ea7a0c 100644
--- a/src/NUnitCore/interfaces/Extensibility/IAddinRegistry.cs
+++ b/src/NUnitCore/interfaces/Extensibility/IAddinRegistry.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 
@@ -25,6 +25,13 @@ namespace NUnit.Core.Extensibility
 		/// <param name="addin">The addin to be registered</param>
 		void Register( Addin addin );
 
+        /// <summary>
+        /// Returns true if an addin of a given name is registered
+        /// </summary>
+        /// <param name="name">The name of the addin</param>
+        /// <returns>True if an addin of that name is registered, otherwise false</returns>
+        bool IsAddinRegistered(string name);
+
 		/// <summary>
 		///  Sets the load status of an addin
 		/// </summary>
diff --git a/src/NUnitCore/interfaces/Extensibility/IDataPointProvider.cs b/src/NUnitCore/interfaces/Extensibility/IDataPointProvider.cs
new file mode 100644
index 0000000..c3ffd5a
--- /dev/null
+++ b/src/NUnitCore/interfaces/Extensibility/IDataPointProvider.cs
@@ -0,0 +1,62 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System.Collections;
+using System.Reflection;
+
+namespace NUnit.Core.Extensibility
+{
+    /// <summary>
+    /// The IDataPointProvider interface is used by extensions
+    /// that provide data for a single test parameter.
+    /// </summary>
+    public interface IDataPointProvider
+    {
+        /// <summary>
+        /// Determine whether any data is available for a parameter.
+        /// </summary>
+        /// <param name="parameter">A ParameterInfo representing one
+        /// argument to a parameterized test</param>
+        /// <returns>True if any data is available, otherwise false.</returns>
+        bool HasDataFor(ParameterInfo parameter);
+
+        /// <summary>
+        /// Return an IEnumerable providing data for use with the
+        /// supplied parameter.
+        /// </summary>
+        /// <param name="parameter">A ParameterInfo representing one
+        /// argument to a parameterized test</param>
+        /// <returns>An IEnumerable providing the required data</returns>
+        IEnumerable GetDataFor(ParameterInfo parameter);
+    }
+
+    /// <summary>
+    /// The IDataPointProvider2 interface extends IDataPointProvider
+    /// by making the test fixture for which the test is being built
+    /// available for use.
+    /// </summary>
+    public interface IDataPointProvider2 : IDataPointProvider
+    {
+        /// <summary>
+        /// Determine whether any data is available for a parameter.
+        /// </summary>
+        /// <param name="parameter">A ParameterInfo representing one
+        /// argument to a parameterized test</param>
+        /// <param name="parentSuite">The test suite for which the test is being built</param>
+        /// <returns>True if any data is available, otherwise false.</returns>
+        bool HasDataFor(ParameterInfo parameter, Test parentSuite);
+
+        /// <summary>
+        /// Return an IEnumerable providing data for use with the
+        /// supplied parameter.
+        /// </summary>
+        /// <param name="parameter">A ParameterInfo representing one
+        /// argument to a parameterized test</param>
+        /// <param name="parentSuite">The test suite for which the test is being built</param>
+        /// <returns>An IEnumerable providing the required data</returns>
+        IEnumerable GetDataFor(ParameterInfo parameter, Test parentSuite);
+    }
+}
diff --git a/src/NUnitCore/interfaces/Extensibility/IExtensionHost.cs b/src/NUnitCore/interfaces/Extensibility/IExtensionHost.cs
index f30f58f..d915e59 100644
--- a/src/NUnitCore/interfaces/Extensibility/IExtensionHost.cs
+++ b/src/NUnitCore/interfaces/Extensibility/IExtensionHost.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 
@@ -22,15 +22,16 @@ namespace NUnit.Core.Extensibility
             get;
         }
 
-		/// <summary>
-		/// Get an interface to the framework registry
-		/// </summary>
-		IFrameworkRegistry FrameworkRegistry
-		{
-			get;
-		}
-		
-		/// <summary>
+        /// <summary>
+        /// Get an interface to the framework registry
+        /// </summary>
+        [Obsolete("Use the FrameworkRegistry extension point instead")]
+        IFrameworkRegistry FrameworkRegistry
+        {
+            get;
+        }
+
+        /// <summary>
 		/// Return an extension point by name, if present
 		/// </summary>
 		/// <param name="name">The name of the extension point</param>
diff --git a/src/NUnitCore/interfaces/Extensibility/IExtensionPoint.cs b/src/NUnitCore/interfaces/Extensibility/IExtensionPoint.cs
index d10c0f8..6c793e2 100644
--- a/src/NUnitCore/interfaces/Extensibility/IExtensionPoint.cs
+++ b/src/NUnitCore/interfaces/Extensibility/IExtensionPoint.cs
@@ -1,18 +1,18 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 
 namespace NUnit.Core.Extensibility
 {
-	/// <summary>
-	/// Represents a single point of extension for NUnit. Some extension
-	/// points may accept only a single extension, while others may
-	/// accept more than one at the same time.
-	/// </summary>
-	public interface IExtensionPoint
+    /// <summary>
+    /// Represents a single point of extension for NUnit. Some extension
+    /// points may accept only a single extension, while others may
+    /// accept more than one at the same time.
+    /// </summary>
+    public interface IExtensionPoint
 	{
 		/// <summary>
 		/// Get the name of this extension point
@@ -24,19 +24,42 @@ namespace NUnit.Core.Extensibility
         /// </summary>
         IExtensionHost Host { get; }
 
-		/// <summary>
-		/// Install an extension at this extension point. If the
-		/// extension object does not meet the requirements for
-		/// this extension point, an exception is thrown.
-		/// </summary>
-		/// <param name="extension">The extension to install</param>
-		void Install( object extension );
+        /// <summary>
+        /// Install an extension at this extension point. If the
+        /// extension object does not meet the requirements for
+        /// this extension point, an exception is thrown.
+        /// </summary>
+        /// <param name="extension">The extension to install</param>
+        void Install(object extension);
 
-		/// <summary>
+        /// <summary>
 		/// Removes an extension from this extension point. If the
 		/// extension object is not present, the method returns
 		/// without error.
-		/// <param name="extension"></param>
+        /// </summary>
+        /// <param name="extension"></param>
 		void Remove( object extension );
 	}
+
+    /// <summary>
+    /// Represents a single point of extension for NUnit. Some extension
+    /// points may accept only a single extension, while others may
+    /// accept more than one at the same time. This interface enhances
+    /// IExtensionPoint by allowing specification of a priority
+    /// order for applying addins.
+    /// </summary>
+    public interface IExtensionPoint2 : IExtensionPoint
+    {
+        /// <summary>
+        /// Install an extension at this extension point specifying
+        /// an integer priority value for the extension.If the
+        /// extension object does not meet the requirements for
+        /// this extension point, or if the extension point does
+        /// not support the requested priority level, an exception 
+        /// is thrown.
+        /// </summary>
+        /// <param name="extension">The extension to install</param>
+        /// <param name="priority">The priority level for this extension</param>
+        void Install(object extension, int priority);
+    }
 }
diff --git a/src/NUnitCore/interfaces/Extensibility/IFrameworkRegistry.cs b/src/NUnitCore/interfaces/Extensibility/IFrameworkRegistry.cs
index 7d2945e..d5262dd 100644
--- a/src/NUnitCore/interfaces/Extensibility/IFrameworkRegistry.cs
+++ b/src/NUnitCore/interfaces/Extensibility/IFrameworkRegistry.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 
diff --git a/src/NUnitCore/interfaces/Extensibility/ISuiteBuilder.cs b/src/NUnitCore/interfaces/Extensibility/ISuiteBuilder.cs
index 3bbf7c1..096006a 100644
--- a/src/NUnitCore/interfaces/Extensibility/ISuiteBuilder.cs
+++ b/src/NUnitCore/interfaces/Extensibility/ISuiteBuilder.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitCore/interfaces/Extensibility/ITestCaseBuilder.cs b/src/NUnitCore/interfaces/Extensibility/ITestCaseBuilder.cs
index 22ca86f..654fe3b 100644
--- a/src/NUnitCore/interfaces/Extensibility/ITestCaseBuilder.cs
+++ b/src/NUnitCore/interfaces/Extensibility/ITestCaseBuilder.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System.Reflection;
@@ -14,26 +14,57 @@ namespace NUnit.Core.Extensibility
 	/// </summary>
 	public interface ITestCaseBuilder
 	{
-		/// <summary>
-		/// Examine the method and determine if it is suitable for
-		/// this builder to use in building a TestCase.
-		/// 
-		/// Note that returning false will cause the method to be ignored 
-		/// in loading the tests. If it is desired to load the method
-		/// but label it as non-runnable, ignored, etc., then this
-		/// method must return true.
-		/// 
-		/// Derived classes must override this method.
-		/// </summary>
-		/// <param name="method">The test method to examine</param>
-		/// <returns>True is the builder can use this method</returns>
-		bool CanBuildFrom( MethodInfo method );
+        /// <summary>
+        /// Examine the method and determine if it is suitable for
+        /// this builder to use in building a TestCase.
+        /// 
+        /// Note that returning false will cause the method to be ignored 
+        /// in loading the tests. If it is desired to load the method
+        /// but label it as non-runnable, ignored, etc., then this
+        /// method must return true.
+        /// </summary>
+        /// <param name="method">The test method to examine</param>
+        /// <returns>True is the builder can use this method</returns>
+        bool CanBuildFrom(MethodInfo method);
 
-		/// <summary>
-		/// Build a TestCase from the provided MethodInfo.
-		/// </summary>
-		/// <param name="method">The method to be used as a test case</param>
-		/// <returns>A TestCase or null</returns>
-		Test BuildFrom( MethodInfo method );
-	}
+        /// <summary>
+        /// Build a TestCase from the provided MethodInfo.
+        /// </summary>
+        /// <param name="method">The method to be used as a test case</param>
+        /// <returns>A TestCase or null</returns>
+        Test BuildFrom(MethodInfo method);
+    }
+
+    /// <summary>
+    /// ITestCaseBuilder2 extends ITestCaseBuilder with methods
+    /// that include the suite for which the test case is being
+    /// built. Test case builders not needing the suite can
+    /// continue to implement ITestCaseBuilder.
+    /// </summary>
+    public interface ITestCaseBuilder2 : ITestCaseBuilder
+    {
+        /// <summary>
+        /// Examine the method and determine if it is suitable for
+        /// this builder to use in building a TestCase to be
+        /// included in the suite being populated.
+        /// 
+        /// Note that returning false will cause the method to be ignored 
+        /// in loading the tests. If it is desired to load the method
+        /// but label it as non-runnable, ignored, etc., then this
+        /// method must return true.
+        /// </summary>
+        /// <param name="method">The test method to examine</param>
+        /// <param name="suite">The suite being populated</param>
+        /// <returns>True is the builder can use this method</returns>
+        bool CanBuildFrom(MethodInfo method, Test suite);
+
+        /// <summary>
+        /// Build a TestCase from the provided MethodInfo for
+        /// inclusion in the suite being constructed.
+        /// </summary>
+        /// <param name="method">The method to be used as a test case</param>
+        /// <param name="suite">The test suite being populated, or null</param>
+        /// <returns>A TestCase or null</returns>
+        Test BuildFrom(MethodInfo method, Test suite);
+    }
 }
diff --git a/src/NUnitCore/interfaces/Extensibility/ITestCaseProvider.cs b/src/NUnitCore/interfaces/Extensibility/ITestCaseProvider.cs
new file mode 100644
index 0000000..ea84061
--- /dev/null
+++ b/src/NUnitCore/interfaces/Extensibility/ITestCaseProvider.cs
@@ -0,0 +1,60 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System.Collections;
+using System.Reflection;
+
+namespace NUnit.Core.Extensibility
+{
+    /// <summary>
+    /// The ITestCaseProvider interface is used by extensions
+    /// that provide data for parameterized tests, along with
+    /// certain flags and other indicators used in the test.
+    /// </summary>
+    public interface ITestCaseProvider
+    {
+        /// <summary>
+        /// Determine whether any test cases are available for a parameterized method.
+        /// </summary>
+        /// <param name="method">A MethodInfo representing a parameterized test</param>
+        /// <returns>True if any cases are available, otherwise false.</returns>
+        bool HasTestCasesFor(MethodInfo method);
+
+        /// <summary>
+        /// Return an IEnumerable providing test cases for use in
+        /// running a paramterized test.
+        /// </summary>
+        /// <param name="method"></param>
+        /// <returns></returns>
+        IEnumerable GetTestCasesFor(MethodInfo method);
+    }
+
+    /// <summary>
+    /// ITestCaseProvider2 extends ITestCaseProvider with methods
+    /// that include the suite for which the test case is being
+    /// built. TestCaseProviders not needing the suite can
+    /// continue to implement ITestCaseBuilder.
+    /// </summary>
+    public interface ITestCaseProvider2 : ITestCaseProvider
+    {
+        /// <summary>
+        /// Determine whether any test cases are available for a parameterized method.
+        /// </summary>
+        /// <param name="method">A MethodInfo representing a parameterized test</param>
+        /// <param name="suite">The suite for which the test case is being built</param>
+        /// <returns>True if any cases are available, otherwise false.</returns>
+        bool HasTestCasesFor(MethodInfo method, Test suite);
+
+        /// <summary>
+        /// Return an IEnumerable providing test cases for use in
+        /// running a paramterized test.
+        /// </summary>
+        /// <param name="method"></param>
+        /// <param name="suite">The suite for which the test case is being built</param>
+        /// <returns></returns>
+        IEnumerable GetTestCasesFor(MethodInfo method, Test suite);
+    }
+}
diff --git a/src/NUnitCore/interfaces/Extensibility/ITestDecorator.cs b/src/NUnitCore/interfaces/Extensibility/ITestDecorator.cs
index 4b1933f..78d3cb5 100644
--- a/src/NUnitCore/interfaces/Extensibility/ITestDecorator.cs
+++ b/src/NUnitCore/interfaces/Extensibility/ITestDecorator.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 using System.Reflection;
@@ -9,6 +9,34 @@ using System.Reflection;
 namespace NUnit.Core.Extensibility
 {
 	/// <summary>
+	/// DecoratorPriority wraps constants that may be used
+    /// to represent the relative priority of TestDecorators.
+    /// Decorators with a lower priority are applied first
+    /// so that higher priority decorators wrap them.
+    /// 
+    /// NOTE: This feature is subject to change.
+	/// </summary>
+    public class DecoratorPriority
+	{
+	    /// <summary>
+	    /// The default priority, equivalent to Normal
+	    /// </summary>
+        public static readonly int Default = 0;
+        /// <summary>
+        /// Priority for Decorators that must apply first 
+        /// </summary>
+		public static readonly int First = 1;
+        /// <summary>
+        /// Normal Decorator priority
+        /// </summary>
+		public static readonly int Normal = 5;
+        /// <summary>
+        /// Priority for Decorators that must apply last
+        /// </summary>
+	    public static readonly int Last = 9;
+	}
+
+	/// <summary>
 	/// The ITestDecorator interface is exposed by a class that knows how to
 	/// enhance the functionality of a test case or suite by decorating it.
 	/// </summary>
diff --git a/src/NUnitCore/interfaces/Extensibility/NUnitAddinAttribute.cs b/src/NUnitCore/interfaces/Extensibility/NUnitAddinAttribute.cs
index cf8c88c..bccd6ca 100644
--- a/src/NUnitCore/interfaces/Extensibility/NUnitAddinAttribute.cs
+++ b/src/NUnitCore/interfaces/Extensibility/NUnitAddinAttribute.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 
diff --git a/src/NUnitCore/interfaces/Extensibility/ParameterSet.cs b/src/NUnitCore/interfaces/Extensibility/ParameterSet.cs
new file mode 100644
index 0000000..4946338
--- /dev/null
+++ b/src/NUnitCore/interfaces/Extensibility/ParameterSet.cs
@@ -0,0 +1,324 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Collections.Specialized;
+using System.Reflection;
+
+namespace NUnit.Core.Extensibility
+{
+    /// <summary>
+    /// ParameterSet encapsulates method arguments and
+    /// other selected parameters needed for constructing
+    /// a parameterized test case.
+    /// </summary>
+    public class ParameterSet : NUnit.Framework.ITestCaseData
+    {
+        #region Constants
+        private static readonly string DESCRIPTION = "_DESCRIPTION";
+        private static readonly string IGNOREREASON = "_IGNOREREASON";
+        private static readonly string CATEGORIES = "_CATEGORIES";
+        #endregion
+
+        #region Instance Fields
+        private RunState runState;
+        private Exception providerException;
+        private object[] arguments;
+        private object[] originalArguments;
+        private System.Type expectedExceptionType;
+        private string expectedExceptionName;
+        private string expectedMessage;
+        private string matchType;
+        private object result;
+        private string testName;
+        private string ignoreReason;
+        private bool isIgnored;
+        private bool hasExpectedResult;
+
+        /// <summary>
+        /// A dictionary of properties, used to add information
+        /// to tests without requiring the class to change.
+        /// </summary>
+        private IDictionary properties;
+        #endregion
+
+        #region Properties
+        /// <summary>
+        /// The RunState for this set of parameters.
+        /// </summary>
+        public RunState RunState
+        {
+            get { return runState; }
+            set { runState = value; }
+        }
+
+        /// <summary>
+        /// The reason for not running the test case
+        /// represented by this ParameterSet
+        /// </summary>
+        public string NotRunReason
+        {
+            get { return (string) Properties[IGNOREREASON]; }
+        }
+
+        /// <summary>
+        /// Holds any exception thrown by the parameter provider
+        /// </summary>
+        public Exception ProviderException
+        {
+            get { return providerException; }
+        }
+
+        /// <summary>
+        /// The arguments to be used in running the test,
+        /// which must match the method signature.
+        /// </summary>
+        public object[] Arguments
+        {
+            get { return arguments; }
+            set 
+            {
+                arguments = value;
+
+                if (originalArguments == null)
+                    originalArguments = value;
+            }
+        }
+
+        /// <summary>
+        /// The original arguments supplied by the user,
+        /// used for display purposes.
+        /// </summary>
+        public object[] OriginalArguments
+        {
+            get { return originalArguments; }
+        }
+
+        /// <summary>
+        /// The Type of any exception that is expected.
+        /// </summary>
+        public System.Type ExpectedException
+        {
+            get { return expectedExceptionType; }
+            set { expectedExceptionType = value; }
+        }
+
+        /// <summary>
+        /// The FullName of any exception that is expected
+        /// </summary>
+        public string ExpectedExceptionName
+        {
+            get { return expectedExceptionName; }
+            set { expectedExceptionName = value; }
+        }
+
+        /// <summary>
+        /// The Message of any exception that is expected
+        /// </summary>
+        public string ExpectedMessage
+        {
+        	get { return expectedMessage; }
+        	set { expectedMessage = value; }
+        }
+
+        /// <summary>
+        ///  Gets or sets the type of match to be performed on the expected message
+        /// </summary>
+        public string MatchType
+        {
+            get { return matchType; }
+            set { matchType = value; }
+        }
+
+        /// <summary>
+        /// The expected result of the test, which
+        /// must match the method return type.
+        /// </summary>
+        public object Result
+        {
+            get { return result; }
+            set 
+            { 
+                result = value;
+                hasExpectedResult = true;
+            }
+        }
+
+        /// <summary>
+        /// Returns true if an expected result has been 
+        /// specified for this parameter set.
+        /// </summary>
+        public bool HasExpectedResult
+        {
+            get { return hasExpectedResult; }
+        }
+
+        /// <summary>
+        /// A description to be applied to this test case
+        /// </summary>
+        public string Description
+        {
+            get { return (string) Properties[DESCRIPTION]; }
+            set 
+            {
+                if (value != null)
+                    Properties[DESCRIPTION] = value;
+                else
+                    Properties.Remove(DESCRIPTION);
+            }
+        }
+
+        /// <summary>
+        /// A name to be used for this test case in lieu
+        /// of the standard generated name containing
+        /// the argument list.
+        /// </summary>
+        public string TestName
+        {
+            get { return testName; }
+            set { testName = value; }
+        }
+
+        /// <summary>
+        /// Gets or sets a value indicating whether this <see cref="ParameterSet"/> is ignored.
+        /// </summary>
+        /// <value><c>true</c> if ignored; otherwise, <c>false</c>.</value>
+        public bool Ignored
+        {
+            get { return isIgnored; }
+            set { isIgnored = value; }
+        }
+
+        /// <summary>
+        /// Gets or sets the ignore reason.
+        /// </summary>
+        /// <value>The ignore reason.</value>
+        public string IgnoreReason
+        {
+            get { return ignoreReason; }
+            set { ignoreReason = value; }
+        }
+
+        /// <summary>
+        /// Gets a list of categories associated with this test.
+        /// </summary>
+        public IList Categories
+        {
+            get
+            {
+                if (Properties[CATEGORIES] == null)
+                    Properties[CATEGORIES] = new ArrayList();
+
+                return (IList)Properties[CATEGORIES];
+            }
+        }
+
+        /// <summary>
+        /// Gets the property dictionary for this test
+        /// </summary>
+        public IDictionary Properties
+        {
+            get
+            {
+                if (properties == null)
+                    properties = new ListDictionary();
+
+                return properties;
+            }
+        }
+        #endregion
+
+        #region Constructors
+        /// <summary>
+        /// Construct a non-runnable ParameterSet, specifying
+        /// the provider excetpion that made it invalid.
+        /// </summary>
+        public ParameterSet(Exception exception)
+        {
+            this.runState = RunState.NotRunnable;
+            this.providerException = exception;
+        }
+
+        /// <summary>
+        /// Construct an empty parameter set, which
+        /// defaults to being Runnable.
+        /// </summary>
+        public ParameterSet()
+        {
+            this.runState = RunState.Runnable;
+        }
+        #endregion
+
+        #region Static Methods
+        /// <summary>
+        /// Constructs a ParameterSet from another object, accessing properties 
+        /// by reflection. The object must expose at least an Arguments property
+        /// in order for the test to be runnable.
+        /// </summary>
+        /// <param name="source"></param>
+        public static ParameterSet FromDataSource(object source)
+        {
+            ParameterSet parms = new ParameterSet();
+
+            parms.Arguments = GetParm(source, PropertyNames.Arguments) as object[];
+            parms.ExpectedException = GetParm(source, PropertyNames.ExpectedException) as Type;
+            if (parms.ExpectedException != null)
+                parms.ExpectedExceptionName = parms.ExpectedException.FullName;
+            else
+                parms.ExpectedExceptionName = GetParm(source, PropertyNames.ExpectedExceptionName) as string;
+            parms.ExpectedMessage = GetParm(source, PropertyNames.ExpectedMessage) as string;
+            object matchEnum = GetParm(source, PropertyNames.MatchType);
+            if ( matchEnum != null )
+                parms.MatchType = matchEnum.ToString();
+            parms.Result = GetParm(source, PropertyNames.Result);
+            parms.Description = GetParm(source, PropertyNames.Description) as string;
+            parms.TestName = GetParm(source, PropertyNames.TestName) as string;
+
+            object objIgnore = GetParm(source, PropertyNames.Ignored);
+            if ( objIgnore != null )
+                parms.Ignored = (bool)objIgnore;
+            parms.IgnoreReason = GetParm(source, PropertyNames.IgnoreReason) as string;
+
+            // Some sources may also implement Properties and/or Categories
+            bool gotCategories = false;
+            IDictionary props = GetParm(source, PropertyNames.Properties) as IDictionary;
+            if ( props != null )
+                foreach (string key in props.Keys)
+                {
+                    parms.Properties.Add(key, props[key]);
+                    if (key == CATEGORIES) gotCategories = true;
+                }
+
+            // Some sources implement Categories. They may have been
+            // provided as properties or they may be separate.
+            if (!gotCategories)
+            {
+                IList categories = GetParm(source, PropertyNames.Categories) as IList;
+                if (categories != null) 
+                    foreach (string cat in categories)
+                        parms.Categories.Add(cat);
+            }
+
+            return parms;
+        }
+
+        private static object GetParm(object source, string name)
+        {
+            Type type = source.GetType();
+            PropertyInfo prop = type.GetProperty(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.GetProperty);
+            if (prop != null)
+                return prop.GetValue(source, null);
+
+            FieldInfo field = type.GetField(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.GetField);
+            if (field != null)
+                return field.GetValue(source);
+
+            return null;
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/interfaces/Extensibility/TestFramework.cs b/src/NUnitCore/interfaces/Extensibility/TestFramework.cs
index ccbeac1..be0b5c0 100644
--- a/src/NUnitCore/interfaces/Extensibility/TestFramework.cs
+++ b/src/NUnitCore/interfaces/Extensibility/TestFramework.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitCore/interfaces/Filters/AndFilter.cs b/src/NUnitCore/interfaces/Filters/AndFilter.cs
index d85d8c5..787af24 100644
--- a/src/NUnitCore/interfaces/Filters/AndFilter.cs
+++ b/src/NUnitCore/interfaces/Filters/AndFilter.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 using System.Collections;
diff --git a/src/NUnitCore/interfaces/Filters/CategoryFilter.cs b/src/NUnitCore/interfaces/Filters/CategoryFilter.cs
index 9131bb9..dd709d1 100644
--- a/src/NUnitCore/interfaces/Filters/CategoryFilter.cs
+++ b/src/NUnitCore/interfaces/Filters/CategoryFilter.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitCore/interfaces/Filters/NameFilter.cs b/src/NUnitCore/interfaces/Filters/NameFilter.cs
index 326517e..b0ecf96 100644
--- a/src/NUnitCore/interfaces/Filters/NameFilter.cs
+++ b/src/NUnitCore/interfaces/Filters/NameFilter.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitCore/interfaces/Filters/NotFilter.cs b/src/NUnitCore/interfaces/Filters/NotFilter.cs
index 42af81b..bc18e9e 100644
--- a/src/NUnitCore/interfaces/Filters/NotFilter.cs
+++ b/src/NUnitCore/interfaces/Filters/NotFilter.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 
@@ -14,6 +14,7 @@ namespace NUnit.Core.Filters
 	public class NotFilter : TestFilter
 	{
 		ITestFilter baseFilter;
+        bool topLevel = false;
 
 		/// <summary>
 		/// Construct a not filter on another filter
@@ -24,6 +25,16 @@ namespace NUnit.Core.Filters
 			this.baseFilter = baseFilter;
 		}
 
+        /// <summary>
+        /// Indicates whether this is a top-level NotFilter,
+        /// requiring special handling of Explicit
+        /// </summary>
+        public bool TopLevel
+        {
+            get { return topLevel; }
+            set { topLevel = value; }
+        }
+
 		/// <summary>
 		/// Gets the base filter
 		/// </summary>
@@ -39,7 +50,10 @@ namespace NUnit.Core.Filters
 		/// <returns>True if it matches, otherwise false</returns>
 		public override bool Match( ITest test )
 		{
-			return test.RunState != RunState.Explicit && !baseFilter.Pass( test );
+            if (topLevel && test.RunState == RunState.Explicit)
+                return false;
+
+			return !baseFilter.Pass( test );
 		}
 
 		/// <summary>
@@ -49,7 +63,7 @@ namespace NUnit.Core.Filters
 		/// <returns>True if at least one descendant matches the filter criteria</returns>
 		protected override bool MatchDescendant(ITest test)
 		{
-			if (!test.IsSuite || test.Tests == null || test.RunState == RunState.Explicit)
+			if (!test.IsSuite || test.Tests == null || topLevel && test.RunState == RunState.Explicit)
 				return false;
 
 			foreach (ITest child in test.Tests)
diff --git a/src/NUnitCore/interfaces/Filters/OrFilter.cs b/src/NUnitCore/interfaces/Filters/OrFilter.cs
index dc28008..c0fba0e 100644
--- a/src/NUnitCore/interfaces/Filters/OrFilter.cs
+++ b/src/NUnitCore/interfaces/Filters/OrFilter.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 using System.Collections;
diff --git a/src/NUnitCore/interfaces/Filters/SimpleNameFilter.cs b/src/NUnitCore/interfaces/Filters/SimpleNameFilter.cs
index 3104ca3..f277b4c 100644
--- a/src/NUnitCore/interfaces/Filters/SimpleNameFilter.cs
+++ b/src/NUnitCore/interfaces/Filters/SimpleNameFilter.cs
@@ -1,11 +1,10 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 using System.Collections;
-using System.Text;
 
 namespace NUnit.Core.Filters
 {
@@ -25,22 +24,41 @@ namespace NUnit.Core.Filters
         /// <summary>
         /// Construct a SimpleNameFilter for a single name
         /// </summary>
-        /// <param name="name">The name the filter will recognize</param>
-		public SimpleNameFilter( string name )
+        /// <param name="name">The name the filter will recognize.</param>
+        public SimpleNameFilter(string name)
         {
-            this.names.Add( name );
+            names.Add(name);
         }
 
-		/// <summary>
-		/// Add a name to a SimpleNameFilter
-		/// </summary>
-		/// <param name="name">The name to be added</param>
-		public void Add( string name )
-		{
-			names.Add( name );
-		}
+        /// <summary>
+        /// Construct a SimpleNameFilter for an array of names
+        /// </summary>
+        /// <param names="nameToAdd">The names the filter will recognize.</param>
+        public SimpleNameFilter(string[] namesToAdd)
+        {
+            this.names.AddRange(namesToAdd);
+        }
 
-		/// <summary>
+        /// <summary>
+        /// Add a name to a SimpleNameFilter
+        /// </summary>
+        /// <param name="name">The name to be added.</param>
+        public void Add(string name)
+        {
+            names.Add(name);
+        }
+
+        /// <summary>
+        /// Add an array of names to a SimpleNameFilter
+        /// </summary>
+        /// <param name="namesToAdd">The name to be added.</param>
+        public void Add(string[] namesToAdd)
+        {
+            foreach (string name in namesToAdd)
+                names.Add(name);
+        }
+
+        /// <summary>
 		/// Check whether the filter matches a test
 		/// </summary>
 		/// <param name="test">The test to be matched</param>
diff --git a/src/NUnitCore/interfaces/IAgency.cs b/src/NUnitCore/interfaces/IAgency.cs
new file mode 100644
index 0000000..6bc8efb
--- /dev/null
+++ b/src/NUnitCore/interfaces/IAgency.cs
@@ -0,0 +1,23 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Core
+{
+    /// <summary>
+    /// The IAgency interface is implemented by a TestAgency in 
+    /// order to allow TestAgents to register with it.
+    /// </summary>
+    public interface IAgency
+    {
+        /// <summary>
+        /// Registers an agent with an agency
+        /// </summary>
+        /// <param name="agent"></param>
+        void Register(TestAgent agent);
+    }
+}
diff --git a/src/NUnitCore/interfaces/IService.cs b/src/NUnitCore/interfaces/IService.cs
index 0a4541a..6d79ece 100644
--- a/src/NUnitCore/interfaces/IService.cs
+++ b/src/NUnitCore/interfaces/IService.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 
diff --git a/src/NUnitCore/interfaces/ITest.cs b/src/NUnitCore/interfaces/ITest.cs
index 6a4a5b2..634c8e3 100644
--- a/src/NUnitCore/interfaces/ITest.cs
+++ b/src/NUnitCore/interfaces/ITest.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System.Collections;
diff --git a/src/NUnitCore/interfaces/ITestFilter.cs b/src/NUnitCore/interfaces/ITestFilter.cs
index 3faa4e7..fa4d78e 100644
--- a/src/NUnitCore/interfaces/ITestFilter.cs
+++ b/src/NUnitCore/interfaces/ITestFilter.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 
diff --git a/src/NUnitCore/interfaces/OSPlatform.cs b/src/NUnitCore/interfaces/OSPlatform.cs
new file mode 100644
index 0000000..dc1aa87
--- /dev/null
+++ b/src/NUnitCore/interfaces/OSPlatform.cs
@@ -0,0 +1,329 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Runtime.InteropServices;
+
+namespace NUnit.Core
+{
+    /// <summary>
+    /// OSPlatform represents a particular operating system platform
+    /// </summary>
+    public class OSPlatform
+    {
+        PlatformID platform;
+        Version version;
+        ProductType product;
+
+        #region Static Members
+        private static OSPlatform currentPlatform;
+
+        
+        /// <summary>
+        /// Platform ID for Unix as defined by Microsoft .NET 2.0 and greater
+        /// </summary>
+        public static readonly PlatformID UnixPlatformID_Microsoft = (PlatformID)4;
+
+        /// <summary>
+        /// Platform ID for Unix as defined by Mono
+        /// </summary>
+        public static readonly PlatformID UnixPlatformID_Mono = (PlatformID)128;
+
+        /// <summary>
+        /// Get the OSPlatform under which we are currently running
+        /// </summary>
+        public static OSPlatform CurrentPlatform
+        {
+            get
+            {
+                if (currentPlatform == null)
+                {
+                    OperatingSystem os = Environment.OSVersion;
+
+                    if (os.Platform == PlatformID.Win32NT && os.Version.Major >= 5)
+                    {
+                        OSVERSIONINFOEX osvi = new OSVERSIONINFOEX();
+                        osvi.dwOSVersionInfoSize = (uint)Marshal.SizeOf(osvi);
+                        GetVersionEx(ref osvi);
+                        currentPlatform = new OSPlatform(os.Platform, os.Version, (ProductType)osvi.ProductType);
+                    }
+                    else
+                        currentPlatform = new OSPlatform(os.Platform, os.Version);
+                }
+
+                return currentPlatform;
+            }
+        }
+        #endregion
+
+        #region Members used for Win32NT platform only
+        /// <summary>
+        /// Product Type Enumeration used for Windows
+        /// </summary>
+        public enum ProductType
+        {
+            /// <summary>
+            /// Product type is unknown or unspecified
+            /// </summary>
+            Unknown,
+
+            /// <summary>
+            /// Product type is Workstation
+            /// </summary>
+            WorkStation,
+
+            /// <summary>
+            /// Product type is Domain Controller
+            /// </summary>
+            DomainController,
+
+            /// <summary>
+            /// Product type is Server
+            /// </summary>
+            Server,
+        }
+
+        [StructLayout(LayoutKind.Sequential)]
+        struct OSVERSIONINFOEX
+        {
+            public uint dwOSVersionInfoSize;
+            public uint dwMajorVersion;
+            public uint dwMinorVersion;
+            public uint dwBuildNumber;
+            public uint dwPlatformId;
+            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
+            public string szCSDVersion;
+            public Int16 wServicePackMajor;
+            public Int16 wServicePackMinor;
+            public Int16 wSuiteMask;
+            public Byte ProductType;
+            public Byte Reserved;
+        }
+
+        [DllImport("Kernel32.dll")]
+        private static extern bool GetVersionEx(ref OSVERSIONINFOEX osvi);
+        #endregion
+
+        /// <summary>
+        /// Construct from a platform ID and version
+        /// </summary>
+        public OSPlatform(PlatformID platform, Version version)
+        {
+            this.platform = platform;
+            this.version = version;
+        }
+
+        /// <summary>
+        /// Construct from a platform ID, version and product type
+        /// </summary>
+        public OSPlatform(PlatformID platform, Version version, ProductType product)
+            : this( platform, version )
+        {
+            this.product = product;
+        }
+
+        /// <summary>
+        /// Get the platform ID of this instance
+        /// </summary>
+        public PlatformID Platform
+        {
+            get { return platform; }
+        }
+
+        /// <summary>
+        /// Get the Version of this instance
+        /// </summary>
+        public Version Version
+        {
+            get { return version; }
+        }
+
+        /// <summary>
+        /// Get the Product Type of this instance
+        /// </summary>
+        public ProductType Product
+        {
+            get { return product; }
+        }
+
+        /// <summary>
+        /// Return true if this is a windows platform
+        /// </summary>
+        public bool IsWindows
+        {
+            get
+            {
+                return platform == PlatformID.Win32NT
+                    || platform == PlatformID.Win32Windows
+                    || platform == PlatformID.Win32S
+                    || platform == PlatformID.WinCE;
+            }
+        }
+
+        /// <summary>
+        /// Return true if this is a Unix or Linux platform
+        /// </summary>
+        public bool IsUnix
+        {
+            get
+            {
+                return platform == UnixPlatformID_Microsoft
+                    || platform == UnixPlatformID_Mono;
+            }
+        }
+
+        /// <summary>
+        /// Return true if the platform is Win32S
+        /// </summary>
+        public bool IsWin32S
+        {
+            get { return platform == PlatformID.Win32S; }
+        }
+
+        /// <summary>
+        /// Return true if the platform is Win32Windows
+        /// </summary>
+        public bool IsWin32Windows
+        {
+            get { return platform == PlatformID.Win32Windows; }
+        }
+
+        /// <summary>
+        ///  Return true if the platform is Win32NT
+        /// </summary>
+        public bool IsWin32NT
+        {
+            get { return platform == PlatformID.Win32NT; }
+        }
+
+        /// <summary>
+        /// Return true if the platform is Windows CE
+        /// </summary>
+        public bool IsWinCE
+        {
+            get { return (int)platform == 3; } // PlatformID.WinCE not defined in .NET 1.0
+        }
+
+        /// <summary>
+        /// Return true if the platform is Windows 95
+        /// </summary>
+        public bool IsWin95
+        {
+            get { return platform == PlatformID.Win32Windows && version.Major == 4 && version.Minor == 0; }
+        }
+
+        /// <summary>
+        /// Return true if the platform is Windows 98
+        /// </summary>
+        public bool IsWin98
+        {
+            get { return platform == PlatformID.Win32Windows && version.Major == 4 && version.Minor == 10; }
+        }
+
+        /// <summary>
+        /// Return true if the platform is Windows ME
+        /// </summary>
+        public bool IsWinME
+        {
+            get { return platform == PlatformID.Win32Windows && version.Major == 4 && version.Minor == 90; }
+        }
+
+        /// <summary>
+        /// Return true if the platform is NT 3
+        /// </summary>
+        public bool IsNT3
+        {
+            get { return platform == PlatformID.Win32NT && version.Major == 3; }
+        }
+
+        /// <summary>
+        /// Return true if the platform is NT 4
+        /// </summary>
+        public bool IsNT4
+        {
+            get { return platform == PlatformID.Win32NT && version.Major == 4; }
+        }
+
+        /// <summary>
+        /// Return true if the platform is NT 5
+        /// </summary>
+        public bool IsNT5
+        {
+            get { return platform == PlatformID.Win32NT && version.Major == 5; }
+        }
+
+        /// <summary>
+        /// Return true if the platform is Windows 2000
+        /// </summary>
+        public bool IsWin2K
+        {
+            get { return IsNT5 && version.Minor == 0; }
+        }
+
+        /// <summary>
+        /// Return true if the platform is Windows XP
+        /// </summary>
+        public bool IsWinXP
+        {
+            get { return IsNT5 && version.Minor == 1 || (version.Minor == 2 && Product == ProductType.WorkStation); }
+        }
+
+        /// <summary>
+        /// Return true if the platform is Windows 2003 Server
+        /// </summary>
+        public bool IsWin2003Server
+        {
+            get { return IsNT5 && version.Minor == 2 && Product == ProductType.Server; }
+        }
+
+        /// <summary>
+        /// Return true if the platform is NT 6
+        /// </summary>
+        public bool IsNT6
+        {
+            get { return platform == PlatformID.Win32NT && version.Major == 6; }
+        }
+
+        /// <summary>
+        /// Return true if the platform is Vista
+        /// </summary>
+        public bool IsVista
+        {
+            get { return IsNT6 && version.Minor == 0 && Product == ProductType.WorkStation; }
+        }
+
+        /// <summary>
+        /// Return true if the platform is Windows 2008 Server (original or R2)
+        /// </summary>
+        public bool IsWin2008Server
+        {
+            get { return IsNT6 && Product == ProductType.Server; }
+        }
+
+        /// <summary>
+        /// Return true if the platform is Windows 2008 Server (original)
+        /// </summary>
+        public bool IsWin2008ServerR1
+        {
+            get { return IsNT6 && version.Minor == 0 && Product == ProductType.Server; }
+        }
+
+        /// <summary>
+        /// Return true if the platform is Windows 2008 Server R2
+        /// </summary>
+        public bool IsWin2008ServerR2
+        {
+            get { return IsNT6 && version.Minor == 1 && Product == ProductType.Server; }
+        }
+
+        /// <summary>
+        /// Return true if the platform is Windows 7
+        /// </summary>
+        public bool IsWindows7
+        {
+            get { return IsNT6 && version.Minor == 1 && Product == ProductType.WorkStation; }
+        }
+    }
+}
diff --git a/src/NUnitCore/interfaces/PropertyNames.cs b/src/NUnitCore/interfaces/PropertyNames.cs
new file mode 100644
index 0000000..4c6bf1a
--- /dev/null
+++ b/src/NUnitCore/interfaces/PropertyNames.cs
@@ -0,0 +1,55 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Core
+{
+    /// <summary>
+    /// The PropertyNames struct lists common property names, which are
+    /// accessed by reflection in the NUnit core. This provides a modicum 
+    /// of type safety as opposed to using the strings directly.
+    /// </summary>
+    public struct PropertyNames
+    {
+        /// <summary>Exception Type expected from a test</summary>
+        public static readonly string ExpectedException = "ExpectedException";
+        /// <summary>Exception Type expected from a test (pre-2.5)</summary>
+        public static readonly string LegacyExceptionType = "ExceptionType";
+        /// <summary>FullName of the Exception Type expected from a test</summary>
+        public static readonly string ExpectedExceptionName = "ExpectedExceptionName";
+        /// <summary>FullName of the Exception Type expected from a test (pre-2.5)</summary>
+        public static readonly string LegacyExceptionName = "ExceptionName";
+        /// <summary>ExpectedException Message</summary>
+        public static readonly string ExpectedMessage = "ExpectedMessage";
+        /// <summary>ExpectedException MatchType</summary>
+        public static readonly string MatchType = "MatchType";
+        /// <summary>Expected return result from test</summary>
+        public static readonly string Result = "Result";
+        /// <summary>Description of the test</summary>
+        public static readonly string Description = "Description";
+        /// <summary>Alternate test name</summary>
+        public static readonly string TestName = "TestName";
+        /// <summary>Arguments for the test</summary>
+        public static readonly string Arguments = "Arguments";
+        /// <summary>Indicates test case is ignored</summary>
+        public static readonly string Ignored = "Ignored";
+        /// <summary>The reason a test case is ignored</summary>
+        public static readonly string IgnoreReason = "IgnoreReason";
+        /// <summary>Properties of the test</summary>
+        public static readonly string Properties = "Properties";
+        /// <summary>Categories of the test</summary>
+        public static readonly string Categories = "Categories";
+        /// <summary>Name of a category</summary>
+        public static readonly string CategoryName = "Name";
+        /// <summary>Reason for not running a test</summary>
+        public static readonly string Reason = "Reason";
+        /// <summary>Flag indicating excluded test should be marked as Ignored</summary>
+        public static readonly string IgnoreExcluded = "IgnoreExcluded";
+        /// <summary>Name of an addin that must be present to run a test</summary>
+        public static readonly string RequiredAddin = "RequiredAddin";
+    }
+}
diff --git a/src/NUnitCore/interfaces/ResultState.cs b/src/NUnitCore/interfaces/ResultState.cs
index f84a729..4a8128c 100644
--- a/src/NUnitCore/interfaces/ResultState.cs
+++ b/src/NUnitCore/interfaces/ResultState.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 
@@ -13,19 +13,44 @@ namespace NUnit.Core
 	public enum ResultState
 	{
         /// <summary>
+        /// The result is inconclusive
+        /// </summary>
+        Inconclusive = 0,
+
+        /// <summary>
+        /// The test was not runnable.
+        /// </summary>
+		NotRunnable = 1, 
+
+        /// <summary>
+        /// The test has been skipped. 
+        /// </summary>
+		Skipped = 2,
+
+        /// <summary>
+        /// The test has been ignored.
+        /// </summary>
+		Ignored = 3,
+
+        /// <summary>
         /// The test succeeded
         /// </summary>
-		Success,
+		Success = 4,
 
         /// <summary>
         /// The test failed
         /// </summary>
-		Failure,
+		Failure = 5,
 
         /// <summary>
         /// The test encountered an unexpected exception
         /// </summary>
-		Error
+		Error = 6,
+
+        /// <summary>
+        /// The test was cancelled by the user
+        /// </summary>
+        Cancelled =7
 	}
 
     /// <summary>
@@ -34,11 +59,6 @@ namespace NUnit.Core
     /// </summary>
     public enum FailureSite
     {
-		/// <summary>
-		/// The location of the failure is not known
-		/// </summary>
-		Unknown,
-
         /// <summary>
         /// Failure in the test itself
         /// </summary>
diff --git a/src/NUnitCore/interfaces/ResultVisitor.cs b/src/NUnitCore/interfaces/ResultVisitor.cs
deleted file mode 100644
index e2e0042..0000000
--- a/src/NUnitCore/interfaces/ResultVisitor.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-namespace NUnit.Core
-{
-    /// <summary>
-    /// The ResultVisitor interface implements the
-    /// Visitor pattern over TestResults
-    /// </summary>
-	public interface ResultVisitor
-	{
-        /// <summary>
-        /// Visit a TestCaseResult
-        /// </summary>
-        /// <param name="caseResult">The result to visit</param>
-		void Visit(TestCaseResult caseResult);
-
-        /// <summary>
-        /// Visit a TestSuiteResult
-        /// </summary>
-        /// <param name="suiteResult">The result to visit</param>
-		void Visit(TestSuiteResult suiteResult);
-	}
-}
diff --git a/src/NUnitCore/interfaces/RunState.cs b/src/NUnitCore/interfaces/RunState.cs
index 0ac551b..dda6b59 100644
--- a/src/NUnitCore/interfaces/RunState.cs
+++ b/src/NUnitCore/interfaces/RunState.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 
@@ -9,38 +9,45 @@ namespace NUnit.Core
 {
 	/// <summary>
 	/// The RunState enum indicates whether a test
-    /// has been or can be executed.
+    /// can be executed. When used on a TestResult
+    /// it may also indicate whether the test has
+    /// been executed. See individual values for
+    /// restrictions on use.
 	/// </summary>
 	public enum RunState
 	{
         /// <summary>
-        /// The test is not runnable
+        /// The test is not runnable.
         /// </summary>
-		NotRunnable,
+		NotRunnable, 
 
         /// <summary>
-        /// The test is runnable
+        /// The test is runnable. This value would 
+        /// normally not appear on a TestResult, since
+        /// it would change to Executed.
         /// </summary>
 		Runnable,
 
         /// <summary>
-        /// The test can only be run explicitly
+        /// The test can only be run explicitly. Would
+        /// normally not appear on a TestResult, since
+        /// it would change to Executed or Skipped.
         /// </summary>
 		Explicit,
 
         /// <summary>
-        /// The test has been skipped
+        /// The test has been skipped. This value may
+        /// appear on a Test when certain attributes
+        /// are used to skip the test.
         /// </summary>
 		Skipped,
 
         /// <summary>
-        /// The test has been ignored
+        /// The test has been ignored. May appear on
+        /// a Test, when the IgnoreAttribute is used.
+        /// Appears on a TestResult in that case or
+        /// if the test is dynamically ignored.
         /// </summary>
-		Ignored,
-
-        /// <summary>
-        /// The test has been executed
-        /// </summary>
-		Executed
+		Ignored
 	}
 }
diff --git a/src/NUnitCore/interfaces/RuntimeFramework.cs b/src/NUnitCore/interfaces/RuntimeFramework.cs
index 2920feb..11edd38 100644
--- a/src/NUnitCore/interfaces/RuntimeFramework.cs
+++ b/src/NUnitCore/interfaces/RuntimeFramework.cs
@@ -1,11 +1,14 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
+using System.IO;
 using System.Reflection;
+using System.Collections;
+using Microsoft.Win32;
 
 namespace NUnit.Core
 {
@@ -15,6 +18,8 @@ namespace NUnit.Core
 	/// </summary>
 	public enum RuntimeType
 	{
+        /// <summary>Any supported runtime framework</summary>
+        Any,
 		/// <summary>Microsoft .NET Framework</summary>
 		Net,
 		/// <summary>Microsoft .NET Compact Framework</summary>
@@ -29,69 +34,430 @@ namespace NUnit.Core
 	/// RuntimeFramework represents a particular version
 	/// of a common language runtime implementation.
 	/// </summary>
+    [Serializable]
 	public sealed class RuntimeFramework
-	{
-		private RuntimeType runtime;
-		private Version version;
+    {
+        #region Static and Instance Fields
+
+        /// <summary>
+        /// DefaultVersion is an empty Version, used to indicate that
+        /// NUnit should select the CLR version to use for the test.
+        /// </summary>
+        public static readonly Version DefaultVersion = new Version();
+
+        private static RuntimeFramework currentFramework;
+        private static RuntimeFramework[] availableFrameworks;
+      
+        private RuntimeType runtime;
+        private Version frameworkVersion;
+        private Version clrVersion;
+		private string displayName;
+        #endregion
+
+        #region Constructor
 
-		/// <summary>
-		/// Constructor
+        /// <summary>
+		/// Construct from a runtime type and version
 		/// </summary>
 		/// <param name="runtime">The runtime type of the framework</param>
 		/// <param name="version">The version of the framework</param>
-		public RuntimeFramework( RuntimeType runtime, Version version )
+		public RuntimeFramework( RuntimeType runtime, Version version)
 		{
 			this.runtime = runtime;
-			this.version = version;
-		}
+            this.frameworkVersion = version;
 
-		/// <summary>
-		/// Static method to return a RuntimeFramework object
-		/// for the frameowrk that is currently in use.
-		/// </summary>
-		public static RuntimeFramework CurrentFramework
-		{
-			get 
-			{ 
-				RuntimeType runtime = Type.GetType( "Mono.Runtime", false ) != null
-					? RuntimeType.Mono : RuntimeType.Net;
+            this.clrVersion = version;
+            if (frameworkVersion.Major == 3)
+                this.clrVersion = new Version(2, 0);
+            else if (runtime == RuntimeType.Mono && version.Major == 1)
+                this.clrVersion = new Version(1, 1);
 
-				return new RuntimeFramework( runtime, Environment.Version );
-			}
-		}
+            this.displayName = GetDefaultDisplayName(runtime, version);
+        }
 
-		/// <summary>
-		/// The type of this runtime framework
-		/// </summary>
-		public RuntimeType Runtime
-		{
-			get { return runtime; }
-		}
+        #endregion
 
-		/// <summary>
-		/// The version of this runtime framework
-		/// </summary>
-		public Version Version
-		{
-			get { return version; }
-		}
+        #region Properties
 
-		/// <summary>
-		/// Gets a display string for the particular framework version
-		/// </summary>
-		/// <returns>A string used to display the framework in use</returns>
-		public string GetDisplayName()
+        /// <summary>
+        /// Static method to return a RuntimeFramework object
+        /// for the framework that is currently in use.
+        /// </summary>
+        public static RuntimeFramework CurrentFramework
+        {
+            get
+            {
+                if (currentFramework == null)
+                {
+                    Type monoRuntimeType = Type.GetType("Mono.Runtime", false);
+                    bool isMono = monoRuntimeType != null;
+
+                    RuntimeType runtime = isMono ? RuntimeType.Mono : RuntimeType.Net;
+
+                    int major = Environment.Version.Major;
+                    int minor = Environment.Version.Minor;
+
+                    if (isMono && major == 1)
+                        minor = 0;
+
+                    currentFramework = new RuntimeFramework(runtime, new Version(major, minor));
+                    currentFramework.clrVersion = Environment.Version;
+
+                    if (isMono)
+                    {
+                        MethodInfo getDisplayNameMethod = monoRuntimeType.GetMethod(
+                            "GetDisplayName", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.DeclaredOnly | BindingFlags.ExactBinding);
+                        if (getDisplayNameMethod != null)
+                            currentFramework.displayName = (string)getDisplayNameMethod.Invoke(null, new object[0]);
+                    }
+                }
+
+                return currentFramework;
+            }
+        }
+
+        /// <summary>
+        /// Gets an array of all available frameworks
+        /// </summary>
+        public static RuntimeFramework[] AvailableFrameworks
+        {
+            get
+            {
+                if (availableFrameworks == null)
+                {
+                    FrameworkCollection frameworks = new FrameworkCollection();
+
+                    AppendDotNetFrameworks(frameworks);
+                    AppendDefaultMonoFramework(frameworks);
+                    // NYI
+                    //AppendMonoFrameworks(frameworks);
+
+                    availableFrameworks = frameworks.ToArray();
+                }
+
+                return availableFrameworks;
+            }
+        }
+
+        /// <summary>
+        /// Returns true if the current RuntimeFramework is available.
+        /// In the current implementation, only Mono and Microsoft .NET
+        /// are supported.
+        /// </summary>
+        /// <returns>True if it's available, false if not</returns>
+        public bool IsAvailable
+        {
+            get
+            {
+                foreach (RuntimeFramework framework in AvailableFrameworks)
+                    if (this.Matches(framework))
+                        return true;
+
+                return false;
+            }
+        }
+
+        /// <summary>
+        /// The type of this runtime framework
+        /// </summary>
+        public RuntimeType Runtime
+        {
+            get { return runtime; }
+        }
+
+        /// <summary>
+        /// The framework version for this runtime framework
+        /// </summary>
+        public Version FrameworkVersion
+        {
+            get { return frameworkVersion; }
+        }
+
+        /// <summary>
+        /// The CLR version for this runtime framework
+        /// </summary>
+        public Version ClrVersion
+        {
+            get { return clrVersion; }
+        }
+
+        /// <summary>
+        /// Return true if any CLR version may be used in
+        /// matching this RuntimeFramework object.
+        /// </summary>
+        public bool AllowAnyVersion
+        {
+            get { return this.clrVersion == DefaultVersion; }
+        }
+
+        /// <summary>
+        /// Returns the Display name for this framework
+        /// </summary>
+        public string DisplayName
+        {
+            get { return displayName; }
+        }
+
+        #endregion
+
+        #region Public Methods
+
+        /// <summary>
+        /// Parses a string representing a RuntimeFramework.
+        /// The string may be just a RuntimeType name or just
+        /// a Version or a hyphentated RuntimeType-Version or
+        /// a Version prefixed by 'v'.
+        /// </summary>
+        /// <param name="s"></param>
+        /// <returns></returns>
+        public static RuntimeFramework Parse(string s)
+        {
+            RuntimeType runtime = RuntimeType.Any;
+            Version version = DefaultVersion;
+
+            string[] parts = s.Split(new char[] { '-' });
+            if (parts.Length == 2)
+            {
+                runtime = (RuntimeType)System.Enum.Parse(typeof(RuntimeType), parts[0], true);
+                string vstring = parts[1];
+                if (vstring != "")
+                    version = new Version(vstring);
+            }
+            else if (char.ToLower(s[0]) == 'v')
+            {
+                version = new Version(s.Substring(1));
+            }
+            else if (IsRuntimeTypeName(s))
+            {
+                runtime = (RuntimeType)System.Enum.Parse(typeof(RuntimeType), s, true);
+            }
+            else
+            {
+                version = new Version(s);
+            }
+
+            return new RuntimeFramework(runtime, version);
+        }
+
+        /// <summary>
+        /// Returns the best available framework that matches a target framework.
+        /// If the target framework has a build number specified, then an exact
+        /// match is needed. Otherwise, the matching framework with the highest
+        /// build number is used.
+        /// </summary>
+        /// <param name="target"></param>
+        /// <returns></returns>
+        public static RuntimeFramework GetBestAvailableFramework(RuntimeFramework target)
+        {
+            RuntimeFramework result = target;
+
+            if (target.ClrVersion.Build < 0)
+            {
+                foreach (RuntimeFramework framework in AvailableFrameworks)
+                    if (framework.Matches(target) && 
+                        framework.ClrVersion.Build > result.ClrVersion.Build)
+                    {
+                        result = framework;
+                    }
+            }
+
+            return result;
+        }
+
+        /// <summary>
+        /// Overridden to return the short name of the framework
+        /// </summary>
+        /// <returns></returns>
+		public override string ToString()
 		{
-			if ( runtime == RuntimeType.Mono )
-			{
-				Type monoRuntimeType = Type.GetType( "Mono.Runtime", false );
-				MethodInfo getDisplayNameMethod = monoRuntimeType.GetMethod(
-					"GetDisplayName", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.DeclaredOnly | BindingFlags.ExactBinding );
-				if ( getDisplayNameMethod != null )
-					return (string)getDisplayNameMethod.Invoke( null, new object[0] );
-			}
-
-			return runtime.ToString() + " " + Version.ToString();
+            if (this.AllowAnyVersion)
+            {
+                return runtime.ToString().ToLower();
+            }
+            else
+            {
+                string vstring = frameworkVersion.ToString();
+                if (runtime == RuntimeType.Any)
+                    return "v" + vstring;
+                else
+                    return runtime.ToString().ToLower() + "-" + vstring;
+            }
 		}
-	}
+
+        /// <summary>
+        /// Returns true if this framework "matches" the one supplied
+        /// as an argument. Two frameworks match if their runtime types 
+        /// are the same or either one is RuntimeType.Any and all specified 
+        /// components of the CLR version are equal. Negative (i.e. unspecified) 
+        /// version components are ignored.
+        /// </summary>
+        /// <param name="other">The RuntimeFramework to be matched.</param>
+        /// <returns>True on match, otherwise false</returns>
+        public bool Matches(RuntimeFramework other)
+        {
+            if (this.Runtime != RuntimeType.Any
+                && other.Runtime != RuntimeType.Any
+                && this.Runtime != other.Runtime)
+                return false;
+
+            if (this.AllowAnyVersion || other.AllowAnyVersion)
+                return true;
+
+            return this.ClrVersion.Major == other.ClrVersion.Major
+                && this.ClrVersion.Minor == other.ClrVersion.Minor
+                && (   this.ClrVersion.Build < 0 
+                    || other.ClrVersion.Build < 0 
+                    || this.ClrVersion.Build == other.ClrVersion.Build ) 
+                && (   this.ClrVersion.Revision < 0
+                    || other.ClrVersion.Revision < 0
+                    || this.ClrVersion.Revision == other.ClrVersion.Revision );
+        }
+
+        #endregion
+
+        #region Helper Methods
+
+        private static bool IsRuntimeTypeName(string name)
+        {
+            foreach (string item in Enum.GetNames(typeof(RuntimeType)))
+                if (item.ToLower() == name.ToLower())
+                    return true;
+
+            return false;
+        }
+
+        private static string GetDefaultDisplayName(RuntimeType runtime, Version version)
+        {
+            if (version == DefaultVersion)
+                return runtime.ToString();
+            else if (runtime == RuntimeType.Any)
+                return "v" + version.ToString();
+            else
+                return runtime.ToString() + " " + version.ToString();
+        }
+
+        private static void AppendMonoFrameworks(FrameworkCollection frameworks)
+        {
+            if (Environment.OSVersion.Platform == PlatformID.Win32NT)
+                AppendAllMonoFrameworks(frameworks);
+            else
+                AppendDefaultMonoFramework(frameworks);
+        }
+
+        private static void AppendAllMonoFrameworks(FrameworkCollection frameworks)
+        {
+            // TODO: Find multiple installed Mono versions under Linux
+            if (Environment.OSVersion.Platform == PlatformID.Win32NT)
+            {
+                // Use registry to find alternate versions
+                RegistryKey key = Registry.LocalMachine.OpenSubKey(@"Software\Novell\Mono");
+                if (key == null) return;
+
+                foreach (string version in key.GetSubKeyNames())
+                {
+                    RegistryKey subKey = key.OpenSubKey(version);
+                    string monoPrefix = subKey.GetValue("SdkInstallRoot") as string;
+
+                    AppendMonoFramework(frameworks, monoPrefix, version);
+                }
+            }
+            else
+                AppendDefaultMonoFramework(frameworks);
+        }
+
+        // This method works for Windows and Linux but currently
+        // is only called under Linux.
+        private static void AppendDefaultMonoFramework(FrameworkCollection frameworks)
+        {
+            string monoPrefix = null;
+            string version = null;
+
+            if (Environment.OSVersion.Platform == PlatformID.Win32NT)
+            {
+                RegistryKey key = Registry.LocalMachine.OpenSubKey(@"Software\Novell\Mono");
+                if (key != null)
+                {
+                    version = key.GetValue("DefaultCLR") as string;
+                    if (version != null && version != "")
+                    {
+                        key = key.OpenSubKey(version);
+                        if (key != null)
+                            monoPrefix = key.GetValue("SdkInstallRoot") as string;
+                    }
+                }
+            }
+            else // Assuming we're currently running Mono - change if more runtimes are added
+            {
+                string libMonoDir = Path.GetDirectoryName(typeof(object).Assembly.Location);
+                monoPrefix = Path.GetDirectoryName(Path.GetDirectoryName(Path.GetDirectoryName(libMonoDir)));
+            }
+
+            AppendMonoFramework(frameworks, monoPrefix, version);
+        }
+
+        private static void AppendMonoFramework(FrameworkCollection frameworks, string monoPrefix, string version)
+        {
+            if (monoPrefix != null)
+            {
+                string displayFmt = version != null
+                    ? "Mono " + version + " - {0} Profile"
+                    : "Mono {0} Profile";
+
+                if (File.Exists(Path.Combine(monoPrefix, "lib/mono/1.0/mscorlib.dll")))
+                {
+                    RuntimeFramework framework = new RuntimeFramework(RuntimeType.Mono, new Version(1, 1, 4322));
+                    framework.displayName = string.Format(displayFmt, "1.0");
+                    frameworks.Add(framework);
+                }
+
+                if (File.Exists(Path.Combine(monoPrefix, "lib/mono/2.0/mscorlib.dll")))
+                {
+                    RuntimeFramework framework = new RuntimeFramework(RuntimeType.Mono, new Version(2, 0, 50727));
+                    framework.displayName = string.Format(displayFmt, "2.0");
+                    frameworks.Add(framework);
+                }
+
+                if (File.Exists(Path.Combine(monoPrefix, "lib/mono/4.0/mscorlib.dll")))
+                {
+                    RuntimeFramework framework = new RuntimeFramework(RuntimeType.Mono, new Version(4, 0, 30319));
+                    framework.displayName = string.Format(displayFmt, "4.0");
+                    frameworks.Add(framework);
+                }
+            }
+        }
+
+        private static void AppendDotNetFrameworks(FrameworkCollection frameworks)
+        {
+            if (Environment.OSVersion.Platform == PlatformID.Win32NT)
+            {
+                RegistryKey key = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\.NETFramework\policy");
+                if (key != null)
+                {
+                    foreach (string name in key.GetSubKeyNames())
+                    {
+                        if (name.StartsWith("v"))
+                        {
+                            RegistryKey key2 = key.OpenSubKey(name);
+                            foreach (string build in key2.GetValueNames())
+                                frameworks.Add(new RuntimeFramework(RuntimeType.Net, new Version(name.Substring(1) + "." + build)));
+                        }
+                    }
+                }
+            }
+        }
+
+#if NET_2_0
+        private class FrameworkCollection : System.Collections.Generic.List<RuntimeFramework> { }
+#else
+        private class FrameworkCollection : ArrayList 
+        {
+            public new RuntimeFramework[] ToArray()
+            {
+                return (RuntimeFramework[])ToArray(typeof(RuntimeFramework));
+            }
+        }
+#endif
+
+        #endregion
+    }
 }
diff --git a/src/NUnitCore/interfaces/Test.cs b/src/NUnitCore/interfaces/Test.cs
index 071b19c..d1fee36 100644
--- a/src/NUnitCore/interfaces/Test.cs
+++ b/src/NUnitCore/interfaces/Test.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 namespace NUnit.Core
@@ -9,15 +9,23 @@ namespace NUnit.Core
 	using System;
 	using System.Collections;
 	using System.Collections.Specialized;
+    using System.Threading;
 	using System.Reflection;
 
 	/// <summary>
 	///		Test Class.
 	/// </summary>
 	public abstract class Test : ITest, IComparable
-	{
-		#region Fields
-		/// <summary>
+    {
+        #region Constants
+        //private static readonly string SETCULTURE = "_SETCULTURE";
+        private static readonly string DESCRIPTION = "_DESCRIPTION";
+        private static readonly string IGNOREREASON = "_IGNOREREASON";
+        private static readonly string CATEGORIES = "_CATEGORIES";
+        #endregion
+
+        #region Fields
+        /// <summary>
 		/// TestName that identifies this test
 		/// </summary>
 		private TestName testName;
@@ -28,46 +36,70 @@ namespace NUnit.Core
 		private RunState runState;
 
 		/// <summary>
-		/// The reason for not running the test
-		/// </summary>
-		private string ignoreReason;
-		
-		/// <summary>
-		/// Description for this test 
-		/// </summary>
-		private string description;
-		
-		/// <summary>
 		/// Test suite containing this test, or null
 		/// </summary>
 		private Test parent;
 		
 		/// <summary>
-		/// List of categories applying to this test
-		/// </summary>
-		private IList categories;
-
-		/// <summary>
 		/// A dictionary of properties, used to add information
 		/// to tests without requiring the class to change.
 		/// </summary>
 		private IDictionary properties;
 
-		/// <summary>
-		/// The System.Type of the fixture for this test suite, if there is one
-		/// </summary>
-		private Type fixtureType;
+		#endregion
 
-		/// <summary>
-		/// The fixture object, if it has been created
-		/// </summary>
-		private object fixture;
+        #region Properties
+        /// <summary>
+        /// Return true if the test requires a thread
+        /// </summary>
+        public bool RequiresThread
+        {
+            get { return Properties.Contains("RequiresThread") && (bool)Properties["RequiresThread"]; }
+        }
+
+        /// <summary>
+        /// Get the desired apartment state for running the test
+        /// </summary>
+        public ApartmentState ApartmentState
+        {
+            get
+            {
+                return Properties.Contains("APARTMENT_STATE")
+                    ? (ApartmentState)Properties["APARTMENT_STATE"]
+                    : GetCurrentApartment();
+            }
+        }
+
+        /// <summary>
+        /// Get the current apartment state of the test
+        /// </summary>
+        protected ApartmentState GetCurrentApartment()
+        {
+#if NET_2_0
+            return Thread.CurrentThread.GetApartmentState();
+#else
+            return Thread.CurrentThread.ApartmentState;
+#endif
+        }
 
+        /// <summary>
+        /// Gets a boolean value indicating whether this 
+        /// test should run on it's own thread.
+        /// </summary>
+        protected virtual bool ShouldRunOnOwnThread
+        {
+            get
+            {
+                return RequiresThread
+                    || ApartmentState != ApartmentState.Unknown
+                    && ApartmentState != GetCurrentApartment();
+            }
+        }
 		#endregion
 
-		#region Construction
+        #region Construction
 
-		/// <summary>
+        /// <summary>
 		/// Constructs a test given its name
 		/// </summary>
 		/// <param name="name">The name of the test</param>
@@ -110,35 +142,6 @@ namespace NUnit.Core
 		}
 
 		/// <summary>
-		/// Constructs a test given a fixture type
-		/// </summary>
-		/// <param name="fixtureType">The type to use in constructiong the test</param>
-		protected Test( Type fixtureType )
-		{
-			this.testName = new TestName();
-			this.testName.FullName = fixtureType.FullName;
-			this.testName.Name = fixtureType.Namespace != null
-				? TestName.FullName.Substring( TestName.FullName.LastIndexOf( '.' ) + 1 )
-				: fixtureType.FullName;
-			this.testName.TestID = new TestID();
-
-			this.fixtureType = fixtureType;
-			this.RunState = RunState.Runnable;
-		}
-
-		/// <summary>
-		/// Construct a test given a MethodInfo
-		/// </summary>
-		/// <param name="method">The method to be used</param>
-		protected Test( MethodInfo method )
-			: this( method.ReflectedType )
-		{
-			this.testName.Name = method.DeclaringType == method.ReflectedType 
-				? method.Name : method.DeclaringType.Name + "." + method.Name;
-			this.testName.FullName = method.ReflectedType.FullName + "." + method.Name;
-		}
-
-		/// <summary>
 		/// Sets the runner id of a test and optionally its children
 		/// </summary>
 		/// <param name="runnerID">The runner id to be used</param>
@@ -169,7 +172,11 @@ namespace NUnit.Core
 		/// Gets a string representing the kind of test
 		/// that this object represents, for use in display.
 		/// </summary>
-		public abstract string TestType { get; }
+        public abstract string TestType
+        {
+            get;
+        }
+
 
 		/// <summary>
 		/// Whether or not the test should be run
@@ -185,8 +192,14 @@ namespace NUnit.Core
 		/// </summary>
 		public string IgnoreReason
 		{
-			get { return ignoreReason; }
-			set { ignoreReason = value; }
+			get { return (string)Properties[IGNOREREASON]; }
+			set 
+            {
+                if (value == null)
+                    Properties.Remove(IGNOREREASON);
+                else
+                    Properties[IGNOREREASON] = value;
+            }
 		}
 
 		/// <summary>
@@ -203,17 +216,32 @@ namespace NUnit.Core
 		/// </summary>
 		public IList Categories 
 		{
-			get { return categories; }
-			set { categories = value; }
+			get 
+            {
+                if (Properties[CATEGORIES] == null)
+                    Properties[CATEGORIES] = new ArrayList();
+
+                return (IList)Properties[CATEGORIES]; 
+            }
+			set 
+            {
+                Properties[CATEGORIES] = value; 
+            }
 		}
 
 		/// <summary>
-		/// Gets a desctiption associated with this test.
+		/// Gets a description associated with this test.
 		/// </summary>
 		public String Description
 		{
-			get { return description; }
-			set { description = value; }
+			get { return (string)Properties[DESCRIPTION]; }
+			set 
+            {
+                if (value == null)
+                    Properties.Remove(DESCRIPTION);
+                else
+                    Properties[DESCRIPTION] = value; 
+            }
 		}
 
 		/// <summary>
@@ -237,7 +265,11 @@ namespace NUnit.Core
 		/// <summary>
 		/// Indicates whether this test is a suite
 		/// </summary>
-		public abstract bool IsSuite { get; }
+        public virtual bool IsSuite
+        {
+            get { return false; }
+        }
+
 
 		/// <summary>
 		/// Gets the parent test of this test
@@ -260,23 +292,25 @@ namespace NUnit.Core
 		/// <summary>
 		/// Gets this test's child tests
 		/// </summary>
-		public abstract IList Tests { get; }
+		public virtual IList Tests 
+        {
+            get { return null; } 
+        }
 
 		/// <summary>
 		/// Gets the Type of the fixture used in running this test
 		/// </summary>
-		public Type FixtureType
+		public virtual Type FixtureType
 		{
-			get { return fixtureType; }
+			get { return null; }
 		}
 
 		/// <summary>
 		/// Gets or sets a fixture object for running this test
 		/// </summary>
-		public  object Fixture
+		public  abstract object Fixture
 		{
-			get { return fixture; }
-			set { fixture = value; }
+			get; set;
         }
         #endregion
 
@@ -287,29 +321,26 @@ namespace NUnit.Core
 		/// </summary>
 		/// <param name="filter"></param>
 		/// <returns></returns>
-        public abstract int CountTestCases(ITestFilter filter);
-        #endregion
+        public virtual int CountTestCases(ITestFilter filter)
+        {
+            if (filter.Pass(this))
+                return 1;
 
+            return 0;
+        }
+
+        /// <summary>
+        /// Runs the test under a particular filter, sending
+        /// notifications to a listener.
+        /// </summary>
+        /// <param name="listener">An event listener to receive notifications</param>
+        /// <param name="filter">A filter used in running the test</param>
+        /// <returns></returns>
+        public abstract TestResult Run(EventListener listener, ITestFilter filter);
         #endregion
 
-		#region Abstract Run Methods
-		/// <summary>
-		/// Runs the test, sending notifications to a listener.
-		/// </summary>
-		/// <param name="listener">An event listener to receive notifications</param>
-		/// <returns>A TestResult</returns>
-		public abstract TestResult Run(EventListener listener);
+        #endregion
 
-		/// <summary>
-		/// Runs the test under a particular filter, sending
-		/// notifications to a listener.
-		/// </summary>
-		/// <param name="listener">An event listener to receive notifications</param>
-		/// <param name="filter">A filter used in running the test</param>
-		/// <returns></returns>
-        public abstract TestResult Run(EventListener listener, ITestFilter filter);
-		#endregion
-		
 		#region IComparable Members
 		/// <summary>
 		/// Compares this test to another test for sorting purposes
diff --git a/src/NUnitCore/interfaces/TestAgent.cs b/src/NUnitCore/interfaces/TestAgent.cs
new file mode 100644
index 0000000..ecec2ec
--- /dev/null
+++ b/src/NUnitCore/interfaces/TestAgent.cs
@@ -0,0 +1,111 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Core
+{
+    /// <summary>
+	/// Abstract base for all types of TestAgents.
+    /// A TestAgent provides services of locating,
+    /// loading and running tests in a particular
+    /// context such as an AppDomain or Process.
+	/// </summary>
+	public abstract class TestAgent : MarshalByRefObject, IDisposable
+	{
+		#region Fields
+		/// <summary>
+		/// Reference to the TestAgency that controls this agent
+		/// </summary>
+		private IAgency agency;
+
+		/// <summary>
+		/// This agent's assigned id
+		/// </summary>
+		private Guid agentId;
+		#endregion
+
+		#region Constructors
+        /// <summary>
+        /// Constructs a TestAgent
+        /// </summary>
+        /// <param name="agentId"></param>
+        public TestAgent(Guid agentId)
+        {
+            this.agentId = agentId;
+        }
+
+        /// <summary>
+        /// Consructor used by TestAgency when creating
+        /// an agent.
+        /// </summary>
+        /// <param name="agentId"></param>
+        /// <param name="agency"></param>
+		public TestAgent( Guid agentId, IAgency agency )
+		{
+			this.agency = agency;
+			this.agentId = agentId;
+		}
+		#endregion
+
+		#region Properties
+        /// <summary>
+        /// The TestAgency with which this agent is asssociated,
+        /// or null if the agent is not tied to an agency.
+        /// </summary>
+		public IAgency Agency
+		{
+			get { return agency; }
+		}
+
+        /// <summary>
+        /// A Guid that uniquely identifies this agent.
+        /// </summary>
+		public Guid Id
+		{
+			get { return agentId; }
+		}
+		#endregion
+
+		#region Absract Methods
+        /// <summary>
+        /// Starts the agent, performing any required initialization
+        /// </summary>
+        /// <returns></returns>
+        public abstract bool Start();
+
+        /// <summary>
+        /// Stops the agent, releasing any resources
+        /// </summary>
+        public abstract void Stop();
+
+		/// <summary>
+		///  Creates a runner using a given runner id
+		/// </summary>
+        public abstract TestRunner CreateRunner(int runnerId);
+		#endregion
+
+        #region IDisposable Members
+        /// <summary>
+        /// Dispose is overridden to stop the agent
+        /// </summary>
+        public void Dispose()
+        {
+            this.Stop();
+        }
+        #endregion
+
+        #region InitializeLifeTimeService
+        /// <summary>
+        /// Overridden to cause object to live indefinitely
+        /// </summary>
+        public override object InitializeLifetimeService()
+        {
+            return null;
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/interfaces/TestAssemblyInfo.cs b/src/NUnitCore/interfaces/TestAssemblyInfo.cs
index fbd7234..94445c9 100644
--- a/src/NUnitCore/interfaces/TestAssemblyInfo.cs
+++ b/src/NUnitCore/interfaces/TestAssemblyInfo.cs
@@ -1,11 +1,12 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 using System.Collections;
 using System.Reflection;
+using System.Diagnostics;
 using System.IO;
 using System.Text;
 
@@ -18,20 +19,39 @@ namespace NUnit.Core
 	public class TestAssemblyInfo
 	{
 		private string assemblyName;
-		private Version runtimeVersion;
-		private IList testFrameworks;
+        private Version imageRuntimeVersion;
+        private RuntimeFramework runnerRuntimeFramework;
+        private int processId;
+        private string moduleName;
+        private string domainName;
+        private string appBase;
+        private string binPath;
+        private string configFile;
+        private IList testFrameworks;
 
         /// <summary>
         /// Constructs a TestAssemblyInfo
         /// </summary>
         /// <param name="assemblyName">The name of the assembly</param>
-        /// <param name="runtimeVersion">The version of the runtime for which the assembly was built</param>
+        /// <param name="imageRuntimeVersion">The version of the runtime for which the assembly was built</param>
+        /// <param name="runnerRuntimeFramework">The runtime framework under which the assembly is loaded</param>
         /// <param name="testFrameworks">A list of test framework useds by the assembly</param>
-		public TestAssemblyInfo( string assemblyName, Version runtimeVersion, IList testFrameworks )
+		public TestAssemblyInfo( string assemblyName, Version imageRuntimeVersion, RuntimeFramework runnerRuntimeFramework, IList testFrameworks )
 		{
 			this.assemblyName = assemblyName;
-			this.runtimeVersion = runtimeVersion;
-			this.testFrameworks = testFrameworks;
+            this.imageRuntimeVersion = imageRuntimeVersion;
+            this.runnerRuntimeFramework = runnerRuntimeFramework;
+            this.testFrameworks = testFrameworks;
+            Process p = Process.GetCurrentProcess();
+            this.processId = p.Id;
+			Assembly entryAssembly = Assembly.GetEntryAssembly();
+            this.moduleName = entryAssembly != null
+				? Path.GetFileName(Assembly.GetEntryAssembly().Location)
+				: p.MainModule.ModuleName;
+            this.domainName = AppDomain.CurrentDomain.FriendlyName;
+            this.appBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
+            this.configFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
+            this.binPath = AppDomain.CurrentDomain.SetupInformation.PrivateBinPath;
 		}
 
         /// <summary>
@@ -45,10 +65,75 @@ namespace NUnit.Core
         /// <summary>
         /// Gets the runtime version for which the assembly was built
         /// </summary>
-		public Version RuntimeVersion
-		{
-			get { return runtimeVersion; }
-		}
+        public Version ImageRuntimeVersion
+        {
+            get { return imageRuntimeVersion; }
+        }
+
+        /// <summary>
+        /// Gets the runtime framework under which the assembly is loaded
+        /// </summary>
+        public RuntimeFramework RunnerRuntimeFramework
+        {
+            get { return runnerRuntimeFramework; }
+        }
+
+        /// <summary>
+        /// Gets the runtime version under which the assembly is loaded
+        /// </summary>
+        public Version RunnerRuntimeVersion
+        {
+            get { return runnerRuntimeFramework.ClrVersion; }
+        }
+
+        /// <summary>
+        /// The Id of the process in which the assembly is loaded
+        /// </summary>
+        public int ProcessId
+        {
+            get { return processId; }
+        }
+
+        /// <summary>
+        /// The friendly name of the AppDomain in which the assembly is loaded
+        /// </summary>
+        public string DomainName
+        {
+            get { return domainName; }
+        }
+
+        /// <summary>
+        /// The Application Base of the AppDomain in which the assembly is loaded
+        /// </summary>
+        public string ApplicationBase
+        {
+            get { return appBase; }
+        }
+
+        /// <summary>
+        /// The PrivateBinPath of the AppDomain in which the assembly is loaded
+        /// </summary>
+        public string PrivateBinPath
+        {
+            get { return binPath; }
+        }
+
+        /// <summary>
+        /// The ConfigurationFile of the AppDomain in which the assembly is loaded
+        /// </summary>
+        public string ConfigurationFile
+        {
+            get { return configFile; }
+        }
+
+        /// <summary>
+        /// The name of the main module of the process in which the assembly is loaded 
+        /// </summary>
+        public string ModuleName
+        {
+            get { return moduleName; }
+			set { moduleName = value; }
+        }
 
         /// <summary>
         /// Gets a list of testframeworks referenced by the assembly
diff --git a/src/NUnitCore/interfaces/TestCaseResult.cs b/src/NUnitCore/interfaces/TestCaseResult.cs
deleted file mode 100644
index 1aa183f..0000000
--- a/src/NUnitCore/interfaces/TestCaseResult.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-namespace NUnit.Core
-{
-	using System;
-	using System.Text;
-
-	/// <summary>
-	/// TestCaseResult represents the result of a test case execution
-	/// </summary>
-	[Serializable]
-	public class TestCaseResult : TestResult
-	{
-        /// <summary>
-        /// Construct a result for a test case
-        /// </summary>
-        /// <param name="testCase">The test case for which this is a result</param>
-		public TestCaseResult(TestInfo testCase)
-			: base(testCase, testCase.TestName.FullName) { }
-
-		/// <summary>
-		/// Construct a result from a string - used for tests
-		/// </summary>
-		/// <param name="testCaseString"></param>
-		public TestCaseResult(string testCaseString) 
-			: base(null, testCaseString) { }
-
-        /// <summary>
-        /// Accept a ResultVisitor
-        /// </summary>
-        /// <param name="visitor">The visitor to accept</param>
-		public override void Accept(ResultVisitor visitor) 
-		{
-			visitor.Visit(this);
-		}
-	}
-}
diff --git a/src/NUnitCore/interfaces/TestFilter.cs b/src/NUnitCore/interfaces/TestFilter.cs
index 0500ec4..b66cc4f 100644
--- a/src/NUnitCore/interfaces/TestFilter.cs
+++ b/src/NUnitCore/interfaces/TestFilter.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitCore/interfaces/TestID.cs b/src/NUnitCore/interfaces/TestID.cs
index d7c9d5e..4b00c34 100644
--- a/src/NUnitCore/interfaces/TestID.cs
+++ b/src/NUnitCore/interfaces/TestID.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 
diff --git a/src/NUnitCore/interfaces/TestInfo.cs b/src/NUnitCore/interfaces/TestInfo.cs
index b5a480c..9aa3443 100644
--- a/src/NUnitCore/interfaces/TestInfo.cs
+++ b/src/NUnitCore/interfaces/TestInfo.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 using System.Collections;
@@ -111,11 +111,16 @@ namespace NUnit.Core
 			this.description = null;
 			this.isSuite = true;
 
-			foreach( ITest test in tests )
-			{
-				this.testCaseCount += test.TestCount;
-			}
+            if ( tests != null )
+			    foreach( ITest test in tests )
+    				this.testCaseCount += test.TestCount;
 		}
+
+		/// <summary>
+		/// Construct given a test name
+		/// </summary>
+		/// <param name="testName">The TestName for the new test</param>
+		public TestInfo( TestName testName ) : this( testName, null) { }
 		#endregion
 
 		#region Properties
diff --git a/src/NUnitCore/interfaces/TestName.cs b/src/NUnitCore/interfaces/TestName.cs
index ef51ae9..46be25f 100644
--- a/src/NUnitCore/interfaces/TestName.cs
+++ b/src/NUnitCore/interfaces/TestName.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 
diff --git a/src/NUnitCore/interfaces/TestNode.cs b/src/NUnitCore/interfaces/TestNode.cs
index 6b9ed44..aeaaa0b 100644
--- a/src/NUnitCore/interfaces/TestNode.cs
+++ b/src/NUnitCore/interfaces/TestNode.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 using System.Collections;
diff --git a/src/NUnitCore/interfaces/TestOutput.cs b/src/NUnitCore/interfaces/TestOutput.cs
index 78e72af..7a5bc8e 100644
--- a/src/NUnitCore/interfaces/TestOutput.cs
+++ b/src/NUnitCore/interfaces/TestOutput.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 namespace NUnit.Core
 {
diff --git a/src/NUnitCore/interfaces/TestPackage.cs b/src/NUnitCore/interfaces/TestPackage.cs
index 22b7082..768919d 100644
--- a/src/NUnitCore/interfaces/TestPackage.cs
+++ b/src/NUnitCore/interfaces/TestPackage.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 using System.IO;
@@ -10,7 +10,57 @@ using System.Collections.Specialized;
 
 namespace NUnit.Core
 {
-	/// <summary>
+    /// <summary>
+    /// Represents the manner in which test assemblies are
+    /// distributed across processes.
+    /// </summary>
+    public enum ProcessModel
+    {
+        /// <summary>
+        /// Use the default setting, depending on the runner
+        /// and the nature of the tests to be loaded.
+        /// </summary>
+        Default,
+        /// <summary>
+        /// Run tests directly in the NUnit process
+        /// </summary>
+        Single,
+        /// <summary>
+        /// Run tests in a single separate process
+        /// </summary>
+        Separate,
+        /// <summary>
+        /// Run tests in a separate process per assembly
+        /// </summary>
+        Multiple
+    }
+
+    /// <summary>
+    /// Represents the manner in which test assemblies use
+    /// AppDomains to provide isolation
+    /// </summary>
+    public enum DomainUsage
+    {
+        /// <summary>
+        /// Use the default setting, depending on the runner
+        /// and the nature of the tests to be loaded.
+        /// </summary>
+        Default,
+        /// <summary>
+        /// Don't create a test domain - run in the primary AppDomain
+        /// </summary>
+        None,
+        /// <summary>
+        /// Run tests in a single separate test domain
+        /// </summary>
+        Single,
+        /// <summary>
+        /// Run tests in a separate domain per assembly
+        /// </summary>
+        Multiple
+    }
+
+    /// <summary>
 	/// TestPackage holds information about a set of tests to
 	/// be loaded by a TestRunner. It may represent a single
 	/// assembly or a set of assemblies. It supports selection
@@ -42,14 +92,17 @@ namespace NUnit.Core
 		/// </summary>
 		/// <param name="name">The name of the package</param>
 		public TestPackage( string name )
-		{
-			this.fullName = name;
+		{          
+            this.fullName = name;
 			this.name = Path.GetFileName( name );
 			this.assemblies = new ArrayList();
 			if ( IsAssemblyFileType( name ) )
 			{
-				this.isSingleAssembly = true;
-				this.assemblies.Add( name );
+                if (!Path.IsPathRooted(name))
+                    throw new ArgumentException("Assembly in TestPackage must be specified as an absolute path", "name");
+                
+                this.isSingleAssembly = true;
+				this.assemblies.Add(name);
 			}
 		}
 
@@ -63,7 +116,13 @@ namespace NUnit.Core
 		{
 			this.fullName = name;
 			this.name = Path.GetFileName( name );
-			this.assemblies = new ArrayList( assemblies );
+			this.assemblies = new ArrayList();
+            foreach (string assembly in assemblies)
+            {
+                if (!Path.IsPathRooted(assembly))
+                    throw new ArgumentException("Assembly in TestPackage must be specified as an absolute path", "assemblies");
+                this.assemblies.Add(assembly);
+            }
 			this.isSingleAssembly = false;
 		}
 
@@ -156,20 +215,72 @@ namespace NUnit.Core
 			get { return settings; }
 		}
 
-		/// <summary>
-		/// Return the value of a bool setting or a default.
-		/// </summary>
-		/// <param name="name">The name of the setting</param>
-		/// <param name="defaultSetting">The default value</param>
-		/// <returns></returns>
-		public bool GetSetting( string name, bool defaultSetting )
-		{
-			object setting = settings[name];
-			
-			return setting == null ? defaultSetting : (bool)setting;
-		}
+        /// <summary>
+        /// Return the value of a setting or a default.
+        /// </summary>
+        /// <param name="name">The name of the setting</param>
+        /// <param name="defaultSetting">The default value</param>
+        /// <returns></returns>
+        public object GetSetting(string name, object defaultSetting)
+        {
+            object setting = settings[name];
+
+            return setting == null ? defaultSetting : setting;
+        }
+
+        /// <summary>
+        /// Return the value of a string setting or a default.
+        /// </summary>
+        /// <param name="name">The name of the setting</param>
+        /// <param name="defaultSetting">The default value</param>
+        /// <returns></returns>
+        public string GetSetting(string name, string defaultSetting)
+        {
+            object setting = settings[name];
+
+            return setting == null ? defaultSetting : (string)setting;
+        }
+
+        /// <summary>
+        /// Return the value of a bool setting or a default.
+        /// </summary>
+        /// <param name="name">The name of the setting</param>
+        /// <param name="defaultSetting">The default value</param>
+        /// <returns></returns>
+        public bool GetSetting(string name, bool defaultSetting)
+        {
+            object setting = settings[name];
+
+            return setting == null ? defaultSetting : (bool)setting;
+        }
+
+        /// <summary>
+        /// Return the value of an int setting or a default.
+        /// </summary>
+        /// <param name="name">The name of the setting</param>
+        /// <param name="defaultSetting">The default value</param>
+        /// <returns></returns>
+        public int GetSetting(string name, int defaultSetting)
+        {
+            object setting = settings[name];
+
+            return setting == null ? defaultSetting : (int)setting;
+        }
+
+        /// <summary>
+        /// Return the value of a enum setting or a default.
+        /// </summary>
+        /// <param name="name">The name of the setting</param>
+        /// <param name="defaultSetting">The default value</param>
+        /// <returns></returns>
+        public System.Enum GetSetting(string name, System.Enum defaultSetting)
+        {
+            object setting = settings[name];
+
+            return setting == null ? defaultSetting : (System.Enum)setting;
+        }
 
-		private static bool IsAssemblyFileType( string path )
+        private static bool IsAssemblyFileType(string path)
 		{
 			string extension = Path.GetExtension( path ).ToLower();
 			return extension == ".dll" || extension == ".exe";
diff --git a/src/NUnitCore/interfaces/TestResult.cs b/src/NUnitCore/interfaces/TestResult.cs
index 74bd140..55965b2 100644
--- a/src/NUnitCore/interfaces/TestResult.cs
+++ b/src/NUnitCore/interfaces/TestResult.cs
@@ -1,30 +1,26 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 namespace NUnit.Core
 {
 	using System;
 	using System.Text;
+	using System.Collections;
 
 	/// <summary>
-	/// The TestResult abstract class represents
+	/// The TestResult class represents
 	/// the result of a test and is used to
 	/// communicate results across AppDomains.
 	/// </summary>
 	/// 
 	[Serializable]
-	public abstract class TestResult
+	public class TestResult
 	{
 		#region Fields
 		/// <summary>
-		/// Indicates whether the test was executed or not
-		/// </summary>
-		private RunState runState;
-
-		/// <summary>
 		/// Indicates the result of the test
 		/// </summary>
 		private ResultState resultState;
@@ -40,14 +36,9 @@ namespace NUnit.Core
 		private double time = 0.0;
 
 		/// <summary>
-		/// The name of the test
-		/// </summary>
-		private string name;
-
-		/// <summary>
 		/// The test that this result pertains to
 		/// </summary>
-		private TestInfo test;
+		private readonly TestInfo test;
 
 		/// <summary>
 		/// The stacktrace at the point of failure
@@ -55,14 +46,14 @@ namespace NUnit.Core
 		private string stackTrace;
 
 		/// <summary>
-		/// Description of this test
+		/// Message giving the reason for failure
 		/// </summary>
-		private string description;
+		private string message;
 
 		/// <summary>
-		/// Message giving the reason for failure
+		/// List of child results
 		/// </summary>
-		protected string messageString;
+		private IList results;
 
 		/// <summary>
 		/// Number of asserts executed by this test
@@ -71,38 +62,31 @@ namespace NUnit.Core
 
 		#endregion
 
-		#region Protected Constructor
+		#region Constructor
 		/// <summary>
-		/// Protected constructor constructs a test result given
-		/// a test and a name.
+		/// Construct a test result given a TestInfo
 		/// </summary>
 		/// <param name="test">The test to be used</param>
-		/// <param name="name">Name for this result</param>
-		protected TestResult(TestInfo test, string name)
+		public TestResult(TestInfo test)
 		{
-			this.name = name;
 			this.test = test;
-            this.RunState = RunState.Runnable;
-            if (test != null)
-            {
-                this.description = test.Description;
-                this.runState = test.RunState;
-                this.messageString = test.IgnoreReason;
-            }
-        }
-		#endregion
+			this.message = test.IgnoreReason;
+		}
 
-        #region Properties
+        /// <summary>
+        /// Construct a TestResult given an ITest
+        /// </summary>
+        /// <param name="test"></param>
+        public TestResult(ITest test) : this( new TestInfo(test) ) { }
 
 		/// <summary>
-		/// Gets the RunState of the result, which indicates
-		/// whether or not it has executed and why.
+		/// Construct a TestResult given a TestName
 		/// </summary>
-        public RunState RunState
-        {
-            get { return runState; }
-            set { runState = value; }
-        }
+		/// <param name="testName">A TestName</param>
+		public TestResult(TestName testName) : this( new TestInfo( testName ) ) { }
+		#endregion
+
+        #region Properties
 
 		/// <summary>
 		/// Gets the ResultState of the test result, which 
@@ -127,16 +111,30 @@ namespace NUnit.Core
 		/// </summary>
         public bool Executed
         {
-            get { return runState == RunState.Executed; }
+            get
+            {
+                return resultState == ResultState.Success ||
+                       resultState == ResultState.Failure ||
+                       resultState == ResultState.Error ||
+                       resultState == ResultState.Inconclusive;
+            }
         }
 
 		/// <summary>
 		/// Gets the name of the test result
 		/// </summary>
-        public virtual string Name
-        {
-            get { return name; }
-        }
+		public virtual string Name
+		{
+			get { return test.TestName.Name; }
+		}
+
+		/// <summary>
+		/// Gets the full name of the test result
+		/// </summary>
+		public virtual string FullName
+		{
+			get { return test.TestName.FullName; }
+		}
 
 		/// <summary>
 		/// Gets the test associated with this result
@@ -151,27 +149,31 @@ namespace NUnit.Core
 		/// </summary>
         public virtual bool IsSuccess
         {
-            // TODO: Redefine this more precisely
-            get { return !IsFailure; }
-            //get { return resultState == ResultState.Success; }
+            get { return resultState == ResultState.Success; }
         }
 
         /// <summary>
         /// Indicates whether the test failed
         /// </summary>
-		// TODO: Distinguish errors from failures
         public virtual bool IsFailure
         {
-            get { return resultState == ResultState.Failure || resultState == ResultState.Error; }
+            get { return resultState == ResultState.Failure;  }
         }
 
+	    /// <summary>
+	    /// Indicates whether the test had an error (as opposed to a failure)
+	    /// </summary>
+        public virtual bool IsError
+	    {
+            get { return resultState == ResultState.Error;  }   
+	    }
+
 		/// <summary>
 		/// Gets a description associated with the test
 		/// </summary>
-        public virtual string Description
+        public string Description
         {
-            get { return description; }
-            set { description = value; }
+            get { return test.Description; }
         }
 
 		/// <summary>
@@ -189,7 +191,7 @@ namespace NUnit.Core
 		/// </summary>
         public string Message
         {
-            get { return messageString; }
+            get { return message; }
         }
 
 		/// <summary>
@@ -198,14 +200,8 @@ namespace NUnit.Core
 		/// </summary>
         public virtual string StackTrace
         {
-            get
-            {
-                return stackTrace;
-            }
-            set
-            {
-                stackTrace = value;
-            }
+            get { return stackTrace; }
+            set { stackTrace = value; }
         }
 
 		/// <summary>
@@ -218,19 +214,42 @@ namespace NUnit.Core
             set { assertCount = value; }
         }
 
-        #endregion
-
-        #region Public Methods
         /// <summary>
-		/// Mark the test as succeeding
+        /// Return true if this result has any child results
+        /// </summary>
+	    public bool HasResults
+	    {
+            get { return results != null && results.Count > 0; }    
+	    }
+
+		/// <summary>
+		/// Gets a list of the child results of this TestResult
 		/// </summary>
-		public void Success() 
-		{ 
-			this.runState = RunState.Executed;
-			this.resultState = ResultState.Success; 
+		public IList Results
+		{
+			get { return results; }
 		}
 
-		/// <summary>
+		#endregion
+
+        #region Public Methods
+        /// <summary>
+        /// Mark the test as succeeding
+        /// </summary>
+        public void Success()
+        {
+            SetResult( ResultState.Success, null, null );
+        }
+
+        /// <summary>
+        /// Mark the test as succeeding and set a message
+        /// </summary>
+        public void Success( string message )
+        {
+            SetResult( ResultState.Success, message, null );
+        }
+
+        /// <summary>
 		/// Mark the test as ignored.
 		/// </summary>
 		/// <param name="reason">The reason the test was not run</param>
@@ -255,52 +274,92 @@ namespace NUnit.Core
 		/// <param name="stackTrace">Stack trace giving the location of the command</param>
 		public void Ignore(string reason, string stackTrace)
 		{
-			NotRun( RunState.Ignored, reason, stackTrace );
+			SetResult( ResultState.Ignored, reason, stackTrace );
 		}
 
 		/// <summary>
 		/// Mark the test as skipped.
 		/// </summary>
 		/// <param name="reason">The reason the test was not run</param>
-		public void Skip(string reason)
-		{
-			Skip( reason, null );
-		}
+        public void Skip(string reason)
+        {
+            SetResult(ResultState.Skipped, reason, null);
+        }
 
-		/// <summary>
-		/// Mark the test as ignored.
-		/// </summary>
-		/// <param name="ex">The ignore exception that was thrown</param>
-		public void Skip( Exception ex )
-		{
-			Skip( ex.Message, BuildStackTrace( ex ) );
-		}
+        /// <summary>
+        /// Mark the test a not runnable with a reason
+        /// </summary>
+        /// <param name="reason">The reason the test is invalid</param>
+        public void Invalid( string reason )
+        {
+            SetResult( ResultState.NotRunnable, reason, null );
+        }
 
-		/// <summary>
-		/// Mark the test as skipped.
-		/// </summary>
-		/// <param name="reason">The reason the test was not run</param>
-		/// <param name="stackTrace">Stack trace giving the location of the command</param>
-		public void Skip(string reason, string stackTrace)
-		{
-			NotRun( RunState.Skipped, reason, stackTrace );
-		}
+        /// <summary>
+        /// Mark the test as not runnable due to a builder exception
+        /// </summary>
+        /// <param name="ex">The exception thrown by the builder or an addin</param>
+        public void Invalid(Exception ex)
+        {
+            SetResult(ResultState.NotRunnable, BuildMessage( ex ), BuildStackTrace(ex));
+        }
 
-		/// <summary>
-		/// Mark the test as Not Run - either skipped or ignored
+	    /// <summary>
+		/// Set the result of the test
 		/// </summary>
-		/// <param name="runState">The RunState to use in the result</param>
+		/// <param name="resultState">The ResultState to use in the result</param>
 		/// <param name="reason">The reason the test was not run</param>
-		/// <param name="stackTrace">Stack trace giving the location of the command</param>
-		public void NotRun(RunState runState, string reason, string stackTrace)
+        /// <param name="stackTrace">Stack trace giving the location of the command</param>
+        /// <param name="failureSite">The location of the failure, if any</param>
+        public void SetResult(ResultState resultState, string reason, string stackTrace, FailureSite failureSite)
 		{
-			this.runState = runState;
-			this.messageString = reason;
-			this.stackTrace = stackTrace;
+            if (failureSite == FailureSite.SetUp)
+                reason = "SetUp : " + reason;
+            else if (failureSite == FailureSite.TearDown)
+            {
+                reason = "TearDown : " + reason;
+                stackTrace = "--TearDown" + Environment.NewLine + stackTrace;
+
+                if (this.message != null)
+                    reason = this.message + Environment.NewLine + reason;
+                if (this.stackTrace != null)
+                    stackTrace = this.stackTrace + Environment.NewLine + stackTrace;
+            }
+
+            this.resultState = resultState;
+            this.message = reason;
+            this.stackTrace = stackTrace;
+            this.failureSite = failureSite;
 		}
 
+        /// <summary>
+        /// Set the result of the test
+        /// </summary>
+        /// <param name="resultState">The ResultState to use in the result</param>
+        /// <param name="reason">The reason the test was not run</param>
+        /// <param name="stackTrace">Stack trace giving the location of the command</param>
+        public void SetResult(ResultState resultState, string reason, string stackTrace)
+        {
+            SetResult(resultState, reason, stackTrace, FailureSite.Test);
+        }
 
-		/// <summary>
+        /// <summary>
+        /// Set the result of the test.
+        /// </summary>
+        /// <param name="resultState">The ResultState to use in the result</param>
+        /// <param name="ex">The exception that caused this result</param>
+        /// <param name="failureSite">The site at which an error or failure occured</param>
+        public void SetResult(ResultState resultState, Exception ex, FailureSite failureSite)
+        {
+            if (resultState == ResultState.Cancelled)
+                SetResult(resultState, "Test cancelled by user", BuildStackTrace(ex));
+            else if (resultState == ResultState.Error)
+                SetResult( resultState, BuildMessage(ex), BuildStackTrace(ex), failureSite);
+            else
+                SetResult(resultState, ex.Message, ex.StackTrace, failureSite);
+        }
+   
+        /// <summary>
 		/// Mark the test as a failure due to an
 		/// assertion having failed.
 		/// </summary>
@@ -320,11 +379,8 @@ namespace NUnit.Core
 		/// <param name="failureSite">The site of the failure</param>
 		public void Failure(string message, string stackTrace, FailureSite failureSite )
 		{
-			this.runState = RunState.Executed;
-			this.resultState = ResultState.Failure;
+            SetResult( Core.ResultState.Failure, message, stackTrace );
             this.failureSite = failureSite;
-			this.messageString = message;
-			this.stackTrace = stackTrace;
 		}
 
 		/// <summary>
@@ -342,35 +398,60 @@ namespace NUnit.Core
 		/// from the indicated FailureSite.
 		/// </summary>
 		/// <param name="exception">The exception that was caught</param>
-		/// <param name="failureSite">The site from which it was thrown</param>
-		public void Error( Exception exception, FailureSite failureSite )
+        /// <param name="failureSite">The site from which it was thrown</param>
+        public void Error(Exception exception, FailureSite failureSite)
 		{
-			this.runState = RunState.Executed;
-			this.resultState = ResultState.Error;
-            this.failureSite = failureSite;
+            SetResult(ResultState.Error, exception, failureSite);
+            //string message = BuildMessage(exception);
+            //string stackTrace = BuildStackTrace(exception);
+
+            //if (failureSite == FailureSite.TearDown)
+            //{
+            //    message = "TearDown : " + message;
+            //    stackTrace = "--TearDown" + Environment.NewLine + stackTrace;
+
+            //    if (this.message != null)
+            //        message = this.message + Environment.NewLine + message;
+            //    if (this.stackTrace != null)
+            //        stackTrace = this.stackTrace + Environment.NewLine + stackTrace;
+            //}
+
+            //SetResult( ResultState.Error, message, stackTrace );
+            //this.failureSite = failureSite;
+        }
 
-            string message = BuildMessage(exception);
-            string stackTrace = BuildStackTrace(exception);
+		/// <summary>
+		/// Add a child result
+		/// </summary>
+		/// <param name="result">The child result to be added</param>
+		public void AddResult(TestResult result) 
+		{
+			if ( results == null )
+				results = new ArrayList();
 
-            if (failureSite == FailureSite.TearDown)
-            {
-                message = "TearDown : " + message;
-                stackTrace = "--TearDown" + Environment.NewLine + stackTrace;
+			this.results.Add(result);
 
-                if (this.messageString != null)
-                    message = this.messageString + Environment.NewLine + message;
-                if (this.stackTrace != null)
-                    stackTrace = this.stackTrace + Environment.NewLine + stackTrace;
+            switch (result.ResultState)
+            {
+                case ResultState.Failure:
+                case ResultState.Error:
+                    if (!this.IsFailure && !this.IsError)
+                        this.Failure("Child test failed", null, FailureSite.Child);
+                    break;
+                case ResultState.Success:
+                    if (this.ResultState == ResultState.Inconclusive)
+                        this.Success();
+                    break;
+                case ResultState.Cancelled:
+                    this.SetResult(ResultState.Cancelled, result.Message, null, FailureSite.Child);
+                    break;
             }
-
-            this.messageString = message;
-            this.stackTrace = stackTrace;
 		}
 		#endregion
 
 		#region Exception Helpers
 
-		private string BuildMessage(Exception exception)
+		private static string BuildMessage(Exception exception)
 		{
 			StringBuilder sb = new StringBuilder();
 			sb.AppendFormat( "{0} : {1}", exception.GetType().ToString(), exception.Message );
@@ -386,7 +467,7 @@ namespace NUnit.Core
 			return sb.ToString();
 		}
 		
-		private string BuildStackTrace(Exception exception)
+		private static string BuildStackTrace(Exception exception)
 		{
             StringBuilder sb = new StringBuilder( GetStackTrace( exception ) );
 
@@ -405,7 +486,7 @@ namespace NUnit.Core
             return sb.ToString();
 		}
 
-		private string GetStackTrace(Exception exception)
+		private static string GetStackTrace(Exception exception)
 		{
 			try
 			{
@@ -418,11 +499,5 @@ namespace NUnit.Core
 		}
 
 		#endregion
-
-		/// <summary>
-		/// Abstract method that accepts a ResultVisitor
-		/// </summary>
-		/// <param name="visitor">The visitor</param>
-		public abstract void Accept(ResultVisitor visitor);
 	}
 }
diff --git a/src/NUnitCore/interfaces/TestRunner.cs b/src/NUnitCore/interfaces/TestRunner.cs
index 90b0b8e..447bdd1 100644
--- a/src/NUnitCore/interfaces/TestRunner.cs
+++ b/src/NUnitCore/interfaces/TestRunner.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -36,7 +36,7 @@ namespace NUnit.Core
     /// result of the last run may be obtained by querying the TestResult property.
     /// 
     /// </summary>
-	public interface TestRunner
+	public interface TestRunner : IDisposable
 	{
 		#region Properties
 		/// <summary>
@@ -52,8 +52,8 @@ namespace NUnit.Core
 		}
 
 		/// <summary>
-		/// IsTestRunning indicates whether a test is in progress. To retrieve the
-		/// results from an asynchronous test run, wait till IsTestRunning is false.
+		/// Running indicates whether a test is in progress. To retrieve the
+		/// results from an asynchronous test run, wait till Running is false.
 		/// </summary>
 		bool Running
 		{
diff --git a/src/NUnitCore/interfaces/TestSuiteResult.cs b/src/NUnitCore/interfaces/TestSuiteResult.cs
deleted file mode 100644
index af2c69a..0000000
--- a/src/NUnitCore/interfaces/TestSuiteResult.cs
+++ /dev/null
@@ -1,72 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-namespace NUnit.Core
-{
-	using System;
-	using System.Collections;
-
-	/// <summary>
-	/// TestSuiteResult represents the result of running a 
-	/// TestSuite. It adds a set of child results to the
-	/// base TestResult class.
-	/// </summary>
-	/// 
-	[Serializable]
-	public class TestSuiteResult : TestResult
-	{
-		private ArrayList results = new ArrayList();
-		
-		/// <summary>
-		/// Construct a TestSuiteResult from a test and a name
-		/// </summary>
-		/// <param name="test"></param>
-		/// <param name="name"></param>
-		public TestSuiteResult(TestInfo test, string name) 
-			: base(test, name) { }
-
-		/// <summary>
-		/// Construct a TestSuite result from a string
-		/// 
-		/// This overload is used for testing
-		/// </summary>
-		/// <param name="testSuiteString"></param>
-		public TestSuiteResult(string testSuiteString) 
-			: base(null, testSuiteString) { }
-
-		/// <summary>
-		/// Add a child result to a TestSuiteResult
-		/// </summary>
-		/// <param name="result">The child result to be added</param>
-		public void AddResult(TestResult result) 
-		{
-			results.Add(result);
-
-			if( this.ResultState == ResultState.Success &&
-				result.ResultState != ResultState.Success )
-			{
-				this.Failure( "Child test failed", null, FailureSite.Child );
-			}
-		}
-
-		/// <summary>
-		/// Gets a list of the child results of this TestSUiteResult
-		/// </summary>
-		public IList Results
-		{
-			get { return results; }
-		}
-
-		/// <summary>
-		/// Accepts a ResultVisitor
-		/// </summary>
-		/// <param name="visitor">The visitor</param>
-		public override void Accept(ResultVisitor visitor) 
-		{
-			visitor.Visit(this);
-		}
-	}
-}
diff --git a/src/NUnitCore/interfaces/nunit.core.interfaces.build b/src/NUnitCore/interfaces/nunit.core.interfaces.build
index c856822..0088c4e 100644
--- a/src/NUnitCore/interfaces/nunit.core.interfaces.build
+++ b/src/NUnitCore/interfaces/nunit.core.interfaces.build
@@ -1,24 +1,21 @@
 <?xml version="1.0"?>
 <project name="NUnitCoreInterfaces" default="build" basedir=".">
 
-  <target name="build">
-    <csc target="library" 
-        output="${current.build.dir}/nunit.core.interfaces.dll"
-        debug="${build.debug}" 
-        define="${build.defines}">
-      <sources>
+  <patternset id="source-files">
         <include name="AssemblyInfo.cs"/>
         <include name="EventListener.cs"/>
+        <include name="IAgency.cs"/>
         <include name="IService.cs"/>
         <include name="ITest.cs"/>
         <include name="ITestFilter.cs"/>
+        <include name="OSPlatform.cs"/>
+        <include name="PropertyNames.cs"/>
         <include name="ResultState.cs"/>
-        <include name="ResultVisitor.cs"/>
         <include name="RunState.cs"/>
         <include name="RuntimeFramework.cs"/>
         <include name="Test.cs"/>
+        <include name="TestAgent.cs"/>
         <include name="TestAssemblyInfo.cs"/>
-        <include name="TestCaseResult.cs"/>
         <include name="TestFilter.cs"/>
         <include name="TestID.cs"/>
         <include name="TestInfo.cs"/>
@@ -28,19 +25,21 @@
         <include name="TestPackage.cs"/>
         <include name="TestResult.cs"/>
         <include name="TestRunner.cs"/>
-        <include name="TestSuiteResult.cs"/>
         <include name="Extensibility/Addin.cs"/>
         <include name="Extensibility/AddinStatus.cs"/>
         <include name="Extensibility/ExtensionType.cs"/>
         <include name="Extensibility/IAddin.cs"/>
         <include name="Extensibility/IAddinRegistry.cs"/>
+        <include name="Extensibility/IDataPointProvider.cs"/>
         <include name="Extensibility/IExtensionHost.cs"/>
         <include name="Extensibility/IExtensionPoint.cs"/>
         <include name="Extensibility/IFrameworkRegistry.cs"/>
         <include name="Extensibility/ISuiteBuilder.cs"/>
         <include name="Extensibility/ITestCaseBuilder.cs"/>
+        <include name="Extensibility/ITestCaseProvider.cs"/>
         <include name="Extensibility/ITestDecorator.cs"/>
         <include name="Extensibility/NUnitAddinAttribute.cs"/>
+        <include name="Extensibility/ParameterSet.cs"/>
         <include name="Extensibility/TestFramework.cs"/>
         <include name="Filters/AndFilter.cs"/>
         <include name="Filters/CategoryFilter.cs"/>
@@ -48,17 +47,31 @@
         <include name="Filters/NotFilter.cs"/>
         <include name="Filters/OrFilter.cs"/>
         <include name="Filters/SimpleNameFilter.cs"/>
-        <include name="../../CommonAssemblyInfo.cs"/>
+  </patternset>
+
+  <target name="build">
+    <csc target="library" 
+        output="${current.lib.dir}/nunit.core.interfaces.dll"
+        debug="${build.debug}" 
+        define="${build.defines}">
+      <sources>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
+        <include name="../../NUnitFramework/framework/ITestCaseData.cs"/>
       </sources>
       <nowarn>
-        <warning number="1699" if="${runtime.version=='2.0'}"/>
+        <warning number="1699" if="${runtime.version>='2.0'}"/>
       </nowarn>
     </csc>
   </target>
 
   <target name="package">
     <copy todir="${package.src.dir}/NUnitCore/interfaces">
-      <fileset refid="source-files" />
+      <fileset>
+        <patternset refid="source-files"/>
+        <include name="nunit.core.interfaces.dll.csproj"/>
+        <include name="nunit.core.interfaces.build"/>
+      </fileset>
     </copy>
   </target>
 
diff --git a/src/NUnitCore/interfaces/nunit.core.interfaces.dll.csproj b/src/NUnitCore/interfaces/nunit.core.interfaces.dll.csproj
index f8eec21..0e6faee 100644
--- a/src/NUnitCore/interfaces/nunit.core.interfaces.dll.csproj
+++ b/src/NUnitCore/interfaces/nunit.core.interfaces.dll.csproj
@@ -1,301 +1,134 @@
-<VisualStudioProject>
-    <CSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{435428F8-5995-4CE4-8022-93D595A8CC0F}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = ""
-                AssemblyKeyContainerName = ""
-                AssemblyName = "nunit.core.interfaces"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "Library"
-                PreBuildEvent = ""
-                PostBuildEvent = ""
-                RootNamespace = "NUnit.Core"
-                RunPostBuildEvent = "OnBuildSuccess"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE"
-                    DocumentationFile = "bin\Debug\nunit.core.interfaces.xml"
-                    DebugSymbols = "true"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-                <Config
-                    Name = "Release"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DocumentationFile = "bin\Release\nunit.core.interfaces.xml"
-                    DebugSymbols = "false"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "System"
-                    AssemblyName = "System"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.dll"
-                />
-                <Reference
-                    Name = "System.Data"
-                    AssemblyName = "System.Data"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Data.dll"
-                />
-                <Reference
-                    Name = "System.XML"
-                    AssemblyName = "System.Xml"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.XML.dll"
-                />
-            </References>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "AssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CommonAssemblyInfo.cs"
-                    Link = "..\..\CommonAssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "EventListener.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "IService.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ITest.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ITestFilter.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ResultState.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ResultVisitor.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RunState.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RuntimeFramework.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Test.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestAssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestCaseResult.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestFilter.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestID.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestName.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestNode.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestOutput.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestPackage.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestResult.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestRunner.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestSuiteResult.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Extensibility\Addin.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Extensibility\AddinStatus.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Extensibility\ExtensionType.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Extensibility\IAddin.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Extensibility\IAddinRegistry.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Extensibility\IExtensionHost.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Extensibility\IExtensionPoint.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Extensibility\IFrameworkRegistry.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Extensibility\ISuiteBuilder.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Extensibility\ITestCaseBuilder.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Extensibility\ITestDecorator.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Extensibility\NUnitAddinAttribute.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Extensibility\TestFramework.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Filters\AndFilter.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Filters\CategoryFilter.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Filters\NameFilter.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Filters\NotFilter.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Filters\OrFilter.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Filters\SimpleNameFilter.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-            </Include>
-        </Files>
-    </CSHARP>
-</VisualStudioProject>
-
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{435428F8-5995-4CE4-8022-93D595A8CC0F}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit.core.interfaces</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.Core</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\lib\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG;NET_2_0</DefineConstants>
+    <DocumentationFile>..\..\bin\Debug\lib\nunit.core.interfaces.xml</DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>1699</NoWarn>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\lib\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;NET_2_0</DefineConstants>
+    <DocumentationFile>..\..\bin\Release\lib\nunit.core.interfaces.xml</DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>1699</NoWarn>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="..\..\NUnitFramework\framework\ITestCaseData.cs">
+      <Link>Extensibility\ITestCaseData.cs</Link>
+    </Compile>
+    <Compile Include="AssemblyInfo.cs" />
+    <Compile Include="EventListener.cs" />
+    <Compile Include="Extensibility\Addin.cs" />
+    <Compile Include="Extensibility\AddinStatus.cs" />
+    <Compile Include="Extensibility\ExtensionType.cs" />
+    <Compile Include="Extensibility\IAddin.cs" />
+    <Compile Include="Extensibility\IAddinRegistry.cs" />
+    <Compile Include="Extensibility\IDataPointProvider.cs" />
+    <Compile Include="Extensibility\IExtensionHost.cs" />
+    <Compile Include="Extensibility\IExtensionPoint.cs" />
+    <Compile Include="Extensibility\IFrameworkRegistry.cs" />
+    <Compile Include="Extensibility\ISuiteBuilder.cs" />
+    <Compile Include="Extensibility\ITestCaseBuilder.cs" />
+    <Compile Include="Extensibility\ITestCaseProvider.cs" />
+    <Compile Include="Extensibility\ITestDecorator.cs" />
+    <Compile Include="Extensibility\NUnitAddinAttribute.cs" />
+    <Compile Include="Extensibility\ParameterSet.cs" />
+    <Compile Include="Extensibility\TestFramework.cs" />
+    <Compile Include="Filters\AndFilter.cs" />
+    <Compile Include="Filters\CategoryFilter.cs" />
+    <Compile Include="Filters\NameFilter.cs" />
+    <Compile Include="Filters\NotFilter.cs" />
+    <Compile Include="Filters\OrFilter.cs" />
+    <Compile Include="Filters\SimpleNameFilter.cs" />
+    <Compile Include="IAgency.cs" />
+    <Compile Include="IService.cs" />
+    <Compile Include="ITest.cs" />
+    <Compile Include="ITestFilter.cs" />
+    <Compile Include="OSPlatform.cs" />
+    <Compile Include="PropertyNames.cs" />
+    <Compile Include="ResultState.cs" />
+    <Compile Include="RunState.cs" />
+    <Compile Include="RuntimeFramework.cs" />
+    <Compile Include="Test.cs" />
+    <Compile Include="TestAgent.cs" />
+    <Compile Include="TestAssemblyInfo.cs" />
+    <Compile Include="TestFilter.cs" />
+    <Compile Include="TestID.cs" />
+    <Compile Include="TestInfo.cs" />
+    <Compile Include="TestName.cs" />
+    <Compile Include="TestNode.cs" />
+    <Compile Include="TestOutput.cs" />
+    <Compile Include="TestPackage.cs" />
+    <Compile Include="TestResult.cs" />
+    <Compile Include="TestRunner.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit.core.interfaces.build" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/NUnitCore/interfaces/nunit.core.interfaces.dll_VS2005.csproj b/src/NUnitCore/interfaces/nunit.core.interfaces.dll_VS2005.csproj
deleted file mode 100644
index 4206b81..0000000
--- a/src/NUnitCore/interfaces/nunit.core.interfaces.dll_VS2005.csproj
+++ /dev/null
@@ -1,120 +0,0 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProductVersion>8.0.50727</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{DCC88998-255A-4247-B658-71DD932E9873}</ProjectGuid>
-    <OutputType>Library</OutputType>
-    <AppDesignerFolder>Properties</AppDesignerFolder>
-    <RootNamespace>NUnit.Core</RootNamespace>
-    <AssemblyName>nunit.core.interfaces</AssemblyName>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <DebugType>full</DebugType>
-    <Optimize>false</Optimize>
-    <OutputPath>bin\Debug\</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-    <NoWarn>1699</NoWarn>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <DebugType>pdbonly</DebugType>
-    <Optimize>true</Optimize>
-    <OutputPath>bin\Release\</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-    <DocumentationFile>bin\Release\nunit.core.interfaces.xml</DocumentationFile>
-    <NoWarn>1699</NoWarn>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug2005|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\Debug2005\</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <DebugType>full</DebugType>
-    <PlatformTarget>AnyCPU</PlatformTarget>
-    <CodeAnalysisRuleAssemblies>\rules</CodeAnalysisRuleAssemblies>
-    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
-    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
-    <ErrorReport>prompt</ErrorReport>
-    <DocumentationFile>bin\Debug2005\nunit.core.interfaces.xml</DocumentationFile>
-    <NoWarn>1699</NoWarn>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release2005|AnyCPU' ">
-    <OutputPath>bin\Release2005\</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
-    <Optimize>true</Optimize>
-    <DebugType>pdbonly</DebugType>
-    <PlatformTarget>AnyCPU</PlatformTarget>
-    <CodeAnalysisRuleAssemblies>\rules</CodeAnalysisRuleAssemblies>
-    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
-    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
-    <ErrorReport>prompt</ErrorReport>
-    <NoWarn>1699</NoWarn>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System" />
-    <Reference Include="System.Data" />
-    <Reference Include="System.Xml" />
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="AssemblyInfo.cs" />
-    <Compile Include="EventListener.cs" />
-    <Compile Include="Extensibility\Addin.cs" />
-    <Compile Include="Extensibility\AddinStatus.cs" />
-    <Compile Include="Extensibility\ExtensionType.cs" />
-    <Compile Include="Extensibility\IAddin.cs" />
-    <Compile Include="Extensibility\IAddinRegistry.cs" />
-    <Compile Include="Extensibility\IExtensionHost.cs" />
-    <Compile Include="Extensibility\IExtensionPoint.cs" />
-    <Compile Include="Extensibility\IFrameworkRegistry.cs" />
-    <Compile Include="Extensibility\NUnitAddinAttribute.cs" />
-    <Compile Include="Extensibility\ISuiteBuilder.cs" />
-    <Compile Include="Extensibility\TestFramework.cs" />
-    <Compile Include="Filters\AndFilter.cs" />
-    <Compile Include="Filters\CategoryFilter.cs" />
-    <Compile Include="Filters\NameFilter.cs" />
-    <Compile Include="Filters\NotFilter.cs" />
-    <Compile Include="Filters\OrFilter.cs" />
-    <Compile Include="Filters\SimpleNameFilter.cs" />
-    <Compile Include="IService.cs" />
-    <Compile Include="ITest.cs" />
-    <Compile Include="Extensibility\ITestCaseBuilder.cs" />
-    <Compile Include="Extensibility\ITestDecorator.cs" />
-    <Compile Include="ITestFilter.cs" />
-    <Compile Include="ResultState.cs" />
-    <Compile Include="ResultVisitor.cs" />
-    <Compile Include="RunState.cs" />
-    <Compile Include="RuntimeFramework.cs" />
-    <Compile Include="Test.cs" />
-    <Compile Include="TestAssemblyInfo.cs" />
-    <Compile Include="TestCaseResult.cs" />
-    <Compile Include="TestFilter.cs" />
-    <Compile Include="TestID.cs" />
-    <Compile Include="TestInfo.cs" />
-    <Compile Include="TestName.cs" />
-    <Compile Include="TestNode.cs" />
-    <Compile Include="TestOutput.cs" />
-    <Compile Include="TestPackage.cs" />
-    <Compile Include="TestResult.cs" />
-    <Compile Include="TestRunner.cs" />
-    <Compile Include="TestSuiteResult.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <Folder Include="Properties\" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
-       Other similar extension points exist, see Microsoft.Common.targets.
-  <Target Name="BeforeBuild">
-  </Target>
-  <Target Name="AfterBuild">
-  </Target>
-  -->
-</Project>
\ No newline at end of file
diff --git a/src/NUnitCore/tests/AllTests.cs b/src/NUnitCore/tests/AllTests.cs
index 6265c5a..f0e4724 100644
--- a/src/NUnitCore/tests/AllTests.cs
+++ b/src/NUnitCore/tests/AllTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitCore/tests/AssemblyHelperTests.cs b/src/NUnitCore/tests/AssemblyHelperTests.cs
new file mode 100644
index 0000000..110e47c
--- /dev/null
+++ b/src/NUnitCore/tests/AssemblyHelperTests.cs
@@ -0,0 +1,26 @@
+using System;
+using System.IO;
+using NUnit.Framework;
+
+namespace NUnit.Core.Tests
+{
+    [TestFixture]
+    public class AssemblyHelperTests
+    {
+        [Test]
+        public void GetPathForAssembly()
+        {
+            string path = AssemblyHelper.GetAssemblyPath(this.GetType().Assembly);
+            Assert.That(Path.GetFileName(path), Is.EqualTo("nunit.core.tests.dll").IgnoreCase);
+            Assert.That(File.Exists(path));
+        }
+
+        [Test]
+        public void GetPathForType()
+        {
+            string path = AssemblyHelper.GetAssemblyPath(this.GetType());
+            Assert.That(Path.GetFileName(path), Is.EqualTo("nunit.core.tests.dll").IgnoreCase);
+            Assert.That(File.Exists(path));
+        }
+    }
+}
diff --git a/src/NUnitCore/tests/AssemblyReaderTests.cs b/src/NUnitCore/tests/AssemblyReaderTests.cs
index e5fc95a..2e74fb5 100644
--- a/src/NUnitCore/tests/AssemblyReaderTests.cs
+++ b/src/NUnitCore/tests/AssemblyReaderTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 using NUnit.Framework;
@@ -32,14 +32,15 @@ namespace NUnit.Core.Tests
 		[Test]
 		public void CreateFromPath()
 		{
-			Assert.AreEqual( "nunit.core.tests.dll", new AssemblyReader( "nunit.core.tests.dll" ).AssemblyPath );
+            string path = AssemblyHelper.GetAssemblyPath(System.Reflection.Assembly.GetAssembly(GetType()));
+            Assert.AreEqual(path, new AssemblyReader(path).AssemblyPath);
 		}
 
 		[Test]
 		public void CreateFromAssembly()
 		{
-			Assert.IsTrue( NUnit.Util.PathUtils.SamePath( Path.GetFullPath( "nunit.core.tests.dll" ), rdr.AssemblyPath ) );
-			//StringAssert.AreEqualIgnoringCase( Path.GetFullPath("nunit.core.tests.dll"), rdr.AssemblyPath );
+            string path = AssemblyHelper.GetAssemblyPath(System.Reflection.Assembly.GetAssembly(GetType()));
+            Assert.AreEqual(path, rdr.AssemblyPath);
 		}
 
 		[Test]
@@ -67,7 +68,7 @@ namespace NUnit.Core.Tests
 			string runtimeVersion = rdr.ImageRuntimeVersion;
 
 			StringAssert.StartsWith( "v", runtimeVersion );
-			Version version = new Version( runtimeVersion.Substring( 1 ) );
+			new Version( runtimeVersion.Substring( 1 ) );
 			// This fails when we force running under a prior version
 			// Assert.LessOrEqual( version, Environment.Version );
 		}
diff --git a/src/NUnitCore/tests/AssemblyResolverTests.cs b/src/NUnitCore/tests/AssemblyResolverTests.cs
index 42a0df1..bf92b04 100644
--- a/src/NUnitCore/tests/AssemblyResolverTests.cs
+++ b/src/NUnitCore/tests/AssemblyResolverTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 namespace NUnit.Core.Tests
 {
diff --git a/src/NUnitCore/tests/AssemblyTests.cs b/src/NUnitCore/tests/AssemblyTests.cs
index b64930b..eb8dd62 100644
--- a/src/NUnitCore/tests/AssemblyTests.cs
+++ b/src/NUnitCore/tests/AssemblyTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 namespace NUnit.Core.Tests
@@ -18,12 +18,14 @@ namespace NUnit.Core.Tests
 	[TestFixture]
 	public class AssemblyTests 
 	{
-		private string thisDll;
+        private string thisDll;
+	    private string noTestFixturesDll;
 
 		[SetUp]
 		public void InitStrings()
 		{
-			thisDll = this.GetType().Module.Name;
+            thisDll = AssemblyHelper.GetAssemblyPath(this.GetType());
+            noTestFixturesDll = AssemblyHelper.GetAssemblyPath(typeof(NUnit.TestUtilities.TestBuilder));
 		}
 
 		// TODO: Review and remove unnecessary tests
@@ -45,8 +47,7 @@ namespace NUnit.Core.Tests
 		{
 			TestSuiteBuilder builder = new TestSuiteBuilder();
 			Test suite = builder.Build( new TestPackage( thisDll ) );
-			Assert.IsNotNull( suite );
-			//Assert.IsNotNull(testAssembly, "should be able to load assembly");
+            Assert.IsNotNull(suite, "Unable to load " + thisDll);
 			Assert.IsTrue( File.Exists( thisDll ), "Load does not set current Directory" );
 		}
 
@@ -55,18 +56,16 @@ namespace NUnit.Core.Tests
 		public void LoadAssemblyNotFound()
 		{
 			TestSuiteBuilder builder = new TestSuiteBuilder();
-			builder.Build( new TestPackage( "XXXX.dll" ) );
+			builder.Build( new TestPackage( "/XXXX.dll" ) );
 		}
 
 		[Test]
 		public void LoadAssemblyWithoutTestFixtures()
 		{
-			string fileName = "notestfixtures-assembly.dll";
 			TestSuiteBuilder builder = new TestSuiteBuilder();
-			Test suite = builder.Build( new TestPackage( fileName ) );
-			Assert.IsNotNull( suite,"Should not be null" );
-			Assert.AreEqual( RunState.NotRunnable, suite.RunState );
-			Assert.AreEqual( suite.IgnoreReason, "Has no TestFixtures" );
+			Test suite = builder.Build( new TestPackage( noTestFixturesDll ) );
+            Assert.IsNotNull(suite, "Unable to load " + noTestFixturesDll);
+            Assert.AreEqual(RunState.Runnable, suite.RunState);
 			Assert.AreEqual( 0, suite.Tests.Count );
 		}
 
diff --git a/src/NUnitCore/tests/AssemblyVersionFixture.cs b/src/NUnitCore/tests/AssemblyVersionFixture.cs
index 7c61ec5..56160af 100644
--- a/src/NUnitCore/tests/AssemblyVersionFixture.cs
+++ b/src/NUnitCore/tests/AssemblyVersionFixture.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -17,17 +17,8 @@ namespace NUnit.Core.Tests
 	[TestFixture]
 	public class AssemblyVersionFixture
 	{
-		private static readonly string mockAssemblyName = "mock-test-assembly.dll";
-		
-		[TearDown]
-		public void DeleteMockAssembly()
-		{
-			FileInfo info = new FileInfo(mockAssemblyName);
-			if(info.Exists)
-				info.Delete();
-		}
-
 		[Test]
+        // TODO: Figure out what we're testing here! Was there a bug?
 		public void Version()
 		{
 			Version version = new Version("1.0.0.2002");
@@ -36,7 +27,7 @@ namespace NUnit.Core.Tests
 			AssemblyName assemblyName = new AssemblyName(); 
 			assemblyName.Name = nameString;
 			assemblyName.Version = version;
-			MakeDynamicAssembly(assemblyName, mockAssemblyName);
+			MakeDynamicAssembly(assemblyName);
 
 			Assembly assembly = FindAssemblyByName(nameString);
 
@@ -58,10 +49,9 @@ namespace NUnit.Core.Tests
 			return assembly;
 		}
 
-		public static void MakeDynamicAssembly(AssemblyName myAssemblyName, string fileName)
+		public static void MakeDynamicAssembly(AssemblyName myAssemblyName)
 		{
-			AssemblyBuilder myAssemblyBuilder = Thread.GetDomain().DefineDynamicAssembly(myAssemblyName, AssemblyBuilderAccess.RunAndSave);			
-			myAssemblyBuilder.Save(fileName);
+			Thread.GetDomain().DefineDynamicAssembly(myAssemblyName, AssemblyBuilderAccess.RunAndSave);			
 		}
 	}
 }
diff --git a/src/NUnitCore/tests/AssertPassFixture.cs b/src/NUnitCore/tests/AssertPassFixture.cs
new file mode 100644
index 0000000..62d1f03
--- /dev/null
+++ b/src/NUnitCore/tests/AssertPassFixture.cs
@@ -0,0 +1,46 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+
+namespace NUnit.Core.Tests
+{
+    [TestFixture]
+    public class AssertPassFixture
+    {
+        [Test]
+        public void AssertPassReturnsSuccess()
+        {
+            Assert.Pass("This test is OK!");
+        }
+
+        [Test]
+        public void SubsequentFailureIsIrrelevant()
+        {
+            Assert.Pass("This test is OK!");
+            Assert.Fail("No it's NOT!");
+        }
+    }
+
+    [TestFixture]
+    public class AssertInconclusiveFixture
+    {
+        [Test]
+        public void AssertInconclusiveThrowsException()
+        {
+            Exception ex = Assert.Throws(
+                typeof(InconclusiveException),
+                new TestDelegate(InconclusiveTest));
+            Assert.AreEqual("Unable to run test", ex.Message);
+        }
+
+        private static void InconclusiveTest()
+        {
+            Assert.Inconclusive("Unable to run test");
+        }
+    }
+}
diff --git a/src/NUnitCore/tests/AttributeDescriptionFixture.cs b/src/NUnitCore/tests/AttributeDescriptionFixture.cs
index 00f2364..7d0f86a 100644
--- a/src/NUnitCore/tests/AttributeDescriptionFixture.cs
+++ b/src/NUnitCore/tests/AttributeDescriptionFixture.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 using System.Reflection;
@@ -15,36 +15,6 @@ namespace NUnit.Core.Tests
 {
 	// TODO: Review to see if we need these tests
 
-	internal class DescriptionVisitor : ResultVisitor
-	{
-		private string name; 
-		private string description;
-
-		public DescriptionVisitor(string name, string description)
-		{
-			this.name = name;
-			this.description = description;
-		}
-
-		public void Visit(TestCaseResult caseResult)
-		{
-			if(caseResult.Name.Equals(name))
-				Assert.AreEqual(description, caseResult.Description);
-		}
-
-		public void Visit(TestSuiteResult suiteResult)
-		{
-			if(suiteResult.Name.Equals(name))
-				Assert.AreEqual(description, suiteResult.Description);
-
-			foreach (TestResult result in suiteResult.Results)
-			{
-				result.Accept(this);
-			}
-		}
-	}
-
-
 	[TestFixture]
 	public class TestAttributeFixture
 	{
@@ -53,14 +23,14 @@ namespace NUnit.Core.Tests
 		[Test]
 		public void ReflectionTest()
 		{
-			TestCase testCase = TestBuilder.MakeTestCase( FixtureType, "Method" );
+			Test testCase = TestBuilder.MakeTestCase( FixtureType, "Method" );
 			Assert.AreEqual( RunState.Runnable, testCase.RunState );
 		}
 
         [Test]
         public void Description()
         {
-            TestCase testCase = TestBuilder.MakeTestCase(FixtureType, "Method");
+            Test testCase = TestBuilder.MakeTestCase(FixtureType, "Method");
             Assert.AreEqual("Test Description", testCase.Description);
         }
 
@@ -69,20 +39,19 @@ namespace NUnit.Core.Tests
         {
             TestSuite suite = new TestSuite("Mock Fixture");
             suite.Add(TestBuilder.MakeFixture(typeof(MockFixture)));
-            TestResult result = suite.Run(NullListener.NULL);
+            TestResult result = suite.Run(NullListener.NULL, TestFilter.Empty);
 
-            DescriptionVisitor visitor = new DescriptionVisitor("NUnit.Tests.Attributes.MockFixture.Method", "Test Description");
-            result.Accept(visitor);
+            TestResult caseResult = TestFinder.Find("Method", result, true);
+            Assert.AreEqual("Test Description", caseResult.Description);
 
-            visitor =
-                new DescriptionVisitor("NUnit.Tests.Attributes.MockFixture.NoDescriptionMethod", null);
-            result.Accept(visitor);
+            caseResult = TestFinder.Find("NoDescriptionMethod", result, true);
+            Assert.IsNull(caseResult.Description);
         }
 
         [Test]
 		public void NoDescription()
 		{
-			TestCase testCase = TestBuilder.MakeTestCase( FixtureType, "NoDescriptionMethod" );
+			Test testCase = TestBuilder.MakeTestCase( FixtureType, "NoDescriptionMethod" );
 			Assert.IsNull(testCase.Description);
 		}
 
@@ -103,16 +72,16 @@ namespace NUnit.Core.Tests
 		{
 			TestSuite suite = new TestSuite("Mock Fixture");
 			suite.Add( TestBuilder.MakeFixture( typeof( MockFixture ) ) );
-			TestResult result = suite.Run(NullListener.NULL);
+            TestResult result = suite.Run(NullListener.NULL, TestFilter.Empty);
 
-			DescriptionVisitor visitor = new DescriptionVisitor("MockFixture", "Fixture Description");
-			result.Accept(visitor);
+		    TestResult fixtureResult = TestFinder.Find("MockFixture", result, true);
+            Assert.AreEqual("Fixture Description", fixtureResult.Description);
 		}
 
         [Test]
         public void SeparateDescriptionAttribute()
         {
-            TestCase testCase = TestBuilder.MakeTestCase(FixtureType, "SeparateDescriptionMethod");
+            Test testCase = TestBuilder.MakeTestCase(FixtureType, "SeparateDescriptionMethod");
             Assert.AreEqual("Separate Description", testCase.Description);
         }
 
@@ -121,10 +90,10 @@ namespace NUnit.Core.Tests
         {
             TestSuite suite = new TestSuite("Mock Fixture");
             suite.Add(TestBuilder.MakeFixture(typeof(MockFixture)));
-            TestResult result = suite.Run(NullListener.NULL);
+            TestResult result = suite.Run(NullListener.NULL, TestFilter.Empty);
 
-            DescriptionVisitor visitor = new DescriptionVisitor("NUnit.Tests.Attributes.MockFixture.SeparateDescriptionMethod", "Separate Description");
-            result.Accept(visitor);
+            TestResult caseResult = TestFinder.Find("SeparateDescriptionMethod", result, true);
+            Assert.AreEqual("Separate Description", caseResult.Description);
         }
 
     }
diff --git a/src/NUnitCore/tests/AttributeInheritance.cs b/src/NUnitCore/tests/AttributeInheritance.cs
index ed7c13d..78dc41f 100644
--- a/src/NUnitCore/tests/AttributeInheritance.cs
+++ b/src/NUnitCore/tests/AttributeInheritance.cs
@@ -1,3 +1,9 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
 using System;
 using NUnit.Framework;
 using NUnit.Core.Builders;
@@ -27,5 +33,23 @@ namespace NUnit.Core.Tests
 			Test fixture = builder.BuildFrom( typeof( TestData.When_collecting_test_fixtures ) );
 			Assert.AreEqual( 1, fixture.TestCount );
 		}
+
+        [Test]
+        public void InheritedExplicitAttributeIsRecognized()
+        {
+            Test fixture = builder.BuildFrom(typeof(TestData.AttributeInheritanceFixture));
+            Test test = TestUtilities.TestFinder.Find("ShouldBeExplicit", fixture, false);
+            Assert.That(test.RunState, Is.EqualTo(RunState.Explicit));
+            Assert.That(test.IgnoreReason, Is.EqualTo("Work in progress"));
+        }
+
+        [Test]
+        public void InheritedIgnoreAttributeIsRecognized()
+        {
+            Test fixture = builder.BuildFrom(typeof(TestData.AttributeInheritanceFixture));
+            Test test = TestUtilities.TestFinder.Find("ShouldBeIgnored", fixture, false);
+            Assert.That(test.RunState, Is.EqualTo(RunState.Ignored));
+            Assert.That(test.IgnoreReason, Is.EqualTo("Not yet implemented"));
+        }
 	}
 }
diff --git a/src/NUnitCore/tests/BasicRunnerTests.cs b/src/NUnitCore/tests/BasicRunnerTests.cs
index 24b657a..019160e 100644
--- a/src/NUnitCore/tests/BasicRunnerTests.cs
+++ b/src/NUnitCore/tests/BasicRunnerTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 using System.IO;
@@ -23,11 +23,14 @@ namespace NUnit.Core.Tests
 	/// </summary>
 	public abstract class BasicRunnerTests
 	{
-		private static readonly string testsDll = Path.GetFullPath("nonamespace-assembly.dll");
-		private static readonly string mockDll = Path.GetFullPath("mock-assembly.dll");
+		private static readonly string testsDll = NoNamespaceTestFixture.AssemblyPath;
+		private static readonly string mockDll = MockAssembly.AssemblyPath;
 		private readonly string[] assemblies = new string[] { testsDll, mockDll };
+        private readonly RuntimeFramework currentFramework = RuntimeFramework.CurrentFramework;
 
 		protected TestRunner runner;
+        private TestPackage package1;
+        private TestPackage package2;
 
 		[TestFixtureSetUp]
 		public void SetUpRunner()
@@ -39,12 +42,29 @@ namespace NUnit.Core.Tests
         [TestFixtureTearDown]
         public void TearDownRunner()
         {
-            if (runner != null)
-                runner.Unload();
+            DestroyRunner();
+        }
+
+        [SetUp]
+        public void CreatePackages()
+        {
+            package1 = new TestPackage(MockAssembly.AssemblyPath);
+            package2 = new TestPackage("TestSuite", assemblies);
+
+            // Set current framework explicitly to avoid running out of process
+            // unless explicitly called for by derived test.
+            package1.Settings["RuntimeFramework"] = currentFramework;
+            package2.Settings["RuntimeFramework"] = currentFramework;
         }
 
 		protected abstract TestRunner CreateRunner( int runnerID );
 
+        protected virtual void DestroyRunner()
+        {
+            if (runner != null)
+                runner.Unload();
+        }
+
         [Test]
         public void CheckRunnerID()
         {
@@ -52,74 +72,73 @@ namespace NUnit.Core.Tests
         }
 
         [Test]
-		public void LoadAssembly() 
+		public virtual void LoadAndReloadAssembly() 
 		{
-			Assert.IsTrue(runner.Load( new TestPackage( mockDll ) ), "Unable to load assembly" );
-		}
+            Assert.IsTrue(runner.Load(package1), "Unable to load assembly");
+            runner.Unload();
+            Assert.IsTrue(runner.Load(package1), "Unable to reload assembly");
+        }
 
 		[Test]
 		public void LoadAssemblyWithoutNamespaces()
 		{
-			TestPackage package = new TestPackage( mockDll );
-			package.Settings["AutoNamespaceSuites"] = false;
-			Assert.IsTrue(runner.Load( package ), "Unable to load assembly" );
+            package1.Settings["AutoNamespaceSuites"] = false;
+            Assert.IsTrue(runner.Load(package1), "Unable to load assembly");
 			ITest test = runner.Test;
 			Assert.IsNotNull( test );
-			Assert.AreEqual( MockAssembly.Fixtures, test.Tests.Count );
+			Assert.AreEqual( MockAssembly.Classes, test.Tests.Count );
 			Assert.AreEqual( "MockTestFixture", ((ITest)test.Tests[0]).TestName.Name );
 		}
 
 		[Test]
 		public void LoadAssemblyWithFixture()
 		{
-			TestPackage package = new TestPackage( mockDll );
-			package.TestName = "NUnit.Tests.Assemblies.MockTestFixture";
-			Assert.IsTrue( runner.Load( package ) );
+			package1.TestName = "NUnit.Tests.Assemblies.MockTestFixture";
+			Assert.IsTrue( runner.Load( package1 ) );
 		}
 
 		[Test]
 		public void LoadAssemblyWithSuite()
 		{
-			TestPackage package = new TestPackage( mockDll );
-			package.TestName = "NUnit.Tests.Assemblies.MockSuite";
-			runner.Load( package );
+			package1.TestName = "NUnit.Tests.Assemblies.MockSuite";
+			runner.Load( package1 );
 			Assert.IsNotNull(runner.Test, "Unable to build suite");
 		}
 
 		[Test]
 		public void CountTestCases()
 		{
-			runner.Load( new TestPackage( mockDll ) );
+			runner.Load(package1);
 			Assert.AreEqual( MockAssembly.Tests, runner.Test.TestCount );
 		}
 
 		[Test]
 		public void LoadMultipleAssemblies()
 		{
-			runner.Load( new TestPackage( "TestSuite", assemblies ) );
+			runner.Load( package2 );
 			Assert.IsNotNull( runner.Test, "Unable to load assemblies" );
 		}
 
 		[Test]
 		public void LoadMultipleAssembliesWithFixture()
 		{
-			TestPackage package = MakePackage( "TestSuite", assemblies, "NUnit.Tests.Assemblies.MockTestFixture" );
-			runner.Load( package );
+            package2.TestName = "NUnit.Tests.Assemblies.MockTestFixture";
+			runner.Load( package2 );
 			Assert.IsNotNull(runner.Test, "Unable to build suite");
 		}
 
 		[Test]
 		public void LoadMultipleAssembliesWithSuite()
 		{
-			TestPackage package = MakePackage( "TestSuite", assemblies, "NUnit.Tests.Assemblies.MockSuite" );
-			runner.Load( package );
+            package2.TestName = "NUnit.Tests.Assemblies.MockSuite";
+			runner.Load( package2 );
 			Assert.IsNotNull(runner.Test, "Unable to build suite");
 		}
 
 		[Test]
 		public void CountTestCasesAcrossMultipleAssemblies()
 		{
-			runner.Load( new TestPackage( "TestSuite", assemblies ) );
+			runner.Load(package2);
 			Assert.AreEqual( NoNamespaceTestFixture.Tests + MockAssembly.Tests, 
 				runner.Test.TestCount );			
 		}
@@ -127,53 +146,45 @@ namespace NUnit.Core.Tests
 		[Test]
 		public void RunAssembly()
 		{
-			runner.Load( new TestPackage( mockDll ) );
+			runner.Load(package1);
 			TestResult result = runner.Run( NullListener.NULL );
 			ResultSummarizer summary = new ResultSummarizer(result);
-			Assert.AreEqual( MockAssembly.Tests - MockAssembly.NotRun, summary.ResultCount );
+			Assert.AreEqual( MockAssembly.Tests - MockAssembly.NotRun, summary.TestsRun );
 		}
 
 		[Test]
 		public void RunAssemblyUsingBeginAndEndRun()
 		{
-			runner.Load( new TestPackage( mockDll ) );
+			runner.Load(package1);
 			runner.BeginRun( NullListener.NULL );
 			TestResult result = runner.EndRun();
 			Assert.IsNotNull( result );
 			ResultSummarizer summary = new ResultSummarizer( result );
-			Assert.AreEqual( MockAssembly.Tests - MockAssembly.NotRun, summary.ResultCount );
+			Assert.AreEqual( MockAssembly.Tests - MockAssembly.NotRun, summary.TestsRun );
 		}
 
 		[Test]
 		public void RunMultipleAssemblies()
 		{
-			runner.Load( new TestPackage( "TestSuite", assemblies ) );
+			runner.Load( package2 );
 			TestResult result = runner.Run( NullListener.NULL );
 			ResultSummarizer summary = new ResultSummarizer(result);
 			Assert.AreEqual( 
 				NoNamespaceTestFixture.Tests + MockAssembly.Tests - MockAssembly.NotRun, 
-				summary.ResultCount);
+				summary.TestsRun);
 		}
 
 		[Test]
 		public void RunMultipleAssembliesUsingBeginAndEndRun()
 		{
-			runner.Load( new TestPackage( "TestSuite", assemblies ) );
+			runner.Load( package2 );
 			runner.BeginRun( NullListener.NULL );
 			TestResult result = runner.EndRun();
 			Assert.IsNotNull( result );
 			ResultSummarizer summary = new ResultSummarizer( result );
 			Assert.AreEqual( 
 				NoNamespaceTestFixture.Tests + MockAssembly.Tests - MockAssembly.NotRun, 
-				summary.ResultCount);
-		}
-
-		private TestPackage MakePackage( string name, IList assemblies, string testName )
-		{
-			TestPackage package = new TestPackage( name, assemblies );
-			package.TestName = testName;
-
-			return package;
+				summary.TestsRun);
 		}
 	}
 }
diff --git a/src/NUnitCore/tests/CallContextTests.cs b/src/NUnitCore/tests/CallContextTests.cs
index 195fa3c..a33b202 100644
--- a/src/NUnitCore/tests/CallContextTests.cs
+++ b/src/NUnitCore/tests/CallContextTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 using System.Threading;
@@ -31,12 +31,12 @@ namespace NUnit.Core.Tests
 //			CallContext.FreeNamedDataSlot(CONTEXT_DATA);
 //		}
 
-//		[TestFixtureTearDown]
-//		public void FreeCallContextDataSlot()
-//		{
-//			// NOTE: We don't want possible side effects on other cross context tests.
-//			CallContext.FreeNamedDataSlot(CONTEXT_DATA);
-//		}
+        [TestFixtureTearDown]
+        public void FreeCallContextDataSlot()
+        {
+            // NOTE: We don't want possible side effects on other cross context tests.
+            CallContext.FreeNamedDataSlot(CONTEXT_DATA);
+        }
 
 		[Test]
 		public void ILogicalThreadAffinativeTest()
diff --git a/src/NUnitCore/tests/CategoryAttributeTests.cs b/src/NUnitCore/tests/CategoryAttributeTests.cs
index 0ea8d99..d93f059 100644
--- a/src/NUnitCore/tests/CategoryAttributeTests.cs
+++ b/src/NUnitCore/tests/CategoryAttributeTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 using NUnit.Framework;
@@ -33,15 +33,36 @@ namespace NUnit.Core.Tests
 		[Test]
 		public void CategoryOnTestCase()
 		{
-			TestCase test1 = (TestCase)fixture.Tests[0];
+			Test test1 = (Test)fixture.Tests[0];
 			Assert.Contains( "Long", test1.Categories );
 		}
 
 		[Test]
 		public void CanDeriveFromCategoryAttribute()
 		{
-			TestCase test2 = (TestCase)fixture.Tests[1];
+			Test test2 = (Test)fixture.Tests[1];
 			Assert.Contains( "Critical", test2.Categories );
 		}
-	}
+		
+		[Test]
+		public void DerivedCategoryMayBeInherited()
+		{
+			Assert.Contains("MyCategory", fixture.Categories);
+		}
+
+        [Test]
+        public void CountTestsWithoutCategoryFilter()
+        {
+            Assert.That(fixture.CountTestCases(TestFilter.Empty), Is.EqualTo(2));
+        }
+
+        [TestCase("Database", Result = 0)]
+        [TestCase("Long", Result = 1)]
+        [TestCase("Critical", Result = 1)]
+        public int CountTestsUsingCategoryFilter(string name)
+        {
+            TestFilter filter = new Filters.CategoryFilter(name);
+            return fixture.CountTestCases(filter);
+        }
+    }
 }
diff --git a/src/NUnitCore/tests/CombinatorialTests.cs b/src/NUnitCore/tests/CombinatorialTests.cs
new file mode 100644
index 0000000..badd299
--- /dev/null
+++ b/src/NUnitCore/tests/CombinatorialTests.cs
@@ -0,0 +1,82 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+
+namespace NUnit.Core.Tests
+{
+    [TestFixture]
+    public class CombinatorialTests
+    {
+        [Test]
+        public void SingleArgument(
+            [Values(1.3, 1.7, 1.5)] double x)
+        {
+            Assert.That(x > 1.0 && x < 2.0);
+        }
+
+        [Test, Combinatorial]
+        public void TwoArguments_Combinatorial(
+            [Values(1, 2, 3)] int x,
+            [Values(10, 20)] int y)
+        {
+            Assert.That(x > 0 && x < 4 && y % 10 == 0);
+        }
+
+        [Test, Sequential]
+        public void TwoArguments_Sequential(
+            [Values(1, 2, 3)] int x,
+            [Values(10, 20)] int y)
+        {
+            Assert.That(x > 0 && x < 4 && y % 10 == 0);
+        }
+
+        [Test, Combinatorial]
+        public void ThreeArguments_Combinatorial(
+            [Values(1, 2, 3)] int x,
+            [Values(10, 20)] int y,
+            [Values("Charlie", "Joe", "Frank")] string name)
+        {
+            Assert.That(x > 0 && x < 4 && y % 10 == 0);
+            Assert.That(name.Length >= 2);
+        }
+
+        [Test, Sequential]
+        public void ThreeArguments_Sequential(
+            [Values(1, 2, 3)] int x,
+            [Values(10, 20)] int y,
+            [Values("Charlie", "Joe", "Frank")] string name)
+        {
+            Assert.That(x > 0 && x < 4 && y % 10 == 0);
+            Assert.That(name.Length >= 2);
+        }
+
+        [Test]
+        public void RangeTest(
+            [Range(0.2, 0.6, 0.2)] double a,
+            [Range(10, 20, 5)] int b)
+        {
+        }
+        
+        [Test, Sequential]
+        public void RandomTest(
+            [Random(32, 212, 5)] int x,
+            [Random(5)] double y)
+        {
+            Assert.That(x,Is.InRange(32,212));
+            Assert.That(y,Is.InRange(0.0,1.0));
+        }
+
+        [Test, Sequential]
+        public void RandomArgsAreIndependent(
+            [Random(1)] double x,
+            [Random(1)] double y)
+        {
+            Assert.AreNotEqual(x, y);
+        }
+    }
+}
diff --git a/src/NUnitCore/tests/CoreExtensionsTests.cs b/src/NUnitCore/tests/CoreExtensionsTests.cs
index db771e2..293019e 100644
--- a/src/NUnitCore/tests/CoreExtensionsTests.cs
+++ b/src/NUnitCore/tests/CoreExtensionsTests.cs
@@ -1,9 +1,11 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
+using System.Text;
+using System.Reflection;
 using NUnit.Framework;
 using NUnit.Core.Extensibility;
 using NUnit.Mocks;
@@ -60,7 +62,10 @@ namespace NUnit.Core.Tests
 		[Test]
 		public void HasTestFrameworkRegistry()
 		{
-            Assert.IsNotNull(host.FrameworkRegistry);
+			IExtensionPoint ep = host.GetExtensionPoint( "FrameworkRegistry" );
+			Assert.IsNotNull( ep );
+			Assert.AreEqual( "FrameworkRegistry", ep.Name );
+			Assert.AreEqual( typeof( FrameworkRegistry ), ep.GetType() );
 		}
 
 		[Test]
@@ -68,15 +73,70 @@ namespace NUnit.Core.Tests
 		{
 			DynamicMock mock = new DynamicMock( typeof(ITestDecorator) );
 			mock.Expect( "Decorate" );
-			
-			IExtensionPoint ep = host.GetExtensionPoint("TestDecorators");
-			ep.Install( mock.MockInstance );
-			host.TestDecorators.Decorate( null, null );
+
+            IExtensionPoint ep = host.GetExtensionPoint("TestDecorators");
+            ep.Install(mock.MockInstance);
+
+            ITestDecorator decorators = (ITestDecorator)ep;
+            decorators.Decorate(null, null);
 
 			mock.Verify();
 		}
 
-		[Test]
+        class MockDecorator : ITestDecorator
+        {
+            private string name;
+            private StringBuilder sb;
+
+            public MockDecorator(string name, StringBuilder sb)
+            {
+                this.name = name;
+                this.sb = sb;
+            }
+
+            public Test Decorate(Test test, MemberInfo member)
+            {
+                sb.Append(name);
+                return test;
+            }
+        }
+
+	    [Test]
+        public void DecoratorsRunInOrderOfPriorities()
+        {
+            StringBuilder sb = new StringBuilder();
+
+            ITestDecorator mock0 = new MockDecorator("mock0", sb);
+            ITestDecorator mock1 = new MockDecorator("mock1", sb);
+            ITestDecorator mock3a = new MockDecorator("mock3a", sb);
+            ITestDecorator mock3b = new MockDecorator("mock3b", sb);
+            ITestDecorator mock3c = new MockDecorator("mock3c", sb);
+            ITestDecorator mock5a = new MockDecorator("mock5a", sb);
+            ITestDecorator mock5b = new MockDecorator("mock5b", sb);
+            ITestDecorator mock8 = new MockDecorator("mock8", sb);
+            ITestDecorator mock9 = new MockDecorator("mock9", sb);
+
+            IExtensionPoint2 ep = (IExtensionPoint2)host.GetExtensionPoint("TestDecorators");
+            ep.Install(mock8, 8);
+            ep.Install(mock5a, 5);
+            ep.Install(mock1, 1);
+            ep.Install(mock3a, 3);
+            ep.Install(mock3b, 3);
+            ep.Install(mock9, 9);
+            ep.Install(mock3c, 3);
+            ep.Install(mock0);
+            ep.Install(mock5b, 5);
+
+            ITestDecorator decorators = (ITestDecorator)ep;
+            decorators.Decorate(null, null);
+            Assert.AreEqual("mock0mock1mock3cmock3bmock3amock5bmock5amock8mock9", sb.ToString());
+
+            sb.Remove(0, sb.Length);
+	        decorators.Decorate(null, null);
+            Assert.AreEqual("mock0mock1mock3cmock3bmock3amock5bmock5amock8mock9", sb.ToString());
+        }
+
+	    [Test]
 		public void CanAddSuiteBuilder()
 		{
 			DynamicMock mock = new DynamicMock( typeof(ISuiteBuilder) );
@@ -85,26 +145,43 @@ namespace NUnit.Core.Tests
 			
 			IExtensionPoint ep = host.GetExtensionPoint("SuiteBuilders");
 			ep.Install( mock.MockInstance );
-			host.SuiteBuilders.BuildFrom( null );
+			ISuiteBuilder builders = (ISuiteBuilder)ep;
+			builders.BuildFrom( null );
 
 			mock.Verify();
 		}
 
-		[Test]
-		public void CanAddTestCaseBuilder()
-		{
-			DynamicMock mock = new DynamicMock( typeof(ITestCaseBuilder) );
-			mock.ExpectAndReturn( "CanBuildFrom", true, null );
-			mock.Expect( "BuildFrom" );
-			
-			IExtensionPoint ep = host.GetExtensionPoint("TestCaseBuilders");
-			ep.Install( mock.MockInstance );
-			host.TestBuilders.BuildFrom( null );
-
-			mock.Verify();
-		}
-
-		[Test]
+        [Test]
+        public void CanAddTestCaseBuilder()
+        {
+            DynamicMock mock = new DynamicMock(typeof(ITestCaseBuilder));
+            mock.ExpectAndReturn("CanBuildFrom", true, null);
+            mock.Expect("BuildFrom");
+
+            IExtensionPoint ep = host.GetExtensionPoint("TestCaseBuilders");
+            ep.Install(mock.MockInstance);
+            ITestCaseBuilder builders = (ITestCaseBuilder)ep;
+            builders.BuildFrom(null);
+
+            mock.Verify();
+        }
+
+        [Test]
+        public void CanAddTestCaseBuilder2()
+        {
+            DynamicMock mock = new DynamicMock(typeof(ITestCaseBuilder2));
+            mock.ExpectAndReturn("CanBuildFrom", true, null);
+            mock.Expect("BuildFrom");
+
+            IExtensionPoint ep = host.GetExtensionPoint("TestCaseBuilders");
+            ep.Install(mock.MockInstance);
+            ITestCaseBuilder2 builders = (ITestCaseBuilder2)ep;
+            builders.BuildFrom(null, null);
+
+            mock.Verify();
+        }
+
+        [Test]
 		public void CanAddEventListener()
 		{
 			DynamicMock mock = new DynamicMock( typeof(EventListener) );
@@ -113,8 +190,9 @@ namespace NUnit.Core.Tests
 
 			IExtensionPoint ep = host.GetExtensionPoint("EventListeners");
 			ep.Install( mock.MockInstance );
-			host.Listeners.RunStarted( "test", 0 );
-			host.Listeners.RunFinished( new TestSuiteResult(null, "test") );
+			EventListener listeners = (EventListener)ep;
+			listeners.RunStarted( "test", 0 );
+			listeners.RunFinished( new TestResult( new TestInfo( new TestSuite( "test" ) ) ) );
 
 			mock.Verify();
 		}
diff --git a/src/NUnitCore/tests/CultureDetectionTests.cs b/src/NUnitCore/tests/CultureDetectionTests.cs
deleted file mode 100644
index 3030d79..0000000
--- a/src/NUnitCore/tests/CultureDetectionTests.cs
+++ /dev/null
@@ -1,89 +0,0 @@
-using System;
-using System.Globalization;
-using NUnit.Framework;
-
-namespace NUnit.Core.Tests
-{
-	/// <summary>
-	/// Summary description for CultureDetectionTests.
-	/// </summary>
-	[TestFixture]
-	public class CultureDetectionTests
-	{
-		private CultureDetector detector = new CultureDetector("fr-FR");
-
-		private void ExpectMatch( string culture )
-		{
-			if ( !detector.IsCultureSupported( culture ) )
-				Assert.Fail( string.Format( "Failed to match \"{0}\"" , culture ) );
-		}
-
-		private void ExpectMatch( CultureAttribute attr )
-		{
-			if ( !detector.IsCultureSupported( attr ) )
-				Assert.Fail( string.Format( "Failed to match attribute with Include=\"{0}\",Exclude=\"{1}\"", attr.Include, attr.Exclude ) );
-		}
-
-		private void ExpectFailure( string culture )
-		{
-			if ( detector.IsCultureSupported( culture ) )
-				Assert.Fail( string.Format( "Should not match \"{0}\"" , culture ) );
-			Assert.AreEqual( "Only supported under culture " + culture, detector.Reason );
-		}
-
-		private void ExpectFailure( CultureAttribute attr, string msg )
-		{
-			if ( detector.IsCultureSupported( attr ) )
-				Assert.Fail( string.Format( "Should not match attribute with Include=\"{0}\",Exclude=\"{1}\"",
-					attr.Include, attr.Exclude ) );
-			Assert.AreEqual( msg, detector.Reason );
-		}
-
-		[Test]
-		public void CanMatchStrings()
-		{
-			ExpectMatch( "fr-FR" );
-			ExpectMatch( "fr" );
-			ExpectMatch( "fr-FR,fr-BE,fr-CA" );
-			ExpectMatch( "en,de,fr,it" );
-			ExpectFailure( "en-GB" );
-			ExpectFailure( "en" );
-			ExpectFailure( "fr-CA" );
-			ExpectFailure( "fr-BE,fr-CA" );
-			ExpectFailure( "en,de,it" );
-		}
-
-		[Test]
-		public void CanMatchAttributeWithInclude()
-		{
-			ExpectMatch( new CultureAttribute( "fr-FR" ) );
-			ExpectMatch( new CultureAttribute( "fr-FR,fr-BE,fr-CA" ) );
-			ExpectFailure( new CultureAttribute( "en" ), "Only supported under culture en" );
-			ExpectFailure( new CultureAttribute( "en,de,it" ), "Only supported under culture en,de,it" );
-		}
-
-		[Test]
-		public void CanMatchAttributeWithExclude()
-		{
-			CultureAttribute attr = new CultureAttribute();
-			attr.Exclude = "en";
-			ExpectMatch( attr );
-			attr.Exclude = "en,de,it";
-			ExpectMatch( attr );
-			attr.Exclude = "fr";
-			ExpectFailure( attr, "Not supported under culture fr");
-			attr.Exclude = "fr-FR,fr-BE,fr-CA";
-			ExpectFailure( attr, "Not supported under culture fr-FR,fr-BE,fr-CA" );
-		}
-
-		[Test]
-		public void CanMatchAttributeWithIncludeAndExclude()
-		{
-			CultureAttribute attr = new CultureAttribute( "en,fr,de,it" );
-			attr.Exclude="fr-CA,fr-BE";
-			ExpectMatch( attr );
-			attr.Exclude = "fr-FR";
-			ExpectFailure( attr, "Not supported under culture fr-FR" );
-		}
-	}
-}
diff --git a/src/NUnitCore/tests/CultureSettingAndDetectionTests.cs b/src/NUnitCore/tests/CultureSettingAndDetectionTests.cs
index 358022e..60e241c 100644
--- a/src/NUnitCore/tests/CultureSettingAndDetectionTests.cs
+++ b/src/NUnitCore/tests/CultureSettingAndDetectionTests.cs
@@ -1,8 +1,13 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
 using System;
 using System.Threading;
 using System.Globalization;
 using NUnit.Framework;
-using NUnit.Framework.SyntaxHelpers;
 using NUnit.TestData.CultureAttributeTests;
 using NUnit.TestUtilities;
 
@@ -131,8 +136,11 @@ namespace NUnit.Core.Tests
 		{
 			TestResult result = TestBuilder.RunTestCase( typeof( InvalidCultureFixture ), "InvalidCultureSet" );
 			Assert.AreEqual( ResultState.Error, result.ResultState );
-            Assert.That( result.Message, Text.StartsWith( "System.ArgumentException" ) );
-            Assert.That( result.Message, Text.Contains("xx-XX").IgnoreCase );
+            string expectedException = RuntimeFramework.CurrentFramework.ClrVersion.Major == 4
+                ? "System.Globalization.CultureNotFoundException"
+                : "System.ArgumentException";
+            Assert.That(result.Message, Text.StartsWith(expectedException));
+            Assert.That(result.Message, Text.Contains("xx-XX").IgnoreCase);
 		}
 
 		[TestFixture, SetCulture("en-GB")]
@@ -144,5 +152,14 @@ namespace NUnit.Core.Tests
 				Assert.AreEqual( "en-GB", CultureInfo.CurrentCulture.Name );
 			}
 		}
+
+#if NET_2_0
+        [Test, SetCulture("de-DE")]
+        [TestCase(Result="01.06.2010 00:00:00")]
+        public string UseWithParameterizedTest()
+        {
+            return new DateTime(2010, 6, 1).ToString();
+        }
+#endif
 	}
 }
diff --git a/src/NUnitCore/tests/DatapointTests.cs b/src/NUnitCore/tests/DatapointTests.cs
new file mode 100644
index 0000000..5ea830e
--- /dev/null
+++ b/src/NUnitCore/tests/DatapointTests.cs
@@ -0,0 +1,66 @@
+using System;
+#if NET_2_0
+using System.Collections.Generic;
+#endif
+using NUnit.Framework;
+using NUnit.TestData.DatapointFixture;
+using NUnit.TestUtilities;
+
+namespace NUnit.Core.Tests
+{
+    public class DatapointTests
+    {
+        private void RunTestOnFixture(Type fixtureType)
+        {
+            TestResult result = TestBuilder.RunTestFixture(fixtureType);
+            NUnit.Util.ResultSummarizer summary = new NUnit.Util.ResultSummarizer(result);
+            Assert.That(summary.Passed, Is.EqualTo(2));
+            Assert.That(summary.Inconclusive, Is.EqualTo(3));
+            Assert.That(result.ResultState, Is.EqualTo(ResultState.Success));
+        }
+
+        [Test]
+        public void WorksOnField()
+        {
+            RunTestOnFixture(typeof(SquareRootTest_Field_Double));
+        }
+
+        [Test]
+        public void WorksOnArray()
+        {
+            RunTestOnFixture(typeof(SquareRootTest_Field_ArrayOfDouble));
+        }
+
+        [Test]
+        public void WorksOnPropertyReturningArray()
+        {
+            RunTestOnFixture(typeof(SquareRootTest_Property_ArrayOfDouble));
+        }
+
+        [Test]
+        public void WorksOnMethodReturningArray()
+        {
+            RunTestOnFixture(typeof(SquareRootTest_Method_ArrayOfDouble));
+        }
+
+#if NET_2_0 && CS_3_0
+        [Test]
+        public void WorksOnIEnumerableOfT()
+        {
+            RunTestOnFixture(typeof(SquareRootTest_Field_IEnumerableOfDouble));
+        }
+
+        [Test]
+        public void WorksOnPropertyReturningIEnumerableOfT()
+        {
+            RunTestOnFixture(typeof(SquareRootTest_Property_IEnumerableOfDouble));
+        }
+
+        [Test]
+        public void WorksOnMethodReturningIEnumerableOfT()
+        {
+            RunTestOnFixture(typeof(SquareRootTest_Method_IEnumerableOfDouble));
+        }
+#endif
+    }
+}
diff --git a/src/NUnitCore/tests/DirectoryChangeTests.cs b/src/NUnitCore/tests/DirectoryChangeTests.cs
new file mode 100644
index 0000000..048ef31
--- /dev/null
+++ b/src/NUnitCore/tests/DirectoryChangeTests.cs
@@ -0,0 +1,26 @@
+// ****************************************************************
+// Copyright 2010, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using NUnit.TestData;
+using NUnit.TestUtilities;
+
+namespace NUnit.Core.Tests
+{
+	[TestFixture]
+	public class DirectoryChangeTests
+	{
+		[Test]
+		public void ChangingCurrentDirectoryGivesWarning()
+		{
+			TestResult result = TestBuilder.RunTestCase(typeof(DirectoryChangeFixture), "ChangeCurrentDirectory");
+			Assert.AreEqual(ResultState.Success, result.ResultState);
+			Assert.AreEqual("Warning: Test changed the CurrentDirectory", result.Message);
+		}
+	}
+}
+
diff --git a/src/NUnitCore/tests/DirectorySwapperTests.cs b/src/NUnitCore/tests/DirectorySwapperTests.cs
index 559bc47..d8b3836 100644
--- a/src/NUnitCore/tests/DirectorySwapperTests.cs
+++ b/src/NUnitCore/tests/DirectorySwapperTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 using System.IO;
diff --git a/src/NUnitCore/tests/EventQueueTests.cs b/src/NUnitCore/tests/EventQueueTests.cs
index ab1534e..698f8e3 100644
--- a/src/NUnitCore/tests/EventQueueTests.cs
+++ b/src/NUnitCore/tests/EventQueueTests.cs
@@ -1,147 +1,630 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 using System.Collections;
+using System.Diagnostics;
+using System.IO;
 using System.Threading;
+using NUnit.Core.Extensibility;
 using NUnit.Framework;
 
+using ThreadState = System.Threading.ThreadState;
+
 namespace NUnit.Core.Tests
 {
 	/// <summary>
 	/// Summary description for EventQueueTests.
 	/// </summary>
-	[TestFixture]
-	public class EventQueueTests
-	{
-		static readonly Event[] events = {
+    [TestFixture]
+    public class EventQueueTests
+    {
+        static readonly Event[] events = {
 				new RunStartedEvent( string.Empty, 0 ),
 				new SuiteStartedEvent( null ),
+                new OutputEvent( new TestOutput( string.Empty, TestOutputType.Log )),
 				new TestStartedEvent( null ),
+                new OutputEvent( new TestOutput( string.Empty, TestOutputType.Out )),
 				new TestFinishedEvent( null ),
+                new OutputEvent( new TestOutput( string.Empty, TestOutputType.Trace )),
 				new SuiteFinishedEvent( null ),
 				new RunFinishedEvent( (TestResult)null )
 			};
 
-		private void EnqueueEvents( EventQueue q )
-		{
-			foreach( Event e in events )
-				q.Enqueue( e );
-		}
-
-		private void SendEvents( EventListener el )
-		{
-			foreach( Event e in events )
-				e.Send( el );
-		}
-
-		private void VerifyQueue( EventQueue q )
-		{
-			for( int index = 0; index < events.Length; index++ )
-			{
-				Event e = q.Dequeue();
-				Assert.AreEqual( events[index].GetType(), e.GetType(), 
-					string.Format("Event {0}",index) );
-			}
-		}
-
-		private void StartPump( EventPump pump, int waitTime )
-		{
-			pump.Start();
-			
-			while( waitTime > 0 && !pump.Pumping )
-			{
-				Thread.Sleep( 10 );
-				waitTime -= 10;
-			}
-		}
-
-		private void StopPump( EventPump pump, int waitTime )
-		{
-			pump.Stop();
-			WaitForPumpToStop( pump, waitTime );
-		}
-
-		private void WaitForPumpToStop( EventPump pump, int waitTime )
-		{
-			while( waitTime > 0 && pump.Pumping )
-			{
-				Thread.Sleep( 10 );
-				waitTime -= 10;
-			}
-		}
-
-		[Test]
-		public void QueueEvents()
-		{
-			EventQueue q = new EventQueue();
-			EnqueueEvents( q );
-			VerifyQueue( q );
-		}
-
-		[Test]
-		public void SendEvents()
-		{
-			QueuingEventListener el = new QueuingEventListener();
-			SendEvents( el );
-			VerifyQueue( el.Events );
-		}
-
-		[Test]
-		public void StartAndStopPumpOnEmptyQueue()
-		{
-			EventPump pump = new EventPump( NullListener.NULL, new EventQueue(), false );
-			StartPump( pump, 1000 ); 
-			Assert.IsTrue( pump.Pumping, "Pump failed to start" );
-			StopPump( pump, 1000 );
-			Assert.IsFalse( pump.Pumping, "Pump failed to stop" );
-		}
-
-		[Test]
-		public void PumpAutoStopsOnRunFinished()
-		{
-			EventQueue q = new EventQueue();
-			EventPump pump = new EventPump( NullListener.NULL, q, true );
-			Assert.IsFalse( pump.Pumping, "Should not be pumping initially" );
-			StartPump( pump, 1000 );
-			Assert.IsTrue( pump.Pumping, "Pump failed to start" );
-			q.Enqueue( new RunFinishedEvent( new Exception() ) );
-			WaitForPumpToStop( pump, 1000 );
-			Assert.IsFalse( pump.Pumping, "Pump failed to stop" );
-		}
-
-		[Test]
-		public void PumpEvents()
-		{
-			EventQueue q = new EventQueue();
-			EnqueueEvents( q );
-			QueuingEventListener el = new QueuingEventListener();
-			EventPump pump = new EventPump( el, q, false );
-			Assert.IsFalse( pump.Pumping, "Should not be pumping initially" );
-			StartPump( pump, 1000 );
-			Assert.IsTrue( pump.Pumping, "Pump should still be running" );
-			StopPump( pump, 1000 );
-			Assert.IsFalse( pump.Pumping, "Pump should have stopped" );
-			VerifyQueue( el.Events );
-		}
-
-		[Test]
-		public void PumpEventsWithAutoStop()
-		{
-			EventQueue q = new EventQueue();
-			EnqueueEvents( q );
-			QueuingEventListener el = new QueuingEventListener();
-			EventPump pump = new EventPump( el, q, true );
-			pump.Start();
-			int tries = 10;
-			while( --tries > 0 && q.Count > 0 )
-			{
-				Thread.Sleep(100);
-			}
-			VerifyQueue( el.Events );
-			Assert.IsFalse( pump.Pumping, "Pump failed to stop" );
-		}
-	}
+        private static void EnqueueEvents(EventQueue q)
+        {
+            foreach (Event e in events)
+                q.Enqueue(e);
+        }
+
+        private static void SendEvents(EventListener el)
+        {
+            foreach (Event e in events)
+                e.Send(el);
+        }
+
+        private static void VerifyQueue(EventQueue q)
+        {
+            for (int index = 0; index < events.Length; index++)
+            {
+                Event e = q.Dequeue(false);
+                Assert.AreEqual(events[index].GetType(), e.GetType(),
+                    string.Format("Event {0}", index));
+            }
+        }
+
+        private static void StartPump(EventPump pump, int waitTime)
+        {
+            pump.Start();
+            WaitForPumpToStart(pump, waitTime);
+        }
+
+        private static void StopPump(EventPump pump, int waitTime)
+        {
+            pump.Stop();
+            WaitForPumpToStop(pump, waitTime);
+        }
+
+        private static void WaitForPumpToStart(EventPump pump, int waitTime)
+        {
+            while (waitTime > 0 && pump.PumpState != EventPumpState.Pumping)
+            {
+                Thread.Sleep(100);
+                waitTime -= 100;
+            }
+        }
+
+        private static void WaitForPumpToStop(EventPump pump, int waitTime)
+        {
+            while (waitTime > 0 && pump.PumpState != EventPumpState.Stopped)
+            {
+                Thread.Sleep(100);
+                waitTime -= 100;
+            }
+        }
+
+        #region EventQueue tests
+
+        [Test]
+        public void QueueEvents()
+        {
+            EventQueue q = new EventQueue();
+            EnqueueEvents(q);
+            VerifyQueue(q);
+        }
+
+         [Test]
+        public void DequeueEmpty()
+        {
+            EventQueue q = new EventQueue();
+            Assert.IsNull(q.Dequeue(false));
+        }
+
+        [TestFixture]
+        public class DequeueBlocking_StopTest : ProducerConsumerTest
+        {
+            private EventQueue q;
+            private volatile int receivedEvents;
+
+            [Test]
+            [Timeout(1000)]
+            public void DequeueBlocking_Stop()
+            {
+                this.q = new EventQueue();
+                this.receivedEvents = 0;
+                this.RunProducerConsumer();
+                Assert.AreEqual(events.Length + 1, this.receivedEvents);
+            }
+
+            protected override void Producer()
+            {
+                EnqueueEvents(this.q);
+                while (this.receivedEvents < events.Length)
+                {
+                    Thread.Sleep(30);
+                }
+
+                this.q.Stop();
+            }
+
+            protected override void Consumer()
+            {
+                Event e;
+                do
+                {
+                    e = this.q.Dequeue(true);
+                    this.receivedEvents++;
+                    Thread.MemoryBarrier();
+                }
+                while (e != null);
+            }
+        }
+
+        [TestFixture]
+        public class SetWaitHandle_Enqueue_SynchronousTest : ProducerConsumerTest
+        {
+            private EventQueue q;
+            private AutoResetEvent waitHandle;
+            private volatile bool afterEnqueue;
+
+            [Test]
+            [Timeout(1000)]
+            public void SetWaitHandle_Enqueue_Synchronous()
+            {
+                using (this.waitHandle = new AutoResetEvent(false))
+                {
+                    this.q = new EventQueue();
+                    this.q.SetWaitHandleForSynchronizedEvents(this.waitHandle);
+                    this.afterEnqueue = false;
+                    this.RunProducerConsumer();
+                }
+            }
+
+            protected override void Producer()
+            {
+                Event synchronousEvent = new RunStartedEvent(string.Empty, 0);
+                Assert.IsTrue(synchronousEvent.IsSynchronous);
+                this.q.Enqueue(synchronousEvent);
+                this.afterEnqueue = true;
+                Thread.MemoryBarrier();
+            }
+
+            protected override void Consumer()
+            {
+                this.q.Dequeue(true);
+                Thread.Sleep(30);
+                Assert.IsFalse(this.afterEnqueue);
+                this.waitHandle.Set();
+                Thread.Sleep(30);
+                Assert.IsTrue(this.afterEnqueue);
+            }
+        }
+
+        [TestFixture]
+        public class SetWaitHandle_Enqueue_AsynchronousTest : ProducerConsumerTest
+        {
+            private EventQueue q;
+            private volatile bool afterEnqueue;
+
+            [Test]
+            [Timeout(1000)]
+            public void SetWaitHandle_Enqueue_Asynchronous()
+            {
+                using (AutoResetEvent waitHandle = new AutoResetEvent(false))
+                {
+                    this.q = new EventQueue();
+                    this.q.SetWaitHandleForSynchronizedEvents(waitHandle);
+                    this.afterEnqueue = false;
+                    this.RunProducerConsumer();
+                }
+            }
+
+            protected override void Producer()
+            {
+                Event asynchronousEvent = new OutputEvent(new TestOutput(string.Empty, TestOutputType.Trace));
+                Assert.IsFalse(asynchronousEvent.IsSynchronous);
+                this.q.Enqueue(asynchronousEvent);
+                this.afterEnqueue = true;
+                Thread.MemoryBarrier();
+            }
+
+            protected override void Consumer()
+            {
+                this.q.Dequeue(true);
+                Thread.Sleep(30);
+                Assert.IsTrue(this.afterEnqueue);
+            }
+        }
+
+        #endregion EventQueue tests
+
+        #region QueuingEventListener tests
+
+        [Test]
+        public void SendEvents()
+        {
+            QueuingEventListener el = new QueuingEventListener();
+            SendEvents(el);
+            VerifyQueue(el.Events);
+        }
+
+        #endregion
+
+        #region EventPump tests
+
+        [Test]
+        public void StartAndStopPumpOnEmptyQueue()
+        {
+            EventQueue q = new EventQueue();
+            using (EventPump pump = new EventPump(NullListener.NULL, q, false))
+            {
+                pump.Name = "StartAndStopPumpOnEmptyQueue";
+                StartPump(pump, 1000);
+                Assert.That(pump.PumpState, Is.EqualTo(EventPumpState.Pumping));
+                StopPump(pump, 1000);
+                Assert.That(pump.PumpState, Is.EqualTo(EventPumpState.Stopped));
+            }
+        }
+
+        [Test]
+        public void PumpAutoStopsOnRunFinished()
+        {
+            EventQueue q = new EventQueue();
+            using (EventPump pump = new EventPump(NullListener.NULL, q, true))
+            {
+                pump.Name = "PumpAutoStopsOnRunFinished";
+                Assert.That(pump.PumpState, Is.EqualTo(EventPumpState.Stopped));
+                StartPump(pump, 1000);
+                Assert.That(pump.PumpState, Is.EqualTo(EventPumpState.Pumping));
+                q.Enqueue(new RunFinishedEvent(new Exception()));
+                WaitForPumpToStop(pump, 1000);
+                Assert.That(pump.PumpState, Is.EqualTo(EventPumpState.Stopped));
+            }
+        }
+
+        [Test]
+        [Timeout(3000)]
+        public void PumpEvents()
+        {
+            EventQueue q = new EventQueue();
+            QueuingEventListener el = new QueuingEventListener();
+            using (EventPump pump = new EventPump(el, q, false))
+            {
+                pump.Name = "PumpEvents";
+                Assert.That(pump.PumpState, Is.EqualTo(EventPumpState.Stopped));
+                StartPump(pump, 1000);
+                Assert.That(pump.PumpState, Is.EqualTo(EventPumpState.Pumping));
+                EnqueueEvents(q);
+                StopPump(pump, 1000);
+                Assert.That(pump.PumpState, Is.EqualTo(EventPumpState.Stopped));
+            }
+            VerifyQueue(el.Events);
+        }
+
+        [Test]
+        [Timeout(2000)]
+        public void PumpEventsWithAutoStop()
+        {
+             EventQueue q = new EventQueue();
+            QueuingEventListener el = new QueuingEventListener();
+            using (EventPump pump = new EventPump(el, q, true))
+            {
+                pump.Name = "PumpEventsWithAutoStop";
+                pump.Start();
+                EnqueueEvents(q);
+                int tries = 10;
+                while (--tries > 0 && q.Count > 0)
+                {
+                    Thread.Sleep(100);
+                }
+                Assert.That(pump.PumpState, Is.EqualTo(EventPumpState.Stopped));
+            }
+        }
+
+        [Test]
+        [Timeout(2000)]
+        public void PumpPendingEventsAfterAutoStop()
+        {
+            EventQueue q = new EventQueue();
+            EnqueueEvents(q);
+            Event[] eventsAfterStop =
+            {
+                new OutputEvent(new TestOutput("foo", TestOutputType.Out)),
+                new OutputEvent(new TestOutput("bar", TestOutputType.Trace)),
+            };
+            foreach (Event e in eventsAfterStop)
+            {
+                q.Enqueue(e);
+            }
+
+            QueuingEventListener el = new QueuingEventListener();
+            using (EventPump pump = new EventPump(el, q, true))
+            {
+                pump.Name = "PumpPendingEventsAfterAutoStop";
+                pump.Start();
+                int tries = 10;
+                while (--tries > 0 && q.Count > 0)
+                {
+                    Thread.Sleep(100);
+                }
+
+                Assert.That(pump.PumpState, Is.EqualTo(EventPumpState.Stopped));
+            }
+            Assert.That(el.Events.Count, Is.EqualTo(events.Length + eventsAfterStop.Length));
+        }
+
+        [Test]
+        [Timeout(1000)]
+        public void PumpSynchronousAndAsynchronousEvents()
+        {
+            EventQueue q = new EventQueue();
+            using (EventPump pump = new EventPump(NullListener.NULL, q, false))
+            {
+                pump.Name = "PumpSynchronousAndAsynchronousEvents";
+                pump.Start();
+
+                int numberOfAsynchronousEvents = 0;
+                int sumOfAsynchronousQueueLength = 0;
+                const int Repetitions = 2;
+                for (int i = 0; i < Repetitions; i++)
+                {
+                    foreach (Event e in events)
+                    {
+                        q.Enqueue(e);
+                        if (e.IsSynchronous)
+                        {
+                            Assert.That(q.Count, Is.EqualTo(0));
+                        }
+                        else
+                        {
+                            sumOfAsynchronousQueueLength += q.Count;
+                            numberOfAsynchronousEvents++;
+                        }
+                    }
+                }
+
+                Console.WriteLine("Average queue length: {0}", (float)sumOfAsynchronousQueueLength / numberOfAsynchronousEvents);
+            }
+        }
+
+        /// <summary>
+        /// Verifies that when
+        /// (1) Traces are captured and fed into the EventListeners, and
+        /// (2) an EventListener writes Traces,
+        /// the Trace / EventPump / EventListener do not deadlock.
+        /// </summary>
+        /// <remarks>
+        /// This mainly simulates the object structure created by RemoteTestRunner.Run.
+        /// </remarks>
+        [Test]
+        [Timeout(1000)]
+        public void TracingEventListenerDoesNotDeadlock()
+        {
+            QueuingEventListener upstreamListener = new QueuingEventListener();
+            EventQueue upstreamListenerQueue = upstreamListener.Events;
+
+            // Install a TraceListener sending TestOutput events to the upstreamListener.
+            // This simulates RemoteTestRunner.StartTextCapture, where TestContext installs such a TraceListener.
+            TextWriter traceWriter = new EventListenerTextWriter(upstreamListener, TestOutputType.Trace);
+            const string TraceListenerName = "TracingEventListenerDoesNotDeadlock";
+            TraceListener feedingTraceToUpstreamListener = new TextWriterTraceListener(traceWriter, TraceListenerName);
+
+            try
+            {
+                Trace.Listeners.Add(feedingTraceToUpstreamListener);
+
+                // downstreamListenerToTrace simulates an EventListener installed e.g. by an Addin, 
+                // which may call Trace within the EventListener methods:
+                TracingEventListener downstreamListenerToTrace = new TracingEventListener();
+                using (EventPump pump = new EventPump(downstreamListenerToTrace, upstreamListenerQueue, false))
+                {
+                    pump.Name = "TracingEventListenerDoesNotDeadlock";
+                    pump.Start();
+
+                    const int Repetitions = 10;
+                    for (int i = 0; i < Repetitions; i++)
+                    {
+                        foreach (Event e in events)
+                        {
+                            Trace.WriteLine("Before sending {0} event.", e.GetType().Name);
+                            e.Send(upstreamListener);
+                            Trace.WriteLine("After sending {0} event.", e.GetType().Name);
+                        }
+                    }
+                }
+            }
+            finally
+            {
+                Trace.Listeners.Remove(TraceListenerName);
+                feedingTraceToUpstreamListener.Dispose();
+            }
+        }
+
+        /// <summary> 
+        /// Floods the queue of an EventPump with multiple concurrent event producers.
+        /// Prints the maximum queue length to Console, but does not implement an
+        /// oracle on what the maximum queue length should be.
+        /// </summary>
+        /// <param name="numberOfProducers">The number of concurrent producer threads.</param>
+        /// <param name="producerDelay">
+        /// If <c>true</c>, the producer threads slow down by adding a short delay time.
+        /// </param>
+        [TestCase(1, false)]
+        [TestCase(5, true)]
+        [TestCase(5, false)]
+        [Explicit("Takes several seconds. Just prints the queue length of the EventPump to Console, but has no oracle regarding this.")]
+        public void EventPumpQueueLength(int numberOfProducers, bool producerDelay)
+        {
+            EventQueue q = new EventQueue();
+            EventProducer[] producers = new EventProducer[numberOfProducers];
+            for (int i = 0; i < numberOfProducers; i++)
+            {
+                producers[i] = new EventProducer(q, i, producerDelay);
+            }
+
+            using (EventPump pump = new EventPump(NullListener.NULL, q, false))
+            {
+                pump.Name = "EventPumpQueueLength";
+                pump.Start();
+
+                foreach (EventProducer p in producers)
+                {
+                    p.ProducerThread.Start();
+                }
+                foreach (EventProducer p in producers)
+                {
+                    p.ProducerThread.Join();
+                }
+                pump.Stop();
+            }
+            Assert.That(q.Count, Is.EqualTo(0));
+
+            foreach (EventProducer p in producers)
+            {
+                Console.WriteLine(
+                    "#Events: {0}, MaxQueueLength: {1}", p.SentEventsCount, p.MaxQueueLength);
+                Assert.IsNull(p.Exception, "{0}", p.Exception);
+            }
+        }
+
+        #endregion
+    
+        public abstract class ProducerConsumerTest
+        {
+            private volatile Exception myConsumerException;
+
+            protected void RunProducerConsumer()
+            {
+                this.myConsumerException = null;
+                Thread consumerThread = new Thread(new ThreadStart(this.ConsumerThreadWrapper));
+                try
+                {
+                    consumerThread.Start();
+                    this.Producer();
+                    bool consumerStopped = consumerThread.Join(1000);
+                    Assert.IsTrue(consumerStopped);
+                }
+                finally
+                {
+                    consumerThread.Abort();
+                    if ((consumerThread.ThreadState & ThreadState.WaitSleepJoin) != 0)
+                    {
+                        consumerThread.Interrupt();
+                    }
+                }
+
+                Assert.IsNull(this.myConsumerException);
+            }
+
+            protected abstract void Producer();
+
+            protected abstract void Consumer();
+
+            private void ConsumerThreadWrapper()
+            {
+                try
+                {
+                    this.Consumer();
+                }
+                catch (ThreadAbortException)
+                {
+                    Thread.ResetAbort();
+                }
+                catch (Exception ex)
+                {
+                    this.myConsumerException = ex;
+                }
+            }
+        }
+
+        private class EventProducer
+        {
+            public readonly Thread ProducerThread;
+            public int SentEventsCount;
+            public int MaxQueueLength;
+            public Exception Exception;
+            private readonly EventQueue queue;
+            private readonly bool delay;
+
+            public EventProducer(EventQueue q, int id, bool delay)
+            {
+                this.queue = q;
+                this.ProducerThread = new Thread(new ThreadStart(this.Produce));
+                this.ProducerThread.Name = this.GetType().FullName + id;
+                this.delay = delay;
+            }
+
+            private void Produce()
+            {
+                try
+                {
+                    Event e = new OutputEvent(new TestOutput(this.ProducerThread.Name, TestOutputType.Log));
+                    DateTime start = DateTime.Now;
+                    while (DateTime.Now - start <= TimeSpan.FromSeconds(3))
+                    {
+                        this.queue.Enqueue(e);
+                        this.SentEventsCount++;
+                        this.MaxQueueLength = Math.Max(this.queue.Count, this.MaxQueueLength);
+
+                        // without Sleep or with just a Sleep(0), the EventPump thread does not keep up and the queue gets very long
+                        if (this.delay)
+                        {
+                            Thread.Sleep(1);
+                        }
+                    }
+                }
+                catch (Exception ex)
+                {
+                    this.Exception = ex;
+                }
+            }
+        }
+
+        private class TracingEventListener : EventListener
+        {
+            #region EventListener Members
+            public void RunStarted(string name, int testCount)
+            {
+                WriteTrace("RunStarted({0},{1})", name, testCount);
+            }
+
+            public void RunFinished(TestResult result)
+            {
+                WriteTrace("RunFinished({0})", result);
+            }
+
+            public void RunFinished(Exception exception)
+            {
+                WriteTrace("RunFinished({0})", exception);
+            }
+
+            public void TestStarted(TestName testName)
+            {
+                WriteTrace("TestStarted({0})", testName);
+            }
+
+            public void TestFinished(TestResult result)
+            {
+                WriteTrace("TestFinished({0})", result);
+            }
+
+            public void SuiteStarted(TestName testName)
+            {
+                WriteTrace("SuiteStarted({0})", testName);
+            }
+
+            public void SuiteFinished(TestResult result)
+            {
+                WriteTrace("SuiteFinished({0})", result);
+            }
+
+            public void UnhandledException(Exception exception)
+            {
+                WriteTrace("UnhandledException({0})", exception);
+            }
+
+            public void TestOutput(TestOutput testOutput)
+            {
+                if (testOutput.Type != TestOutputType.Trace)
+                {
+                    WriteTrace("TestOutput {0}: '{1}'", testOutput.Type, testOutput.Text);
+                }
+            }
+            #endregion
+
+#if NET_2_0
+            private static void WriteTrace(string message, params object[] args)
+            {
+                Trace.TraceInformation(message, args);
+            }
+#else
+            private static void WriteTrace(string message, params object[] args)
+            {
+                Trace.WriteLine(string.Format(message, args));
+            }
+#endif
+        }
+    }
 }
diff --git a/src/NUnitCore/tests/EventTestFixture.cs b/src/NUnitCore/tests/EventTestFixture.cs
index 49b5d02..2292029 100644
--- a/src/NUnitCore/tests/EventTestFixture.cs
+++ b/src/NUnitCore/tests/EventTestFixture.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -17,7 +17,7 @@ namespace NUnit.Core.Tests
 	[TestFixture(Description="Tests that proper events are generated when running  test")]
 	public class EventTestFixture
 	{
-		private string testsDll = "mock-assembly.dll";
+        private string testsDll = MockAssembly.AssemblyPath;
 
 		internal class EventCounter : EventListener
 		{
@@ -48,7 +48,7 @@ namespace NUnit.Core.Tests
 				testCaseStart++;
 			}
 			
-			public void TestFinished(TestCaseResult result)
+			public void TestFinished(TestResult result)
 			{
 				testCaseFinished++;
 			}
@@ -58,7 +58,7 @@ namespace NUnit.Core.Tests
 				suiteStarted++;
 			}
 
-			public void SuiteFinished(TestSuiteResult result)
+			public void SuiteFinished(TestResult result)
 			{
 				suiteFinished++;
 			}
@@ -79,12 +79,12 @@ namespace NUnit.Core.Tests
 			Test testSuite = builder.Build( new TestPackage( testsDll ) );
 			
 			EventCounter counter = new EventCounter();
-			testSuite.Run(counter);
+            testSuite.Run(counter, TestFilter.Empty);
 			Assert.AreEqual(testSuite.CountTestCases(TestFilter.Empty), counter.testCaseStart);
 			Assert.AreEqual(testSuite.CountTestCases(TestFilter.Empty), counter.testCaseFinished);
 
-			Assert.AreEqual(MockAssembly.Suites - MockAssembly.ExplicitFixtures, counter.suiteStarted);
-			Assert.AreEqual(MockAssembly.Suites - MockAssembly.ExplicitFixtures, counter.suiteFinished);
+			Assert.AreEqual(MockAssembly.SuitesRun, counter.suiteStarted);
+			Assert.AreEqual(MockAssembly.SuitesRun, counter.suiteFinished);
 		}
 	}
 }
diff --git a/src/NUnitCore/tests/ExpectExceptionTest.cs b/src/NUnitCore/tests/ExpectExceptionTest.cs
index 49f0edd..8c60edc 100644
--- a/src/NUnitCore/tests/ExpectExceptionTest.cs
+++ b/src/NUnitCore/tests/ExpectExceptionTest.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -25,21 +25,35 @@ namespace NUnit.Core.Tests
 			throw new ArgumentException();
 		}
 
-		[Test]
-		[ExpectedException(typeof(ArgumentException))]
-		public void TestSucceedsWithSpecifiedExceptionType()
-		{
-			throw new ArgumentException("argument exception");
-		}
+        [Test]
+        [ExpectedException(typeof(ArgumentException))]
+        public void TestSucceedsWithSpecifiedExceptionType()
+        {
+            throw new ArgumentException("argument exception");
+        }
 
-		[Test]
-		[ExpectedException("System.ArgumentException")]
-		public void TestSucceedsWithSpecifiedExceptionName()
-		{
-			throw new ArgumentException("argument exception");
-		}
+        [Test]
+        [ExpectedException(ExpectedException=typeof(ArgumentException))]
+        public void TestSucceedsWithSpecifiedExceptionTypeAsNamedParameter()
+        {
+            throw new ArgumentException("argument exception");
+        }
 
-		[Test]
+        [Test]
+        [ExpectedException("System.ArgumentException")]
+        public void TestSucceedsWithSpecifiedExceptionName()
+        {
+            throw new ArgumentException("argument exception");
+        }
+
+        [Test]
+        [ExpectedException(ExpectedExceptionName="System.ArgumentException")]
+        public void TestSucceedsWithSpecifiedExceptionNameAsNamedParameter()
+        {
+            throw new ArgumentException("argument exception");
+        }
+
+        [Test]
 		[ExpectedException(typeof(ArgumentException),ExpectedMessage="argument exception")]
 		public void TestSucceedsWithSpecifiedExceptionTypeAndMessage()
 		{
@@ -68,12 +82,19 @@ namespace NUnit.Core.Tests
 		}
 
         [Test]
-        [ExpectedException("System.ArgumentException", "argument exception")]
-        public void TestSucceedsWithSpecifiedExceptionNameAndMessage_OldFormat()
+        [ExpectedException(typeof(ArgumentException), ExpectedMessage = "argument invalid", MatchType = MessageMatch.StartsWith)]
+        public void TestSucceedsWithSpecifiedExceptionTypeAndStartsWithMatch()
         {
-            throw new ArgumentException("argument exception");
+            throw new ArgumentException("argument invalid exception");
         }
 
+//        [Test]
+//        [ExpectedException("System.ArgumentException", "argument exception")]
+//        public void TestSucceedsWithSpecifiedExceptionNameAndMessage_OldFormat()
+//        {
+//            throw new ArgumentException("argument exception");
+//        }
+
         [Test]
         [ExpectedException("System.ArgumentException", ExpectedMessage = "argument exception")]
         public void TestSucceedsWithSpecifiedExceptionNameAndMessage_NewFormat()
@@ -107,7 +128,7 @@ namespace NUnit.Core.Tests
 		{
 			Type fixtureType = typeof(BaseException);
 			Test test = TestBuilder.MakeTestCase( fixtureType, "BaseExceptionTest" );
-			TestResult result = test.Run(NullListener.NULL);
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
 			Assert.IsTrue(result.IsFailure, "BaseExceptionTest should have failed");
 			StringAssert.StartsWith(
 				"An unexpected exception type was thrown" + Environment.NewLine +
@@ -121,7 +142,7 @@ namespace NUnit.Core.Tests
 		{
 			Type fixtureType = typeof(DerivedException);
 			Test test = TestBuilder.MakeTestCase( fixtureType, "DerivedExceptionTest" );
-			TestResult result = test.Run(NullListener.NULL);
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
 			Assert.IsTrue(result.IsFailure, "DerivedExceptionTest should have failed");
 			StringAssert.StartsWith( 
 				"An unexpected exception type was thrown" + Environment.NewLine +
@@ -130,26 +151,40 @@ namespace NUnit.Core.Tests
 				result.Message);
 		}
 
-		[Test]
-		public void TestMismatchedExceptionType()
-		{
-			Type fixtureType = typeof(MismatchedException);
-			Test test = TestBuilder.MakeTestCase( fixtureType, "MismatchedExceptionType" );
-			TestResult result = test.Run(NullListener.NULL);
-			Assert.IsTrue(result.IsFailure, "MismatchedExceptionType should have failed");
-			StringAssert.StartsWith(
-				"An unexpected exception type was thrown" + Environment.NewLine +
-				"Expected: System.ArgumentException" + Environment.NewLine +
-				" but was: System.ArgumentOutOfRangeException", 
-				result.Message);
-		}
+        [Test]
+        public void TestMismatchedExceptionType()
+        {
+            Type fixtureType = typeof(MismatchedException);
+            Test test = TestBuilder.MakeTestCase(fixtureType, "MismatchedExceptionType");
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            Assert.IsTrue(result.IsFailure, "MismatchedExceptionType should have failed");
+            StringAssert.StartsWith(
+                "An unexpected exception type was thrown" + Environment.NewLine +
+                "Expected: System.ArgumentException" + Environment.NewLine +
+                " but was: System.ArgumentOutOfRangeException",
+                result.Message);
+        }
 
-		[Test]
+        [Test]
+        public void TestMismatchedExceptionTypeAsNamedParameter()
+        {
+            Type fixtureType = typeof(MismatchedException);
+            Test test = TestBuilder.MakeTestCase(fixtureType, "MismatchedExceptionTypeAsNamedParameter");
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            Assert.IsTrue(result.IsFailure, "MismatchedExceptionType should have failed");
+            StringAssert.StartsWith(
+                "An unexpected exception type was thrown" + Environment.NewLine +
+                "Expected: System.ArgumentException" + Environment.NewLine +
+                " but was: System.ArgumentOutOfRangeException",
+                result.Message);
+        }
+
+        [Test]
 		public void TestMismatchedExceptionTypeWithUserMessage()
 		{
 			Type fixtureType = typeof(MismatchedException);
 			Test test = TestBuilder.MakeTestCase( fixtureType, "MismatchedExceptionTypeWithUserMessage" );
-			TestResult result = test.Run(NullListener.NULL);
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
 			Assert.IsTrue(result.IsFailure, "Test method should have failed");
 			StringAssert.StartsWith(
 				"custom message" + Environment.NewLine +
@@ -164,7 +199,7 @@ namespace NUnit.Core.Tests
 		{
 			Type fixtureType = typeof(MismatchedException);
 			Test test = TestBuilder.MakeTestCase( fixtureType, "MismatchedExceptionName" );
-			TestResult result = test.Run(NullListener.NULL);
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
 			Assert.IsTrue(result.IsFailure, "MismatchedExceptionName should have failed");
 			StringAssert.StartsWith(
 				"An unexpected exception type was thrown" + Environment.NewLine +
@@ -178,7 +213,7 @@ namespace NUnit.Core.Tests
 		{
 			Type fixtureType = typeof(MismatchedException);
 			Test test = TestBuilder.MakeTestCase( fixtureType, "MismatchedExceptionNameWithUserMessage" );
-			TestResult result = test.Run(NullListener.NULL);
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
 			Assert.IsTrue(result.IsFailure, "Test method should have failed");
 			StringAssert.StartsWith(
 				"custom message" + Environment.NewLine +
@@ -193,7 +228,7 @@ namespace NUnit.Core.Tests
 		{
 			Type fixtureType = typeof(TestThrowsExceptionWithWrongMessage);
 			Test test = TestBuilder.MakeTestCase( fixtureType, "TestThrow" );
-			TestResult result = test.Run(NullListener.NULL);
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
 			Assert.IsTrue(result.IsFailure, "TestThrow should have failed");
 			Assert.AreEqual(
 				"The exception message text was incorrect" + Environment.NewLine +
@@ -207,7 +242,7 @@ namespace NUnit.Core.Tests
 		{
 			Type fixtureType = typeof(TestThrowsExceptionWithWrongMessage);
 			Test test = TestBuilder.MakeTestCase( fixtureType, "TestThrowWithUserMessage" );
-			TestResult result = test.Run(NullListener.NULL);
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
 			Assert.IsTrue(result.IsFailure, "TestThrow should have failed");
 			Assert.AreEqual(
 				"custom message" + Environment.NewLine +
@@ -222,7 +257,7 @@ namespace NUnit.Core.Tests
 		{
 			Type fixtureType = typeof(TestDoesNotThrowExceptionFixture);
 			Test test = TestBuilder.MakeTestCase( fixtureType, "TestDoesNotThrowUnspecifiedException" );
-			TestResult result = test.Run(NullListener.NULL);
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
 			Assert.IsTrue(result.IsFailure, "Test method should have failed");
 			Assert.AreEqual("An Exception was expected", result.Message);
 		}
@@ -232,7 +267,7 @@ namespace NUnit.Core.Tests
 		{
 			Type fixtureType = typeof(TestDoesNotThrowExceptionFixture);
 			Test test = TestBuilder.MakeTestCase( fixtureType, "TestDoesNotThrowUnspecifiedExceptionWithUserMessage" );
-			TestResult result = test.Run(NullListener.NULL);
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
 			Assert.IsTrue(result.IsFailure, "Test method should have failed");
 			Assert.AreEqual("custom message" + Environment.NewLine + "An Exception was expected", result.Message);
 		}
@@ -242,7 +277,7 @@ namespace NUnit.Core.Tests
 		{
 			Type fixtureType = typeof(TestDoesNotThrowExceptionFixture);
 			Test test = TestBuilder.MakeTestCase( fixtureType, "TestDoesNotThrowExceptionType" );
-			TestResult result = test.Run(NullListener.NULL);
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
 			Assert.IsTrue(result.IsFailure, "Test method should have failed");
 			Assert.AreEqual("System.ArgumentException was expected", result.Message);
 		}
@@ -252,7 +287,7 @@ namespace NUnit.Core.Tests
 		{
 			Type fixtureType = typeof(TestDoesNotThrowExceptionFixture);
 			Test test = TestBuilder.MakeTestCase( fixtureType, "TestDoesNotThrowExceptionTypeWithUserMessage" );
-			TestResult result = test.Run(NullListener.NULL);
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
 			Assert.IsTrue(result.IsFailure, "Test method should have failed");
 			Assert.AreEqual("custom message" + Environment.NewLine + "System.ArgumentException was expected", result.Message);
 		}
@@ -262,7 +297,7 @@ namespace NUnit.Core.Tests
 		{
 			Type fixtureType = typeof(TestDoesNotThrowExceptionFixture);
 			Test test = TestBuilder.MakeTestCase( fixtureType, "TestDoesNotThrowExceptionName" );
-			TestResult result = test.Run(NullListener.NULL);
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
 			Assert.IsTrue(result.IsFailure, "Test method should have failed");
 			Assert.AreEqual("System.ArgumentException was expected", result.Message);
 		}
@@ -272,7 +307,7 @@ namespace NUnit.Core.Tests
 		{
 			Type fixtureType = typeof(TestDoesNotThrowExceptionFixture);
 			Test test = TestBuilder.MakeTestCase( fixtureType, "TestDoesNotThrowExceptionNameWithUserMessage" );
-			TestResult result = test.Run(NullListener.NULL);
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
 			Assert.IsTrue(result.IsFailure, "Test method should have failed");
 			Assert.AreEqual("custom message" + Environment.NewLine + "System.ArgumentException was expected", result.Message);
 		}
@@ -322,8 +357,8 @@ namespace NUnit.Core.Tests
 		[Test]
 		public void AssertFailBeforeException() 
 		{ 
-			TestSuiteResult suiteResult = (TestSuiteResult)TestBuilder.RunTestFixture( typeof (TestAssertsBeforeThrowingException) );
-			Assert.AreEqual( true, suiteResult.IsFailure );
+			TestResult suiteResult = TestBuilder.RunTestFixture( typeof (TestAssertsBeforeThrowingException) );
+			Assert.AreEqual( ResultState.Failure, suiteResult.ResultState );
 			TestResult result = (TestResult)suiteResult.Results[0];
 			Assert.AreEqual( "private message", result.Message );
 		} 
@@ -368,7 +403,7 @@ namespace NUnit.Core.Tests
 		{
 			ExceptionHandlerCalledClass fixture = new ExceptionHandlerCalledClass();
 			Test test = TestBuilder.MakeTestCase( fixture, "ThrowsArgumentException_AlternateHandler" );
-			test.Run( NullListener.NULL );
+            test.Run(NullListener.NULL, TestFilter.Empty);
 			Assert.IsFalse(fixture.HandlerCalled, "Base Handler should not be called" );
 			Assert.IsTrue(fixture.AlternateHandlerCalled, "Alternate Handler should be called" );
 		}
@@ -378,7 +413,7 @@ namespace NUnit.Core.Tests
 		{
 			ExceptionHandlerCalledClass fixture = new ExceptionHandlerCalledClass();
 			Test test = TestBuilder.MakeTestCase( fixture, "ThrowsArgumentException" );
-			test.Run(NullListener.NULL);
+            test.Run(NullListener.NULL, TestFilter.Empty);
 			Assert.IsTrue(fixture.HandlerCalled, "Base Handler should be called");
 			Assert.IsFalse(fixture.AlternateHandlerCalled, "Alternate Handler should not be called");
 		}
@@ -388,7 +423,7 @@ namespace NUnit.Core.Tests
 		{
 			ExceptionHandlerCalledClass fixture = new ExceptionHandlerCalledClass();
 			Test test = TestBuilder.MakeTestCase( fixture, "ThrowsApplicationException" );
-			test.Run( NullListener.NULL );
+            test.Run(NullListener.NULL, TestFilter.Empty);
 			Assert.IsFalse( fixture.HandlerCalled, "Base Handler should not be called" );
 			Assert.IsFalse( fixture.AlternateHandlerCalled, "Alternate Handler should not be called" );
 		}
@@ -398,7 +433,7 @@ namespace NUnit.Core.Tests
 		{
 			ExceptionHandlerCalledClass fixture = new ExceptionHandlerCalledClass();
 			Test test = TestBuilder.MakeTestCase( fixture, "ThrowsApplicationException_AlternateHandler" );
-			test.Run( NullListener.NULL );
+            test.Run(NullListener.NULL, TestFilter.Empty);
 			Assert.IsFalse(fixture.HandlerCalled, "Base Handler should not be called");
 			Assert.IsFalse(fixture.AlternateHandlerCalled, "Alternate Handler should not be called");
 		}
@@ -414,50 +449,4 @@ namespace NUnit.Core.Tests
 				test.IgnoreReason );
 		}
 	}
-
-	class ExceptionHandlerCalledClass : IExpectException
-	{
-		public bool HandlerCalled = false;
-		public bool AlternateHandlerCalled = false;
-
-		[Test, ExpectedException(typeof(ArgumentException))]
-		public void ThrowsArgumentException()
-		{
-			throw new ArgumentException();
-		}
-
-		[Test, ExpectedException(typeof(ArgumentException), Handler = "AlternateExceptionHandler")]
-		public void ThrowsArgumentException_AlternateHandler()
-		{
-			throw new ArgumentException();
-		}
-
-		[Test, ExpectedException(typeof(ArgumentException))]
-		public void ThrowsApplicationException()
-		{
-			throw new ApplicationException();
-		}
-
-		[Test, ExpectedException(typeof(ArgumentException), Handler = "AlternateExceptionHandler")]
-		public void ThrowsApplicationException_AlternateHandler()
-		{
-			throw new ApplicationException();
-		}
-
-		[Test, ExpectedException(typeof(ArgumentException), Handler = "DeliberatelyMissingHandler")]
-		public void MethodWithBadHandler()
-		{
-			throw new ArgumentException();
-		}
-
-		public void HandleException(Exception ex)
-		{
-			HandlerCalled = true;
-		}
-
-		public void AlternateExceptionHandler(Exception ex)
-		{
-			AlternateHandlerCalled = true;
-		}
-	}
 }
diff --git a/src/NUnitCore/tests/FailFixture.cs b/src/NUnitCore/tests/FailFixture.cs
index 4b18067..a167ab9 100644
--- a/src/NUnitCore/tests/FailFixture.cs
+++ b/src/NUnitCore/tests/FailFixture.cs
@@ -1,11 +1,10 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
-using System.Reflection;
 using NUnit.Framework;
 using NUnit.TestUtilities;
 using NUnit.TestData.FailFixture;
@@ -26,17 +25,6 @@ namespace NUnit.Core.Tests
 				VerifyFailThrowsException.failureMessage, 
 				result.Message);
 		}
-		[Test]
-		public void VerifyAssertionFailWorks()
-		{
-			TestResult result = TestBuilder.RunTestCase( 
-				typeof(VerifyFailThrowsException), 
-				"CallAssertionFail" );
-			Assert.IsTrue(result.IsFailure, "Should have failed");
-			Assert.AreEqual(
-				VerifyFailThrowsException.failureMessage, 
-				result.Message);
-		}
 
 		[Test]
 		[ExpectedException(typeof(AssertionException))]
@@ -66,7 +54,7 @@ namespace NUnit.Core.Tests
 			Type fixtureType = typeof(VerifyTestResultRecordsInnerExceptions);
 			string expectedMessage ="System.Exception : Outer Exception" + Environment.NewLine + "  ----> System.Exception : Inner Exception";
 			NUnit.Core.TestResult result = TestBuilder.RunTestCase(fixtureType, "ThrowInnerException");
-			Assert.IsTrue(result.IsFailure, "Should have failed");
+			Assert.AreEqual(ResultState.Error, result.ResultState );
 			Assert.AreEqual(expectedMessage, result.Message);
 		}
 
@@ -74,7 +62,7 @@ namespace NUnit.Core.Tests
 		public void BadStackTraceIsHandled()
 		{
 			TestResult result = TestBuilder.RunTestCase( typeof( BadStackTraceFixture ), "TestFailure" );
-			Assert.AreEqual( true, result.IsFailure );
+			Assert.AreEqual( ResultState.Error, result.ResultState );
 			Assert.AreEqual( "NUnit.TestData.FailFixture.ExceptionWithBadStackTrace : thrown by me", result.Message );
 			Assert.AreEqual( "No stack trace available", result.StackTrace );
 		}
@@ -83,7 +71,7 @@ namespace NUnit.Core.Tests
 		public void CustomExceptionIsHandled()
 		{
 			TestResult result = TestBuilder.RunTestCase( typeof( CustomExceptionFixture ), "ThrowCustomException" );
-			Assert.AreEqual( true, result.IsFailure );
+			Assert.AreEqual( ResultState.Error, result.ResultState );
 			Assert.AreEqual( "NUnit.TestData.FailFixture.CustomExceptionFixture+CustomException : message", result.Message );
 		}
 	}
diff --git a/src/NUnitCore/tests/FixtureSetUpTearDownTest.cs b/src/NUnitCore/tests/FixtureSetUpTearDownTest.cs
index 0b1e3a0..22c3168 100644
--- a/src/NUnitCore/tests/FixtureSetUpTearDownTest.cs
+++ b/src/NUnitCore/tests/FixtureSetUpTearDownTest.cs
@@ -1,10 +1,12 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
+using System.Security.Principal;
+using System.Threading;
 using NUnit.Framework;
 using NUnit.Core.Builders;
 using NUnit.Util;
@@ -16,11 +18,11 @@ namespace NUnit.Core.Tests
 	[TestFixture]
 	public class FixtureSetupTearDownTest
 	{
-		private TestSuiteResult RunTestOnFixture( object fixture )
+		private TestResult RunTestOnFixture( object fixture )
 		{
 			TestSuite suite = TestBuilder.MakeFixture( fixture.GetType() );
 			suite.Fixture = fixture;
-			return (TestSuiteResult)suite.Run( NullListener.NULL );
+            return suite.Run(NullListener.NULL, TestFilter.Empty);
 		}
 
 		[Test]
@@ -53,44 +55,99 @@ namespace NUnit.Core.Tests
 			Assert.AreEqual(1, fixture.tearDownCount);
 		}
 
+        [Test]
+        public static void StaticSetUpAndTearDownAreCalled()
+        {
+            StaticSetUpAndTearDownFixture.setUpCount = 0;
+            StaticSetUpAndTearDownFixture.tearDownCount = 0;
+            TestBuilder.RunTestFixture(typeof(StaticSetUpAndTearDownFixture));
+
+            Assert.AreEqual(1, StaticSetUpAndTearDownFixture.setUpCount);
+            Assert.AreEqual(1, StaticSetUpAndTearDownFixture.tearDownCount);
+        }
+
+#if NET_2_0
+        [Test]
+        public static void StaticClassSetUpAndTearDownAreCalled()
+        {
+            StaticClassSetUpAndTearDownFixture.setUpCount = 0;
+            StaticClassSetUpAndTearDownFixture.tearDownCount = 0;
+            TestBuilder.RunTestFixture(typeof(StaticClassSetUpAndTearDownFixture));
+
+            Assert.AreEqual(1, StaticClassSetUpAndTearDownFixture.setUpCount);
+            Assert.AreEqual(1, StaticClassSetUpAndTearDownFixture.tearDownCount);
+        }
+#endif
+
 		[Test]
-		public void CheckInheritedSetUpAndTearDownAreNotCalled()
+		public void OverriddenSetUpAndTearDownAreNotCalled()
 		{
-			DefineInheritSetUpAndTearDown fixture = new DefineInheritSetUpAndTearDown();
-			RunTestOnFixture( fixture );
+            DefineInheritSetUpAndTearDown fixture = new DefineInheritSetUpAndTearDown();
+            RunTestOnFixture(fixture);
 
-			Assert.AreEqual(0, fixture.setUpCount);
-			Assert.AreEqual(0, fixture.tearDownCount);
-			Assert.AreEqual(1, fixture.derivedSetUpCount);
-			Assert.AreEqual(1, fixture.derivedTearDownCount);
-		}
+            Assert.AreEqual(0, fixture.setUpCount);
+            Assert.AreEqual(0, fixture.tearDownCount);
+            Assert.AreEqual(1, fixture.derivedSetUpCount);
+            Assert.AreEqual(1, fixture.derivedTearDownCount);
+        }
 
-		[Test]
+        [Test]
+        public void BaseSetUpCalledFirstAndTearDownCalledLast()
+        {
+            DerivedSetUpAndTearDownFixture fixture = new DerivedSetUpAndTearDownFixture();
+            RunTestOnFixture(fixture);
+
+            Assert.AreEqual(1, fixture.setUpCount);
+            Assert.AreEqual(1, fixture.tearDownCount);
+            Assert.AreEqual(1, fixture.derivedSetUpCount);
+            Assert.AreEqual(1, fixture.derivedTearDownCount);
+            Assert.That(fixture.baseSetUpCalledFirst, "Base SetUp called first");
+            Assert.That(fixture.baseTearDownCalledLast, "Base TearDown called last");
+        }
+
+        [Test]
+        public void StaticBaseSetUpCalledFirstAndTearDownCalledLast()
+        {
+            StaticSetUpAndTearDownFixture.setUpCount = 0;
+            StaticSetUpAndTearDownFixture.tearDownCount = 0;
+            DerivedStaticSetUpAndTearDownFixture.derivedSetUpCount = 0;
+            DerivedStaticSetUpAndTearDownFixture.derivedTearDownCount = 0;
+
+            DerivedStaticSetUpAndTearDownFixture fixture = new DerivedStaticSetUpAndTearDownFixture();
+            RunTestOnFixture(fixture);
+
+            Assert.AreEqual(1, DerivedStaticSetUpAndTearDownFixture.setUpCount);
+            Assert.AreEqual(1, DerivedStaticSetUpAndTearDownFixture.tearDownCount);
+            Assert.AreEqual(1, DerivedStaticSetUpAndTearDownFixture.derivedSetUpCount);
+            Assert.AreEqual(1, DerivedStaticSetUpAndTearDownFixture.derivedTearDownCount);
+            Assert.That(DerivedStaticSetUpAndTearDownFixture.baseSetUpCalledFirst, "Base SetUp called first");
+            Assert.That(DerivedStaticSetUpAndTearDownFixture.baseTearDownCalledLast, "Base TearDown called last");
+        }
+
+        [Test]
 		public void HandleErrorInFixtureSetup() 
 		{
 			MisbehavingFixture fixture = new MisbehavingFixture();
 			fixture.blowUpInSetUp = true;
-			TestSuiteResult result = (TestSuiteResult)RunTestOnFixture( fixture );
+			TestResult result = RunTestOnFixture( fixture );
 
 			Assert.AreEqual( 1, fixture.setUpCount, "setUpCount" );
 			Assert.AreEqual( 0, fixture.tearDownCount, "tearDownCOunt" );
 
 			// should have one suite and one fixture
 			ResultSummarizer summ = new ResultSummarizer(result);
-			Assert.AreEqual(1, summ.ResultCount);
+			Assert.AreEqual(1, summ.TestsRun);
 			Assert.AreEqual(0, summ.TestsNotRun);
-			Assert.AreEqual(0, summ.SuitesNotRun);
 			
-			Assert.IsTrue(result.Executed, "Suite should have executed");
-			Assert.IsTrue(result.IsFailure, "Suite should have failed");
-			Assert.AreEqual("System.Exception : This was thrown from fixture setup", result.Message, "TestSuite Message");
+			Assert.AreEqual(ResultState.Error, result.ResultState);
+			Assert.AreEqual("SetUp : System.Exception : This was thrown from fixture setup", result.Message, "TestSuite Message");
 			Assert.IsNotNull(result.StackTrace, "TestSuite StackTrace should not be null");
 
 			TestResult testResult = ((TestResult)result.Results[0]);
-			Assert.IsTrue(testResult.Executed, "Testcase should have executed");
+			Assert.IsTrue(testResult.Executed, "Test should have executed");
 			Assert.AreEqual("TestFixtureSetUp failed in MisbehavingFixture", testResult.Message, "TestSuite Message");
             Assert.AreEqual(FailureSite.Parent, testResult.FailureSite);
-			Assert.AreEqual(testResult.StackTrace, testResult.StackTrace, "TestCase stackTrace should match TestSuite stackTrace" );
+			Assert.AreEqual(testResult.StackTrace, testResult.StackTrace, "Test stackTrace should match TestSuite stackTrace" );
 		}
 
 		[Test]
@@ -98,13 +155,12 @@ namespace NUnit.Core.Tests
 		{
 			MisbehavingFixture fixture = new MisbehavingFixture();
 			fixture.blowUpInSetUp = true;
-			TestSuiteResult result = RunTestOnFixture( fixture );
+			TestResult result = RunTestOnFixture( fixture );
 
 			// should have one suite and one fixture
 			ResultSummarizer summ = new ResultSummarizer(result);
-			Assert.AreEqual(1, summ.ResultCount);
+			Assert.AreEqual(1, summ.TestsRun);
 			Assert.AreEqual(0, summ.TestsNotRun);
-			Assert.AreEqual(0, summ.SuitesNotRun);
 			Assert.IsTrue(result.Executed, "Suite should have executed");
 
 			//fix the blow up in setup
@@ -116,22 +172,20 @@ namespace NUnit.Core.Tests
 
 			// should have one suite and one fixture
 			summ = new ResultSummarizer(result);
-			Assert.AreEqual(1, summ.ResultCount);
+			Assert.AreEqual(1, summ.TestsRun);
 			Assert.AreEqual(0, summ.TestsNotRun);
-			Assert.AreEqual(0, summ.SuitesNotRun);
 		}
 
 		[Test]
 		public void HandleIgnoreInFixtureSetup() 
 		{
 			IgnoreInFixtureSetUp fixture = new IgnoreInFixtureSetUp();
-			TestSuiteResult result = RunTestOnFixture( fixture );
+			TestResult result = RunTestOnFixture( fixture );
 
 			// should have one suite and one fixture
 			ResultSummarizer summ = new ResultSummarizer(result);
-			Assert.AreEqual(0, summ.ResultCount);
+			Assert.AreEqual(0, summ.TestsRun);
 			Assert.AreEqual(1, summ.TestsNotRun);
-			Assert.AreEqual(1, summ.SuitesNotRun);
 			Assert.IsFalse(result.Executed, "Suite should not have executed");
 			Assert.AreEqual("TestFixtureSetUp called Ignore", result.Message);
 			Assert.IsNotNull(result.StackTrace, "StackTrace should not be null");
@@ -146,7 +200,7 @@ namespace NUnit.Core.Tests
 		{
 			MisbehavingFixture fixture = new MisbehavingFixture();
 			fixture.blowUpInTearDown = true;
-			TestSuiteResult result = RunTestOnFixture( fixture );
+			TestResult result = RunTestOnFixture( fixture );
 			Assert.AreEqual(1, result.Results.Count);
 			Assert.IsTrue(result.Executed, "Suite should have executed");
 			Assert.IsTrue(result.IsFailure, "Suite should have failed" );
@@ -159,33 +213,30 @@ namespace NUnit.Core.Tests
 
 			// should have one suite and one fixture
 			ResultSummarizer summ = new ResultSummarizer(result);
-			Assert.AreEqual(1, summ.ResultCount);
+			Assert.AreEqual(1, summ.TestsRun);
 			Assert.AreEqual(0, summ.TestsNotRun);
-			Assert.AreEqual(0, summ.SuitesNotRun);
 		}
 
 		[Test]
 		public void HandleExceptionInFixtureConstructor()
 		{
 			TestSuite suite = TestBuilder.MakeFixture( typeof( ExceptionInConstructor ) );
-			TestSuiteResult result = (TestSuiteResult)suite.Run( NullListener.NULL );
+            TestResult result = suite.Run(NullListener.NULL, TestFilter.Empty);
 
 			// should have one suite and one fixture
 			ResultSummarizer summ = new ResultSummarizer(result);
-			Assert.AreEqual(1, summ.ResultCount);
+			Assert.AreEqual(1, summ.TestsRun);
 			Assert.AreEqual(0, summ.TestsNotRun);
-			Assert.AreEqual(0, summ.SuitesNotRun);
 			
-			Assert.IsTrue(result.Executed, "Suite should have executed");
-			Assert.IsTrue(result.IsFailure, "Suite should have failed");
-			Assert.AreEqual("System.Exception : This was thrown in constructor", result.Message, "TestSuite Message");
+			Assert.AreEqual(ResultState.Error, result.ResultState);
+			Assert.AreEqual("SetUp : System.Exception : This was thrown in constructor", result.Message, "TestSuite Message");
 			Assert.IsNotNull(result.StackTrace, "TestSuite StackTrace should not be null");
 
 			TestResult testResult = ((TestResult)result.Results[0]);
 			Assert.IsTrue(testResult.Executed, "Testcase should have executed");
 			Assert.AreEqual("TestFixtureSetUp failed in ExceptionInConstructor", testResult.Message, "TestSuite Message");
             Assert.AreEqual(FailureSite.Parent, testResult.FailureSite);
-			Assert.AreEqual(testResult.StackTrace, testResult.StackTrace, "TestCase stackTrace should match TestSuite stackTrace" );
+			Assert.AreEqual(testResult.StackTrace, testResult.StackTrace, "Test stackTrace should match TestSuite stackTrace" );
 		}
 
 		[Test]
@@ -193,14 +244,13 @@ namespace NUnit.Core.Tests
 		{
 			MisbehavingFixture fixture = new MisbehavingFixture();
 			fixture.blowUpInTearDown = true;
-			TestSuiteResult result = RunTestOnFixture( fixture );
+			TestResult result = RunTestOnFixture( fixture );
 			Assert.AreEqual(1, result.Results.Count);
 
 			// should have one suite and one fixture
 			ResultSummarizer summ = new ResultSummarizer(result);
-			Assert.AreEqual(1, summ.ResultCount);
+			Assert.AreEqual(1, summ.TestsRun);
 			Assert.AreEqual(0, summ.TestsNotRun);
-			Assert.AreEqual(0, summ.SuitesNotRun);
 
 			fixture.Reinitialize();
 			result = RunTestOnFixture( fixture );
@@ -209,9 +259,8 @@ namespace NUnit.Core.Tests
 			Assert.AreEqual( 1, fixture.tearDownCount, "tearDownCOunt" );
 
 			summ = new ResultSummarizer(result);
-			Assert.AreEqual(1, summ.ResultCount);
+			Assert.AreEqual(1, summ.TestsRun);
 			Assert.AreEqual(0, summ.TestsNotRun);
-			Assert.AreEqual(0, summ.SuitesNotRun);
 		}
 
 		[Test]
@@ -230,9 +279,9 @@ namespace NUnit.Core.Tests
 			SetUpAndTearDownFixture fixture = new SetUpAndTearDownFixture();
 			TestSuite suite = TestBuilder.MakeFixture( fixture.GetType() );
 			suite.Fixture = fixture;
-			NUnit.Core.TestCase testCase = (NUnit.Core.TestCase)suite.Tests[0];
+			Test test = (Test)suite.Tests[0];
 			
-			suite.Run(NullListener.NULL, new Filters.NameFilter( testCase.TestName ) );
+			suite.Run(NullListener.NULL, new Filters.NameFilter( test.TestName ) );
 
 			Assert.AreEqual(1, fixture.setUpCount);
 			Assert.AreEqual(1, fixture.tearDownCount);
@@ -245,29 +294,32 @@ namespace NUnit.Core.Tests
 			TestSuite suite = new TestSuite("IgnoredFixtureSuite");
 			TestSuite fixtureSuite = TestBuilder.MakeFixture( fixture.GetType() );
 			suite.Fixture = fixture;
-			NUnit.Core.TestCase testCase = (NUnit.Core.TestCase)fixtureSuite.Tests[0];
+			Test test = (Test)fixtureSuite.Tests[0];
 			suite.Add( fixtureSuite );
-			
-			fixtureSuite.Run(NullListener.NULL);
+
+            fixtureSuite.Run(NullListener.NULL, TestFilter.Empty);
 			Assert.IsFalse( fixture.setupCalled, "TestFixtureSetUp called running fixture" );
 			Assert.IsFalse( fixture.teardownCalled, "TestFixtureTearDown called running fixture" );
 
-			suite.Run(NullListener.NULL);
+            suite.Run(NullListener.NULL, TestFilter.Empty);
 			Assert.IsFalse( fixture.setupCalled, "TestFixtureSetUp called running enclosing suite" );
 			Assert.IsFalse( fixture.teardownCalled, "TestFixtureTearDown called running enclosing suite" );
 
-			testCase.Run(NullListener.NULL);
+            test.Run(NullListener.NULL, TestFilter.Empty);
 			Assert.IsFalse( fixture.setupCalled, "TestFixtureSetUp called running a test case" );
 			Assert.IsFalse( fixture.teardownCalled, "TestFixtureTearDown called running a test case" );
 		}
 
 		[Test]
-		public void FixtureWithNoTestsShouldNotCallFixtureSetUpOrTearDown()
+		public void FixtureWithNoTestsCallsFixtureSetUpAndTearDown()
 		{
+            // NOTE: Beginning with NUnit 2.5.3, FixtureSetUp and TearDown
+            // are called even if the fixture contains no tests.
+
 			FixtureWithNoTests fixture = new FixtureWithNoTests();
 			RunTestOnFixture( fixture );		
-			Assert.IsFalse( fixture.setupCalled, "TestFixtureSetUp called running fixture" );
-			Assert.IsFalse( fixture.teardownCalled, "TestFixtureTearDown called running fixture" );
+			Assert.IsTrue( fixture.setupCalled, "TestFixtureSetUp not called" );
+			Assert.IsTrue( fixture.teardownCalled, "TestFixtureTearDown not called" );
 		}
 
         [Test]
@@ -277,5 +329,36 @@ namespace NUnit.Core.Tests
             RunTestOnFixture(fixture);
             Assert.IsTrue(fixture.disposeCalled);
         }
-	}
+
+        [TestFixture]
+        class ChangesMadeInFixtureSetUp
+        {
+            [TestFixtureSetUp]
+            public void TestFixtureSetUp()
+            {
+                GenericIdentity identity = new GenericIdentity("foo");
+                Thread.CurrentPrincipal = new GenericPrincipal(identity, new string[0]);
+
+                System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo("en-GB");
+                Thread.CurrentThread.CurrentCulture = culture;
+                Thread.CurrentThread.CurrentUICulture = culture;
+            }
+
+            [Test]
+            public void TestThatChangesPersistUsingSameThread()
+            {
+                Assert.AreEqual("foo", Thread.CurrentPrincipal.Identity.Name);
+                Assert.AreEqual("en-GB", Thread.CurrentThread.CurrentCulture.Name);
+                Assert.AreEqual("en-GB", Thread.CurrentThread.CurrentUICulture.Name);
+            }
+
+            [Test, RequiresThread]
+            public void TestThatChangesPersistUsingSeparateThread()
+            {
+                Assert.AreEqual("foo", Thread.CurrentPrincipal.Identity.Name);
+                Assert.AreEqual("en-GB", Thread.CurrentThread.CurrentCulture.Name);
+                Assert.AreEqual("en-GB", Thread.CurrentThread.CurrentUICulture.Name);
+            }
+        }
+    }
 }
diff --git a/src/NUnitCore/tests/Generic/DeduceTypeArgsFromArgs.cs b/src/NUnitCore/tests/Generic/DeduceTypeArgsFromArgs.cs
new file mode 100644
index 0000000..d205edd
--- /dev/null
+++ b/src/NUnitCore/tests/Generic/DeduceTypeArgsFromArgs.cs
@@ -0,0 +1,31 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+#if NET_2_0
+using System;
+using NUnit.Framework;
+
+namespace NUnit.Core.Tests.Generic
+{
+    [Category("Generics")]
+    [TestFixture(100.0, 42)]
+    [TestFixture(42, 100.0)]
+    public class DeduceTypeArgsFromArgs<T1, T2>
+    {
+        public DeduceTypeArgsFromArgs(T1 t1, T2 t2)
+        {
+        }
+
+        [TestCase(5, 7)]
+        public void TestMyArgTypes(T1 t1, T2 t2)
+        {
+            Assert.That(t1, Is.TypeOf<T1>());
+            Assert.That(t2, Is.TypeOf<T2>());
+        }
+    }
+}
+#endif
+
diff --git a/src/NUnitCore/tests/Generic/SimpleGenericFixture.cs b/src/NUnitCore/tests/Generic/SimpleGenericFixture.cs
new file mode 100644
index 0000000..bb6d3de
--- /dev/null
+++ b/src/NUnitCore/tests/Generic/SimpleGenericFixture.cs
@@ -0,0 +1,33 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+#if NET_2_0
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+
+namespace NUnit.Core.Tests.Generic
+{
+    [Category("Generics")]
+    [TestFixture(typeof(List<int>))]
+    [TestFixture(TypeArgs=new Type[] {typeof(ArrayList)} )]
+    public class SimpleGenericFixture<TList> where TList : IList, new()
+    {
+        [Test]
+        public void TestCollectionCount()
+        {
+            Console.WriteLine("TList is {0}", typeof(TList));
+            IList list = new TList();
+            list.Add(1);
+            list.Add(2);
+            list.Add(3);
+            Assert.AreEqual(3, list.Count);
+        }
+    }
+}
+#endif
\ No newline at end of file
diff --git a/src/NUnitCore/tests/Generic/SimpleGenericMethods.cs b/src/NUnitCore/tests/Generic/SimpleGenericMethods.cs
new file mode 100644
index 0000000..bca216c
--- /dev/null
+++ b/src/NUnitCore/tests/Generic/SimpleGenericMethods.cs
@@ -0,0 +1,51 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+#if NET_2_0
+using System;
+using System.Collections.Generic;
+using NUnit.Framework;
+
+namespace NUnit.Core.Tests.Generic
+{
+    [TestFixture,Category("Generics")]
+    class SimpleGenericMethods
+    {
+        [TestCase(5, 2, "ABC")]
+        [TestCase(5.0, 2.0, "ABC")]
+        [TestCase(5, 2.0, "ABC")]
+        [TestCase(5.0, 2L, "ABC")]
+        public void GenericTestMethodWithOneTypeParameter<T>(T x, T y, string label)
+        {
+            Assert.AreEqual(5, x);
+            Assert.AreEqual(2, y);
+            Assert.AreEqual("ABC", label);
+        }
+
+        [TestCase(5, 2, "ABC")]
+        [TestCase(5.0, 2.0, "ABC")]
+        [TestCase(5, 2.0, "ABC")]
+        [TestCase(5.0, 2L, "ABC")]
+        public void GenericTestMethodWithTwoTypeParameters<T1, T2>(T1 x, T2 y, string label)
+        {
+            Assert.AreEqual(5, x);
+            Assert.AreEqual(2, y);
+            Assert.AreEqual("ABC", label);
+        }
+
+        [TestCase(5, 2, "ABC")]
+        [TestCase(5.0, 2.0, "ABC")]
+        [TestCase(5, 2.0, "ABC")]
+        [TestCase(5.0, 2L, "ABC")]
+        public void GenericTestMethodWithTwoTypeParameters_Reversed<T1, T2>(T2 x, T1 y, string label)
+        {
+            Assert.AreEqual(5, x);
+            Assert.AreEqual(2, y);
+            Assert.AreEqual("ABC", label);
+        }
+    }
+}
+#endif
\ No newline at end of file
diff --git a/src/NUnitCore/tests/Generic/TypeParameterUsedWithTestMethod.cs b/src/NUnitCore/tests/Generic/TypeParameterUsedWithTestMethod.cs
new file mode 100644
index 0000000..4f962f4
--- /dev/null
+++ b/src/NUnitCore/tests/Generic/TypeParameterUsedWithTestMethod.cs
@@ -0,0 +1,25 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+#if NET_2_0
+using System;
+using NUnit.Framework;
+
+namespace NUnit.Core.Tests.Generic
+{
+    [Category("Generics")]
+    [TestFixture(typeof(double))]
+    public class TypeParameterUsedWithTestMethod<T>
+    {
+        [TestCase(5)]
+        [TestCase(1.23)]
+        public void TestMyArgType(T x)
+        {
+            Assert.That(x, Is.TypeOf(typeof(T)));
+        }
+    }
+}
+#endif
\ No newline at end of file
diff --git a/src/NUnitCore/tests/IgnoreFixture.cs b/src/NUnitCore/tests/IgnoreFixture.cs
index f6f9465..37df857 100644
--- a/src/NUnitCore/tests/IgnoreFixture.cs
+++ b/src/NUnitCore/tests/IgnoreFixture.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
 using System.Reflection;
@@ -36,12 +36,22 @@ namespace NUnit.Core.Tests
 		[Test]
 		public void IgnoreWorksForTestCase()
 		{
-			Type fixtureType = typeof(IgnoredTestCaseFixture);
-			Test test = TestBuilder.MakeTestCase( fixtureType, "CallsIgnore" );
-			TestResult result = test.Run( NullListener.NULL);
-			Assert.IsFalse( result.Executed, "TestCase should not run" );
-			Assert.AreEqual( "Ignore me", result.Message );
-		}
+            Type fixtureType = typeof(IgnoredTestCaseFixture);
+            Test test = TestBuilder.MakeTestCase(fixtureType, "CallsIgnore");
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            Assert.IsFalse(result.Executed, "Test should not run");
+            Assert.AreEqual("Ignore me", result.Message);
+        }
+
+        [Test]
+        public void IgnoreTakesPrecedenceOverExpectedException()
+        {
+            Type fixtureType = typeof(IgnoredTestCaseFixture);
+            Test test = TestBuilder.MakeTestCase(fixtureType, "CallsIgnoreWithExpectedException");
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            Assert.IsFalse(result.Executed, "Test should not run");
+            Assert.AreEqual("Ignore me", result.Message);
+        }
 
 		[Test]
 		public void IgnoreWorksForTestSuite()
@@ -49,9 +59,9 @@ namespace NUnit.Core.Tests
 			//IgnoredTestSuiteFixture testFixture = new IgnoredTestSuiteFixture();
 			TestSuite suite = new TestSuite("IgnoredTestFixture");
 			suite.Add( TestBuilder.MakeFixture( typeof( IgnoredTestSuiteFixture ) ) );
-			TestSuiteResult result = (TestSuiteResult)suite.Run( NullListener.NULL);
+            TestResult result = suite.Run(NullListener.NULL, TestFilter.Empty);
 
-			TestSuiteResult fixtureResult = (TestSuiteResult)result.Results[0];
+			TestResult fixtureResult = (TestResult)result.Results[0];
 			Assert.IsFalse( fixtureResult.Executed, "Fixture should not have been executed" );
 			
 			foreach( TestResult testResult in fixtureResult.Results )
@@ -62,7 +72,7 @@ namespace NUnit.Core.Tests
 		public void IgnoreWorksFromSetUp()
 		{
 			TestSuite testFixture = TestBuilder.MakeFixture( typeof( IgnoreInSetUpFixture ) );
-			TestSuiteResult fixtureResult = (TestSuiteResult)testFixture.Run( NullListener.NULL);
+            TestResult fixtureResult = testFixture.Run(NullListener.NULL, TestFilter.Empty);
 
 			Assert.IsTrue( fixtureResult.Executed, "Fixture should have been executed" );
 			
diff --git a/src/NUnitCore/tests/LegacySuiteTests.cs b/src/NUnitCore/tests/LegacySuiteTests.cs
index 4337863..48a821e 100644
--- a/src/NUnitCore/tests/LegacySuiteTests.cs
+++ b/src/NUnitCore/tests/LegacySuiteTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -9,6 +9,7 @@ using System.Collections;
 using NUnit.Framework;
 using NUnit.Core;
 using NUnit.TestData;
+using NUnit.TestData.LegacySuiteData;
 
 namespace NUnit.Core.Tests
 {
@@ -20,11 +21,12 @@ namespace NUnit.Core.Tests
 	{
         static int setupCount = 0;
         static int teardownCount = 0;
+        private Builders.LegacySuiteBuilder builder = new Builders.LegacySuiteBuilder();
 
         [Test]
         public void SuiteReturningTestSuite()
         {
-            TestSuite suite = new LegacySuite(typeof(NUnit.Core.Tests.AllTests));
+            Test suite = builder.BuildFrom(typeof(NUnit.Core.Tests.AllTests));
             Assert.AreEqual(RunState.Runnable, suite.RunState);
             Assert.AreEqual(3, suite.Tests.Count);
             Assert.AreEqual(11, suite.TestCount);
@@ -33,7 +35,7 @@ namespace NUnit.Core.Tests
         [Test]
         public void SuiteReturningFixtures()
         {
-            TestSuite suite = new LegacySuite(typeof(LegacySuiteReturningFixtures));
+            Test suite = builder.BuildFrom(typeof(LegacySuiteReturningFixtures));
             Assert.AreEqual(RunState.Runnable, suite.RunState);
             Assert.AreEqual(3, suite.Tests.Count);
             Assert.AreEqual(11, suite.TestCount);
@@ -56,9 +58,18 @@ namespace NUnit.Core.Tests
         }
 
         [Test]
+        public void SuiteReturningFixtureWithArguments()
+        {
+            Test suite = builder.BuildFrom(typeof(LegacySuiteReturningFixtureWithArguments));
+            Assert.AreEqual(RunState.Runnable, suite.RunState);
+            Assert.AreEqual(1, suite.Tests.Count);
+            Assert.AreEqual(0, suite.TestCount);
+        }
+
+        [Test]
         public void SuiteReturningTypes()
         {
-            TestSuite suite = new LegacySuite(typeof(LegacySuiteReturningTypes));
+            Test suite = builder.BuildFrom(typeof(LegacySuiteReturningTypes));
             Assert.AreEqual(RunState.Runnable, suite.RunState);
             Assert.AreEqual(3, suite.Tests.Count);
             Assert.AreEqual(11, suite.TestCount);
@@ -84,9 +95,9 @@ namespace NUnit.Core.Tests
 		public void SetUpAndTearDownAreCalled()
 		{
             setupCount = teardownCount = 0;
-			TestSuite suite = new LegacySuite( typeof( LegacySuiteWithSetUpAndTearDown ) );
+			Test suite = builder.BuildFrom( typeof( LegacySuiteWithSetUpAndTearDown ) );
             Assert.AreEqual(RunState.Runnable, suite.RunState);
-			suite.Run( NullListener.NULL );
+            suite.Run(NullListener.NULL, TestFilter.Empty);
 			Assert.AreEqual( 1, setupCount );
 			Assert.AreEqual( 1, teardownCount );
 		}
@@ -115,7 +126,7 @@ namespace NUnit.Core.Tests
         [Test]
         public void SuitePropertyWithInvalidType()
         {
-            TestSuite suite = new LegacySuite(typeof(LegacySuiteWithInvalidPropertyType));
+            Test suite = builder.BuildFrom(typeof(LegacySuiteWithInvalidPropertyType));
             Assert.AreEqual(RunState.NotRunnable, suite.RunState);
         }
 
diff --git a/src/NUnitCore/tests/MaxTimeTests.cs b/src/NUnitCore/tests/MaxTimeTests.cs
new file mode 100644
index 0000000..aff0e41
--- /dev/null
+++ b/src/NUnitCore/tests/MaxTimeTests.cs
@@ -0,0 +1,70 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using NUnit.TestData;
+
+namespace NUnit.Core.Tests
+{
+	/// <summary>
+	/// Tests for MaxTime decoration.
+	/// </summary>
+    [TestFixture]
+    public class MaxTimeTests
+	{
+		[Test,MaxTime(1000)]
+		public void MaxTimeNotExceeded()
+		{
+		}
+
+        // TODO: We need a way to simulate the clock reliably
+        [Test]
+        public void MaxTimeExceeded()
+        {
+            Test test = TestFixtureBuilder.BuildFrom(typeof(MaxTimeFixture));
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            Assert.AreEqual(ResultState.Failure, result.ResultState);
+            result = (TestResult)result.Results[0];
+            StringAssert.IsMatch(@"Elapsed time of \d*ms exceeds maximum of 1ms", result.Message);
+        }
+
+        [Test, MaxTime(1000)]
+        [ExpectedException(typeof(AssertionException), ExpectedMessage = "Intentional Failure")]
+        public void FailureReport()
+        {
+            Assert.Fail("Intentional Failure");
+        }
+
+        [Test]
+        public void FailureReportHasPriorityOverMaxTime()
+		{
+            Test test = TestFixtureBuilder.BuildFrom(typeof(MaxTimeFixtureWithFailure));
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            Assert.AreEqual(ResultState.Failure, result.ResultState);
+            result = (TestResult)result.Results[0];
+            Assert.AreEqual(ResultState.Failure, result.ResultState);
+            StringAssert.IsMatch("Intentional Failure", result.Message);
+        }
+
+        [Test, MaxTime(1000), ExpectedException]
+        public void ErrorReport()
+        {
+            throw new Exception();
+        }
+
+        [Test]
+        public void ErrorReportHasPriorityOverMaxTime()
+        {
+            Test test = TestFixtureBuilder.BuildFrom(typeof(MaxTimeFixtureWithError));
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            Assert.AreEqual(ResultState.Failure, result.ResultState);
+            result = (TestResult)result.Results[0];
+            Assert.AreEqual(ResultState.Error, result.ResultState);
+            StringAssert.IsMatch("Exception message", result.Message);
+        }
+    }
+}
diff --git a/src/NUnitCore/tests/MockTestRunner.cs b/src/NUnitCore/tests/MockTestRunner.cs
index 6e680f0..1adf115 100644
--- a/src/NUnitCore/tests/MockTestRunner.cs
+++ b/src/NUnitCore/tests/MockTestRunner.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitCore/tests/NameFilterTest.cs b/src/NUnitCore/tests/NameFilterTest.cs
index 62488a4..db02e58 100644
--- a/src/NUnitCore/tests/NameFilterTest.cs
+++ b/src/NUnitCore/tests/NameFilterTest.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -18,14 +18,14 @@ namespace NUnit.Core.Tests
 	public class NameFilterTest
 	{
 		private TestSuite testSuite;
-		private NUnit.Core.TestCase mock3;
+		private Test mock3;
 
 		[SetUp]
 		public void SetUp() 
 		{
 			testSuite = new TestSuite("Mock Test Suite");
 			testSuite.Add( TestBuilder.MakeFixture( typeof( MockTestFixture ) ) );
-			mock3 = (NUnit.Core.TestCase) TestFinder.Find("MockTest3", testSuite);
+			mock3 = TestFinder.Find("MockTest3", testSuite, true);
 		}
 
 		[Test]
@@ -42,7 +42,7 @@ namespace NUnit.Core.Tests
 		[Test]
 		public void MultipleNameMatch() 
 		{
-			NUnit.Core.TestCase mock1 = (NUnit.Core.TestCase) TestFinder.Find("MockTest1", testSuite);
+			Test mock1 = TestFinder.Find("MockTest1", testSuite, true);
 			NameFilter filter = new NameFilter();
 			filter.Add(mock3.TestName);
 			filter.Add(mock1.TestName);
@@ -54,7 +54,7 @@ namespace NUnit.Core.Tests
 		[Test]
 		public void SuiteNameMatch() 
 		{
-			NUnit.Core.TestSuite mockTest = (NUnit.Core.TestSuite) TestFinder.Find("MockTestFixture", testSuite);
+			NUnit.Core.TestSuite mockTest = (NUnit.Core.TestSuite) TestFinder.Find("MockTestFixture", testSuite, true);
 			NameFilter filter = new NameFilter(mockTest.TestName);
 			Assert.IsTrue(filter.Pass(mock3), "Name Filter did not pass test case");
 			Assert.IsTrue(filter.Pass(mockTest), "Suite did not pass test case");
@@ -64,7 +64,7 @@ namespace NUnit.Core.Tests
 		[Test]
 		public void TestDoesNotMatch() 
 		{
-			NUnit.Core.TestCase mock1 = (NUnit.Core.TestCase) TestFinder.Find("MockTest1", testSuite);
+			Test mock1 = TestFinder.Find("MockTest1", testSuite, true);
 			NameFilter filter = new NameFilter(mock1.TestName);
 			Assert.IsFalse(filter.Pass(mock3), "Name Filter did pass test case");
 			Assert.IsTrue(filter.Pass(testSuite), "Name Filter did not pass test suite");
@@ -73,7 +73,7 @@ namespace NUnit.Core.Tests
 		[Test]
 		public void HighLevelSuite() 
 		{
-			NUnit.Core.TestSuite mockTest = (NUnit.Core.TestSuite) TestFinder.Find("MockTestFixture", testSuite);
+			NUnit.Core.TestSuite mockTest = (NUnit.Core.TestSuite) TestFinder.Find("MockTestFixture", testSuite, true);
 			NameFilter filter = new NameFilter(testSuite.TestName);
 			Assert.AreEqual( true, filter.Pass(mock3), "test case");
 			Assert.AreEqual( true, filter.Pass(mockTest), "middle suite");
@@ -83,7 +83,7 @@ namespace NUnit.Core.Tests
 		[Test]
 		public void ExplicitTestCaseDoesNotMatchWhenNotSelectedDirectly()
 		{
-			NUnit.Core.TestCase explicitTest = (NUnit.Core.TestCase) TestFinder.Find("ExplicitlyRunTest", testSuite);
+			Test explicitTest = TestFinder.Find("ExplicitlyRunTest", testSuite, true);
 			NameFilter filter = new NameFilter( testSuite.TestName );
 			Assert.AreEqual( false, filter.Pass(explicitTest) );
 		}
@@ -91,7 +91,7 @@ namespace NUnit.Core.Tests
 		[Test]
 		public void ExplicitTestCaseMatchesWhenSelectedDirectly()
 		{
-			NUnit.Core.TestCase explicitTest = (NUnit.Core.TestCase) TestFinder.Find("ExplicitlyRunTest", testSuite);
+			Test explicitTest = TestFinder.Find("ExplicitlyRunTest", testSuite, true);
 			NameFilter filter = new NameFilter( explicitTest.TestName );
 			Assert.IsTrue(filter.Pass(explicitTest), "Name Filter did not pass on test case" );
 			Assert.IsTrue(filter.Pass(testSuite), "Name Filter did not pass on test suite" );
@@ -100,7 +100,7 @@ namespace NUnit.Core.Tests
 		[Test]
 		public void ExplicitTestSuiteDoesNotMatchWhenNotSelectedDirectly()
 		{
-			NUnit.Core.TestSuite mockTest = (NUnit.Core.TestSuite) TestFinder.Find("MockTestFixture", testSuite);
+			NUnit.Core.TestSuite mockTest = (NUnit.Core.TestSuite) TestFinder.Find("MockTestFixture", testSuite, true);
 			mockTest.RunState = RunState.Explicit;
 			NameFilter filter = new NameFilter(testSuite.TestName);
 			Assert.AreEqual( false, filter.Pass(mock3), "descendant of explicit suite should not match" );
@@ -110,7 +110,7 @@ namespace NUnit.Core.Tests
 		[Test]
 		public void ExplicitTestSuiteMatchesWhenSelectedDirectly()
 		{
-			NUnit.Core.TestSuite mockTest = (NUnit.Core.TestSuite) TestFinder.Find("MockTestFixture", testSuite);
+			NUnit.Core.TestSuite mockTest = (NUnit.Core.TestSuite) TestFinder.Find("MockTestFixture", testSuite, true);
 			mockTest.RunState = RunState.Explicit;
 			NameFilter filter = new NameFilter(mockTest.TestName);
 			Assert.AreEqual( true, filter.Pass(mock3), "test case" );
diff --git a/src/NUnitCore/tests/NamespaceAssemblyTests.cs b/src/NUnitCore/tests/NamespaceAssemblyTests.cs
index 45b6d15..bdbd8f5 100644
--- a/src/NUnitCore/tests/NamespaceAssemblyTests.cs
+++ b/src/NUnitCore/tests/NamespaceAssemblyTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -10,14 +10,15 @@ using System.Reflection;
 using NUnit.Framework;
 using NUnit.Core;
 using NUnit.Tests.Assemblies;
+using NUnit.TestUtilities;
 
 namespace NUnit.Core.Tests
 {
 	[TestFixture]
 	public class NamespaceAssemblyTests
 	{
-		private string testsDll = "mock-assembly.dll";
-		private string nonamespaceDLL = "nonamespace-assembly.dll";
+        private string testsDll = MockAssembly.AssemblyPath;
+        private string nonamespaceDLL = NoNamespaceTestFixture.AssemblyPath;
 		
 		[Test]
 		public void LoadTestFixtureFromAssembly()
@@ -42,39 +43,26 @@ namespace NUnit.Core.Tests
 		{
 			TestSuiteBuilder builder = new TestSuiteBuilder();
 			Test suite = builder.Build( new TestPackage( testsDll ) );
-			IList tests = suite.Tests;
-			Assert.AreEqual(1, tests.Count);
 
-			Assert.IsTrue(tests[0] is TestSuite, "TestSuite:NUnit - is not correct");
-			TestSuite testSuite = (TestSuite)tests[0];
-			Assert.AreEqual("NUnit", testSuite.TestName.Name);
+            suite = (Test)suite.Tests[0];
+            Assert.AreEqual("NUnit", suite.TestName.Name);
 
-			tests = testSuite.Tests;
-			Assert.IsTrue(tests[0] is TestSuite, "TestSuite:Tests - is invalid");
-			testSuite = (TestSuite)tests[0];
-			Assert.AreEqual(1, tests.Count);
-			Assert.AreEqual("Tests", testSuite.TestName.Name);
+            suite = (Test)suite.Tests[0];
+            Assert.AreEqual("Tests", suite.TestName.Name);
+			Assert.AreEqual(MockAssembly.Classes, suite.Tests.Count);
 
-			tests = testSuite.Tests;
-			// TODO: Get rid of constants in this test
-			Assert.AreEqual(MockAssembly.Fixtures, tests.Count);
-
-			Assert.IsTrue(tests[3] is TestSuite, "TestSuite:singletons - is invalid");
-			TestSuite singletonSuite = (TestSuite)tests[3];
-			Assert.AreEqual("Singletons", singletonSuite.TestName.Name);
+			Test singletonSuite = TestFinder.Find("Singletons", suite, false);
 			Assert.AreEqual(1, singletonSuite.Tests.Count);
 
-			Assert.IsTrue(tests[0] is TestSuite, "TestSuite:assemblies - is invalid");
-			TestSuite mockSuite = (TestSuite)tests[0];
-			Assert.AreEqual("Assemblies", mockSuite.TestName.Name);
+			Test mockSuite = TestFinder.Find("Assemblies", suite, false);
+			Assert.AreEqual(1, mockSuite.Tests.Count);
 
-			TestSuite mockFixtureSuite = (TestSuite)mockSuite.Tests[0];
+			Test mockFixtureSuite = TestFinder.Find("MockTestFixture", mockSuite, false);
 			Assert.AreEqual(MockTestFixture.Tests, mockFixtureSuite.Tests.Count);
-			
-			IList mockTests = mockFixtureSuite.Tests;
-			foreach(Test t in mockTests)
+
+			foreach(Test t in mockFixtureSuite.Tests)
 			{
-				Assert.IsTrue(t is NUnit.Core.TestCase, "should be a TestCase");
+				Assert.IsFalse(t.IsSuite, "Should not be a suite");
 			}
 		}
 			
diff --git a/src/NUnitCore/tests/PairwiseTests.cs b/src/NUnitCore/tests/PairwiseTests.cs
new file mode 100644
index 0000000..a27205f
--- /dev/null
+++ b/src/NUnitCore/tests/PairwiseTests.cs
@@ -0,0 +1,122 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Framework;
+using NUnit.Core.Builders;
+
+namespace NUnit.Core.Tests
+{
+    [TestFixture]
+    public class PairwiseTest
+    {
+        [TestFixture]
+        public class LiveTest
+        {
+            public Hashtable pairsTested = new Hashtable();
+
+            [TestFixtureSetUp]
+            public void TestFixtureSetUp()
+            {
+                pairsTested = new Hashtable();
+            }
+
+            [TestFixtureTearDown]
+            public void TestFixtureTearDown()
+            {
+                Assert.That(pairsTested.Count, Is.EqualTo(16));
+            }
+
+            [Test, Pairwise]
+            public void Test(
+                [Values("a", "b", "c")] string a,
+                [Values("+", "-")] string b,
+                [Values("x", "y")] string c)
+            {
+                Console.WriteLine("Pairwise: {0} {1} {2}", a, b, c);
+
+                pairsTested[a + b] = null;
+                pairsTested[a + c] = null;
+                pairsTested[b + c] = null;
+            }
+        }
+
+        // Test data is taken from various sources. See "Lessons Learned
+        // in Software Testing" pp 53-59, for example. For orthogonal cases, see 
+        // http://www.freequality.org/sites/www_freequality_org/documents/tools/Tagarray_files/tamatrix.htm
+        internal static object[] cases = new object[]
+        {
+#if ORIGINAL
+            new TestCaseData( new int[] { 2, 4 }, 8, 8 ).SetName("Test 2x4"),
+            new TestCaseData( new int[] { 2, 2, 2 }, 5, 4 ).SetName("Test 2x2x2"),
+            new TestCaseData( new int[] { 3, 2, 2 }, 6, 6 ).SetName("Test 3x2x2"),
+            new TestCaseData( new int[] { 3, 2, 2, 2 }, 7, 6 ).SetName("Test 3x2x2x2"),
+            new TestCaseData( new int[] { 3, 2, 2, 2, 2 }, 8, 6 ).SetName("Test 3x2x2x2x2"),
+            new TestCaseData( new int[] { 3, 2, 2, 2, 2, 2 }, 9, 8 ).SetName("Test 3x2x2x2x2x2"),
+            new TestCaseData( new int[] { 3, 3, 3 }, 12, 9 ).SetName("Test 3x3x3"),
+            new TestCaseData( new int[] { 4, 4, 4 }, 22, 16 ).SetName("Test 4x4x4"),
+            new TestCaseData( new int[] { 5, 5, 5 }, 34, 25 ).SetName("Test 5x5x5")
+#else
+            new TestCaseData( new int[] { 2, 4 }, 8, 8 ).SetName("Test 2x4"),
+            new TestCaseData( new int[] { 2, 2, 2 }, 5, 4 ).SetName("Test 2x2x2"),
+            new TestCaseData( new int[] { 3, 2, 2 }, 7, 6 ).SetName("Test 3x2x2"),
+            new TestCaseData( new int[] { 3, 2, 2, 2 }, 8, 6 ).SetName("Test 3x2x2x2"),
+            new TestCaseData( new int[] { 3, 2, 2, 2, 2 }, 9, 6 ).SetName("Test 3x2x2x2x2"),
+            new TestCaseData( new int[] { 3, 2, 2, 2, 2, 2 }, 9, 8 ).SetName("Test 3x2x2x2x2x2"),
+            new TestCaseData( new int[] { 3, 3, 3 }, 9, 9 ).SetName("Test 3x3x3"),
+            new TestCaseData( new int[] { 4, 4, 4 }, 17, 16 ).SetName("Test 4x4x4"),
+            new TestCaseData( new int[] { 5, 5, 5 }, 27, 25 ).SetName("Test 5x5x5")
+#endif
+        };
+
+        [Test, TestCaseSource("cases")]
+        public void Test(int[] dimensions, int bestSoFar, int targetCases)
+        {
+            int features = dimensions.Length;
+
+            string[][] sources = new string[features][];
+
+            for (int i = 0; i < features; i++)
+            {
+                string featureName = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".Substring(i, 1);
+
+                int n = dimensions[i];
+                sources[i] = new string[n];
+                for (int j = 0; j < n; j++)
+                    sources[i][j] = featureName + j.ToString();
+            }
+
+            CombiningStrategy strategy = new PairwiseStrategy(sources);
+
+            Hashtable pairs = new Hashtable();
+            int cases = 0;
+            foreach (NUnit.Core.Extensibility.ParameterSet testcase in strategy.GetTestCases())
+            {
+                for (int i = 1; i < features; i++)
+                    for (int j = 0; j < i; j++)
+                    {
+                        string a = testcase.Arguments[i] as string;
+                        string b = testcase.Arguments[j] as string;
+                        pairs[a + b] = null;
+                    }
+
+                ++cases;
+            }
+
+            int expectedPairs = 0;
+            for (int i = 1; i < features; i++)
+                for (int j = 0; j < i; j++)
+                    expectedPairs += dimensions[i] * dimensions[j];
+
+            Assert.That(pairs.Count, Is.EqualTo(expectedPairs), "Number of pairs is incorrect");
+            Assert.That(cases, Is.AtMost(bestSoFar), "Regression: Number of test cases exceeded target previously reached");
+#if DEBUG
+            //Assert.That(cases, Is.AtMost(targetCases), "Number of test cases exceeded target");
+#endif
+        }
+    }
+}
diff --git a/src/NUnitCore/tests/ParameterizedTestFixtureTests.cs b/src/NUnitCore/tests/ParameterizedTestFixtureTests.cs
new file mode 100644
index 0000000..7c94373
--- /dev/null
+++ b/src/NUnitCore/tests/ParameterizedTestFixtureTests.cs
@@ -0,0 +1,201 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Framework;
+using NUnit.TestUtilities;
+
+namespace NUnit.Core.Tests
+{
+    [TestFixture("hello", "hello", "goodbye")]
+    [TestFixture("zip", "zip")]
+    [TestFixture(42, 42, 99)]
+    public class ParameterizedTestFixture
+    {
+        private string eq1;
+        private string eq2;
+        private string neq;
+        
+        public ParameterizedTestFixture(string eq1, string eq2, string neq)
+        {
+            this.eq1 = eq1;
+            this.eq2 = eq2;
+            this.neq = neq;
+        }
+
+        public ParameterizedTestFixture(string eq1, string eq2)
+            : this(eq1, eq2, null) { }
+
+        public ParameterizedTestFixture(int eq1, int eq2, int neq)
+        {
+            this.eq1 = eq1.ToString();
+            this.eq2 = eq2.ToString();
+            this.neq = neq.ToString();
+        }
+
+        [Test]
+        public void TestEquality()
+        {
+            Assert.AreEqual(eq1, eq2);
+            if (eq1 != null && eq2 != null)
+                Assert.AreEqual(eq1.GetHashCode(), eq2.GetHashCode());
+        }
+
+        [Test]
+        public void TestInequality()
+        {
+            Assert.AreNotEqual(eq1, neq);
+            if (eq1 != null && neq != null)
+                Assert.AreNotEqual(eq1.GetHashCode(), neq.GetHashCode());
+        }
+    }
+
+#if NET_2_0
+    [TestFixture("A", null)]
+    [TestFixture(null, "A")]
+    [TestFixture(null, null)]
+    public class ParameterizedTestFixtureWithNullArguments
+    {
+        string a;
+        string b;
+
+        public ParameterizedTestFixtureWithNullArguments(string a, string b)
+        {
+            this.a = a;
+            this.b = b;
+        }
+
+        [Test]
+        public void TestMethod() 
+        {
+            Assert.That(a == null || b == null);
+        }
+    }
+#endif
+
+    [TestFixture(42)]
+    public class ParameterizedTestFixtureWithDataSources
+    {
+        private int answer;
+
+        internal object[] myData = { new int[] { 6, 7 }, new int[] { 3, 14 } };
+
+        public ParameterizedTestFixtureWithDataSources(int val)
+        {
+            this.answer = val;
+        }
+
+        [Test, TestCaseSource("myData")]
+        public void CanAccessTestCaseSource(int x, int y)
+        {
+            Assert.That(x * y, Is.EqualTo(answer));
+        }
+
+#if NET_2_0
+        IEnumerable GenerateData()
+        {
+            for(int i = 1; i <= answer; i++)
+                if ( answer%i == 0 )
+                    yield return new int[] { i, answer/i  };
+        }
+
+        [Test, TestCaseSource("GenerateData")]
+        public void CanGenerateDataFromParameter(int x, int y)
+        {
+            Assert.That(x * y, Is.EqualTo(answer));
+        }
+#endif
+
+        internal int[] intvals = new int[] { 1, 2, 3 };
+
+        [Test]
+        public void CanAccessValueSource(
+            [ValueSource("intvals")] int x)
+        {
+            Assert.That(answer % x == 0);
+        }
+    }
+
+    public class ParameterizedTestFixtureNamingTests
+    {
+        Test fixture;
+
+        [SetUp]
+        public void MakeFixture()
+        {
+            fixture = TestBuilder.MakeFixture(typeof(NUnit.TestData.ParameterizedTestFixture));
+        }
+
+        [Test]
+        public void TopLevelSuiteIsNamedCorrectly()
+        {
+            Assert.That(fixture.TestName.Name, Is.EqualTo("ParameterizedTestFixture"));
+            Assert.That(fixture.TestName.FullName, Is.EqualTo("NUnit.TestData.ParameterizedTestFixture"));
+        }
+
+        [Test]
+        public void SuiteHasCorrectNumberOfInstances()
+        {
+            Assert.That(fixture.Tests.Count, Is.EqualTo(2));
+        }
+
+        [Test]
+        public void FixtureInstancesAreNamedCorrectly()
+        {
+            ArrayList names = new ArrayList();
+            ArrayList fullnames = new ArrayList();
+            foreach (Test test in fixture.Tests)
+            {
+                names.Add(test.TestName.Name);
+                fullnames.Add(test.TestName.FullName);
+            }
+
+            Assert.That(names, Is.EquivalentTo(new string[] {
+                "ParameterizedTestFixture(1)", "ParameterizedTestFixture(2)" }));
+            Assert.That(fullnames, Is.EquivalentTo(new string[] {
+                "NUnit.TestData.ParameterizedTestFixture(1)", "NUnit.TestData.ParameterizedTestFixture(2)" }));
+        }
+
+        [Test]
+        public void MethodWithoutParamsIsNamedCorrectly()
+        {
+            Test instance = (Test)fixture.Tests[0];
+            Test method = TestFinder.Find("MethodWithoutParams", instance, false);
+            Assert.That(method, Is.Not.Null );
+            Assert.That(method.TestName.FullName, Is.EqualTo(instance.TestName.FullName + ".MethodWithoutParams"));
+        }
+
+        [Test]
+        public void MethodWithParamsIsNamedCorrectly()
+        {
+            Test instance = (Test)fixture.Tests[0];
+            Test method = TestFinder.Find("MethodWithParams", instance, false);
+            Assert.That(method, Is.Not.Null);
+            
+            Test testcase = (Test)method.Tests[0];
+            Assert.That(testcase.TestName.Name, Is.EqualTo("MethodWithParams(10,20)"));
+            Assert.That(testcase.TestName.FullName, Is.EqualTo(instance.TestName.FullName + ".MethodWithParams(10,20)"));
+        }
+    }
+
+    public class ParameterizedTestFixtureTests
+    {
+        [Test]
+        public void CanSpecifyCategory()
+        {
+            Test fixture = TestBuilder.MakeFixture(typeof(NUnit.TestData.TestFixtureWithSingleCategory));
+            Assert.AreEqual(new string[] { "XYZ" }, fixture.Categories);
+        }
+
+        [Test]
+        public void CanSpecifyMultipleCategories()
+        {
+            Test fixture = TestBuilder.MakeFixture(typeof(NUnit.TestData.TestFixtureWithMultipleCategories));
+            Assert.AreEqual(new string[] { "X", "Y", "Z" }, fixture.Categories);
+        }
+    }
+}
diff --git a/src/NUnitCore/tests/PlatformDetectionTests.cs b/src/NUnitCore/tests/PlatformDetectionTests.cs
index e590028..38e3466 100644
--- a/src/NUnitCore/tests/PlatformDetectionTests.cs
+++ b/src/NUnitCore/tests/PlatformDetectionTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -17,14 +17,14 @@ namespace NUnit.Core.Tests
 	public class PlatformDetectionTests
 	{
 		private static readonly PlatformHelper win95Helper = new PlatformHelper( 
-			new OperatingSystem( PlatformID.Win32Windows , new Version( 4, 0 ) ),
+			new OSPlatform( PlatformID.Win32Windows , new Version( 4, 0 ) ),
 			new RuntimeFramework( RuntimeType.Net, new Version( 1, 1, 4322, 0 ) ) );
 
 		private static readonly PlatformHelper winXPHelper = new PlatformHelper( 
-			new OperatingSystem( PlatformID.Win32NT , new Version( 5,1 ) ),
+			new OSPlatform( PlatformID.Win32NT , new Version( 5,1 ) ),
 			new RuntimeFramework( RuntimeType.Net, new Version( 1, 1, 4322, 0 ) ) );
 
-		private void CheckOSPlatforms( OperatingSystem os, 
+		private void CheckOSPlatforms( OSPlatform os, 
 			string expectedPlatforms )
 		{
 			CheckPlatforms(
@@ -37,7 +37,7 @@ namespace NUnit.Core.Tests
 			string expectedPlatforms )
 		{
 			CheckPlatforms(
-				new PlatformHelper( Environment.OSVersion, runtimeFramework ),
+				new PlatformHelper( OSPlatform.CurrentPlatform, runtimeFramework ),
 				expectedPlatforms,
 				PlatformHelper.RuntimePlatforms + ",NET-1.0,NET-1.1,NET-2.0,MONO-1.0,MONO-2.0" );
 		}
@@ -71,7 +71,7 @@ namespace NUnit.Core.Tests
 		public void DetectWin95()
 		{
 			CheckOSPlatforms( 
-				new OperatingSystem( PlatformID.Win32Windows, new Version( 4, 0 ) ),
+				new OSPlatform( PlatformID.Win32Windows, new Version( 4, 0 ) ),
 				"Win95,Win32Windows,Win32,Win" );
 		}
 
@@ -79,7 +79,7 @@ namespace NUnit.Core.Tests
 		public void DetectWin98()
 		{
 			CheckOSPlatforms( 
-				new OperatingSystem( PlatformID.Win32Windows, new Version( 4, 10 ) ),
+				new OSPlatform( PlatformID.Win32Windows, new Version( 4, 10 ) ),
 				"Win98,Win32Windows,Win32,Win" );
 		}
 
@@ -87,7 +87,7 @@ namespace NUnit.Core.Tests
 		public void DetectWinMe()
 		{
 			CheckOSPlatforms( 
-				new OperatingSystem( PlatformID.Win32Windows, new Version( 4, 90 ) ),
+				new OSPlatform( PlatformID.Win32Windows, new Version( 4, 90 ) ),
 				"WinMe,Win32Windows,Win32,Win" );
 		}
 
@@ -97,7 +97,7 @@ namespace NUnit.Core.Tests
 		{
             PlatformID winCE = (PlatformID)Enum.Parse(typeof(PlatformID), "WinCE");
 			CheckOSPlatforms(
-                new OperatingSystem(winCE, new Version(1, 0)),
+                new OSPlatform(winCE, new Version(1, 0)),
 				"WinCE,Win32,Win" );
 		}
 
@@ -105,7 +105,7 @@ namespace NUnit.Core.Tests
 		public void DetectNT3()
 		{
 			CheckOSPlatforms( 
-				new OperatingSystem( PlatformID.Win32NT, new Version( 3, 51 ) ),
+				new OSPlatform( PlatformID.Win32NT, new Version( 3, 51 ) ),
 				"NT3,Win32NT,Win32,Win" );
 		}
 
@@ -113,39 +113,79 @@ namespace NUnit.Core.Tests
 		public void DetectNT4()
 		{
 			CheckOSPlatforms( 
-				new OperatingSystem( PlatformID.Win32NT, new Version( 4, 0 ) ),
-				"NT4,Win32NT,Win32,Win" );
+				new OSPlatform( PlatformID.Win32NT, new Version( 4, 0 ) ),
+				"NT4,Win32NT,Win32,Win,Win-4.0" );
 		}
 
 		[Test]
 		public void DetectWin2K()
 		{
 			CheckOSPlatforms( 
-				new OperatingSystem( PlatformID.Win32NT, new Version( 5, 0 ) ),
-				"Win2K,NT5,Win32NT,Win32,Win" );
+				new OSPlatform( PlatformID.Win32NT, new Version( 5, 0 ) ),
+				"Win2K,NT5,Win32NT,Win32,Win,Win-5.0" );
 		}
 
 		[Test]
 		public void DetectWinXP()
 		{
 			CheckOSPlatforms( 
-				new OperatingSystem( PlatformID.Win32NT, new Version( 5, 1 ) ),
-				"WinXP,NT5,Win32NT,Win32,Win" );
+				new OSPlatform( PlatformID.Win32NT, new Version( 5, 1 ) ),
+				"WinXP,NT5,Win32NT,Win32,Win,Win-5.1" );
 		}
 
 		[Test]
-		public void DetectWin2003Server()
+		public void DetectWinXPProfessionalX64()
 		{
 			CheckOSPlatforms( 
-				new OperatingSystem( PlatformID.Win32NT, new Version( 5, 2 ) ),
-				"Win2003Server,NT5,Win32NT,Win32,Win" );
+				new OSPlatform( PlatformID.Win32NT, new Version( 5, 2 ), OSPlatform.ProductType.WorkStation ),
+				"WinXP,NT5,Win32NT,Win32,Win,Win-5.1" );
 		}
 
+		[Test]
+		public void DetectWin2003Server()
+		{
+            CheckOSPlatforms(
+                new OSPlatform(PlatformID.Win32NT, new Version(5, 2), OSPlatform.ProductType.Server),
+                "Win2003Server,NT5,Win32NT,Win32,Win,Win-5.2");
+        }
+
+        [Test]
+        public void DetectVista()
+        {
+            CheckOSPlatforms(
+                new OSPlatform(PlatformID.Win32NT, new Version(6, 0), OSPlatform.ProductType.WorkStation),
+                "Vista,NT6,Win32NT,Win32,Win,Win-6.0");
+        }
+
+        [Test]
+        public void DetectWin2008ServerOriginal()
+        {
+            CheckOSPlatforms(
+                new OSPlatform(PlatformID.Win32NT, new Version(6, 0), OSPlatform.ProductType.Server),
+                "Win2008Server,NT6,Win32NT,Win32,Win,Win-6.0");
+        }
+
+        [Test]
+        public void DetectWin2008ServerR2()
+        {
+            CheckOSPlatforms(
+                new OSPlatform(PlatformID.Win32NT, new Version(6, 1), OSPlatform.ProductType.Server),
+                "Win2008Server,Win2008ServerR2,NT6,Win32NT,Win32,Win,Win-6.1");
+        }
+
+        [Test]
+        public void DetectWindows7()
+        {
+            CheckOSPlatforms(
+                new OSPlatform(PlatformID.Win32NT, new Version(6, 1), OSPlatform.ProductType.WorkStation),
+                "Windows7,NT6,Win32NT,Win32,Win,Win-6.1");
+        }
+
         [Test]
         public void DetectUnixUnderMicrosoftDotNet()
         {
             CheckOSPlatforms(
-                new OperatingSystem(PlatformHelper.UnixPlatformID_Microsoft, new Version()),
+                new OSPlatform(OSPlatform.UnixPlatformID_Microsoft, new Version()),
                 "UNIX,Linux");
         }
 
@@ -154,7 +194,7 @@ namespace NUnit.Core.Tests
         public void DetectUnixUnderMono()
         {
             CheckOSPlatforms(
-                new OperatingSystem(PlatformHelper.UnixPlatformID_Mono, new Version()),
+                new OSPlatform(OSPlatform.UnixPlatformID_Mono, new Version()),
                 "UNIX,Linux");
         }
 
@@ -181,6 +221,13 @@ namespace NUnit.Core.Tests
 				new RuntimeFramework( RuntimeType.Net, new Version( 2, 0, 40607, 0 ) ),
 				"Net,Net-2.0" );
 		}
+        [Test]
+        public void DetectNet40()
+        {
+            CheckRuntimePlatforms(
+                new RuntimeFramework(RuntimeType.Net, new Version(4, 0, 20506, 0)),
+                "Net,Net-4.0");
+        }
 
 		[Test]
 		public void DetectNetCF()
diff --git a/src/NUnitCore/tests/PropertyAttributeTests.cs b/src/NUnitCore/tests/PropertyAttributeTests.cs
index 16633fb..b3eb8f8 100644
--- a/src/NUnitCore/tests/PropertyAttributeTests.cs
+++ b/src/NUnitCore/tests/PropertyAttributeTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -25,14 +25,14 @@ namespace NUnit.Core.Tests
 		[Test]
 		public void PropertyWithStringValue()
 		{
-			TestCase test1 = (TestCase)fixture.Tests[0];
+			Test test1 = (Test)fixture.Tests[0];
 			Assert.AreEqual( "Charlie", test1.Properties["user"] );
 		}
 
 		[Test]
 		public void PropertiesWithNumericValues()
 		{
-			TestCase test2 = (TestCase)fixture.Tests[1];
+			Test test2 = (Test)fixture.Tests[1];
 			Assert.AreEqual( 10.0, test2.Properties["X"] );
 			Assert.AreEqual( 17.0, test2.Properties["Y"] );
 		}
@@ -46,7 +46,7 @@ namespace NUnit.Core.Tests
 		[Test]
 		public void CanDeriveFromPropertyAttribute()
 		{
-			TestCase test3 = (TestCase)fixture.Tests[2];
+			Test test3 = (Test)fixture.Tests[2];
 			Assert.AreEqual( 5, test3.Properties["Priority"] );
 		}
 	}
diff --git a/src/NUnitCore/tests/ReflectTests.cs b/src/NUnitCore/tests/ReflectTests.cs
index c14888c..958b0bf 100644
--- a/src/NUnitCore/tests/ReflectTests.cs
+++ b/src/NUnitCore/tests/ReflectTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -88,33 +88,30 @@ namespace NUnit.Core.Tests
 		}
 
 		[Test]
-		public void GetMethodWithAttribute()
+		public void GetMethodsWithAttribute()
 		{
-			Assert.IsNotNull( Reflect.GetMethodWithAttribute( myType, "Colors.BlueAttribute", BF, false ) );
-		}
-
-		[Test]
-		public void CountMethodsWithAttribute()
-		{
-			Assert.AreEqual( 1, Reflect.CountMethodsWithAttribute( myType, "Colors.BlueAttribute", BF, false ) );
-		}
+            MethodInfo[] methods = Reflect.GetMethodsWithAttribute(myType, "Colors.BlueAttribute", false);
+            Assert.That(
+                List.Map(methods).Property("Name"), 
+                Is.EqualTo(new string[] {"BaseBlueMethod", "BlueMethod"} ));
+        }
 
 		[Test]
 		public void GetNamedMethod()
 		{
-			Assert.IsNotNull( Reflect.GetNamedMethod( myType, "BlueMethod", BF ) );
+			Assert.IsNotNull( Reflect.GetNamedMethod( myType, "BlueMethod" ) );
 		}
 
 		[Test]
 		public void GetNamedMethodWithArgs()
 		{
-			Assert.IsNotNull( Reflect.GetNamedMethod( myType, "TwoArgs", new string[] { "System.Int32", "System.String" }, BF ) );
+			Assert.IsNotNull( Reflect.GetNamedMethod( myType, "TwoArgs", new string[] { "System.Int32", "System.String" } ) );
 		}
 
 		[Test]
 		public void GetPropertyWithAttribute()
 		{
-			Assert.IsNotNull( Reflect.GetPropertyWithAttribute( myType, "Colors.RedAttribute", BF ) );
+			Assert.IsNotNull( Reflect.GetPropertyWithAttribute( myType, "Colors.RedAttribute" ) );
 		}
 
 		[Test]
@@ -139,7 +136,7 @@ namespace NUnit.Core.Tests
 		public void InvokeMethod()
 		{
 			Colors.MyClass myClass = new Colors.MyClass();
-			MethodInfo method = Reflect.GetNamedMethod( myType, "BlueMethod", BF );
+			MethodInfo method = Reflect.GetNamedMethod( myType, "BlueMethod" );
 			Reflect.InvokeMethod( method, myClass );
 			Assert.IsTrue( myClass.BlueInvoked );
 		}
@@ -160,6 +157,8 @@ namespace Colors
 	[Red]
 	class BaseClass : MyInterface
 	{
+        [Blue]
+        public void BaseBlueMethod() { }
 	}
 
 	[Green]
diff --git a/src/NUnitCore/tests/RemoteRunnerTests.cs b/src/NUnitCore/tests/RemoteRunnerTests.cs
index 40a13d5..26e0c98 100644
--- a/src/NUnitCore/tests/RemoteRunnerTests.cs
+++ b/src/NUnitCore/tests/RemoteRunnerTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitCore/tests/RepeatedTestFixture.cs b/src/NUnitCore/tests/RepeatedTestFixture.cs
new file mode 100644
index 0000000..9ab0656
--- /dev/null
+++ b/src/NUnitCore/tests/RepeatedTestFixture.cs
@@ -0,0 +1,101 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Reflection;
+using NUnit.Framework;
+using NUnit.TestData.RepeatedTestFixture;
+
+namespace NUnit.Core.Tests
+{
+    [TestFixture]
+    public class RepeatedTestFixture
+	{
+		private MethodInfo successMethod;
+		private MethodInfo failOnFirstMethod;
+		private MethodInfo failOnThirdMethod;
+
+		[SetUp]
+		public void SetUp()
+		{
+			Type testType = typeof(RepeatSuccessFixture);
+			successMethod = testType.GetMethod ("RepeatSuccess");
+			testType = typeof(RepeatFailOnFirstFixture);
+			failOnFirstMethod = testType.GetMethod("RepeatFailOnFirst");
+			testType = typeof(RepeatFailOnThirdFixture);
+			failOnThirdMethod = testType.GetMethod("RepeatFailOnThird");
+		}
+
+		private TestResult RunTestOnFixture( object fixture )
+		{
+			Test suite = TestFixtureBuilder.BuildFrom( fixture );
+			Assert.AreEqual( 1, suite.Tests.Count, "Test case count" );
+            return suite.Run(NullListener.NULL, TestFilter.Empty);
+		}
+
+		[Test]
+		public void RepeatSuccess()
+		{
+			Assert.IsNotNull (successMethod);
+			RepeatSuccessFixture fixture = new RepeatSuccessFixture();
+			TestResult result = RunTestOnFixture( fixture );
+
+			Assert.IsTrue(result.IsSuccess);
+			Assert.AreEqual(1, fixture.FixtureSetupCount);
+			Assert.AreEqual(1, fixture.FixtureTeardownCount);
+			Assert.AreEqual(3, fixture.SetupCount);
+			Assert.AreEqual(3, fixture.TeardownCount);
+			Assert.AreEqual(3, fixture.Count);
+		}
+
+		[Test]
+		public void RepeatFailOnFirst()
+		{
+			Assert.IsNotNull (failOnFirstMethod);
+			RepeatFailOnFirstFixture fixture = new RepeatFailOnFirstFixture();
+			TestResult result = RunTestOnFixture( fixture );
+
+			Assert.IsFalse(result.IsSuccess);
+			Assert.AreEqual(1, fixture.SetupCount);
+			Assert.AreEqual(1, fixture.TeardownCount);
+			Assert.AreEqual(1, fixture.Count);
+		}
+
+		[Test]
+		public void RepeatFailOnThird()
+		{
+			Assert.IsNotNull (failOnThirdMethod);
+			RepeatFailOnThirdFixture fixture = new RepeatFailOnThirdFixture();
+			TestResult result = RunTestOnFixture( fixture );
+
+			Assert.IsFalse(result.IsSuccess);
+			Assert.AreEqual(3, fixture.SetupCount);
+			Assert.AreEqual(3, fixture.TeardownCount);
+			Assert.AreEqual(3, fixture.Count);
+		}
+
+		[Test]
+		public void IgnoreWorksWithRepeatedTest()
+		{
+			RepeatedTestWithIgnore fixture = new RepeatedTestWithIgnore();
+			RunTestOnFixture( fixture );
+
+			Assert.AreEqual( 0, fixture.SetupCount );
+			Assert.AreEqual( 0, fixture.TeardownCount );
+			Assert.AreEqual( 0, fixture.Count );
+		}
+
+        [Test]
+        public void CategoryWorksWithRepeatedTest()
+        {
+            Test suite = TestFixtureBuilder.BuildFrom(typeof(RepeatedTestWithCategory));
+            Test test = suite.Tests[0] as Test;
+            Assert.IsNotNull(test.Categories);
+            Assert.AreEqual(1, test.Categories.Count);
+            Assert.AreEqual("SAMPLE", test.Categories[0]);
+        }
+	}
+}
diff --git a/src/NUnitCore/tests/Results.xsd b/src/NUnitCore/tests/Results.xsd
new file mode 100644
index 0000000..3afb840
--- /dev/null
+++ b/src/NUnitCore/tests/Results.xsd
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+	<xs:complexType name="failureType">
+		<xs:sequence>
+			<xs:element ref="message" />
+			<xs:element ref="stack-trace" />
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="reasonType">
+		<xs:sequence>
+			<xs:element ref="message" />
+		</xs:sequence>
+	</xs:complexType>
+	<xs:element name="message" type="xs:string" />
+	<xs:complexType name="resultsType">
+		<xs:choice>
+			<xs:element name="test-suite" type="test-suiteType" maxOccurs="unbounded" />
+			<xs:element name="test-case" type="test-caseType" maxOccurs="unbounded" minOccurs="0" />
+		</xs:choice>
+	</xs:complexType>
+	<xs:element name="stack-trace" type="xs:string" />
+	<xs:element name="test-results" type="resultType" />
+	<xs:complexType name="categoriesType">
+		<xs:sequence>
+			<xs:element name="category" type="categoryType" maxOccurs="unbounded" minOccurs="1" />
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="categoryType">
+		<xs:attribute name="name" type="xs:string" use="required" />
+	</xs:complexType>
+	<xs:complexType name="propertiesType">
+		<xs:sequence>
+			<xs:element name="property" type="propertyType" maxOccurs="unbounded" minOccurs="1" />
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="propertyType">
+		<xs:attribute name="name" type="xs:string" use="required" />
+		<xs:attribute name="value" type="xs:string" use="required" />
+	</xs:complexType>
+	<xs:complexType name="environmentType">
+		<xs:attribute name="nunit-version" type="xs:string" use="required" />
+		<xs:attribute name="clr-version" type="xs:string" use="required" />
+		<xs:attribute name="os-version" type="xs:string" use="required" />
+		<xs:attribute name="platform" type="xs:string" use="required" />
+		<xs:attribute name="cwd" type="xs:string" use="required" />
+		<xs:attribute name="machine-name" type="xs:string" use="required" />
+		<xs:attribute name="user" type="xs:string" use="required" />
+		<xs:attribute name="user-domain" type="xs:string" use="required" />
+	</xs:complexType>
+	<xs:complexType name="culture-infoType">
+		<xs:attribute name="current-culture" type="xs:string" use="required" />
+		<xs:attribute name="current-uiculture" type="xs:string" use="required" />
+	</xs:complexType>
+	<xs:complexType name="resultType">
+		<xs:sequence>
+			<xs:element name="environment" type="environmentType" />
+			<xs:element name="culture-info" type="culture-infoType" />
+			<xs:element name="test-suite" type="test-suiteType" />
+		</xs:sequence>
+		<xs:attribute name="name" type="xs:string" use="required" />
+		<xs:attribute name="total" type="xs:decimal" use="required" />
+    <xs:attribute name="errors" type="xs:decimal" use="required" />
+    <xs:attribute name="failures" type="xs:decimal" use="required" />
+    <xs:attribute name="inconclusive" type="xs:decimal" use="required" />
+    <xs:attribute name="not-run" type="xs:decimal" use="required" />
+    <xs:attribute name="ignored" type="xs:decimal" use="required" />
+    <xs:attribute name="skipped" type="xs:decimal" use="required" />
+    <xs:attribute name="invalid" type="xs:decimal" use="required" />
+    <xs:attribute name="date" type="xs:string" use="required" />
+		<xs:attribute name="time" type="xs:string" use="required" />
+	</xs:complexType>
+	<xs:complexType name="test-caseType">
+		<xs:sequence>
+			<xs:element name="categories" type="categoriesType" minOccurs="0" maxOccurs="1" />
+			<xs:element name="properties" type="propertiesType" minOccurs="0" maxOccurs="1" />
+			<xs:choice>
+				<xs:element name="failure" type="failureType" minOccurs="0" />
+				<xs:element name="reason" type="reasonType" minOccurs="0" />
+			</xs:choice>
+		</xs:sequence>
+		<xs:attribute name="name" type="xs:string" use="required" />
+		<xs:attribute name="description" type="xs:string" use="optional" />
+		<xs:attribute name="success" type="xs:string" use="optional" />
+		<xs:attribute name="time" type="xs:string" use="optional" />
+		<xs:attribute name="executed" type="xs:string" use="required" />
+		<xs:attribute name="asserts" type="xs:string" use="optional" />
+    <xs:attribute name="result" type="xs:string" use="required" />
+  </xs:complexType>
+	<xs:complexType name="test-suiteType">
+		<xs:sequence>
+			<xs:element name="categories" type="categoriesType" minOccurs="0" maxOccurs="1" />
+			<xs:element name="properties" type="propertiesType" minOccurs="0" maxOccurs="1" />
+			<xs:choice>
+				<xs:element name="failure" type="failureType" minOccurs="0" />
+				<xs:element name="reason" type="reasonType" minOccurs="0" />
+			</xs:choice>
+			<xs:element name="results" type="resultsType" minOccurs="0" maxOccurs="1"/>
+		</xs:sequence>
+    <xs:attribute name="type" type="xs:string" use="required" />
+		<xs:attribute name="name" type="xs:string" use="required" />
+		<xs:attribute name="description" type="xs:string" use="optional" />
+		<xs:attribute name="success" type="xs:string" use="optional" />
+    <xs:attribute name="time" type="xs:string" use="optional" />
+		<xs:attribute name="executed" type="xs:string" use="required" />
+		<xs:attribute name="asserts" type="xs:string" use="optional" />
+    <xs:attribute name="result" type="xs:string" use="required" />
+  </xs:complexType>
+</xs:schema>
\ No newline at end of file
diff --git a/src/NUnitCore/tests/RuntimeFrameworkTests.cs b/src/NUnitCore/tests/RuntimeFrameworkTests.cs
new file mode 100644
index 0000000..9ae3ba2
--- /dev/null
+++ b/src/NUnitCore/tests/RuntimeFrameworkTests.cs
@@ -0,0 +1,197 @@
+using System;
+using NUnit.Framework;
+
+namespace NUnit.Core.Tests
+{
+    [TestFixture]
+    public class RuntimeFrameworkTests
+    {
+        static RuntimeType currentRuntime = 
+            Type.GetType("Mono.Runtime", false) != null ? RuntimeType.Mono : RuntimeType.Net;
+
+        [Test]
+        public void CanGetCurrentFramework()
+        {
+            RuntimeFramework framework = RuntimeFramework.CurrentFramework;
+
+            Assert.That(framework.Runtime, Is.EqualTo(currentRuntime));
+            Assert.That(framework.ClrVersion, Is.EqualTo(Environment.Version));
+        }
+
+        [Test]
+        public void CurrentFrameworkHasBuildSpecified()
+        {
+            Assert.That(RuntimeFramework.CurrentFramework.ClrVersion.Build, Is.GreaterThan(0));
+        }
+
+        [Test]
+        public void CurrentFrameworkMustBeAvailable()
+        {
+            Assert.That(RuntimeFramework.CurrentFramework.IsAvailable);
+        }
+
+        [Test]
+        public void CanListAvailableFrameworks()
+        {
+            RuntimeFramework[] available = RuntimeFramework.AvailableFrameworks;
+            Assert.That(available, Has.Length.GreaterThan(0) );
+            bool foundCurrent = false;
+            foreach (RuntimeFramework framework in available)
+            {
+                Console.WriteLine("Available: {0}", framework.DisplayName);
+                foundCurrent |= RuntimeFramework.CurrentFramework.Matches(framework);
+            }
+            Assert.That(foundCurrent, "CurrentFramework not listed");
+        }
+
+        [TestCaseSource("frameworkData")]
+        public void CanCreateNewRuntimeFramework(FrameworkData data)
+        {
+            RuntimeFramework framework = new RuntimeFramework(data.runtime, data.frameworkVersion);
+            Assert.AreEqual(data.runtime, framework.Runtime);
+            Assert.AreEqual(data.clrVersion, framework.ClrVersion);
+        }
+
+        [TestCaseSource("frameworkData")]
+        public void CanParseRuntimeFramework(FrameworkData data)
+        {
+            RuntimeFramework framework = RuntimeFramework.Parse(data.representation);
+            Assert.AreEqual(data.runtime, framework.Runtime);
+            Assert.AreEqual(data.clrVersion, framework.ClrVersion);
+        }
+
+        [TestCaseSource("frameworkData")]
+        public void CanDisplayFrameworkAsString(FrameworkData data)
+        {
+            RuntimeFramework framework = new RuntimeFramework(data.runtime, data.frameworkVersion);
+            Assert.AreEqual(data.representation, framework.ToString());
+            Assert.AreEqual(data.displayName, framework.DisplayName);
+        }
+
+        [TestCaseSource("matchData")]
+        public bool CanMatchRuntimes(RuntimeFramework f1, RuntimeFramework f2)
+        {
+            return f1.Matches(f2);
+        }
+
+        internal static TestCaseData[] matchData = new TestCaseData[] {
+            new TestCaseData(
+                new RuntimeFramework(RuntimeType.Net, new Version(2,0)), 
+                new RuntimeFramework(RuntimeType.Net, new Version(2,0))) 
+                .Returns(true),
+            new TestCaseData(
+                new RuntimeFramework(RuntimeType.Net, new Version(2,0)), 
+                new RuntimeFramework(RuntimeType.Net, new Version(2,0,50727))) 
+                .Returns(true),
+            new TestCaseData(
+                new RuntimeFramework(RuntimeType.Net, new Version(2,0,50727)), 
+                new RuntimeFramework(RuntimeType.Net, new Version(2,0))) 
+                .Returns(true),
+            new TestCaseData(
+                new RuntimeFramework(RuntimeType.Net, new Version(2,0,50727)), 
+                new RuntimeFramework(RuntimeType.Net, new Version(2,0))) 
+                .Returns(true),
+            new TestCaseData(
+                new RuntimeFramework(RuntimeType.Net, new Version(3,5)), 
+                new RuntimeFramework(RuntimeType.Net, new Version(2,0))) 
+                .Returns(true),
+            new TestCaseData(
+                new RuntimeFramework(RuntimeType.Net, new Version(2,0)), 
+                new RuntimeFramework(RuntimeType.Mono, new Version(2,0))) 
+                .Returns(false),
+            new TestCaseData(
+                new RuntimeFramework(RuntimeType.Net, new Version(2,0)), 
+                new RuntimeFramework(RuntimeType.Net, new Version(1,1))) 
+                .Returns(false),
+            new TestCaseData(
+                new RuntimeFramework(RuntimeType.Net, new Version(2,0,50727)), 
+                new RuntimeFramework(RuntimeType.Net, new Version(2,0,40607))) 
+                .Returns(false),
+            new TestCaseData(
+                new RuntimeFramework(RuntimeType.Mono, new Version(1,1)), // non-existent version but it works
+                new RuntimeFramework(RuntimeType.Mono, new Version(1,0))) 
+                .Returns(true),
+            new TestCaseData(
+                new RuntimeFramework(RuntimeType.Mono, new Version(2,0)),
+                new RuntimeFramework(RuntimeType.Any, new Version(2,0)))
+                .Returns(true),
+            new TestCaseData(
+                new RuntimeFramework(RuntimeType.Any, new Version(2,0)),
+                new RuntimeFramework(RuntimeType.Mono, new Version(2,0)))
+                .Returns(true),
+            new TestCaseData(
+                new RuntimeFramework(RuntimeType.Any, new Version(2,0)),
+                new RuntimeFramework(RuntimeType.Any, new Version(2,0)))
+                .Returns(true),
+            new TestCaseData(
+                new RuntimeFramework(RuntimeType.Any, new Version(2,0)),
+                new RuntimeFramework(RuntimeType.Any, new Version(4,0)))
+                .Returns(false),
+            new TestCaseData(
+                new RuntimeFramework(RuntimeType.Net, RuntimeFramework.DefaultVersion), 
+                new RuntimeFramework(RuntimeType.Net, new Version(2,0))) 
+                .Returns(true),
+            new TestCaseData(
+                new RuntimeFramework(RuntimeType.Net, new Version(2,0)),
+                new RuntimeFramework(RuntimeType.Net, RuntimeFramework.DefaultVersion)) 
+                .Returns(true),
+            new TestCaseData(
+                new RuntimeFramework(RuntimeType.Any, RuntimeFramework.DefaultVersion), 
+                new RuntimeFramework(RuntimeType.Net, new Version(2,0))) 
+                .Returns(true),
+            new TestCaseData(
+                new RuntimeFramework(RuntimeType.Net, new Version(2,0)),
+                new RuntimeFramework(RuntimeType.Any, RuntimeFramework.DefaultVersion)) 
+                .Returns(true)
+            };
+
+        public struct FrameworkData
+        {
+            public RuntimeType runtime;
+            public Version frameworkVersion;
+            public Version clrVersion;
+            public string representation;
+            public string displayName;
+
+            public FrameworkData(RuntimeType runtime, Version frameworkVersion, Version clrVersion,
+                string representation, string displayName)
+            {
+                this.runtime = runtime;
+                this.frameworkVersion = frameworkVersion;
+                this.clrVersion = clrVersion;
+                this.representation = representation;
+                this.displayName = displayName;
+            }
+
+            public override string ToString()
+            {
+                return string.Format("<{0}-{1}>", this.runtime, this.frameworkVersion);
+            }
+        }
+
+        internal FrameworkData[] frameworkData = new FrameworkData[] {
+            new FrameworkData(RuntimeType.Net, new Version(1,0), new Version(1,0), "net-1.0", "Net 1.0"),
+            new FrameworkData(RuntimeType.Net, new Version(1,0,3705), new Version(1,0,3705), "net-1.0.3705", "Net 1.0.3705"),
+            new FrameworkData(RuntimeType.Net, new Version(1,1), new Version(1,1), "net-1.1", "Net 1.1"),
+            new FrameworkData(RuntimeType.Net, new Version(1,1,4322), new Version(1,1,4322), "net-1.1.4322", "Net 1.1.4322"),
+            new FrameworkData(RuntimeType.Net, new Version(2,0), new Version(2,0), "net-2.0", "Net 2.0"),
+            new FrameworkData(RuntimeType.Net, new Version(2,0,40607), new Version(2,0,40607), "net-2.0.40607", "Net 2.0.40607"),
+            new FrameworkData(RuntimeType.Net, new Version(2,0,50727), new Version(2,0,50727), "net-2.0.50727", "Net 2.0.50727"),
+            new FrameworkData(RuntimeType.Net, new Version(3,0), new Version(2,0), "net-3.0", "Net 3.0"),
+            new FrameworkData(RuntimeType.Net, new Version(3,5), new Version(2,0), "net-3.5", "Net 3.5"),
+            new FrameworkData(RuntimeType.Net, new Version(4,0), new Version(4,0), "net-4.0", "Net 4.0"),
+            new FrameworkData(RuntimeType.Net, RuntimeFramework.DefaultVersion, RuntimeFramework.DefaultVersion, "net", "Net"),
+            new FrameworkData(RuntimeType.Mono, new Version(1,0), new Version(1,1), "mono-1.0", "Mono 1.0"),
+            new FrameworkData(RuntimeType.Mono, new Version(2,0), new Version(2,0), "mono-2.0", "Mono 2.0"),
+            new FrameworkData(RuntimeType.Mono, new Version(2,0,50727), new Version(2,0,50727), "mono-2.0.50727", "Mono 2.0.50727"),
+            new FrameworkData(RuntimeType.Mono, new Version(3,5), new Version(2,0), "mono-3.5", "Mono 3.5"),
+            new FrameworkData(RuntimeType.Mono, RuntimeFramework.DefaultVersion, RuntimeFramework.DefaultVersion, "mono", "Mono"),
+            new FrameworkData(RuntimeType.Any, new Version(1,1), new Version(1,1), "v1.1", "v1.1"),
+            new FrameworkData(RuntimeType.Any, new Version(2,0), new Version(2,0), "v2.0", "v2.0"),
+            new FrameworkData(RuntimeType.Any, new Version(2,0,50727), new Version(2,0,50727), "v2.0.50727", "v2.0.50727"),
+            new FrameworkData(RuntimeType.Any, new Version(3,5), new Version(2,0), "v3.5", "v3.5"),
+            new FrameworkData(RuntimeType.Any, new Version(4,0), new Version(4,0), "v4.0", "v4.0"),
+            new FrameworkData(RuntimeType.Any, RuntimeFramework.DefaultVersion, RuntimeFramework.DefaultVersion, "any", "Any")
+        };
+    }
+}
diff --git a/src/NUnitCore/tests/SerializationBug.cs b/src/NUnitCore/tests/SerializationBug.cs
index 8ab694f..5653dfa 100644
--- a/src/NUnitCore/tests/SerializationBug.cs
+++ b/src/NUnitCore/tests/SerializationBug.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitCore/tests/SetCultureAttributeTests.cs b/src/NUnitCore/tests/SetCultureAttributeTests.cs
new file mode 100644
index 0000000..dd93ab0
--- /dev/null
+++ b/src/NUnitCore/tests/SetCultureAttributeTests.cs
@@ -0,0 +1,103 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Threading;
+using System.Globalization;
+using NUnit.Framework;
+using NUnit.TestData.CultureAttributeTests;
+using NUnit.TestUtilities;
+
+namespace NUnit.Core.Tests
+{
+    [TestFixture]
+    public class SetCultureAttributeTests
+    {
+        private CultureInfo originalCulture;
+//        private CultureInfo originalUICulture;
+
+        [SetUp]
+        public void Setup()
+        {
+            originalCulture = CultureInfo.CurrentCulture;
+//            originalUICulture = CultureInfo.CurrentUICulture;
+        }        
+
+        [Test, SetUICulture("fr-FR")]
+        public void SetUICultureOnlyToFrench()
+        {
+            Assert.AreEqual(CultureInfo.CurrentCulture, originalCulture, "Culture should not change");
+            Assert.AreEqual("fr-FR", CultureInfo.CurrentUICulture.Name, "UICulture not set correctly");
+        }
+
+        [Test, SetUICulture("fr-CA")]
+        public void SetUICultureOnlyToFrenchCanadian()
+        {
+            Assert.AreEqual(CultureInfo.CurrentCulture, originalCulture, "Culture should not change");
+            Assert.AreEqual("fr-CA", CultureInfo.CurrentUICulture.Name, "UICulture not set correctly");
+        }
+
+        [Test, SetUICulture("ru-RU")]
+        public void SetUICultureOnlyToRussian()
+        {
+            Assert.AreEqual(CultureInfo.CurrentCulture, originalCulture, "Culture should not change");
+            Assert.AreEqual("ru-RU", CultureInfo.CurrentUICulture.Name, "UICulture not set correctly");
+        }
+
+        [Test, SetCulture("fr-FR"), SetUICulture("fr-FR")]
+        public void SetBothCulturesToFrench()
+        {
+            Assert.AreEqual("fr-FR", CultureInfo.CurrentCulture.Name, "Culture not set correctly");
+            Assert.AreEqual("fr-FR", CultureInfo.CurrentUICulture.Name, "UICulture not set correctly");
+        }
+
+        [Test, SetCulture("fr-CA"), SetUICulture("fr-CA")]
+        public void SetBothCulturesToFrenchCanadian()
+        {
+            Assert.AreEqual("fr-CA", CultureInfo.CurrentCulture.Name, "Culture not set correctly");
+            Assert.AreEqual("fr-CA", CultureInfo.CurrentUICulture.Name, "UICulture not set correctly");
+        }
+
+        [Test, SetCulture("ru-RU"), SetUICulture("ru-RU")]
+        public void SetBothCulturesToRussian()
+        {
+            Assert.AreEqual("ru-RU", CultureInfo.CurrentCulture.Name, "Culture not set correctly");
+            Assert.AreEqual("ru-RU", CultureInfo.CurrentUICulture.Name, "UICulture not set correctly");
+        }
+
+        [Test, SetCulture("fr-FR"), SetUICulture("fr-CA")]
+        public void SetMixedCulturesToFrenchAndUIFrenchCanadian()
+        {
+            Assert.AreEqual("fr-FR", CultureInfo.CurrentCulture.Name, "Culture not set correctly");
+            Assert.AreEqual("fr-CA", CultureInfo.CurrentUICulture.Name, "UICulture not set correctly");
+        }
+
+        [Test, SetCulture("ru-RU"), SetUICulture("en-US")]
+        public void SetMixedCulturesToRussianAndUIEnglishUS()
+        {
+            Assert.AreEqual("ru-RU", CultureInfo.CurrentCulture.Name, "Culture not set correctly");
+            Assert.AreEqual("en-US", CultureInfo.CurrentUICulture.Name, "UICulture not set correctly");
+        }
+
+        [TestFixture, SetCulture("ru-RU"), SetUICulture("ru-RU")]
+        class NestedBehavior
+        {
+            [Test]
+            public void InheritedRussian()
+            {
+                Assert.AreEqual("ru-RU", CultureInfo.CurrentCulture.Name, "Culture not set correctly");
+                Assert.AreEqual("ru-RU", CultureInfo.CurrentUICulture.Name, "UICulture not set correctly");
+            }
+
+            [Test, SetUICulture("fr-FR")]
+            public void InheritedRussianWithUIFrench()
+            {
+                Assert.AreEqual("ru-RU", CultureInfo.CurrentCulture.Name, "Culture not set correctly");
+                Assert.AreEqual("fr-FR", CultureInfo.CurrentUICulture.Name, "UICulture not set correctly");
+            }
+        }        
+    }
+}
diff --git a/src/NUnitCore/tests/SetUpFixtureTests.cs b/src/NUnitCore/tests/SetUpFixtureTests.cs
index aa47e54..7a4c0fc 100644
--- a/src/NUnitCore/tests/SetUpFixtureTests.cs
+++ b/src/NUnitCore/tests/SetUpFixtureTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -13,7 +13,7 @@ namespace NUnit.Core.Tests
     [TestFixture]
     public class SetUpFixtureTests
     {
-        private static readonly string testAssembly = "test-assembly.dll";
+        private static readonly string testAssembly = AssemblyHelper.GetAssemblyPath(typeof(NUnit.TestData.EmptyFixture));
 
         #region SetUp
         [SetUp]
@@ -63,7 +63,7 @@ namespace NUnit.Core.Tests
                 Assert.AreEqual(1, suite.Tests.Count);
             }
 
-            Assert.IsInstanceOfType(typeof(SetUpFixture), suite);
+            Assert.IsInstanceOf(typeof(SetUpFixture), suite);
 
             suite = suite.Tests[0] as TestSuite;
             Assert.AreEqual("SomeTestFixture", suite.TestName.Name);
@@ -83,7 +83,7 @@ namespace NUnit.Core.Tests
             Test suite = builder.Build( new TestPackage( testAssembly ) );
 
             Assert.IsNotNull(suite);
-            Assert.IsInstanceOfType(typeof(SetUpFixture), suite);
+            Assert.IsInstanceOf(typeof(SetUpFixture), suite);
 
             suite = suite.Tests[1] as TestSuite;
             Assert.AreEqual("SomeTestFixture", suite.TestName.Name);
@@ -103,6 +103,17 @@ namespace NUnit.Core.Tests
         }
         #endregion Simple
 
+        #region Static
+        [Test]
+        public void NamespaceSetUpMethodsMayBeStatic()
+        {
+            Assert.IsTrue(runTests("NUnit.TestData.SetupFixture.Namespace5").IsSuccess);
+            TestUtilities.SimpleEventRecorder.Verify("NamespaceSetup",
+                                    "FixtureSetup", "Setup", "Test", "TearDown", "FixtureTearDown",
+                                  "NamespaceTearDown");
+        }
+        #endregion
+
         #region TwoTestFixtures
         [NUnit.Framework.Test]
         public void NamespaceSetUpFixtureWrapsExecutionOfTwoTests()
@@ -146,7 +157,7 @@ namespace NUnit.Core.Tests
         {
             TestResult result = runTests(null, new Filters.SimpleNameFilter("SomeTestFixture"));
             ResultSummarizer summ = new ResultSummarizer(result);
-            Assert.AreEqual(1, summ.ResultCount);
+            Assert.AreEqual(1, summ.TestsRun);
             Assert.IsTrue(result.IsSuccess);
             TestUtilities.SimpleEventRecorder.Verify("RootNamespaceSetup",
                                     "Test",
diff --git a/src/NUnitCore/tests/SetUpTest.cs b/src/NUnitCore/tests/SetUpTest.cs
index cd84ea9..96e6118 100644
--- a/src/NUnitCore/tests/SetUpTest.cs
+++ b/src/NUnitCore/tests/SetUpTest.cs
@@ -1,9 +1,10 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
+using System;
 using NUnit.Framework;
 using NUnit.Core.Builders;
 using NUnit.TestUtilities;
@@ -13,7 +14,7 @@ namespace NUnit.Core.Tests
 {
 	[TestFixture]
 	public class SetUpTest
-	{	
+	{
 		[Test]
 		public void SetUpAndTearDownCounter()
 		{
@@ -46,7 +47,7 @@ namespace NUnit.Core.Tests
 		}
 
 		[Test]
-		public void CheckInheritedSetUpAndTearDownAreNotCalled()
+		public void CheckOverriddenSetUpAndTearDownAreNotCalled()
 		{
 			DefineInheritSetUpAndTearDown fixture = new DefineInheritSetUpAndTearDown();
 			TestBuilder.RunTestFixture( fixture );
@@ -56,5 +57,91 @@ namespace NUnit.Core.Tests
 			Assert.IsTrue(fixture.derivedSetUpCalled);
 			Assert.IsTrue(fixture.derivedTearDownCalled);
 		}
-	}
+
+        [Test]
+        public void MultipleSetUpAndTearDownMethodsAreCalled()
+        {
+            MultipleSetUpTearDownFixture fixture = new MultipleSetUpTearDownFixture();
+            TestBuilder.RunTestFixture(fixture);
+
+            Assert.IsTrue(fixture.wasSetUp1Called, "SetUp1");
+            Assert.IsTrue(fixture.wasSetUp2Called, "SetUp2");
+            Assert.IsTrue(fixture.wasSetUp3Called, "SetUp3");
+            Assert.IsTrue(fixture.wasTearDown1Called, "TearDown1");
+            Assert.IsTrue(fixture.wasTearDown2Called, "TearDown2");
+        }
+
+        [Test]
+        public void BaseSetUpIsCalledFirstTearDownLast()
+        {
+            DerivedClassWithSeparateSetUp fixture = new DerivedClassWithSeparateSetUp();
+            TestBuilder.RunTestFixture(fixture);
+
+            Assert.IsTrue(fixture.wasSetUpCalled, "Base SetUp Called");
+            Assert.IsTrue(fixture.wasTearDownCalled, "Base TearDown Called");
+            Assert.IsTrue(fixture.wasDerivedSetUpCalled, "Derived SetUp Called");
+            Assert.IsTrue(fixture.wasDerivedTearDownCalled, "Derived TearDown Called");
+            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");
+            Assert.AreEqual(result.FailureSite, FailureSite.SetUp, "Test should be failed at setup site");
+            string expected = string.Format("SetUp : {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);
+        }
+
+        public class SetupCallBase
+        {
+            protected int setupCount = 0;
+            public virtual void Init()
+            {
+                setupCount++;
+            }
+            public virtual void AssertCount()
+            {
+            }
+        }
+
+        [TestFixture]
+        // Test for bug 441022
+        public class SetupCallDerived : SetupCallBase
+        {
+            [SetUp]
+            public override void Init()
+            {
+                setupCount++;
+                base.Init();
+            }
+            [Test]
+            public override void AssertCount()
+            {
+                Assert.AreEqual(2, setupCount);
+            }
+        }
+    }
 }
diff --git a/src/NUnitCore/tests/SimpleNameFilterTests.cs b/src/NUnitCore/tests/SimpleNameFilterTests.cs
index a3f3596..5c0571e 100644
--- a/src/NUnitCore/tests/SimpleNameFilterTests.cs
+++ b/src/NUnitCore/tests/SimpleNameFilterTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -10,6 +10,7 @@ using NUnit.Framework;
 using NUnit.Tests.Assemblies;
 using NUnit.Core.Builders;
 using NUnit.Core.Filters;
+using NUnit.Tests.Singletons;
 using NUnit.TestUtilities;
 
 namespace NUnit.Core.Tests
@@ -18,14 +19,14 @@ namespace NUnit.Core.Tests
     public class SimpleNameFilterTests
     {
         private TestSuite testSuite;
-        private NUnit.Core.TestCase mock3;
+        private Test mock3;
 
         [SetUp]
         public void SetUp()
         {
             testSuite = new TestSuite("Mock Test Suite");
             testSuite.Add(TestBuilder.MakeFixture(typeof(MockTestFixture)));
-            mock3 = (NUnit.Core.TestCase)TestFinder.Find("MockTest3", testSuite);
+            mock3 = TestFinder.Find("MockTest3", testSuite, true);
         }
 
         [Test]
@@ -42,7 +43,7 @@ namespace NUnit.Core.Tests
         [Test]
         public void MultipleNameMatch()
         {
-            NUnit.Core.TestCase mock1 = (NUnit.Core.TestCase)TestFinder.Find("MockTest1", testSuite);
+            Test mock1 = TestFinder.Find("MockTest1", testSuite, true);
             SimpleNameFilter filter = new SimpleNameFilter();
             filter.Add("NUnit.Tests.Assemblies.MockTestFixture.MockTest3");
             filter.Add("NUnit.Tests.Assemblies.MockTestFixture.MockTest1");
@@ -54,10 +55,10 @@ namespace NUnit.Core.Tests
         [Test]
         public void SuiteNameMatch()
         {
-            NUnit.Core.TestSuite mockTest = (NUnit.Core.TestSuite)TestFinder.Find("MockTestFixture", testSuite);
+            NUnit.Core.TestSuite mockTest = (NUnit.Core.TestSuite)TestFinder.Find("MockTestFixture", testSuite, true);
             SimpleNameFilter filter = new SimpleNameFilter("NUnit.Tests.Assemblies.MockTestFixture");
             Assert.IsTrue(filter.Pass(mock3), "Name Filter did not pass test case");
-            Assert.IsTrue(filter.Pass(mockTest), "Suite did not pass test case");
+            Assert.IsTrue(filter.Pass(mockTest), "Fixture did not pass test case");
             Assert.IsTrue(filter.Pass(testSuite), "Suite did not pass test case");
         }
 
@@ -72,17 +73,17 @@ namespace NUnit.Core.Tests
         [Test]
         public void HighLevelSuite()
         {
-            NUnit.Core.TestSuite mockTest = (NUnit.Core.TestSuite)TestFinder.Find("MockTestFixture", testSuite);
+            NUnit.Core.TestSuite mockTest = (NUnit.Core.TestSuite)TestFinder.Find("MockTestFixture", testSuite, true);
             SimpleNameFilter filter = new SimpleNameFilter("NUnit.Tests.Assemblies.MockTestFixture");
             Assert.AreEqual(true, filter.Pass(mock3), "test case");
-            Assert.AreEqual(true, filter.Pass(mockTest), "middle suite");
+            Assert.AreEqual(true, filter.Pass(mockTest), "fixture");
             Assert.AreEqual(true, filter.Pass(testSuite), "test suite");
         }
 
         [Test]
         public void ExplicitTestCaseDoesNotMatchWhenNotSelectedDirectly()
         {
-            NUnit.Core.TestCase explicitTest = (NUnit.Core.TestCase)TestFinder.Find("ExplicitlyRunTest", testSuite);
+            Test explicitTest = TestFinder.Find("ExplicitlyRunTest", testSuite, true);
             SimpleNameFilter filter = new SimpleNameFilter("Mock Test Suite");
             Assert.AreEqual(false, filter.Pass(explicitTest));
         }
@@ -90,7 +91,7 @@ namespace NUnit.Core.Tests
         [Test]
         public void ExplicitTestCaseMatchesWhenSelectedDirectly()
         {
-            NUnit.Core.TestCase explicitTest = (NUnit.Core.TestCase)TestFinder.Find("ExplicitlyRunTest", testSuite);
+            Test explicitTest = TestFinder.Find("ExplicitlyRunTest", testSuite, true);
             SimpleNameFilter filter = new SimpleNameFilter("NUnit.Tests.Assemblies.MockTestFixture.ExplicitlyRunTest");
             Assert.IsTrue(filter.Pass(explicitTest), "Name Filter did not pass on test case");
             Assert.IsTrue(filter.Pass(testSuite), "Name Filter did not pass on test suite");
@@ -99,7 +100,7 @@ namespace NUnit.Core.Tests
         [Test]
         public void ExplicitTestSuiteDoesNotMatchWhenNotSelectedDirectly()
         {
-            NUnit.Core.TestSuite mockTest = (NUnit.Core.TestSuite)TestFinder.Find("MockTestFixture", testSuite);
+            NUnit.Core.TestSuite mockTest = (NUnit.Core.TestSuite)TestFinder.Find("MockTestFixture", testSuite, true);
 			mockTest.RunState = RunState.Explicit;
             SimpleNameFilter filter = new SimpleNameFilter("Mock Test Suite");
             Assert.AreEqual(false, filter.Pass(mock3), "descendant of explicit suite should not match");
@@ -109,7 +110,7 @@ namespace NUnit.Core.Tests
         [Test]
         public void ExplicitTestSuiteMatchesWhenSelectedDirectly()
         {
-            NUnit.Core.TestSuite mockTest = (NUnit.Core.TestSuite)TestFinder.Find("MockTestFixture", testSuite);
+            NUnit.Core.TestSuite mockTest = (NUnit.Core.TestSuite)TestFinder.Find("MockTestFixture", testSuite, true);
 			mockTest.RunState = RunState.Explicit;
             SimpleNameFilter filter = new SimpleNameFilter("NUnit.Tests.Assemblies.MockTestFixture");
             Assert.AreEqual(true, filter.Pass(mock3), "test case");
diff --git a/src/NUnitCore/tests/SimpleTestRunnerTests.cs b/src/NUnitCore/tests/SimpleTestRunnerTests.cs
index 581e36c..f403f93 100644
--- a/src/NUnitCore/tests/SimpleTestRunnerTests.cs
+++ b/src/NUnitCore/tests/SimpleTestRunnerTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitCore/tests/StackOverflowTestFixture.cs b/src/NUnitCore/tests/StackOverflowTestFixture.cs
index 8b8db77..f6f5793 100644
--- a/src/NUnitCore/tests/StackOverflowTestFixture.cs
+++ b/src/NUnitCore/tests/StackOverflowTestFixture.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -13,7 +13,7 @@ namespace NUnit.Core.Tests
 	/// <summary>
 	/// Summary description for StackOverflowTestFixture.
 	/// </summary>
-	[TestFixture, Platform(Exclude="Net-2.0,linux",Reason="Cannot handle StackOverflowException in managed code")]
+	[TestFixture, Platform(Exclude="Net-2.0,Net-4.0,Mono",Reason="Cannot handle StackOverflowException in managed code")]
 	public class StackOverflowTestFixture
 	{
 		private void FunctionCallsSelf()
diff --git a/src/NUnitCore/tests/SuiteBuilderTests.cs b/src/NUnitCore/tests/SuiteBuilderTests.cs
index 7aee25b..7630aa5 100644
--- a/src/NUnitCore/tests/SuiteBuilderTests.cs
+++ b/src/NUnitCore/tests/SuiteBuilderTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -9,22 +9,22 @@ using System.IO;
 using NUnit.Framework;
 using NUnit.Core;
 using NUnit.TestUtilities;
-using NUnit.TestData.SuiteBuilderTests;
 
 namespace NUnit.Core.Tests
 {
 	[TestFixture]
 	public class SuiteBuilderTests
 	{
-		private string testsDll = "nunit.core.tests.dll";
-		private string testData = "test-assembly.dll";
-		private string tempFile = "x.dll";
+        private string testsDll = AssemblyHelper.GetAssemblyPath(typeof(SuiteBuilderTests));
+		private string testData = AssemblyHelper.GetAssemblyPath(typeof(NUnit.TestData.EmptyFixture));
+		private string tempFile;
 		private TestSuiteBuilder builder;
 
 		[SetUp]
 		public void CreateBuilder()
 		{
 			builder = new TestSuiteBuilder();
+            tempFile = Path.ChangeExtension(Path.GetTempFileName(), ".dll");
 		}
 		[TearDown]
 		public void TearDown()
@@ -50,7 +50,7 @@ namespace NUnit.Core.Tests
 			Test suite = builder.Build( package );
 			Assert.IsNotNull(suite, "Unable to build suite" );
 			Assert.Greater( suite.Tests.Count, 1 );
-			Assert.AreEqual( "Test Fixture", ((ITest)suite.Tests[0]).TestType );
+			Assert.AreEqual( "TestFixture", ((ITest)suite.Tests[0]).TestType );
 		}
 
 		[Test]
@@ -87,7 +87,7 @@ namespace NUnit.Core.Tests
 		public void DiscoverSuite()
 		{
 			TestPackage package = new TestPackage( testData );
-			package.TestName = "NUnit.TestData.SuiteBuilderTests.Suite";
+			package.TestName = "NUnit.TestData.LegacySuiteData.Suite";
 			Test suite = builder.Build( package );
 			Assert.IsNotNull(suite, "Could not discover suite attribute");
 		}
@@ -96,16 +96,17 @@ namespace NUnit.Core.Tests
 		public void WrongReturnTypeSuite()
 		{
 			TestPackage package = new TestPackage( testData );
-			package.TestName = "NUnit.TestData.SuiteBuilderTests.NonConformingSuite";
+			package.TestName = "NUnit.TestData.LegacySuiteData.NonConformingSuite";
 			Test suite = builder.Build( package );
 			Assert.AreEqual(RunState.NotRunnable, suite.RunState);
+            Assert.AreEqual("Suite property must return either TestSuite or IEnumerable", suite.IgnoreReason);
 		}
 
 		[Test]
 		[ExpectedException(typeof(FileNotFoundException))]
 		public void FileNotFound()
 		{
-			builder.Build( new TestPackage( "xxxx.dll" ) );
+			builder.Build( new TestPackage( "/xxxx.dll" ) );
 		}
 
 		// Gives FileNotFoundException on Mono
diff --git a/src/NUnitCore/tests/SuiteBuilderTests_Multiple.cs b/src/NUnitCore/tests/SuiteBuilderTests_Multiple.cs
index e22cf8e..6574871 100644
--- a/src/NUnitCore/tests/SuiteBuilderTests_Multiple.cs
+++ b/src/NUnitCore/tests/SuiteBuilderTests_Multiple.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -19,8 +19,10 @@ namespace NUnit.Core.Tests
 		private static readonly int totalTests = NoNamespaceTestFixture.Tests + MockAssembly.Tests;
 
 		private TestSuiteBuilder builder;
-		private static string[] assemblies = new string[]
-			{ "nonamespace-assembly.dll", "mock-assembly.dll" };
+		private static string[] assemblies = new string[] {
+            NoNamespaceTestFixture.AssemblyPath,
+            MockAssembly.AssemblyPath
+        };
 		private Test loadedSuite;
 
 		[SetUp]
diff --git a/src/NUnitCore/tests/TestAssemblyBuilderTests.cs b/src/NUnitCore/tests/TestAssemblyBuilderTests.cs
index 8bae978..69b7428 100644
--- a/src/NUnitCore/tests/TestAssemblyBuilderTests.cs
+++ b/src/NUnitCore/tests/TestAssemblyBuilderTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -11,33 +11,36 @@ using NUnit.Core.Builders;
 
 namespace NUnit.Core.Tests
 {
-	[TestFixture]
-	public class TestAssemblyBuilderTests
-	{
-		[Test]
-		public void CanLoadAssemblyInCurrentDirectory()
-		{
-			TestAssemblyBuilder builder = new TestAssemblyBuilder();
-			Assert.IsNotNull( builder.Build( "mock-assembly.dll", false ) );
-		}
+    // It's no longer possible to load assemblies at a relative
+    // location to the current directory.
+    // TODO: Create other tests
+	//[TestFixture]
+    //public class TestAssemblyBuilderTests
+    //{
+    //    [Test]
+    //    public void CanLoadAssemblyInCurrentDirectory()
+    //    {
+    //        TestAssemblyBuilder builder = new TestAssemblyBuilder();
+    //        Assert.IsNotNull( builder.Build( "mock-assembly.dll", false ) );
+    //    }
 
-		[Test]
-		public void CanLoadAssemblyAtRelativeDirectoryLocation()
-		{
-			DirectoryInfo current = new DirectoryInfo( Environment.CurrentDirectory );
-			string dir = current.Name;
-			string parentDir = current.Parent.FullName;
+    //    [Test]
+    //    public void CanLoadAssemblyAtRelativeDirectoryLocation()
+    //    {
+    //        DirectoryInfo current = new DirectoryInfo( Environment.CurrentDirectory );
+    //        string dir = current.Name;
+    //        string parentDir = current.Parent.FullName;
 
-			try
-			{
-				Environment.CurrentDirectory = parentDir;
-				TestAssemblyBuilder builder = new TestAssemblyBuilder();
-				Assert.IsNotNull( builder.Build( dir + Path.DirectorySeparatorChar + "mock-assembly.dll", false ) );
-			}
-			finally
-			{
-				Environment.CurrentDirectory = current.FullName;
-			}
-		}
-	}
+    //        try
+    //        {
+    //            Environment.CurrentDirectory = parentDir;
+    //            TestAssemblyBuilder builder = new TestAssemblyBuilder();
+    //            Assert.IsNotNull( builder.Build( dir + Path.DirectorySeparatorChar + "mock-assembly.dll", false ) );
+    //        }
+    //        finally
+    //        {
+    //            Environment.CurrentDirectory = current.FullName;
+    //        }
+    //    }
+	//}
 }
diff --git a/src/NUnitCore/tests/TestCaseAttributeTests.cs b/src/NUnitCore/tests/TestCaseAttributeTests.cs
new file mode 100644
index 0000000..375ab47
--- /dev/null
+++ b/src/NUnitCore/tests/TestCaseAttributeTests.cs
@@ -0,0 +1,278 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using NUnit.Util;
+using NUnit.TestData;
+using NUnit.TestUtilities;
+using System.Collections;
+
+namespace NUnit.Core.Tests
+{
+    [TestFixture]
+    public class TestCaseAttributeTests
+    {
+        [TestCase(12, 3, 4)]
+        [TestCase(12, 2, 6)]
+        [TestCase(12, 4, 3)]
+        [TestCase(12, 0, 0, ExpectedException = typeof(System.DivideByZeroException))]
+        [TestCase(12, 0, 0, ExpectedExceptionName = "System.DivideByZeroException")]
+        public void IntegerDivisionWithResultPassedToTest(int n, int d, int q)
+        {
+            Assert.AreEqual(q, n / d);
+        }
+
+        [TestCase(12, 3, Result = 4)]
+        [TestCase(12, 2, Result = 6)]
+        [TestCase(12, 4, Result = 3)]
+        [TestCase(12, 0, ExpectedException = typeof(System.DivideByZeroException))]
+        [TestCase(12, 0, ExpectedExceptionName = "System.DivideByZeroException",
+            TestName = "DivisionByZeroThrowsException")]
+        public int IntegerDivisionWithResultCheckedByNUnit(int n, int d)
+        {
+            return n / d;
+        }
+
+        [TestCase(2, 2, Result=4)]
+        public double CanConvertIntToDouble(double x, double y)
+        {
+            return x + y;
+        }
+
+        [TestCase("2.2", "3.3", Result = 5.5)]
+        public decimal CanConvertStringToDecimal(decimal x, decimal y)
+        {
+            return x + y;
+        }
+
+        [TestCase(2.2, 3.3, Result = 5.5)]
+        public decimal CanConvertDoubleToDecimal(decimal x, decimal y)
+        {
+            return x + y;
+        }
+
+        [TestCase(5, 2, Result = 7)]
+        public decimal CanConvertIntToDecimal(decimal x, decimal y)
+        {
+            return x + y;
+        }
+
+        [TestCase(5, 2, Result = 7)]
+        public short CanConvertSmallIntsToShort(short x, short y)
+        {
+            return (short)(x + y);
+        }
+
+        [TestCase(5, 2, Result = 7)]
+        public byte CanConvertSmallIntsToByte(byte x, byte y)
+        {
+            return (byte)(x + y);
+        }
+
+        [TestCase(5, 2, Result = 7)]
+        public sbyte CanConvertSmallIntsToSByte(sbyte x, sbyte y)
+        {
+            return (sbyte)(x + y);
+        }
+
+#if NET_2_0
+        [TestCase(Result = null)]
+        public object ExpectedResultCanBeNull()
+        {
+            return null;
+        }
+#endif
+
+        [Test]
+		public void ConversionOverflowMakesTestNonRunnable()
+		{
+			Test test = (Test)TestBuilder.MakeTestCase(
+				typeof(TestCaseAttributeFixture), "MethodCausesConversionOverflow").Tests[0];
+			Assert.AreEqual(RunState.NotRunnable, test.RunState);
+		}
+
+        [TestCase("ABCD\u0019"), Explicit("For display purposes only")]
+        public void UnicodeCharInStringArgument(string arg)
+        {
+        }
+
+        [TestCase("12-October-1942")]
+        public void CanConvertStringToDateTime(DateTime dt)
+        {
+            Assert.AreEqual(1942, dt.Year);
+        }
+
+        [TestCase(42, ExpectedException = typeof(System.Exception),
+                   ExpectedMessage = "Test Exception")]
+        public void CanSpecifyExceptionMessage(int a)
+        {
+            throw new System.Exception("Test Exception");
+        }
+
+        [TestCase(42, ExpectedException = typeof(System.Exception),
+           ExpectedMessage = "Test Exception",
+           MatchType=MessageMatch.StartsWith)]
+        public void CanSpecifyExceptionMessageAndMatchType(int a)
+        {
+            throw new System.Exception("Test Exception thrown here");
+        }
+
+
+#if NET_2_0
+        [TestCase(null, null)]
+        public void CanPassNullAsArgument(object a, string b)
+        {
+            Assert.IsNull(a);
+            Assert.IsNull(b);
+        }
+
+        [TestCase(null)]
+        public void CanPassNullAsSoleArgument(object a)
+        {
+            Assert.IsNull(a);
+        }
+#endif
+
+        [TestCase(new object[] { 1, "two", 3.0 })]
+        [TestCase(new object[] { "zip" })]
+        public void CanPassObjectArrayAsFirstArgument(object[] a)
+        {
+        }
+  
+        [TestCase(new object[] { "a", "b" })]
+        public void CanPassArrayAsArgument(object[] array)
+        {
+            Assert.AreEqual("a", array[0]);
+            Assert.AreEqual("b", array[1]);
+        }
+
+        [TestCase("a", "b")]
+        public void ArgumentsAreCoalescedInObjectArray(object[] array)
+        {
+            Assert.AreEqual("a", array[0]);
+            Assert.AreEqual("b", array[1]);
+        }
+
+        [TestCase(1, "b")]
+        public void ArgumentsOfDifferentTypeAreCoalescedInObjectArray(object[] array)
+        {
+            Assert.AreEqual(1, array[0]);
+            Assert.AreEqual("b", array[1]);
+        }
+
+        [TestCase("a", "b")]
+        public void HandlesParamsArrayAsSoleArgument(params object[] array)
+        {
+            Assert.AreEqual("a", array[0]);
+            Assert.AreEqual("b", array[1]);
+        }
+
+        [TestCase("a", "b", "c", "d")]
+        public void HandlesParamsArrayAsLastArgument(string s1, string s2, params object[] array)
+        {
+            Assert.AreEqual("a", s1);
+            Assert.AreEqual("b", s2);
+            Assert.AreEqual("c", array[0]);
+            Assert.AreEqual("d", array[1]);
+        }
+
+        [Test]
+        public void CanSpecifyDescription()
+        {
+			Test test = (Test)TestBuilder.MakeTestCase(
+				typeof(TestCaseAttributeFixture), "MethodHasDescriptionSpecified").Tests[0];
+			Assert.AreEqual("My Description", test.Description);
+		}
+
+        [Test]
+        public void CanSpecifyTestName()
+        {
+            Test test = (Test)TestBuilder.MakeTestCase(
+                typeof(TestCaseAttributeFixture), "MethodHasTestNameSpecified").Tests[0];
+            Assert.AreEqual("XYZ", test.TestName.Name);
+            Assert.AreEqual("NUnit.TestData.TestCaseAttributeFixture.XYZ", test.TestName.FullName);
+        }
+
+        [Test]
+        public void CanSpecifyCategory()
+        {
+            Test test = (Test)TestBuilder.MakeTestCase(
+                typeof(TestCaseAttributeFixture), "MethodHasSingleCategory").Tests[0];
+            Assert.AreEqual(new string[] { "XYZ" }, test.Categories);
+        }
+
+        [Test]
+        public void CanSpecifyMultipleCategories()
+        {
+            Test test = (Test)TestBuilder.MakeTestCase(
+                typeof(TestCaseAttributeFixture), "MethodHasMultipleCategories").Tests[0];
+            Assert.AreEqual(new string[] { "X", "Y", "Z" }, test.Categories);
+        }
+
+        [Test]
+        public void CanSpecifyExpectedException()
+        {
+            Test test = (Test)TestBuilder.MakeTestCase(
+                typeof(TestCaseAttributeFixture), "MethodThrowsExpectedException").Tests[0];
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            Assert.AreEqual(ResultState.Success, result.ResultState);
+        }
+
+        [Test]
+        public void CanSpecifyExpectedException_WrongException()
+        {
+            Test test = (Test)TestBuilder.MakeTestCase(
+                typeof(TestCaseAttributeFixture), "MethodThrowsWrongException").Tests[0];
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            Assert.AreEqual(ResultState.Failure, result.ResultState);
+            StringAssert.StartsWith("An unexpected exception type was thrown", result.Message);
+        }
+
+        [Test]
+        public void CanSpecifyExpectedException_WrongMessage()
+        {
+            Test test = (Test)TestBuilder.MakeTestCase(
+                typeof(TestCaseAttributeFixture), "MethodThrowsExpectedExceptionWithWrongMessage").Tests[0];
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            Assert.AreEqual(ResultState.Failure, result.ResultState);
+            StringAssert.StartsWith("The exception message text was incorrect", result.Message);
+        }
+
+        [Test]
+        public void CanSpecifyExpectedException_NoneThrown()
+        {
+            Test test = (Test)TestBuilder.MakeTestCase(
+                typeof(TestCaseAttributeFixture), "MethodThrowsNoException").Tests[0];
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            Assert.AreEqual(ResultState.Failure, result.ResultState);
+            Assert.AreEqual("System.ArgumentNullException was expected", result.Message);
+        }
+
+        [Test]
+        public void IgnoreTakesPrecedenceOverExpectedException()
+        {
+            Test test = (Test)TestBuilder.MakeTestCase(
+                typeof(TestCaseAttributeFixture), "MethodCallsIgnore").Tests[0];
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            Assert.AreEqual(ResultState.Ignored, result.ResultState);
+            Assert.AreEqual("Ignore this", result.Message);
+        }
+
+        [Test]
+        public void CanIgnoreIndividualTestCase()
+        {
+            Test test = TestBuilder.MakeTestCase(
+                typeof(TestCaseAttributeFixture), "MethodWithIgnoredTestCases");
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+
+            ResultSummarizer summary = new ResultSummarizer(result);
+            Assert.AreEqual(3, summary.ResultCount);
+            Assert.AreEqual(2, summary.Ignored);
+            Assert.That(result.Results, Has.Some.Message.EqualTo("Don't Run Me!"));
+        }
+    }
+}
diff --git a/src/NUnitCore/tests/TestCaseResultFixture.cs b/src/NUnitCore/tests/TestCaseResultFixture.cs
index c413610..125f4e1 100644
--- a/src/NUnitCore/tests/TestCaseResultFixture.cs
+++ b/src/NUnitCore/tests/TestCaseResultFixture.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 namespace NUnit.Core.Tests
@@ -9,6 +9,7 @@ namespace NUnit.Core.Tests
 	using System;
 	using NUnit.Framework;	
 	using NUnit.Core;
+	using NUnit.TestUtilities;
 
 	/// <summary>
 	/// Summary description for TestResultTests.
@@ -16,18 +17,20 @@ namespace NUnit.Core.Tests
 	[TestFixture]
 	public class TestCaseResultFixture
 	{
-		private TestCaseResult caseResult;
+		private TestResult caseResult;
 
 		[SetUp]
 		public void SetUp()
 		{
-			caseResult = new TestCaseResult("test case result");
+			caseResult = new TestResult( new TestInfo(new NUnitTestMethod(Reflect.GetNamedMethod( this.GetType(), "DummyMethod" ) ) ) );
 		}
+
+		public void DummyMethod() { }
 		
 		[Test]
 		public void TestCaseDefault()
 		{
-			Assert.AreEqual( RunState.Runnable, caseResult.RunState );
+			Assert.AreEqual( ResultState.Inconclusive, caseResult.ResultState );
 		}
 
 		[Test]
diff --git a/src/NUnitCore/tests/TestCaseSourceTests.cs b/src/NUnitCore/tests/TestCaseSourceTests.cs
new file mode 100644
index 0000000..809648f
--- /dev/null
+++ b/src/NUnitCore/tests/TestCaseSourceTests.cs
@@ -0,0 +1,331 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using NUnit.Framework;
+using NUnit.Util;
+using NUnit.TestData;
+using NUnit.TestUtilities;
+using System.Collections;
+
+namespace NUnit.Core.Tests
+{
+    [TestFixture]
+    public class TestCaseSourceTests
+    {
+        [Test, TestCaseSource("StaticProperty")]
+        public void SourceCanBeStaticProperty(string source)
+        {
+            Assert.AreEqual("StaticProperty", source);
+        }
+
+        static IEnumerable StaticProperty
+        {
+            get { return new object[] { new object[] { "StaticProperty" } }; }
+        }
+
+        [Test, TestCaseSource("InstanceProperty")]
+        public void SourceCanBeInstanceProperty(string source)
+        {
+            Assert.AreEqual("InstanceProperty", source);
+        }
+
+        IEnumerable InstanceProperty
+        {
+            get { return new object[] { new object[] { "InstanceProperty" } }; }
+        }
+
+        [Test, TestCaseSource("StaticMethod")]
+        public void SourceCanBeStaticMethod(string source)
+        {
+            Assert.AreEqual("StaticMethod", source);
+        }
+
+        static IEnumerable StaticMethod()
+        {
+            return new object[] { new object[] { "StaticMethod" } };
+        }
+
+        [Test, TestCaseSource("InstanceMethod")]
+        public void SourceCanBeInstanceMethod(string source)
+        {
+            Assert.AreEqual("InstanceMethod", source);
+        }
+
+        IEnumerable InstanceMethod()
+        {
+            return new object[] { new object[] { "InstanceMethod" } };
+        }
+
+        [Test, TestCaseSource("StaticField")]
+        public void SourceCanBeStaticField(string source)
+        {
+            Assert.AreEqual("StaticField", source);
+        }
+
+        internal static object[] StaticField =
+            { new object[] { "StaticField" } };
+
+        [Test, TestCaseSource("InstanceField")]
+        public void SourceCanBeInstanceField(string source)
+        {
+            Assert.AreEqual("InstanceField", source);
+        }
+
+        internal static object[] InstanceField =
+            { new object[] { "InstanceField" } };
+
+        [Test, TestCaseSource("CheckCurrentDirectory")]
+        public void SourceIsInvokedWithCorrectCurrentDirectory(bool isOK)
+        {
+            Assert.That(isOK);
+        }
+
+        [Test, TestCaseSource("MyData")]
+        public void SourceMayReturnArgumentsAsObjectArray(int n, int d, int q)
+        {
+            Assert.AreEqual(q, n / d);
+        }
+
+        [TestCaseSource("MyData")]
+        public void TestAttributeIsOptional(int n, int d, int q)
+        {
+            Assert.AreEqual(q, n / d);
+        }
+
+        [Test, TestCaseSource("MyIntData")]
+        public void SourceMayReturnArgumentsAsIntArray(int n, int d, int q)
+        {
+            Assert.AreEqual(q, n / d);
+        }
+
+        [Test, TestCaseSource("EvenNumbers")]
+        public void SourceMayReturnSinglePrimitiveArgumentAlone(int n)
+        {
+            Assert.AreEqual(0, n % 2);
+        }
+
+        [Test, TestCaseSource("Params")]
+        public int SourceMayReturnArgumentsAsParamSet(int n, int d)
+        {
+            return n / d;
+        }
+
+        [Test]
+        [TestCaseSource("MyData")]
+        [TestCaseSource("MoreData")]
+        [TestCase(12, 0, 0, ExpectedException = typeof(System.DivideByZeroException))]
+        public void TestMayUseMultipleSourceAttributes(int n, int d, int q)
+        {
+            Assert.AreEqual(q, n / d);
+        }
+
+        [Test, TestCaseSource("FourArgs")]
+        public void TestWithFourArguments(int n, int d, int q, int r)
+        {
+            Assert.AreEqual(q, n / d);
+            Assert.AreEqual(r, n % d);
+        }
+
+        [Test, Category("Top"), TestCaseSource(typeof(DivideDataProvider), "HereIsTheData")]
+        public void SourceMayBeInAnotherClass(int n, int d, int q)
+        {
+            Assert.AreEqual(q, n / d);
+        }
+
+        [Test, TestCaseSource(typeof(DivideDataProviderWithReturnValue), "TestCases")]
+        public int SourceMayBeInAnotherClassWithReturn(int n, int d)
+        {
+            return n / d;
+        }
+
+        [TestCaseSource("ExpectNull")]
+        public object ExpectedResultCanBeNull()
+        {
+            return null;
+        }
+
+        [Test]
+        public void CanSpecifyExpectedException()
+        {
+            Test test = (Test)TestBuilder.MakeTestCase(
+                typeof(TestCaseSourceAttributeFixture), "MethodThrowsExpectedException").Tests[0];
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            Assert.AreEqual(ResultState.Success, result.ResultState);
+        }
+
+        [Test]
+        public void CanSpecifyExpectedException_WrongException()
+        {
+            Test test = (Test)TestBuilder.MakeTestCase(
+                typeof(TestCaseSourceAttributeFixture), "MethodThrowsWrongException").Tests[0];
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            Assert.AreEqual(ResultState.Failure, result.ResultState);
+            StringAssert.StartsWith("An unexpected exception type was thrown", result.Message);
+        }
+
+        [Test]
+        public void CanSpecifyExpectedException_NoneThrown()
+        {
+            Test test = (Test)TestBuilder.MakeTestCase(
+                typeof(TestCaseSourceAttributeFixture), "MethodThrowsNoException").Tests[0];
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            Assert.AreEqual(ResultState.Failure, result.ResultState);
+            Assert.AreEqual("System.ArgumentNullException was expected", result.Message);
+        }
+
+        [Test]
+        public void IgnoreTakesPrecedenceOverExpectedException()
+        {
+            Test test = (Test)TestBuilder.MakeTestCase(
+                typeof(TestCaseSourceAttributeFixture), "MethodCallsIgnore").Tests[0];
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            Assert.AreEqual(ResultState.Ignored, result.ResultState);
+            Assert.AreEqual("Ignore this", result.Message);
+        }
+
+        [Test]
+        public void CanIgnoreIndividualTestCases()
+        {
+            Test test = TestBuilder.MakeTestCase(
+                typeof(TestCaseSourceAttributeFixture), "MethodWithIgnoredTestCases");
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+
+            ResultSummarizer summary = new ResultSummarizer(result);
+            Assert.AreEqual( 3, summary.ResultCount );
+            Assert.AreEqual( 2, summary.Ignored );
+            Assert.AreEqual( "Don't Run Me!", ((TestResult)result.Results[2]).Message );
+        }
+
+        [Test]
+        public void HandlesExceptionInTestCaseSource()
+        {
+            Test test = (Test)TestBuilder.MakeTestCase(
+                typeof(TestCaseSourceAttributeFixture), "MethodWithSourceThrowingException").Tests[0];
+            Assert.AreEqual(RunState.NotRunnable, test.RunState);
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            Assert.AreEqual(ResultState.NotRunnable, result.ResultState);
+            Assert.AreEqual("System.Exception : my message", result.Message);
+        }
+
+        [TestCaseSource("exception_source"), Explicit]
+        public void HandlesExceptioninTestCaseSource_GuiDisplay(string lhs, string rhs)
+        {
+            Assert.AreEqual(lhs, rhs);
+        }
+
+        internal object[] testCases =
+        {
+            new TestCaseData(
+                new string[] { "A" },
+                new string[] { "B" })
+        };
+
+        [Test, TestCaseSource("testCases")]
+        public void MethodTakingTwoStringArrays(string[] a, string[] b)
+        {
+            Assert.That(a, Is.TypeOf(typeof(string[])));
+            Assert.That(b, Is.TypeOf(typeof(string[])));
+        }
+
+        #region Sources used by the tests
+        internal static object[] MyData = new object[] {
+            new object[] { 12, 3, 4 },
+            new object[] { 12, 4, 3 },
+            new object[] { 12, 6, 2 } };
+
+        internal static object[] MyIntData = new object[] {
+            new int[] { 12, 3, 4 },
+            new int[] { 12, 4, 3 },
+            new int[] { 12, 6, 2 } };
+
+        internal static object[] FourArgs = new object[] {
+            new TestCaseData( 12, 3, 4, 0 ),
+            new TestCaseData( 12, 4, 3, 0 ),
+            new TestCaseData( 12, 5, 2, 2 ) };
+
+        internal static int[] EvenNumbers = new int[] { 2, 4, 6, 8 };
+
+        internal static object[] ExpectNull = new object[] {
+            new TestCaseData().Returns(null) };
+
+        private static IEnumerable CheckCurrentDirectory
+        {
+            get
+            {
+                return new object[] { new object[] { System.IO.File.Exists("nunit.core.tests.dll") } };
+            }
+        }
+
+        internal static object[] MoreData = new object[] {
+            new object[] { 12, 1, 12 },
+            new object[] { 12, 2, 6 } };
+
+        internal static object[] Params = new object[] {
+            new TestCaseData(24, 3).Returns(8),
+            new TestCaseData(24, 2).Returns(12) };
+
+        private class DivideDataProvider
+        {
+            public static IEnumerable HereIsTheData
+            {
+                get
+                {
+#if NET_2_0
+                    yield return new TestCaseData(0, 0, 0)
+                        .SetName("ThisOneShouldThrow")
+                        .SetDescription("Demonstrates use of ExpectedException")
+                        .SetCategory("Junk")
+                        .SetProperty("MyProp", "zip")
+                        .Throws(typeof(System.DivideByZeroException));
+                    yield return new object[] { 100, 20, 5 };
+                    yield return new object[] { 100, 4, 25 };
+#else
+                    ArrayList list = new ArrayList();
+                    list.Add(
+                        new TestCaseData( 0, 0, 0)
+                            .SetName("ThisOneShouldThrow")
+                            .SetDescription("Demonstrates use of ExpectedException")
+							.SetCategory("Junk")
+							.SetProperty("MyProp", "zip")
+							.Throws( typeof (System.DivideByZeroException) ));
+                    list.Add(new object[] { 100, 20, 5 });
+                    list.Add(new object[] {100, 4, 25});
+                    return list;
+#endif
+                }
+            }
+        }
+
+        public class DivideDataProviderWithReturnValue
+        {
+            public static IEnumerable TestCases
+            {
+                get
+                {
+                    return new object[] {
+                        new TestCaseData(12, 3).Returns(5).Throws(typeof(AssertionException)).SetName("TC1"),
+                        new TestCaseData(12, 2).Returns(6).SetName("TC2"),
+                        new TestCaseData(12, 4).Returns(3).SetName("TC3")
+                    };
+                }
+            }
+        }
+
+        private static IEnumerable exception_source
+        {
+            get
+            {
+#if NET_2_0
+                yield return new TestCaseData("a", "a");
+                yield return new TestCaseData("b", "b");
+#endif
+
+                throw new System.Exception("my message");
+            }
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/tests/TestCaseTest.cs b/src/NUnitCore/tests/TestCaseTest.cs
index 12d694d..2254bbf 100644
--- a/src/NUnitCore/tests/TestCaseTest.cs
+++ b/src/NUnitCore/tests/TestCaseTest.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -25,7 +25,7 @@ namespace NUnit.Core.Tests
 		public void CreateIgnoredTestCase()
 		{
 			Type fixtureType = typeof(MockTestFixture);
-			TestCase testCase = TestBuilder.MakeTestCase( fixtureType, "MockTest4" );
+			Test testCase = TestBuilder.MakeTestCase( fixtureType, "MockTest4" );
 			Assert.AreEqual(1, testCase.TestCount);
 			Assert.AreEqual( RunState.Ignored, testCase.RunState );
 			Assert.AreEqual("ignoring this test method for now", testCase.IgnoreReason);
@@ -35,12 +35,12 @@ namespace NUnit.Core.Tests
 		public void RunIgnoredTestCase()
 		{
 			Type fixtureType = typeof(MockTestFixture);
-			TestCase testCase = TestBuilder.MakeTestCase( fixtureType, "MockTest4" );
+			Test testCase = TestBuilder.MakeTestCase( fixtureType, "MockTest4" );
 			Assert.AreEqual(1, testCase.TestCount);
-			
-			TestResult result = testCase.Run(NullListener.NULL);
+
+            TestResult result = testCase.Run(NullListener.NULL, TestFilter.Empty);
 			ResultSummarizer summarizer = new ResultSummarizer(result);
-			Assert.AreEqual(0, summarizer.ResultCount);
+			Assert.AreEqual(0, summarizer.TestsRun);
 			Assert.AreEqual(1, summarizer.TestsNotRun);
 		}
 
@@ -48,7 +48,7 @@ namespace NUnit.Core.Tests
 		public void LoadMethodCategories() 
 		{
 			Type fixtureType = typeof(HasCategories);
-			TestCase testCase = TestBuilder.MakeTestCase( fixtureType, "ATest" );
+			Test testCase = TestBuilder.MakeTestCase( fixtureType, "ATest" );
 			Assert.IsNotNull(testCase);
 			Assert.IsNotNull(testCase.Categories);
 			Assert.AreEqual(2, testCase.Categories.Count);
diff --git a/src/NUnitCore/tests/TestConsole.cs b/src/NUnitCore/tests/TestConsole.cs
index f263733..37dea1a 100644
--- a/src/NUnitCore/tests/TestConsole.cs
+++ b/src/NUnitCore/tests/TestConsole.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -42,7 +42,7 @@ namespace NUnit.Core.Tests
 		}
 
 		[Serializable] 
-			public class TestSerialisable
+		public class TestSerialisable
 		{
 			override public string ToString()
 			{
diff --git a/src/NUnitCore/tests/TestContextTests.cs b/src/NUnitCore/tests/TestContextTests.cs
index ef90816..26b0294 100644
--- a/src/NUnitCore/tests/TestContextTests.cs
+++ b/src/NUnitCore/tests/TestContextTests.cs
@@ -1,72 +1,86 @@
-using System;
-using System.Threading;
-using System.Globalization;
+using System;
+using System.IO;
 using NUnit.Framework;
+using NUnit.TestData.TestContextData;
+using NUnit.TestUtilities;
 
 namespace NUnit.Core.Tests
 {
-	/// <summary>
-	/// Summary description for TestContextTests.
-	/// </summary>
-	[TestFixture]
-	public class TestContextTests
-	{
-		string currentDirectory;
-		CultureInfo currentCulture;
+    [TestFixture]
+    public class TestContextTests
+    {
+        [Test]
+        public void TestCanAccessItsOwnName()
+        {
+            Assert.That(TestContext.CurrentContext.Test.Name, Is.EqualTo("TestCanAccessItsOwnName"));
+        }
 
-		/// <summary>
-		/// Since we are testing the mechanism that saves and
-		/// restores contexts, we save manually here
-		/// </summary>
-		[SetUp]
-		public void SaveContext()
-		{
-			currentDirectory = Environment.CurrentDirectory;
-			currentCulture = CultureInfo.CurrentCulture;
-		}
+        [Test]
+        public void TestCanAccessItsOwnFullName()
+        {
+            Assert.That(TestContext.CurrentContext.Test.FullName,
+                Is.EqualTo("NUnit.Core.Tests.TestContextTests.TestCanAccessItsOwnFullName"));
+        }
 
-		[TearDown]
-		public void RestoreContext()
-		{
-			Environment.CurrentDirectory = currentDirectory;
-			Thread.CurrentThread.CurrentCulture = currentCulture;
-		}
+        [Test]
+        [Property("Answer", 42)]
+        public void TestCanAccessItsOwnProperties()
+        {
+            Assert.That(TestContext.CurrentContext.Test.Properties["Answer"], Is.EqualTo(42));
+        }
 
-		[Test]
-		public void SetAndRestoreCurrentDirectory()
-		{
-			Assert.AreEqual( currentDirectory, TestContext.CurrentDirectory, "Directory not in initial context" );
-			
-			using ( new TestContext() )
-			{
-				string otherDirectory = System.IO.Path.GetTempPath();
-				if( otherDirectory[otherDirectory.Length-1] == System.IO.Path.DirectorySeparatorChar )
-					otherDirectory = otherDirectory.Substring(0, otherDirectory.Length-1);
-				TestContext.CurrentDirectory = otherDirectory;
-				Assert.AreEqual( otherDirectory, Environment.CurrentDirectory, "Directory was not set" );
-				Assert.AreEqual( otherDirectory, TestContext.CurrentDirectory, "Directory not in new context" );
-			}
+        [Test]
+        public void TestCanAccessTestDirectory()
+        {
+            string testDirectory = TestContext.CurrentContext.TestDirectory;
+            Assert.NotNull(testDirectory);
+            Assert.That(Directory.Exists(testDirectory));
+            Assert.That(File.Exists(Path.Combine(testDirectory, "nunit.core.tests.dll")));
+        }
 
-			Assert.AreEqual( currentDirectory, Environment.CurrentDirectory, "Directory was not restored" );
-			Assert.AreEqual( currentDirectory, TestContext.CurrentDirectory, "Directory not in final context" );
-		}
+        [Test]
+        public void TestCanAccessTestState_PassingTest()
+        {
+            TestStateRecordingFixture fixture = new TestStateRecordingFixture();
+            TestBuilder.RunTestFixture(fixture);
+            Assert.That(fixture.stateList, Is.EqualTo("Inconclusive=>Inconclusive=>Success"));
+            Assert.That(fixture.statusList, Is.EqualTo("Inconclusive=>Inconclusive=>Passed"));
+        }
 
-		[Test]
-		public void SetAndRestoreCurrentCulture()
-		{
-			Assert.AreEqual( currentCulture, TestContext.CurrentCulture, "Culture not in initial context" );
-			
-			using ( new TestContext() )
-			{
-				CultureInfo otherCulture =
-					new CultureInfo( currentCulture.Name == "fr-FR" ? "en-GB" : "fr-FR" );
-				TestContext.CurrentCulture = otherCulture;
-				Assert.AreEqual( otherCulture, CultureInfo.CurrentCulture, "Culture was not set" );
-				Assert.AreEqual( otherCulture, TestContext.CurrentCulture, "Culture not in new context" );
-			}
+        [Test]
+        public void TestCanAccessTestState_FailureInSetUp()
+        {
+            TestStateRecordingFixture fixture = new TestStateRecordingFixture();
+            fixture.setUpFailure = true;
+            TestBuilder.RunTestFixture(fixture);
+            Assert.That(fixture.stateList, Is.EqualTo("Inconclusive=>=>Failure"));
+            Assert.That(fixture.statusList, Is.EqualTo("Inconclusive=>=>Failed"));
+        }
 
-			Assert.AreEqual( currentCulture, CultureInfo.CurrentCulture, "Culture was not restored" );
-			Assert.AreEqual( currentCulture, TestContext.CurrentCulture, "Culture not in final context" );
-		}
+        [Test]
+        public void TestCanAccessTestState_FailingTest()
+        {
+            TestStateRecordingFixture fixture = new TestStateRecordingFixture();
+            fixture.testFailure = true;
+            TestBuilder.RunTestFixture(fixture);
+            Assert.That(fixture.stateList, Is.EqualTo("Inconclusive=>Inconclusive=>Failure"));
+            Assert.That(fixture.statusList, Is.EqualTo("Inconclusive=>Inconclusive=>Failed"));
+        }
+
+        [Test]
+        public void TestCanAccessTestState_IgnoredInSetUp()
+        {
+            TestStateRecordingFixture fixture = new TestStateRecordingFixture();
+            fixture.setUpIgnore = true;
+            TestBuilder.RunTestFixture(fixture);
+            Assert.That(fixture.stateList, Is.EqualTo("Inconclusive=>=>Ignored"));
+            Assert.That(fixture.statusList, Is.EqualTo("Inconclusive=>=>Skipped"));
+        }	
+
+	        [Test, RequiresThread]
+        public void CanAccessTestContextOnSeparateThread()
+        {
+            Assert.That(TestContext.CurrentContext.Test.Name, Is.EqualTo("CanAccessTestContextOnSeparateThread"));
+        }
 	}
 }
diff --git a/src/NUnitCore/tests/TestDelegateFixture.cs b/src/NUnitCore/tests/TestDelegateFixture.cs
index 15e81da..6f3ca24 100644
--- a/src/NUnitCore/tests/TestDelegateFixture.cs
+++ b/src/NUnitCore/tests/TestDelegateFixture.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitCore/tests/TestExecutionContextTests.cs b/src/NUnitCore/tests/TestExecutionContextTests.cs
new file mode 100644
index 0000000..993178a
--- /dev/null
+++ b/src/NUnitCore/tests/TestExecutionContextTests.cs
@@ -0,0 +1,144 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Security.Principal;
+using System.Threading;
+using System.Globalization;
+using NUnit.Framework;
+
+namespace NUnit.Core.Tests
+{
+	/// <summary>
+    /// Summary description for TestExecutionContextTests.
+	/// </summary>
+	[TestFixture]
+    public class TestExecutionContextTests
+	{
+		string currentDirectory;
+		CultureInfo currentCulture;
+        CultureInfo currentUICulture;
+        IPrincipal currentPrincipal;
+
+		/// <summary>
+		/// Since we are testing the mechanism that saves and
+		/// restores contexts, we save manually here
+		/// </summary>
+		[SetUp]
+		public void SaveContext()
+		{
+			currentDirectory = Environment.CurrentDirectory;
+			currentCulture = CultureInfo.CurrentCulture;
+            currentUICulture = CultureInfo.CurrentUICulture;
+            currentPrincipal = Thread.CurrentPrincipal;
+		}
+
+		[TearDown]
+		public void RestoreContext()
+		{
+			Environment.CurrentDirectory = currentDirectory;
+			Thread.CurrentThread.CurrentCulture = currentCulture;
+            Thread.CurrentThread.CurrentUICulture = currentUICulture;
+            Thread.CurrentPrincipal = currentPrincipal;
+		}
+
+		[Test]
+		public void SetAndRestoreCurrentDirectory()
+		{
+            Assert.AreEqual(currentDirectory, TestExecutionContext.CurrentContext.CurrentDirectory, "Directory not in initial context");
+
+            TestExecutionContext.Save();
+
+            try
+            {
+                string otherDirectory = System.IO.Path.GetTempPath();
+                if (otherDirectory[otherDirectory.Length - 1] == System.IO.Path.DirectorySeparatorChar)
+                    otherDirectory = otherDirectory.Substring(0, otherDirectory.Length - 1);
+                TestExecutionContext.CurrentContext.CurrentDirectory = otherDirectory;
+                Assert.AreEqual(otherDirectory, Environment.CurrentDirectory, "Directory was not set");
+                Assert.AreEqual(otherDirectory, TestExecutionContext.CurrentContext.CurrentDirectory, "Directory not in new context");
+            }
+            finally
+            {
+                TestExecutionContext.Restore();
+            }
+
+			Assert.AreEqual( currentDirectory, Environment.CurrentDirectory, "Directory was not restored" );
+            Assert.AreEqual(currentDirectory, TestExecutionContext.CurrentContext.CurrentDirectory, "Directory not in final context");
+		}
+		
+		[Test]
+		public void SetAndRestoreCurrentCulture()
+		{
+            Assert.AreEqual(currentCulture, TestExecutionContext.CurrentContext.CurrentCulture, "Culture not in initial context");
+
+            TestExecutionContext.Save();
+
+            try
+            {
+                CultureInfo otherCulture =
+                    new CultureInfo(currentCulture.Name == "fr-FR" ? "en-GB" : "fr-FR");
+                TestExecutionContext.CurrentContext.CurrentCulture = otherCulture;
+                Assert.AreEqual(otherCulture, CultureInfo.CurrentCulture, "Culture was not set");
+                Assert.AreEqual(otherCulture, TestExecutionContext.CurrentContext.CurrentCulture, "Culture not in new context");
+            }
+            finally
+            {
+                TestExecutionContext.Restore();
+            }
+
+			Assert.AreEqual( currentCulture, CultureInfo.CurrentCulture, "Culture was not restored" );
+            Assert.AreEqual(currentCulture, TestExecutionContext.CurrentContext.CurrentCulture, "Culture not in final context");
+		}
+
+        [Test]
+        public void SetAndRestoreCurrentUICulture()
+        {
+            Assert.AreEqual(currentUICulture, TestExecutionContext.CurrentContext.CurrentUICulture, "UICulture not in initial context");
+
+            TestExecutionContext.Save();
+
+            try
+            {
+                CultureInfo otherCulture =
+                    new CultureInfo(currentUICulture.Name == "fr-FR" ? "en-GB" : "fr-FR");
+                TestExecutionContext.CurrentContext.CurrentUICulture = otherCulture;
+                Assert.AreEqual(otherCulture, CultureInfo.CurrentUICulture, "UICulture was not set");
+                Assert.AreEqual(otherCulture, TestExecutionContext.CurrentContext.CurrentUICulture, "UICulture not in new context");
+            }
+            finally
+            {
+                TestExecutionContext.Restore();
+            }
+
+            Assert.AreEqual(currentUICulture, CultureInfo.CurrentUICulture, "UICulture was not restored");
+            Assert.AreEqual(currentUICulture, TestExecutionContext.CurrentContext.CurrentUICulture, "UICulture not in final context");
+        }
+
+        [Test]
+        public void SetAndRestoreCurrentPrincipal()
+        {
+            Assert.AreEqual(currentPrincipal, TestExecutionContext.CurrentContext.CurrentPrincipal, "Principal not in initial context");
+
+            TestExecutionContext.Save();
+
+            try
+            {
+                GenericIdentity identity = new GenericIdentity("foo");
+                TestExecutionContext.CurrentContext.CurrentPrincipal = new GenericPrincipal(identity, new string[0]);
+                Assert.AreEqual("foo", Thread.CurrentPrincipal.Identity.Name, "Principal was not set");
+                Assert.AreEqual("foo", TestExecutionContext.CurrentContext.CurrentPrincipal.Identity.Name, "Principal not in new context");
+            }
+            finally
+            {
+                TestExecutionContext.Restore();
+            }
+
+            Assert.AreEqual(currentPrincipal, Thread.CurrentPrincipal, "Principal was not restored");
+            Assert.AreEqual(currentPrincipal, TestExecutionContext.CurrentContext.CurrentPrincipal, "Principal not in final context");
+        }
+    }
+}
diff --git a/src/NUnitCore/tests/TestFixtureBuilderTests.cs b/src/NUnitCore/tests/TestFixtureBuilderTests.cs
index 5aec269..da38cb8 100644
--- a/src/NUnitCore/tests/TestFixtureBuilderTests.cs
+++ b/src/NUnitCore/tests/TestFixtureBuilderTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -22,7 +22,7 @@ namespace NUnit.Core.Tests
 		{
 			string methodName = "TestVoid";
 			Test fixture = TestFixtureBuilder.BuildFrom( typeof( SignatureTestFixture ) );
-			Test foundTest = TestFinder.Find( methodName, fixture );
+			Test foundTest = TestFinder.Find( methodName, fixture, true );
 			Assert.IsNotNull( foundTest );
 			Assert.AreEqual( RunState.Runnable, foundTest.RunState );
 		}
diff --git a/src/NUnitCore/tests/TestFixtureExtension.cs b/src/NUnitCore/tests/TestFixtureExtension.cs
index 4ec5dd9..00fd460 100644
--- a/src/NUnitCore/tests/TestFixtureExtension.cs
+++ b/src/NUnitCore/tests/TestFixtureExtension.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -24,15 +24,15 @@ namespace NUnit.Core.Tests
 		private void RunTestOnFixture( object fixture )
 		{
 			Test suite = TestBuilder.MakeFixture( fixture );
-			suite.Run( NullListener.NULL );
+            suite.Run(NullListener.NULL, TestFilter.Empty);
 		}
 
 		[SetUp] public void LoadFixture()
 		{
-			string testsDll = "test-assembly.dll";
+            string testsDll = AssemblyHelper.GetAssemblyPath(typeof(DerivedTestFixture));
 			TestSuiteBuilder builder = new TestSuiteBuilder();
 			TestPackage package = new TestPackage( testsDll );
-			package.TestName = "NUnit.TestData.TestFixtureExtension.DerivedTestFixture";
+			package.TestName = typeof(DerivedTestFixture).FullName;
 			suite= builder.Build( package );
 		}
 
@@ -49,7 +49,7 @@ namespace NUnit.Core.Tests
 		{
 			Assert.IsNotNull(suite);
 
-			TestResult result = suite.Run(NullListener.NULL);
+            TestResult result = suite.Run(NullListener.NULL, TestFilter.Empty);
 			Assert.IsTrue(result.IsSuccess);
 		}
 
diff --git a/src/NUnitCore/tests/TestFixtureTests.cs b/src/NUnitCore/tests/TestFixtureTests.cs
index dcfa1bc..e51bb42 100644
--- a/src/NUnitCore/tests/TestFixtureTests.cs
+++ b/src/NUnitCore/tests/TestFixtureTests.cs
@@ -1,8 +1,14 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
 using System;
 using NUnit.Framework;
 using NUnit.Core;
 using NUnit.TestUtilities;
-using NUnit.TestData.TestFixtureTests;
+using NUnit.TestData.TestFixtureData;
 
 namespace NUnit.Core.Tests
 {
@@ -33,7 +39,7 @@ namespace NUnit.Core.Tests
 		{
 			TestSuite fixture = TestBuilder.MakeFixture( typeof( OuterClass.NestedTestFixture ) );
 			Assert.AreEqual( "OuterClass+NestedTestFixture", fixture.TestName.Name );
-			Assert.AreEqual( "NUnit.TestData.TestFixtureTests.OuterClass+NestedTestFixture", fixture.TestName.FullName );
+			Assert.AreEqual( "NUnit.TestData.TestFixtureData.OuterClass+NestedTestFixture", fixture.TestName.FullName );
 		}
 
 		[Test]
@@ -41,44 +47,45 @@ namespace NUnit.Core.Tests
 		{
 			TestSuite fixture = TestBuilder.MakeFixture( typeof( OuterClass.NestedTestFixture.DoublyNestedTestFixture ) );
 			Assert.AreEqual( "OuterClass+NestedTestFixture+DoublyNestedTestFixture", fixture.TestName.Name );
-			Assert.AreEqual( "NUnit.TestData.TestFixtureTests.OuterClass+NestedTestFixture+DoublyNestedTestFixture", fixture.TestName.FullName );
-		}
-
-		private void AssertNotRunnable( Type type )
-		{
-			TestSuite suite = TestBuilder.MakeFixture( type );
-			Assert.AreEqual( RunState.NotRunnable, suite.RunState );
-		}
-
-		private void AssertNotRunnable( Type type, string reason )
-		{
-			TestSuite suite = TestBuilder.MakeFixture( type );
-			Assert.AreEqual( RunState.NotRunnable, suite.RunState );
-			Assert.AreEqual( reason, suite.IgnoreReason );
-		}
-
-		[Test]
-		public void CannotRunNoDefaultConstructor()
-		{
-			AssertNotRunnable( typeof( NoDefaultCtorFixture ) );
-		}
-
-		[Test]
+			Assert.AreEqual( "NUnit.TestData.TestFixtureData.OuterClass+NestedTestFixture+DoublyNestedTestFixture", fixture.TestName.FullName );
+		}
+
+        [Test]
+        public void ConstructFromTypeWithoutTestFixtureAttribute()
+        {
+            TestSuite fixture = TestBuilder.MakeFixture(typeof(FixtureWithoutTestFixtureAttribute));
+            Assert.AreEqual("FixtureWithoutTestFixtureAttribute", fixture.TestName.Name);
+            Assert.AreEqual("NUnit.TestData.TestFixtureData.FixtureWithoutTestFixtureAttribute", fixture.TestName.FullName);
+        }
+
+        [Test]
+        public void CannotRunConstructorWithArgsNotSupplied()
+        {
+            TestAssert.IsNotRunnable(typeof(NoDefaultCtorFixture));
+        }
+
+        [Test]
+        public void CanRunConstructorWithArgsSupplied()
+        {
+            TestAssert.IsRunnable(typeof(FixtureWithArgsSupplied));
+        }
+
+        [Test]
 		public void CannotRunBadConstructor()
 		{
-			AssertNotRunnable( typeof( BadCtorFixture ) );
+            TestAssert.IsNotRunnable(typeof(BadCtorFixture));
 		}
 
 		[Test] 
-		public void CannotRunMultipleSetUp()
+		public void CanRunMultipleSetUp()
 		{
-			AssertNotRunnable(typeof(MultipleSetUpAttributes));
+            TestAssert.IsRunnable(typeof(MultipleSetUpAttributes));
 		}
 
 		[Test] 
-		public void CannotRunMultipleTearDown()
+		public void CanRunMultipleTearDown()
 		{
-			AssertNotRunnable(typeof(MultipleTearDownAttributes));
+            TestAssert.IsRunnable(typeof(MultipleTearDownAttributes));
 		}
 
 		[Test]
@@ -86,179 +93,216 @@ namespace NUnit.Core.Tests
 		{
 			TestSuite suite = TestBuilder.MakeFixture( typeof( IgnoredFixture ) );
 			Assert.AreEqual( RunState.Ignored, suite.RunState );
-			Assert.AreEqual( "testing ignore a suite", suite.IgnoreReason );
+			Assert.AreEqual( "testing ignore a fixture", suite.IgnoreReason );
 		}
 
-//		[Test]
-//		public void IgnoreStaticTests()
-//		{
-//			InvalidSignatureTest("Static", "it must be an instance method" );
-//		}
-//
-//		[Test]
-//		public void IgnoreTestsThatReturnSomething()
-//		{
-//			InvalidSignatureTest("NotVoid", "it must return void");
-//		}
-//
-//		[Test]
-//		public void IgnoreTestsWithParameters()
-//		{
-//			InvalidSignatureTest("Parameters", "it must not have parameters");
-//		}
-//
-//		[Test]
-//		public void IgnoreProtectedTests()
-//		{
-//			InvalidSignatureTest("Protected", "it must be a public method");
-//		}
-//
-//		[Test]
-//		public void IgnorePrivateTests()
-//		{
-//			InvalidSignatureTest("Private", "it must be a public method");
-//		}
-//
-//		[Test]
-//		public void GoodSignature()
-//		{
-//			string methodName = "TestVoid";
-//			TestSuite fixture = LoadFixture("NUnit.Core.Tests.TestFixtureBuilderTests+SignatureTestFixture");
-//			NUnit.Core.TestCase foundTest = FindTestByName(fixture, methodName);
-//			Assert.IsNotNull(foundTest);
-//			Assert.AreEqual( RunState.Runnable, foundTest.RunState);
-//		}
+        [Test]
+        public void CanRunFixtureDerivedFromAbstractFixture()
+        {
+            TestAssert.IsRunnable(typeof(DerivedFromAbstractTestFixture));
+        }
 
-		[Test]
-		public void CannotRunAbstractFixture()
-		{
-			AssertNotRunnable( typeof( AbstractTestFixture ) );
-		}
+        [Test]
+        public void CanRunFixtureDerivedFromAbstractDerivedTestFixture()
+        {
+            TestAssert.IsRunnable(typeof(DerivedFromAbstractDerivedTestFixture));
+        }
 
-		[Test]
-		public void CannotRunAbstractDerivedFixture()
-		{
-			AssertNotRunnable( typeof( AbstractDerivedTestFixture ) );
-		}
+        [Test]
+        public void FixtureInheritingTwoTestFixtureAttributesIsLoadedOnlyOnce()
+        {
+            TestSuite suite = TestBuilder.MakeFixture(typeof(DoubleDerivedClassWithTwoInheritedAttributes));
+            Assert.That(suite, Is.TypeOf(typeof(NUnitTestFixture)));
+            Assert.That(suite.Tests.Count, Is.EqualTo(0));
+        }
 
 		[Test] 
-		public void CannotRunMultipleTestFixtureSetUp()
+		public void CanRunMultipleTestFixtureSetUp()
 		{
-			AssertNotRunnable(typeof(MultipleFixtureSetUpAttributes));
+            TestAssert.IsRunnable(typeof(MultipleFixtureSetUpAttributes));
 		}
 
 		[Test] 
-		public void CannotRunMultipleTestFixtureTearDown()
-		{
-			AssertNotRunnable(typeof(MultipleFixtureTearDownAttributes));
-		}
-
+		public void CanRunMultipleTestFixtureTearDown()
+		{
+            TestAssert.IsRunnable(typeof(MultipleFixtureTearDownAttributes));
+		}
+
+#if NET_2_0
+        [Test]
+        public void ConstructFromStaticTypeWithoutTestFixtureAttribute()
+        {
+            TestSuite fixture = TestBuilder.MakeFixture(typeof(StaticFixtureWithoutTestFixtureAttribute));
+            Assert.AreEqual("StaticFixtureWithoutTestFixtureAttribute", fixture.TestName.Name);
+            Assert.AreEqual("NUnit.TestData.TestFixtureData.StaticFixtureWithoutTestFixtureAttribute", fixture.TestName.FullName);
+        }
+
+        [Test]
+        public void CanRunStaticFixture()
+        {
+            TestAssert.IsRunnable(typeof(StaticFixtureWithoutTestFixtureAttribute));
+        }
+
+        [Test]
+        public void CanRunGenericFixtureWithProperArgsProvided()
+        {
+            TestSuite suite = TestBuilder.MakeFixture(
+                Type.GetType("NUnit.TestData.TestFixtureData.GenericFixtureWithProperArgsProvided`1,test-assembly"));
+            Assert.That(suite.RunState, Is.EqualTo(RunState.Runnable));
+            Assert.That(suite is ParameterizedFixtureSuite);
+            Assert.That(suite.Tests.Count, Is.EqualTo(2));
+        }
+
+        [Test]
+        public void CannotRunGenericFixtureWithNoTestFixtureAttribute()
+        {
+            TestAssert.IsNotRunnable(
+                Type.GetType("NUnit.TestData.TestFixtureData.GenericFixtureWithNoTestFixtureAttribute`1,test-assembly"));
+        }
+
+        [Test]
+        public void CannotRunGenericFixtureWithNoArgsProvided()
+        {
+            Test suite = TestBuilder.MakeFixture(
+                Type.GetType("NUnit.TestData.TestFixtureData.GenericFixtureWithNoArgsProvided`1,test-assembly"));
+            TestAssert.IsNotRunnable((Test)suite.Tests[0]);
+        }
+
+        [Test]
+        public void CannotRunGenericFixtureDerivedFromAbstractFixtureWithNoArgsProvided()
+        {
+            Test suite = TestBuilder.MakeFixture(
+                Type.GetType("NUnit.TestData.TestFixtureData.GenericFixtureDerivedFromAbstractFixtureWithNoArgsProvided`1,test-assembly"));
+            TestAssert.IsNotRunnable((Test)suite.Tests[0]);
+        }
+
+        [Test]
+        public void CanRunGenericFixtureDerivedFromAbstractFixtureWithArgsProvided()
+        {
+            Test suite = TestBuilder.MakeFixture(
+                Type.GetType("NUnit.TestData.TestFixtureData.GenericFixtureDerivedFromAbstractFixtureWithArgsProvided`1,test-assembly"));
+            Assert.That(suite.RunState, Is.EqualTo(RunState.Runnable));
+            Assert.That(suite is ParameterizedFixtureSuite);
+            Assert.That(suite.Tests.Count, Is.EqualTo(2));
+        }
+#endif
+
+        #region SetUp Signature
 		[Test] 
 		public void CannotRunPrivateSetUp()
 		{
-			AssertNotRunnable(typeof(PrivateSetUp));
+            TestAssert.IsNotRunnable(typeof(PrivateSetUp));
 		}
 
 		[Test] 
-		public void CannotRunProtectedSetUp()
+		public void CanRunProtectedSetUp()
 		{
-			AssertNotRunnable(typeof(ProtectedSetUp));
+            TestAssert.IsRunnable(typeof(ProtectedSetUp));
 		}
 
+        /// <summary>
+        /// Determines whether this instance [can run static set up].
+        /// </summary>
 		[Test] 
-		public void CannotRunStaticSetUp()
+		public void CanRunStaticSetUp()
 		{
-			AssertNotRunnable(typeof(StaticSetUp));
+            TestAssert.IsRunnable(typeof(StaticSetUp));
 		}
 
 		[Test]
 		public void CannotRunSetupWithReturnValue()
 		{
-			AssertNotRunnable(typeof(SetUpWithReturnValue));
+            TestAssert.IsNotRunnable(typeof(SetUpWithReturnValue));
 		}
 
 		[Test]
 		public void CannotRunSetupWithParameters()
 		{
-			AssertNotRunnable(typeof(SetUpWithParameters));
+            TestAssert.IsNotRunnable(typeof(SetUpWithParameters));
 		}
+		#endregion
 
+		#region TearDown Signature
 		[Test] 
 		public void CannotRunPrivateTearDown()
 		{
-			AssertNotRunnable(typeof(PrivateTearDown));
+            TestAssert.IsNotRunnable(typeof(PrivateTearDown));
 		}
 
 		[Test] 
-		public void CannotRunProtectedTearDown()
+		public void CanRunProtectedTearDown()
 		{
-			AssertNotRunnable(typeof(ProtectedTearDown));
+            TestAssert.IsRunnable(typeof(ProtectedTearDown));
 		}
 
 		[Test] 
-		public void CannotRunStaticTearDown()
+		public void CanRunStaticTearDown()
 		{
-			AssertNotRunnable(typeof(StaticTearDown));
+            TestAssert.IsRunnable(typeof(StaticTearDown));
 		}
 
 		[Test]
 		public void CannotRunTearDownWithReturnValue()
 		{
-			AssertNotRunnable(typeof(TearDownWithReturnValue));
+            TestAssert.IsNotRunnable(typeof(TearDownWithReturnValue));
 		}
 
 		[Test]
 		public void CannotRunTearDownWithParameters()
 		{
-			AssertNotRunnable(typeof(TearDownWithParameters));
+            TestAssert.IsNotRunnable(typeof(TearDownWithParameters));
 		}
+		#endregion
 
+		#region TestFixtureSetUp Signature
 		[Test] 
 		public void CannotRunPrivateFixtureSetUp()
 		{
-			AssertNotRunnable(typeof(PrivateFixtureSetUp));
+            TestAssert.IsNotRunnable(typeof(PrivateFixtureSetUp));
 		}
 
 		[Test] 
-		public void CannotRunProtectedFixtureSetUp()
+		public void CanRunProtectedFixtureSetUp()
 		{
-			AssertNotRunnable(typeof(ProtectedFixtureSetUp));
+            TestAssert.IsRunnable(typeof(ProtectedFixtureSetUp));
 		}
 
 		[Test] 
-		public void CannotRunStaticFixtureSetUp()
+		public void CanRunStaticFixtureSetUp()
 		{
-			AssertNotRunnable(typeof(StaticFixtureSetUp));
+            TestAssert.IsRunnable(typeof(StaticFixtureSetUp));
 		}
 
 		[Test]
 		public void CannotRunFixtureSetupWithReturnValue()
 		{
-			AssertNotRunnable(typeof(FixtureSetUpWithReturnValue));
+            TestAssert.IsNotRunnable(typeof(FixtureSetUpWithReturnValue));
 		}
 
 		[Test]
 		public void CannotRunFixtureSetupWithParameters()
 		{
-			AssertNotRunnable(typeof(FixtureSetUpWithParameters));
+            TestAssert.IsNotRunnable(typeof(FixtureSetUpWithParameters));
 		}
+		#endregion
 
+		#region TestFixtureTearDown Signature
 		[Test] 
 		public void CannotRunPrivateFixtureTearDown()
 		{
-			AssertNotRunnable(typeof(PrivateFixtureTearDown));
+            TestAssert.IsNotRunnable(typeof(PrivateFixtureTearDown));
 		}
 
 		[Test] 
-		public void CannotRunProtectedFixtureTearDown()
+		public void CanRunProtectedFixtureTearDown()
 		{
-			AssertNotRunnable(typeof(ProtectedFixtureTearDown));
+            TestAssert.IsRunnable(typeof(ProtectedFixtureTearDown));
 		}
 
 		[Test] 
-		public void CannotRunStaticFixtureTearDown()
+		public void CanRunStaticFixtureTearDown()
 		{
-			AssertNotRunnable(typeof(StaticFixtureTearDown));
+            TestAssert.IsRunnable(typeof(StaticFixtureTearDown));
 		}
 
 //		[TestFixture]
@@ -281,14 +325,48 @@ namespace NUnit.Core.Tests
 		[Test]
 		public void CannotRunFixtureTearDownWithReturnValue()
 		{
-			AssertNotRunnable(typeof(FixtureTearDownWithReturnValue));
+            TestAssert.IsNotRunnable(typeof(FixtureTearDownWithReturnValue));
 		}
 
 		[Test]
 		public void CannotRunFixtureTearDownWithParameters()
 		{
-			AssertNotRunnable(typeof(FixtureTearDownWithParameters));
-		}
-
-	}
+            TestAssert.IsNotRunnable(typeof(FixtureTearDownWithParameters));
+		}
+		#endregion
+
+        #region Nested Fixtures
+
+        [TestFixture]
+        private class PrivateTestFixture
+        {
+            [Test]
+            public void CanRunTestInPrivateTestFixture()
+            {
+                Assert.True(true);
+            }
+        }
+
+        [TestFixture]
+        protected class ProtectedTestFixture
+        {
+            [Test]
+            public void CanRunTestInProtectedTestFixture()
+            {
+                Assert.True(true);
+            }
+        }
+
+        [TestFixture]
+        internal class InternalTestFixture
+        {
+            [Test]
+            public void CanRunTestInInternalTestFixture()
+            {
+                Assert.True(true);
+            }
+        }
+
+        #endregion
+    }
 }
diff --git a/src/NUnitCore/tests/TestFrameworkTests.cs b/src/NUnitCore/tests/TestFrameworkTests.cs
index 82e7125..77262fb 100644
--- a/src/NUnitCore/tests/TestFrameworkTests.cs
+++ b/src/NUnitCore/tests/TestFrameworkTests.cs
@@ -1,12 +1,13 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
 using NUnit.Framework;
 using System.Reflection;
+using NUnit.Core.Extensibility;
 
 namespace NUnit.Core.Tests
 {
@@ -19,7 +20,8 @@ namespace NUnit.Core.Tests
 		[Test]
 		public void NUnitFrameworkIsKnownAndReferenced()
 		{
-			foreach( AssemblyName assemblyName in CoreExtensions.Host.TestFrameworks.GetReferencedFrameworks( Assembly.GetExecutingAssembly() ) )
+			FrameworkRegistry frameworks = (FrameworkRegistry)CoreExtensions.Host.GetExtensionPoint("FrameworkRegistry");
+			foreach( AssemblyName assemblyName in frameworks.GetReferencedFrameworks( Assembly.GetExecutingAssembly() ) )
 				if ( assemblyName.Name == "nunit.framework" ) return;
 			Assert.Fail("Cannot find nunit.framework");
 		}
diff --git a/src/NUnitCore/tests/TestIDTests.cs b/src/NUnitCore/tests/TestIDTests.cs
index b909f4f..2f74035 100644
--- a/src/NUnitCore/tests/TestIDTests.cs
+++ b/src/NUnitCore/tests/TestIDTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitCore/tests/TestInfoTests.cs b/src/NUnitCore/tests/TestInfoTests.cs
index d22b413..d01c6e9 100644
--- a/src/NUnitCore/tests/TestInfoTests.cs
+++ b/src/NUnitCore/tests/TestInfoTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -19,7 +19,7 @@ namespace NUnit.Core.Tests
 	{
 		TestSuite testSuite;
 		TestSuite testFixture;
-		NUnit.Core.TestCase testCase1;
+		Test testCase1;
 
 		[SetUp]
 		public void SetUp()
@@ -28,7 +28,7 @@ namespace NUnit.Core.Tests
 			testFixture = TestBuilder.MakeFixture( typeof( MockTestFixture ) );
 			testSuite.Add( testFixture );
 
-			testCase1 = (NUnit.Core.TestCase)testFixture.Tests[0];
+			testCase1 = (Test)testFixture.Tests[0];
 		}
 
 		private void CheckConstructionFromTest( ITest expected )
diff --git a/src/NUnitCore/tests/TestMethodSignatureTests.cs b/src/NUnitCore/tests/TestMethodSignatureTests.cs
new file mode 100644
index 0000000..a80f4a9
--- /dev/null
+++ b/src/NUnitCore/tests/TestMethodSignatureTests.cs
@@ -0,0 +1,206 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Framework;
+using NUnit.Util;
+using NUnit.TestUtilities;
+using NUnit.TestData;
+
+namespace NUnit.Core.Tests
+{
+	[TestFixture]
+	public class TestMethodSignatureTests
+	{
+        private static Type fixtureType = typeof(TestMethodSignatureFixture);
+		private Test fixture;
+
+		[SetUp]
+		public void CreateFixture()
+		{
+			fixture = TestBuilder.MakeFixture( typeof( TestMethodSignatureFixture ) );
+		}
+
+        [Test]
+		public void InstanceTestMethodIsRunnable()
+		{
+			TestAssert.IsRunnable( fixtureType, "InstanceTestMethod" );
+		}
+
+		[Test]
+		public void StaticTestMethodIsRunnable()
+		{
+			TestAssert.IsRunnable( fixtureType, "StaticTestMethod" );
+		}
+
+		[Test]
+		public void TestMethodWithoutParametersWithArgumentsProvidedIsNotRunnable()
+		{
+			TestAssert.ChildNotRunnable(fixtureType, "TestMethodWithoutParametersWithArgumentsProvided");
+		}
+
+        [Test]
+        public void TestMethodWithArgumentsNotProvidedIsNotRunnable()
+        {
+            TestAssert.IsNotRunnable(fixtureType, "TestMethodWithArgumentsNotProvided");
+        }
+
+        [Test]
+        public void TestMethodWithArgumentsProvidedIsRunnable()
+        {
+            TestAssert.IsRunnable(fixtureType, "TestMethodWithArgumentsProvided");
+        }
+
+        [Test]
+        public void TestMethodWithWrongNumberOfArgumentsProvidedIsNotRunnable()
+        {
+            TestAssert.ChildNotRunnable(fixtureType, "TestMethodWithWrongNumberOfArgumentsProvided");
+        }
+
+        [Test]
+        public void TestMethodWithWrongArgumentTypesProvidedGivesError()
+        {
+            TestAssert.IsRunnable(fixtureType, "TestMethodWithWrongArgumentTypesProvided", ResultState.Error);
+        }
+
+        [Test]
+        public void StaticTestMethodWithArgumentsNotProvidedIsNotRunnable()
+        {
+            TestAssert.IsNotRunnable(fixtureType, "StaticTestMethodWithArgumentsNotProvided");
+        }
+
+        [Test]
+        public void StaticTestMethodWithArgumentsProvidedIsRunnable()
+        {
+            TestAssert.IsRunnable(fixtureType, "StaticTestMethodWithArgumentsProvided");
+        }
+
+        [Test]
+        public void StaticTestMethodWithWrongNumberOfArgumentsProvidedIsNotRunnable()
+        {
+            TestAssert.ChildNotRunnable(fixtureType, "StaticTestMethodWithWrongNumberOfArgumentsProvided");
+        }
+
+        [Test]
+        public void StaticTestMethodWithWrongArgumentTypesProvidedGivesError()
+        {
+            TestAssert.IsRunnable(fixtureType, "StaticTestMethodWithWrongArgumentTypesProvided", ResultState.Error);
+        }
+
+        [Test]
+        public void TestMethodWithConvertibleArgumentsIsRunnable()
+        {
+            TestAssert.IsRunnable(fixtureType, "TestMethodWithConvertibleArguments");
+        }
+
+        [Test]
+        public void TestMethodWithNonConvertibleArgumentsGivesError()
+        {
+            TestAssert.IsRunnable(fixtureType, "TestMethodWithNonConvertibleArguments", ResultState.Error);
+        }
+
+        [Test]
+		public void ProtectedTestMethodIsNotRunnable()
+		{
+			TestAssert.IsNotRunnable( fixtureType, "ProtectedTestMethod" );
+		}
+
+		[Test]
+		public void PrivateTestMethodIsNotRunnable()
+		{
+			TestAssert.IsNotRunnable( fixtureType, "PrivateTestMethod" );
+		}
+
+		[Test]
+		public void TestMethodWithReturnTypeIsNotRunnable()
+		{
+			TestAssert.IsNotRunnable( fixtureType, "TestMethodWithReturnType" );
+		}
+
+		[Test]
+		public void TestMethodWithMultipleTestCasesExecutesMultipleTimes()
+		{
+			Test test = TestFinder.Find( "TestMethodWithMultipleTestCases", fixture, false );
+			Assert.That( test.RunState, Is.EqualTo( RunState.Runnable ) );
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+			Assert.That( result.ResultState, Is.EqualTo(ResultState.Success) );
+            ResultSummarizer summary = new ResultSummarizer(result);
+		    Assert.That(summary.TestsRun, Is.EqualTo(3));
+		}
+
+        [Test]
+        public void TestMethodWithMultipleTestCasesUsesCorrectNames()
+        {
+            string name = "TestMethodWithMultipleTestCases";
+            string fullName = typeof (TestMethodSignatureFixture).FullName + "." + name;
+            TestSuite suite = (TestSuite)TestFinder.Find(name, fixture, false);
+            Assert.That(suite.TestCount, Is.EqualTo(3));
+
+            ArrayList names = new ArrayList();
+            ArrayList fullNames = new ArrayList();
+
+            foreach (Test test in suite.Tests)
+            {
+                names.Add(test.TestName.Name);
+                fullNames.Add(test.TestName.FullName);
+            }
+
+            Assert.That(names, Has.Member(name + "(12,3,4)"));
+            Assert.That(names, Has.Member(name + "(12,2,6)"));
+            Assert.That(names, Has.Member(name + "(12,4,3)"));
+
+            Assert.That(fullNames, Has.Member(fullName + "(12,3,4)"));
+            Assert.That(fullNames, Has.Member(fullName + "(12,2,6)"));
+            Assert.That(fullNames, Has.Member(fullName + "(12,4,3)"));
+        }
+
+        [Test]
+        public void TestMethodWithParamsArgumentIsRunnable()
+        {
+            TestAssert.IsRunnable(fixtureType, "TestMethodWithParamsArgument");
+        }
+
+        // TODO: Make this work in a later release
+        //[Test]
+        public void TestMethodWithParamsArgumentUsesCorrectName()
+        {
+            string name = "TestMethodWithParamsArgument";
+            string fullName = typeof(TestMethodSignatureFixture).FullName + "." + name;
+            TestSuite suite = (TestSuite)TestFinder.Find(name, fixture, false);
+            Test test = suite.Tests[0] as Test;
+
+            Assert.That(test.TestName.Name, Is.EqualTo(name + "(1, 2, 3)"));
+            Assert.That(test.TestName.FullName, Is.EqualTo(fullName + "(1, 2, 3)"));
+        }
+
+        [Test]
+        public void RunningTestsThroughFixtureGivesCorrectResults()
+		{
+            TestResult result = fixture.Run(NullListener.NULL, TestFilter.Empty);
+			ResultSummarizer summary = new ResultSummarizer( result );
+
+			Assert.That( 
+				summary.ResultCount, 
+				Is.EqualTo( TestMethodSignatureFixture.Tests ) );
+			Assert.That( 
+				summary.TestsRun, 
+				Is.EqualTo( TestMethodSignatureFixture.Runnable ) );
+			Assert.That( 
+				summary.NotRunnable, 
+				Is.EqualTo( TestMethodSignatureFixture.NotRunnable ) );
+            Assert.That(
+                summary.Errors,
+                Is.EqualTo(TestMethodSignatureFixture.Errors));
+            Assert.That(
+                summary.Failures,
+                Is.EqualTo(TestMethodSignatureFixture.Failures));
+            Assert.That( 
+				summary.TestsNotRun, 
+				Is.EqualTo( TestMethodSignatureFixture.NotRunnable ) );
+		}
+    }
+}
diff --git a/src/NUnitCore/tests/TestNameTests.cs b/src/NUnitCore/tests/TestNameTests.cs
index 9d35c91..80eb1b6 100644
--- a/src/NUnitCore/tests/TestNameTests.cs
+++ b/src/NUnitCore/tests/TestNameTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitCore/tests/TestNodeTests.cs b/src/NUnitCore/tests/TestNodeTests.cs
index 8bfa8f7..4324a9a 100644
--- a/src/NUnitCore/tests/TestNodeTests.cs
+++ b/src/NUnitCore/tests/TestNodeTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -21,7 +21,7 @@ namespace NUnit.Core.Tests
 	{
 		TestSuite testSuite;
 		TestSuite testFixture;
-		NUnit.Core.TestCase testCase1;
+		Test testCase1;
 
 		[SetUp]
 		public void SetUp()
@@ -30,7 +30,7 @@ namespace NUnit.Core.Tests
 			testFixture = TestBuilder.MakeFixture( typeof( MockTestFixture ) );
 			testSuite.Add( testFixture );
 
-			testCase1 = (NUnit.Core.TestCase)testFixture.Tests[0];
+			testCase1 = (Test)testFixture.Tests[0];
 		}
 
 		[Test]
diff --git a/src/NUnitCore/tests/TestRunnerThreadTests.cs b/src/NUnitCore/tests/TestRunnerThreadTests.cs
index 9851375..4122331 100644
--- a/src/NUnitCore/tests/TestRunnerThreadTests.cs
+++ b/src/NUnitCore/tests/TestRunnerThreadTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitCore/tests/TestSuiteResultFixture.cs b/src/NUnitCore/tests/TestSuiteResultFixture.cs
deleted file mode 100644
index 622491b..0000000
--- a/src/NUnitCore/tests/TestSuiteResultFixture.cs
+++ /dev/null
@@ -1,73 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-namespace NUnit.Core.Tests
-{
-	using System;
-	using System.Collections;
-	using NUnit.Framework;
-	using NUnit.Core;
-	
-	/// <summary>
-	/// Summary description for TestResultTests.
-	/// </summary>
-	/// 
-	[TestFixture]
-	public class TestSuiteResultFixture
-	{
-		//private TestCaseResult testCase;
-
-		private TestSuiteResult MockSuiteResult( bool failure )
-		{
-			TestCaseResult testCaseResult = new TestCaseResult("a test case");
-			if ( failure ) testCaseResult.Failure( "case failed", null );
-
-			TestSuiteResult level1SuiteA = new TestSuiteResult("level 1 A");
-			level1SuiteA.AddResult(testCaseResult);
-
-			TestSuiteResult level1SuiteB = new TestSuiteResult("level 1 B");
-			level1SuiteB.AddResult(new TestCaseResult("a successful test"));
-
-			TestSuiteResult result = new TestSuiteResult("base");
-			result.AddResult(level1SuiteA);
-			result.AddResult(level1SuiteB);
-
-			return result;
-		}
-
-		[Test]
-		public void EmptySuite()
-		{
-			TestSuiteResult result = new TestSuiteResult("base suite");
-			Assert.IsTrue(result.IsSuccess, "result should be success");
-		}
-
-		[Test]
-		public void SuiteSuccess()
-		{
-			Assert.IsTrue(MockSuiteResult( false ).IsSuccess);
-		}
-
-		[Test]
-		public void TestSuiteFailure()
-		{
-//			AssertionException failure = new AssertionException("an assertion failed error");
-//			testCase.Failure(failure.Message, failure.StackTrace);
-
-			TestSuiteResult result = MockSuiteResult( true );
-			
-			Assert.IsTrue(result.IsFailure);
-			Assert.IsFalse(result.IsSuccess); 
-
-			IList results = result.Results;
-			TestSuiteResult suiteA = (TestSuiteResult)results[0];
-			Assert.IsTrue(suiteA.IsFailure);
-
-			TestSuiteResult suiteB = (TestSuiteResult)results[1];
-			Assert.IsTrue(suiteB.IsSuccess);
-		}		
-	}
-}
diff --git a/src/NUnitCore/tests/TestSuiteTest.cs b/src/NUnitCore/tests/TestSuiteTest.cs
index 3fb84c4..890714f 100644
--- a/src/NUnitCore/tests/TestSuiteTest.cs
+++ b/src/NUnitCore/tests/TestSuiteTest.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -35,15 +35,18 @@ namespace NUnit.Core.Tests
 		[Test]
 		public void RunTestsInFixture()
 		{
-			TestResult result = mockTestFixture.Run( NullListener.NULL );
+            TestResult result = mockTestFixture.Run(NullListener.NULL, TestFilter.Empty);
 			ResultSummarizer summarizer = new ResultSummarizer( result );
-			Assert.AreEqual( MockTestFixture.Tests - MockTestFixture.NotRun, summarizer.ResultCount );
-			Assert.AreEqual( MockTestFixture.Ignored, summarizer.TestsNotRun );
+			Assert.AreEqual( MockTestFixture.TestsRun, summarizer.TestsRun, "TestsRun" );
+            Assert.AreEqual( MockTestFixture.NotRunnable, summarizer.NotRunnable, "NotRunnable");
+            Assert.AreEqual(MockTestFixture.Ignored, summarizer.Ignored, "Ignored");
+            Assert.AreEqual(MockTestFixture.Errors, summarizer.Errors, "Errors");
+            Assert.AreEqual(MockTestFixture.Failures, summarizer.Failures, "Failures");
 
-			result = TestFinder.Find( "ExplicitlyRunTest", result );
+			result = TestFinder.Find( "ExplicitlyRunTest", result, true );
 			Assert.IsNull( result, "ExplicitlyRunTest should not be in results" );
 
-			// TODO: Decide if we want to include Explicitly run tests
+			// TODO: Decide if we want to include Explicit tests that are not run in results
 			//			Assert.IsNotNull( result, "Cannot find ExplicitlyRunTest result" );
 			//			Assert.IsFalse( result.Executed, "ExplicitlyRunTest should not be executed" );
 			//			Assert.AreEqual( "Explicit selection required", result.Message );
@@ -52,25 +55,25 @@ namespace NUnit.Core.Tests
 		[Test]
 		public void RunExplicitTestDirectly()
 		{
-			Test test = TestFinder.Find( "ExplicitlyRunTest", mockTestFixture );
+			Test test = TestFinder.Find( "ExplicitlyRunTest", mockTestFixture, true );
 			Assert.IsNotNull( test, "Cannot find ExplicitlyRunTest" );
 			Assert.AreEqual( RunState.Explicit, test.RunState );
-			TestResult result = test.Run( NullListener.NULL );
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
 			ResultSummarizer summarizer = new ResultSummarizer( result );
-			Assert.AreEqual( 1, summarizer.ResultCount );
+			Assert.AreEqual( 1, summarizer.TestsRun );
 		}
 
 		[Test]
 		public void RunExplicitTestByName()
 		{
-			Test test = TestFinder.Find( "ExplicitlyRunTest", mockTestFixture );
+			Test test = TestFinder.Find( "ExplicitlyRunTest", mockTestFixture, true );
 			Assert.IsNotNull( test, "Cannot find ExplicitlyRunTest" );
 			Assert.AreEqual( RunState.Explicit, test.RunState );
 
 			NameFilter filter = new NameFilter( test.TestName );
 			TestResult result = mockTestFixture.Run( NullListener.NULL, filter );
 			ResultSummarizer summarizer = new ResultSummarizer( result );
-			Assert.AreEqual( 1, summarizer.ResultCount );
+			Assert.AreEqual( 1, summarizer.TestsRun );
 		}
 
 		[Test]
@@ -79,27 +82,29 @@ namespace NUnit.Core.Tests
 			CategoryFilter filter = new CategoryFilter( "Special" );
 			TestResult result = mockTestFixture.Run( NullListener.NULL, filter );
 			ResultSummarizer summarizer = new ResultSummarizer( result );
-			Assert.AreEqual( 1, summarizer.ResultCount );
+			Assert.AreEqual( 1, summarizer.TestsRun );
 		}
 
 		[Test]
 		public void ExcludingCategoryDoesNotRunExplicitTestCases()
 		{
-			TestFilter filter = new NotFilter( new CategoryFilter( "MockCategory" ) );
+			NotFilter filter = new NotFilter( new CategoryFilter( "MockCategory" ) );
+            filter.TopLevel = true;
 			TestResult result = mockTestFixture.Run( NullListener.NULL, filter );
 			ResultSummarizer summarizer = new ResultSummarizer( result );
-			Assert.AreEqual( 2, summarizer.ResultCount );
+			Assert.AreEqual( MockTestFixture.TestsRun - MockTestFixture.MockCategoryTests, summarizer.TestsRun );
 		}
 
 		[Test]
 		public void ExcludingCategoryDoesNotRunExplicitTestFixtures()
 		{
-			TestFilter filter = new NotFilter( new CategoryFilter( "MockCategory" ) );
+			NotFilter filter = new NotFilter( new CategoryFilter( "MockCategory" ) );
+            filter.TopLevel = true;
 			TestAssemblyBuilder builder = new TestAssemblyBuilder();
-			TestSuite suite = builder.Build( "mock-assembly.dll", true );
+			TestSuite suite = builder.Build( MockAssembly.AssemblyPath, true );
 			TestResult result = suite.Run( NullListener.NULL, filter );
 			ResultSummarizer summarizer = new ResultSummarizer( result );
-			Assert.AreEqual( MockAssembly.Tests - MockAssembly.NotRun - 2, summarizer.ResultCount );
+			Assert.AreEqual( MockAssembly.TestsRun - 2, summarizer.TestsRun );
 		}
 
 		[Test]
@@ -122,21 +127,21 @@ namespace NUnit.Core.Tests
 			Assert.AreEqual(1, tests.Count);
 			TestSuite testSuite = (TestSuite)tests[0];
 
-			Assert.AreEqual( RunState.NotRunnable, testSuite.RunState );
-			Assert.AreEqual(testSuite.TestName.Name + " does not have any tests", testSuite.IgnoreReason);
+            // NOTE: Beginning with NUnit 2.5.3, a suite with no tests is now runnable
+			Assert.AreEqual( RunState.Runnable, testSuite.RunState );
+			//Assert.AreEqual(testSuite.TestName.Name + " does not have any tests", testSuite.IgnoreReason);
 		}
 
 		[Test]
 		public void RunNoTestSuite()
 		{
 			Assert.AreEqual(0, noTestSuite.TestCount);
-			
-			TestResult result = noTestSuite.Run(NullListener.NULL);
+
+            TestResult result = noTestSuite.Run(NullListener.NULL, TestFilter.Empty);
 
 			ResultSummarizer summarizer = new ResultSummarizer(result);
-			Assert.AreEqual(0, summarizer.ResultCount);
+			Assert.AreEqual(0, summarizer.TestsRun);
 			Assert.AreEqual(0, summarizer.TestsNotRun);
-			Assert.AreEqual(1, summarizer.SuitesNotRun);
 		}
 
 		[Test]
@@ -164,9 +169,9 @@ namespace NUnit.Core.Tests
 			testSuite.Add(mockTestFixture);
 			
 			RecordingListener listener = new RecordingListener();
-			testSuite.Run(listener);
+            testSuite.Run(listener, TestFilter.Empty);
 
-			Assert.AreEqual(MockTestFixture.Tests - MockTestFixture.Explicit, listener.testStarted.Count);
+			Assert.AreEqual(MockTestFixture.ResultCount, listener.testStarted.Count);
 			Assert.AreEqual(2, listener.suiteStarted.Count);
 		}
 
@@ -177,8 +182,8 @@ namespace NUnit.Core.Tests
 			testSuite.Add(mockTestFixture);
 			Assert.AreEqual(MockTestFixture.Tests, testSuite.TestCount);
 			
-			NUnit.Core.TestCase mock3 = (NUnit.Core.TestCase) TestFinder.Find("MockTest3", testSuite);
-			NUnit.Core.TestCase mock1 = (NUnit.Core.TestCase) TestFinder.Find("MockTest1", testSuite);
+			Test mock3 = TestFinder.Find("MockTest3", testSuite, true);
+			Test mock1 = TestFinder.Find("MockTest1", testSuite, true);
 			NameFilter filter = new NameFilter(mock3.TestName);
 			Assert.AreEqual(1, testSuite.CountTestCases(filter));
 
@@ -190,7 +195,7 @@ namespace NUnit.Core.Tests
 
 			filter = new NameFilter(testSuite.TestName);
 
-			Assert.AreEqual(MockTestFixture.Tests - MockTestFixture.Explicit, testSuite.CountTestCases(filter));
+			Assert.AreEqual(MockTestFixture.ResultCount, testSuite.CountTestCases(filter));
 		}
 
 		[Test]
@@ -217,9 +222,13 @@ namespace NUnit.Core.Tests
 			CategoryFilter filter = new CategoryFilter();
 			filter.AddCategory("MockCategory");
 			RecordingListener listener = new RecordingListener();
-			testSuite.Run(listener, new NotFilter( filter ) );
+            NotFilter notFilter = new NotFilter(filter);
+            notFilter.TopLevel = true;
+			testSuite.Run(listener, notFilter);
 			CollectionAssert.AreEquivalent( 
-				new string[] { "MockTest1", "MockTest4", "MockTest5", "TestWithManyProperties" },
+				new string[] { "MockTest1", "MockTest4", "MockTest5", 
+                    "TestWithManyProperties", "NotRunnableTest", "FailingTest", 
+                    "TestWithException", "InconclusiveTest" },
 				listener.testStarted );
 		}
 
@@ -233,7 +242,7 @@ namespace NUnit.Core.Tests
 			filter.AddCategory("FixtureCategory");
 			RecordingListener listener = new RecordingListener();
 			testSuite.Run(listener, filter);
-			Assert.AreEqual(MockTestFixture.Tests - MockTestFixture.Explicit, listener.testStarted.Count);
+			Assert.AreEqual(MockTestFixture.ResultCount, listener.testStarted.Count);
 		}
 
 		[Test]
@@ -299,7 +308,7 @@ namespace NUnit.Core.Tests
 			testStarted.Add(testName.Name);
 		}
 			
-		public void TestFinished(TestCaseResult result)
+		public void TestFinished(TestResult result)
 		{
 			testFinished.Add(result.Name);
 			lastResult = result;
@@ -310,7 +319,7 @@ namespace NUnit.Core.Tests
 			suiteStarted.Add(suiteName.Name);
 		}
 
-		public void SuiteFinished(TestSuiteResult result)
+		public void SuiteFinished(TestResult result)
 		{
 			suiteFinished.Add(result.Name);
 		}
diff --git a/src/NUnitCore/tests/TheoryTests.cs b/src/NUnitCore/tests/TheoryTests.cs
new file mode 100644
index 0000000..246e31f
--- /dev/null
+++ b/src/NUnitCore/tests/TheoryTests.cs
@@ -0,0 +1,134 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using NUnit.TestUtilities;
+using NUnit.TestData;
+
+namespace NUnit.Core.Tests
+{
+    public class TheoryTests
+    {
+        static Type fixtureType = typeof(TheoryFixture);
+
+        [Test]
+        public void TheoryWithNoArgumentsIsTreatedAsTest()
+        {
+            TestAssert.IsRunnable(fixtureType, "TheoryWithNoArguments");
+        }
+
+        [Test]
+        public void TheoryWithNoDatapointsIsNotRunnable()
+        {
+            TestAssert.IsNotRunnable(fixtureType, "TheoryWithArgumentsButNoDatapoints");
+        }
+
+        [Test]
+        public void BooleanArgumentsAreSuppliedAutomatically()
+        {
+            Test test = TestBuilder.MakeTestCase(fixtureType, "TestWithBooleanArguments");
+            TestAssert.IsRunnable(test);
+            Assert.That(test.TestCount, Is.EqualTo(4));
+        }
+
+        [Theory]
+        public void NullDatapointIsOK(object o)
+        {
+        }
+
+        [Datapoint]
+        internal object objData = null;
+
+        [Test]
+        public void EnumArgumentsAreSuppliedAutomatically()
+        {
+            Test test = TestBuilder.MakeTestCase(fixtureType, "TestWithEnumAsArgument");
+            TestAssert.IsRunnable(test);
+            Assert.That(test.TestCount, Is.EqualTo(3));
+        }
+
+        [Test]
+        public void TheoryWithDatapointsIsRunnable()
+        {
+            Test test = TestBuilder.MakeTestCase(fixtureType, "TheoryWithArgumentsAndDatapoints");
+            TestAssert.IsRunnable(test);
+            Assert.That(test.TestCount, Is.EqualTo(9));
+        }
+
+        [Theory]
+        public void SquareRootWithAllGoodValues(
+            [Values(12.0, 4.0, 9.0)] double d)
+        {
+            SquareRootTest(d);
+        }
+
+        [Theory]
+        public void SquareRootWithOneBadValue(
+            [Values(12.0, -4.0, 9.0)] double d)
+        {
+            SquareRootTest(d);
+        }
+
+        [Datapoints]
+        internal string[] vals = new string[] { "xyz1", "xyz2", "xyz3" };
+
+        [Theory]
+        public void ArrayWithDatapointsAttributeIsUsed(string s)
+        {
+            Assert.That(s.StartsWith("xyz"));
+        }
+
+        //[Datapoint]
+        //public double[,] Array2X2 = new double[,] { { 1, 0 }, { 0, 1 } };
+
+        //[Theory]
+        //public void TestForArbitraryArray<T>(T[,] array)
+        //{
+        //}
+
+
+        private void SquareRootTest(double d)
+        {
+            Assume.That(d > 0);
+            double root = Math.Sqrt(d);
+            Assert.That(root * root, Is.EqualTo(d).Within(0.000001));
+            Assert.That(root > 0);
+        }
+
+        [Test]
+        public void SimpleTestIgnoresDataPoints()
+        {
+            Test test = TestBuilder.MakeTestCase(fixtureType, "TestWithArguments");
+            Assert.That(test.TestCount, Is.EqualTo(2));
+        }
+
+        [Theory]
+        public void TheoryFailsIfAllTestsAreInconclusive()
+        {
+            TestResult result = TestBuilder.RunTestCase(fixtureType, "TestWithAllBadValues");
+            Assert.That(result.ResultState, Is.EqualTo(ResultState.Failure));
+            Assert.That(result.Message, Is.EqualTo("All test cases were inconclusive"));
+        }
+
+        public class SqrtTests_DisplayResults
+        {
+            [Datapoints]
+            public double[] values = new double[] { 0.0, 1.0, -1.0, double.MaxValue, double.PositiveInfinity };
+
+            [Theory]
+            public void SqrtTimesItselfGivesOriginal(double num)
+            {
+                Assume.That(num >= 0.0 && num < double.MaxValue);
+
+                double sqrt = Math.Sqrt(num);
+
+                Assert.That(sqrt >= 0.0);
+                Assert.That(sqrt * sqrt, Is.EqualTo(num).Within(0.000001));
+            }
+        }
+    }
+}
diff --git a/src/NUnitCore/tests/ThreadedTestRunnerTests.cs b/src/NUnitCore/tests/ThreadedTestRunnerTests.cs
index 49aa041..92382a4 100644
--- a/src/NUnitCore/tests/ThreadedTestRunnerTests.cs
+++ b/src/NUnitCore/tests/ThreadedTestRunnerTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitCore/tests/ThreadingTests.cs b/src/NUnitCore/tests/ThreadingTests.cs
new file mode 100644
index 0000000..655f5ef
--- /dev/null
+++ b/src/NUnitCore/tests/ThreadingTests.cs
@@ -0,0 +1,161 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Threading;
+using NUnit.Framework;
+using NUnit.TestUtilities;
+using NUnit.TestData;
+
+namespace NUnit.Core.Tests
+{
+    public class ThreadingTests
+    {
+        Thread parentThread;
+        ApartmentState parentThreadApartment;
+
+        Thread setupThread;
+
+        [TestFixtureSetUp]
+        public void GetParentThreadInfo()
+        {
+			this.parentThread = Thread.CurrentThread;
+			this.parentThreadApartment = parentThread.ApartmentState;
+        }
+
+        [SetUp]
+        public void GetSetUpThreadInfo()
+        {
+            this.setupThread = Thread.CurrentThread;
+        }
+
+        [Test, Timeout(50)]
+        public void TestWithTimeoutRunsOnSeparateThread()
+        {
+            Assert.That(Thread.CurrentThread, Is.Not.EqualTo(parentThread));
+        }
+
+        [Test, Timeout(50)]
+        public void TestWithTimeoutRunsSetUpAndTestOnSameThread()
+        {
+            Assert.That(Thread.CurrentThread, Is.EqualTo(setupThread));
+        }
+
+        [Test]
+        public void TestWithInfiniteLoopTimesOut()
+        {
+            TestResult result = TestBuilder.RunTestCase(
+                typeof(ThreadingFixture), "InfiniteLoopWith50msTimeout");
+            Assert.That(result.ResultState, Is.EqualTo(ResultState.Failure));
+            Assert.That(result.Message, Text.Contains("50ms"));
+        }
+
+        [Test, STAThread]
+        public void TestWithSTAThreadRunsInSTA()
+        {
+            Assert.That(Thread.CurrentThread.ApartmentState, Is.EqualTo(ApartmentState.STA));
+            if (parentThreadApartment == ApartmentState.STA)
+                Assert.That(Thread.CurrentThread, Is.EqualTo(parentThread));
+        }
+
+        [Test, MTAThread]
+        public void TestWithMTAThreadRunsInMTA()
+        {
+            Assert.That(Thread.CurrentThread.ApartmentState, Is.EqualTo(ApartmentState.MTA));
+            if (parentThreadApartment == ApartmentState.MTA)
+                Assert.That(Thread.CurrentThread, Is.EqualTo(parentThread));
+        }
+
+        [Test, RequiresSTA]
+        public void TestWithRequiresSTARunsInSTA()
+        {
+            Assert.That(Thread.CurrentThread.ApartmentState, Is.EqualTo(ApartmentState.STA));
+            if (parentThreadApartment == ApartmentState.STA)
+                Assert.That(Thread.CurrentThread, Is.EqualTo(parentThread));
+        }
+
+        [Test, RequiresMTA]
+        public void TestWithRequiresMTARunsInMTA()
+        {
+            Assert.That(Thread.CurrentThread.ApartmentState, Is.EqualTo(ApartmentState.MTA));
+            if (parentThreadApartment == ApartmentState.MTA)
+                Assert.That(Thread.CurrentThread, Is.EqualTo(parentThread));
+        }
+
+        [Test, RequiresThread]
+        public void TestWithRequiresThreadRunsInSeparateThread()
+        {
+            Assert.That(Thread.CurrentThread, Is.Not.EqualTo(parentThread));
+        }
+
+        [Test, RequiresThread]
+        public void TestWithRequiresThreadRunsSetUpAndTestOnSameThread()
+        {
+            Assert.That(Thread.CurrentThread, Is.EqualTo(setupThread));
+        }
+
+        [Test, RequiresThread(ApartmentState.STA)]
+        public void TestWithRequiresThreadWithSTAArgRunsOnSeparateThreadInSTA()
+        {
+            Assert.That(Thread.CurrentThread.ApartmentState, Is.EqualTo(ApartmentState.STA));
+            Assert.That(Thread.CurrentThread, Is.Not.EqualTo(parentThread));
+        }
+
+        [Test, RequiresThread(ApartmentState.MTA)]
+        public void TestWithRequiresThreadWithMTAArgRunsOnSeparateThreadInMTA()
+        {
+            Assert.That(Thread.CurrentThread.ApartmentState, Is.EqualTo(ApartmentState.MTA));
+            Assert.That(Thread.CurrentThread, Is.Not.EqualTo(parentThread));
+        }
+		
+		[Test]
+		public void TestOnSeparateThreadReportsAssertCountCorrectly()
+		{
+			TestResult result = TestBuilder.RunTestCase(typeof(ThreadingFixture), "MethodWithThreeAsserts");
+			Assert.That(result.AssertCount, Is.EqualTo(3));
+		}
+
+        [Test]
+        public void TimeoutCanBeSetOnTestFixture()
+        {
+            TestResult result = TestBuilder.RunTestFixture(typeof(ThreadingFixtureWithTimeout));
+            Assert.That(result.ResultState, Is.EqualTo(ResultState.Failure));
+            result = TestFinder.Find("Test2WithInfiniteLoop", result, false);
+            Assert.That(result.ResultState, Is.EqualTo(ResultState.Failure));
+            Assert.That(result.Message, Text.Contains("50ms"));
+        }
+
+        [TestFixture, RequiresSTA]
+        class FixtureRequiresSTA
+        {
+            [Test]
+            public void RequiresSTACanBeSetOnTestFixture()
+            {
+                Assert.That(Thread.CurrentThread.ApartmentState, Is.EqualTo(ApartmentState.STA));
+            }
+        }
+
+        [TestFixture, RequiresMTA]
+        class FixtureRequiresMTA
+        {
+            [Test]
+            public void RequiresMTACanBeSetOnTestFixture()
+            {
+                Assert.That(Thread.CurrentThread.ApartmentState, Is.EqualTo(ApartmentState.MTA));
+            }
+        }
+
+        [TestFixture, RequiresThread]
+        class FixtureRequiresThread
+        {
+            [Test]
+            public void RequiresThreadCanBeSetOnTestFixture()
+            {
+                Assert.That(Environment.StackTrace, Text.Contains("TestThread.RunTestProc"));
+            }
+        }
+    }
+}
diff --git a/src/NUnitCore/tests/TypeHelperTests.cs b/src/NUnitCore/tests/TypeHelperTests.cs
new file mode 100644
index 0000000..8c93c75
--- /dev/null
+++ b/src/NUnitCore/tests/TypeHelperTests.cs
@@ -0,0 +1,39 @@
+using System;
+#if NET_2_0
+using System.Collections.Generic;
+#endif
+using NUnit.Framework;
+using NUnit.TestData.TypeHelperFixture;
+
+namespace NUnit.Core.Tests
+{
+    [TestFixture]
+    public class TypeHelperTests
+    {
+        [TestCase(typeof(int), "Int32")]
+        [TestCase(typeof(SimpleClass), "SimpleClass")]
+        [TestCase(typeof(MyNoNamespaceClass), "MyNoNamespaceClass")]
+#if NET_2_0
+        [TestCase(typeof(GenericClass<int, decimal, string>), "GenericClass<Int32,Decimal,String>")]
+        [TestCase(typeof(GenericClass<int[], decimal[], string[]>), "GenericClass<Int32[],Decimal[],String[]>")]
+        [TestCase(typeof(ContainerClass.NestedClass), "ContainerClass+NestedClass")]
+        [TestCase(typeof(ContainerClass.NestedClass.DoublyNestedClass), "ContainerClass+NestedClass+DoublyNestedClass")]
+        [TestCase(typeof(ContainerClass.NestedClass.DoublyNestedGeneric<int>), "ContainerClass+NestedClass+DoublyNestedGeneric<Int32>")]
+        [TestCase(typeof(ContainerClass.NestedGeneric<int>), "ContainerClass+NestedGeneric<Int32>")]
+        [TestCase(typeof(ContainerClass.NestedGeneric<int>.DoublyNestedClass), "ContainerClass+NestedGeneric+DoublyNestedClass<Int32>")]
+        [TestCase(typeof(ContainerClass.NestedGeneric<string>.DoublyNestedGeneric<int>), "ContainerClass+NestedGeneric+DoublyNestedGeneric<String,Int32>")]
+        [TestCase(typeof(GenericContainerClass<string>.NestedClass), "GenericContainerClass+NestedClass<String>")]
+        [TestCase(typeof(GenericContainerClass<string>.NestedClass.DoublyNestedClass), "GenericContainerClass+NestedClass+DoublyNestedClass<String>")]
+        [TestCase(typeof(GenericContainerClass<string>.NestedClass.DoublyNestedGeneric<bool>), "GenericContainerClass+NestedClass+DoublyNestedGeneric<String,Boolean>")]
+        [TestCase(typeof(GenericContainerClass<string>.NestedGeneric<int>), "GenericContainerClass+NestedGeneric<String,Int32>")]
+        [TestCase(typeof(GenericContainerClass<string>.NestedGeneric<int>.DoublyNestedClass), "GenericContainerClass+NestedGeneric+DoublyNestedClass<String,Int32>")]
+        [TestCase(typeof(GenericContainerClass<string>.NestedGeneric<int>.DoublyNestedGeneric<bool>), "GenericContainerClass+NestedGeneric+DoublyNestedGeneric<String,Int32,Boolean>")]
+        [TestCase(typeof(ListTester<List<int>>), "ListTester<List<Int32>>")]
+        [TestCase(typeof(ListTester<List<List<int>>>), "ListTester<List<List<Int32>>>")]
+#endif
+        public void GetDisplayName(Type type, string name)
+        {
+            Assert.That(TypeHelper.GetDisplayName(type), Is.EqualTo(name));
+        }
+    }
+}
diff --git a/src/NUnitCore/tests/UnhandledExceptionTests.cs b/src/NUnitCore/tests/UnhandledExceptionTests.cs
index 8c651b6..5ff75b5 100644
--- a/src/NUnitCore/tests/UnhandledExceptionTests.cs
+++ b/src/NUnitCore/tests/UnhandledExceptionTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -26,7 +26,7 @@ namespace NUnit.Core.Tests
         {
             Type fixtureType = typeof(NUnit.TestData.UnhandledExceptions);
             Test test = TestBuilder.MakeTestCase(fixtureType, dummyName);
-            TestResult result = test.Run(NullListener.NULL);
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
             if (shouldPass)
                 Assert.IsTrue(result.IsSuccess, "{0} test should have passed", dummyName);
             else
diff --git a/src/NUnitCore/tests/ValueSourceTests.cs b/src/NUnitCore/tests/ValueSourceTests.cs
new file mode 100644
index 0000000..edafe95
--- /dev/null
+++ b/src/NUnitCore/tests/ValueSourceTests.cs
@@ -0,0 +1,161 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using NUnit.Framework;
+using NUnit.TestData;
+using NUnit.TestUtilities;
+using System.Collections;
+#if NET_2_0
+using System.Collections.Generic;
+#endif
+
+namespace NUnit.Core.Tests
+{
+    [TestFixture]
+    public class ValueSourceTests
+    {
+        [Test]
+        public void ValueSourceCanBeStaticProperty(
+            [ValueSource("StaticProperty")] string source)
+        {
+            Assert.AreEqual("StaticProperty", source);
+        }
+
+        static IEnumerable StaticProperty
+        {
+            get 
+            {
+#if NET_2_0
+                yield return "StaticProperty";
+#else
+                return new object[] { "StaticProperty" }; 
+#endif
+            }
+        }
+
+        [Test]
+        public void ValueSourceCanBeInstanceProperty(
+            [ValueSource("InstanceProperty")] string source)
+        {
+            Assert.AreEqual("InstanceProperty", source);
+        }
+
+        IEnumerable InstanceProperty
+        {
+            get { return new object[] { "InstanceProperty" }; }
+        }
+
+        [Test]
+        public void ValueSourceCanBeStaticMethod(
+            [ValueSource("StaticMethod")] string source)
+        {
+            Assert.AreEqual("StaticMethod", source);
+        }
+
+        static IEnumerable StaticMethod()
+        {
+            return new object[] { "StaticMethod" };
+        }
+
+        [Test]
+        public void ValueSourceCanBeInstanceMethod(
+            [ValueSource("InstanceMethod")] string source)
+        {
+            Assert.AreEqual("InstanceMethod", source);
+        }
+
+        IEnumerable InstanceMethod()
+        {
+            return new object[] { "InstanceMethod" };
+        }
+
+        [Test]
+        public void ValueSourceCanBeStaticField(
+            [ValueSource("StaticField")] string source)
+        {
+            Assert.AreEqual("StaticField", source);
+        }
+
+        internal static object[] StaticField = { "StaticField" };
+
+        [Test]
+        public void ValueSourceCanBeInstanceField(
+            [ValueSource("InstanceField")] string source)
+        {
+            Assert.AreEqual("InstanceField", source);
+        }
+
+        internal static object[] InstanceField = { "InstanceField" };
+
+        [Test]
+        public void ValueSourceIsInvokedWithCorrectCurrentDirectory(
+            [ValueSource("CheckCurrentDirectory")] bool isOK)
+        {
+            Assert.That(isOK);
+        }
+
+        private static IEnumerable CheckCurrentDirectory
+        {
+            get
+            {
+                return new object[] { System.IO.File.Exists("nunit.core.tests.dll") };
+            }
+        }
+
+        [Test, Sequential]
+        public void MultipleArguments(
+            [ValueSource("Numerators")] int n, 
+            [ValueSource("Denominators")] int d, 
+            [ValueSource("Quotients")] int q)
+        {
+            Assert.AreEqual(q, n / d);
+        }
+
+        internal static int[] Numerators = new int[] { 12, 12, 12 };
+        internal static int[] Denominators = new int[] { 3, 4, 6 };
+        internal static int[] Quotients = new int[] { 4, 3, 2 };
+
+        [Test, Sequential]
+        public void ValueSourceMayBeInAnotherClass(
+            [ValueSource(typeof(DivideDataProvider), "Numerators")] int n,
+            [ValueSource(typeof(DivideDataProvider), "Denominators")] int d,
+            [ValueSource(typeof(DivideDataProvider), "Quotients")] int q)
+        {
+            Assert.AreEqual(q, n / d);
+        }
+
+        private class DivideDataProvider
+        {
+            internal static int[] Numerators = new int[] { 12, 12, 12 };
+            internal static int[] Denominators = new int[] { 3, 4, 6 };
+            internal static int[] Quotients = new int[] { 4, 3, 2 };
+        }
+
+#if NET_2_0
+        [Test]
+        public void ValueSourceMayBeGeneric(
+            [ValueSourceAttribute(typeof(ValueProvider), "IntegerProvider")] int val)
+        {
+            Assert.That(2 * val, Is.EqualTo(val + val));
+        }
+
+        public class ValueProvider
+        {
+            public IEnumerable<int> IntegerProvider()
+            {
+                List<int> dataList = new List<int>();
+
+                dataList.Add(1);
+                dataList.Add(2);
+                dataList.Add(4);
+                dataList.Add(8);
+
+                return dataList;
+            }
+        }
+#endif
+    }
+}
diff --git a/src/NUnitCore/tests/XmlTest.cs b/src/NUnitCore/tests/XmlTest.cs
index 0919346..d4ef5ec 100644
--- a/src/NUnitCore/tests/XmlTest.cs
+++ b/src/NUnitCore/tests/XmlTest.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;	
@@ -97,15 +97,13 @@ namespace NUnit.Core.Tests
 
 		private void runSchemaValidatorTest(string reportFileName)
 		{
-			string testsDll = "mock-assembly.dll";
+            string testsDll = NUnit.Tests.Assemblies.MockAssembly.AssemblyPath;
 			TestSuiteBuilder builder = new TestSuiteBuilder();
 			Test suite = builder.Build( new TestPackage( testsDll ) );
 
-			TestResult result = suite.Run(NullListener.NULL);
+            TestResult result = suite.Run(NullListener.NULL, TestFilter.Empty);
 
-			XmlResultVisitor visitor = new XmlResultVisitor(reportFileName, result);
-			result.Accept(visitor);
-			visitor.Write();
+			new XmlResultWriter(reportFileName).SaveTestResult(result);
 
 			SchemaValidator validator = new SchemaValidator(reportFileName, schemaFile.Path);
 			Assert.IsTrue(validator.Validate(), "validate failed");
@@ -113,15 +111,13 @@ namespace NUnit.Core.Tests
 
 		private void runSchemaValidatorTest(TextWriter writer)
 		{
-			string testsDll = "mock-assembly.dll";
+            string testsDll = NUnit.Tests.Assemblies.MockAssembly.AssemblyPath;
 			TestSuiteBuilder builder = new TestSuiteBuilder();
 			Test suite = builder.Build( new TestPackage( testsDll ) );
 
-			TestResult result = suite.Run(NullListener.NULL);
+            TestResult result = suite.Run(NullListener.NULL, TestFilter.Empty);
 	
-			XmlResultVisitor visitor = new XmlResultVisitor(writer, result);
-			result.Accept(visitor);
-			visitor.Write();
+			new XmlResultWriter(writer).SaveTestResult(result);
 		}
 
 		private string tempFile;
diff --git a/src/NUnitCore/tests/nunit.core.tests.build b/src/NUnitCore/tests/nunit.core.tests.build
index b822cf3..6392e0c 100644
--- a/src/NUnitCore/tests/nunit.core.tests.build
+++ b/src/NUnitCore/tests/nunit.core.tests.build
@@ -1,26 +1,28 @@
 <?xml version="1.0"?>
 <project name="NUnitCoreTests" default="build" basedir=".">
 
-  <target name="build">
-    <csc target="library" 
-       output="${current.build.dir}/nunit.core.tests.dll"
-       debug="${build.debug}" 
-       define="${build.defines}">
-      <nowarn>
-        <warning number="618,672"/>
-      </nowarn>
-      <sources>
+  <patternset id="source-files">
+        <include name="Generic/DeduceTypeArgsFromArgs.cs"/>
+        <include name="Generic/SimpleGenericFixture.cs"/>
+        <include name="Generic/SimpleGenericMethods.cs"/>
+        <include name="Generic/TypeParameterUsedWithTestMethod.cs"/>
         <include name="AllTests.cs"/>
+        <include name="AssemblyHelperTests.cs"/>
         <include name="AssemblyReaderTests.cs"/>
         <include name="AssemblyResolverTests.cs"/>
         <include name="AssemblyTests.cs"/>
         <include name="AssemblyVersionFixture.cs"/>
+        <include name="AssertPassFixture.cs"/>
         <include name="AttributeDescriptionFixture.cs"/>
+        <include name="AttributeInheritance.cs"/>
         <include name="BasicRunnerTests.cs"/>
         <include name="CallContextTests.cs"/>
         <include name="CategoryAttributeTests.cs"/>
+        <include name="CombinatorialTests.cs"/>
         <include name="CoreExtensionsTests.cs"/>
         <include name="CultureSettingAndDetectionTests.cs"/>
+        <include name="DatapointTests.cs"/>
+        <include name="DirectoryChangeTests.cs"/>
         <include name="DirectorySwapperTests.cs"/>
         <include name="EventQueueTests.cs"/>
         <include name="EventTestFixture.cs"/>
@@ -29,14 +31,21 @@
         <include name="FixtureSetUpTearDownTest.cs"/>
         <include name="IgnoreFixture.cs"/>
         <include name="LegacySuiteTests.cs"/>
+    <include name="MaxTimeTests.cs"/>
         <include name="MockTestRunner.cs"/>
         <include name="NameFilterTest.cs"/>
         <include name="NamespaceAssemblyTests.cs"/>
+        <include name="PairwiseTests.cs"/>
+        <include name="ParameterizedTestCaseTests.cs"/>
+        <include name="ParameterizedTestFixtureTests.cs"/>
         <include name="PlatformDetectionTests.cs"/>
         <include name="PropertyAttributeTests.cs"/>
         <include name="ReflectTests.cs"/>
         <include name="RemoteRunnerTests.cs"/>
+        <include name="RepeatedTestFixture.cs"/>
+        <include name="RuntimeFrameworkTests.cs"/>
         <include name="SerializationBug.cs"/>
+        <include name="SetCultureAttributeTests.cs"/>
         <include name="SetUpFixtureTests.cs"/>
         <include name="SetUpTest.cs"/>
         <include name="SimpleNameFilterTests.cs"/>
@@ -45,40 +54,59 @@
         <include name="SuiteBuilderTests.cs"/>
         <include name="SuiteBuilderTests_Multiple.cs"/>
         <include name="TestAssemblyBuilderTests.cs"/>
+        <include name="TestCaseAttributeTests.cs"/>
         <include name="TestCaseResultFixture.cs"/>
+        <include name="TestCaseSourceTests.cs"/>
         <include name="TestCaseTest.cs"/>
-        <include name="TestConsole.cs"/>
-        <include name="TestContextTests.cs"/>
-        <include name="TestDelegateFixture.cs"/>
+    <include name="TestContextTests.cs"/>
+    <include name="TestConsole.cs"/>
+    <include name="TestDelegateFixture.cs"/>
+        <include name="TestExecutionContextTests.cs"/>
         <include name="TestFixtureBuilderTests.cs"/>
         <include name="TestFixtureExtension.cs"/>
         <include name="TestFixtureTests.cs"/>
         <include name="TestFrameworkTests.cs"/>
         <include name="TestIDTests.cs"/>
         <include name="TestInfoTests.cs"/>
+        <include name="TestMethodSignatureTests.cs"/>
         <include name="TestNameTests.cs"/>
         <include name="TestNodeTests.cs"/>
         <include name="TestRunnerThreadTests.cs"/>
-        <include name="TestSuiteResultFixture.cs"/>
         <include name="TestSuiteTest.cs"/>
+        <include name="TheoryTests.cs"/>
         <include name="ThreadedTestRunnerTests.cs"/>
+        <include name="ThreadingTests.cs"/>
+        <include name="TypeHelperTests.cs"/>
         <include name="UnhandledExceptionTests.cs"/>
+        <include name="ValueSourceTests.cs"/>
         <include name="XmlTest.cs"/>
-        <include name="../../CommonAssemblyInfo.cs"/>
+  </patternset>
+
+  <target name="build">
+    <csc target="library" 
+       output="${current.test.dir}/nunit.core.tests.dll"
+       debug="${build.debug}" 
+       define="${build.defines}">
+      <nowarn>
+        <warning number="618,672"/>
+      </nowarn>
+      <sources>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
       </sources>
       <resources prefix="NUnit.Core.Tests">
-        <include name="../core/Results.xsd"/>
+        <include name="Results.xsd"/>
       </resources>
-      <references basedir="${current.build.dir}">
-        <include name="nunit.framework.dll"/>
-        <include name="nunit.core.interfaces.dll"/>
-        <include name="nunit.core.dll"/>
-        <include name="nunit.util.dll"/>
-        <include name="nunit.mocks.dll"/>
-        <include name="test-assembly.dll"/>
-        <include name="test-utilities.dll"/>
-        <include name="mock-assembly.dll"/>
-        <include name="nonamespace-assembly.dll"/>
+      <references>
+        <include name="${current.framework.dir}/nunit.framework.dll"/>
+        <include name="${current.framework.dir}/nunit.mocks.dll"/>
+        <include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
+        <include name="${current.lib.dir}/nunit.core.dll"/>
+        <include name="${current.lib.dir}/nunit.util.dll"/>
+        <include name="${current.test.dir}/test-assembly.dll"/>
+        <include name="${current.test.dir}/test-utilities.dll"/>
+        <include name="${current.test.dir}/mock-assembly.dll"/>
+        <include name="${current.test.dir}/nonamespace-assembly.dll"/>
         <include name="System.Data.dll"/>
       </references>
     </csc>
@@ -86,7 +114,12 @@
 
   <target name="package">
     <copy todir="${package.src.dir}/NUnitCore/tests">
-      <fileset refid="source-files" />
+      <fileset>
+        <patternset refid="source-files"/>
+        <include name="Results.xsd"/>
+        <include name="nunit.core.tests.csproj"/>
+        <include name="nunit.core.tests.build"/>
+      </fileset>
     </copy>
   </target>
 
diff --git a/src/NUnitCore/tests/nunit.core.tests.csproj b/src/NUnitCore/tests/nunit.core.tests.csproj
index e35c3f2..827499c 100644
--- a/src/NUnitCore/tests/nunit.core.tests.csproj
+++ b/src/NUnitCore/tests/nunit.core.tests.csproj
@@ -1,433 +1,240 @@
-<VisualStudioProject>
-    <CSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{DD758D21-E5D5-4D40-9450-5F65A32F359C}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = ""
-                AssemblyKeyContainerName = ""
-                AssemblyName = "nunit.core.tests"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "Library"
-                PreBuildEvent = ""
-                PostBuildEvent = ""
-                RootNamespace = "NUnit.Core.Tests"
-                RunPostBuildEvent = "OnBuildSuccess"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "true"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = "618"
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-                <Config
-                    Name = "Release"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "false"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "System"
-                    AssemblyName = "System"
-                    HintPath = "E:\WINNT\Microsoft.NET\Framework\v1.1.4322\System.dll"
-                />
-                <Reference
-                    Name = "System.Data"
-                    AssemblyName = "System.Data"
-                    HintPath = "E:\WINNT\Microsoft.NET\Framework\v1.1.4322\System.Data.dll"
-                />
-                <Reference
-                    Name = "System.XML"
-                    AssemblyName = "System.Xml"
-                    HintPath = "E:\WINNT\Microsoft.NET\Framework\v1.1.4322\System.XML.dll"
-                />
-                <Reference
-                    Name = "nunit.core.dll"
-                    Project = "{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.framework.dll"
-                    Project = "{83DD7E12-A705-4DBA-9D71-09C8973D9382}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nonamespace-assembly"
-                    Project = "{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.util.dll"
-                    Project = "{61CE9CE5-943E-44D4-A381-814DC1406767}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "mock-assembly"
-                    Project = "{2E368281-3BA8-4050-B05E-0E0E43F8F446}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.mocks"
-                    Project = "{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "test-utilities"
-                    Project = "{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "test-assembly"
-                    Project = "{1960CAC4-9A82-47C5-A9B3-55BC37572C3C}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.core.interfaces.dll"
-                    Project = "{435428F8-5995-4CE4-8022-93D595A8CC0F}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "notestfixtures-assembly"
-                    Project = "{8D330DE4-B980-4A57-9F07-E9F7A7A33F4F}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-            </References>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "AllTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "AssemblyReaderTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "AssemblyResolverTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "AssemblyTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "AssemblyVersionFixture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "AttributeDescriptionFixture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "AttributeInheritance.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "BasicRunnerTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CallContextTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CategoryAttributeTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CommonAssemblyInfo.cs"
-                    Link = "..\..\CommonAssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CoreExtensionsTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CultureSettingAndDetectionTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "DirectorySwapperTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "EventQueueTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "EventTestFixture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ExpectExceptionTest.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "FailFixture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "FixtureSetupTearDownTest.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "IgnoreFixture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "LegacySuiteTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "MockTestRunner.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "NameFilterTest.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "NamespaceAssemblyTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "PlatformDetectionTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "PropertyAttributeTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ReflectTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RemoteRunnerTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Results.xsd"
-                    Link = "..\core\Results.xsd"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "Results.xsx"
-                    Link = "..\core\Results.xsx"
-                    DependentUpon = "Results.xsd"
-                    BuildAction = "None"
-                />
-                <File
-                    RelPath = "SerializationBug.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SetUpFixtureTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SetUpTest.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SimpleNameFilterTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SimpleTestRunnerTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "StackOverflowTestFixture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SuiteBuilderTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SuiteBuilderTests_Multiple.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestAssemblyBuilderTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestCaseResultFixture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestCaseTest.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestConsole.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestContextTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestDelegateFixture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestFixtureBuilderTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestFixtureExtension.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestFixtureTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestFrameworkTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestIdTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestInfoTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestNameTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestNodeTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestRunnerThreadTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestSuiteResultFixture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestSuiteTest.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ThreadedTestRunnerTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "UnhandledExceptionTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "XmlTest.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                    CustomToolNamespace = "NUnit.Core.Tests"
-                />
-            </Include>
-        </Files>
-    </CSHARP>
-</VisualStudioProject>
-
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{DD758D21-E5D5-4D40-9450-5F65A32F359C}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit.core.tests</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.Core.Tests</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <PublishUrl>http://localhost/nunit.core.tests/</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Web</InstallFrom>
+    <UpdateEnabled>true</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>true</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG;NET_2_0;CS_3_0</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>618</NoWarn>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;NET_2_0</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>618</NoWarn>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
+      <Name>nunit.util.dll</Name>
+      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
+      <Name>nunit.framework.dll</Name>
+      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitMocks\mocks\nunit.mocks.csproj">
+      <Name>nunit.mocks</Name>
+      <Project>{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\tests\mock-assembly\mock-assembly.csproj">
+      <Name>mock-assembly</Name>
+      <Project>{2E368281-3BA8-4050-B05E-0E0E43F8F446}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\tests\nonamespace-assembly\nonamespace-assembly.csproj">
+      <Name>nonamespace-assembly</Name>
+      <Project>{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\tests\test-assembly\test-assembly.csproj">
+      <Name>test-assembly</Name>
+      <Project>{1960CAC4-9A82-47C5-A9B3-55BC37572C3C}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\..\tests\test-utilities\test-utilities.csproj">
+      <Name>test-utilities</Name>
+      <Project>{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\core\nunit.core.dll.csproj">
+      <Name>nunit.core.dll</Name>
+      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\interfaces\nunit.core.interfaces.dll.csproj">
+      <Name>nunit.core.interfaces.dll</Name>
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="AllTests.cs" />
+    <Compile Include="AssemblyHelperTests.cs" />
+    <Compile Include="AssemblyReaderTests.cs" />
+    <Compile Include="AssemblyResolverTests.cs" />
+    <Compile Include="AssemblyTests.cs" />
+    <Compile Include="AssemblyVersionFixture.cs" />
+    <Compile Include="AssertPassFixture.cs" />
+    <Compile Include="AttributeDescriptionFixture.cs" />
+    <Compile Include="AttributeInheritance.cs" />
+    <Compile Include="BasicRunnerTests.cs" />
+    <Compile Include="CallContextTests.cs" />
+    <Compile Include="CategoryAttributeTests.cs" />
+    <Compile Include="CombinatorialTests.cs" />
+    <Compile Include="CoreExtensionsTests.cs" />
+    <Compile Include="CultureSettingAndDetectionTests.cs" />
+    <Compile Include="DatapointTests.cs" />
+    <Compile Include="DirectorySwapperTests.cs" />
+    <Compile Include="EventQueueTests.cs" />
+    <Compile Include="EventTestFixture.cs" />
+    <Compile Include="ExpectExceptionTest.cs" />
+    <Compile Include="FailFixture.cs" />
+    <Compile Include="FixtureSetUpTearDownTest.cs" />
+    <Compile Include="Generic\DeduceTypeArgsFromArgs.cs" />
+    <Compile Include="Generic\SimpleGenericFixture.cs" />
+    <Compile Include="Generic\SimpleGenericMethods.cs" />
+    <Compile Include="Generic\TypeParameterUsedWithTestMethod.cs" />
+    <Compile Include="IgnoreFixture.cs" />
+    <Compile Include="LegacySuiteTests.cs" />
+    <Compile Include="MaxTimeTests.cs" />
+    <Compile Include="MockTestRunner.cs" />
+    <Compile Include="NameFilterTest.cs" />
+    <Compile Include="NamespaceAssemblyTests.cs" />
+    <Compile Include="PairwiseTests.cs" />
+    <Compile Include="ParameterizedTestFixtureTests.cs" />
+    <Compile Include="PlatformDetectionTests.cs" />
+    <Compile Include="PropertyAttributeTests.cs" />
+    <Compile Include="ReflectTests.cs" />
+    <Compile Include="RemoteRunnerTests.cs" />
+    <Compile Include="RepeatedTestFixture.cs" />
+    <Compile Include="RuntimeFrameworkTests.cs" />
+    <Compile Include="SerializationBug.cs" />
+    <Compile Include="SetCultureAttributeTests.cs" />
+    <Compile Include="SetUpFixtureTests.cs" />
+    <Compile Include="SetUpTest.cs" />
+    <Compile Include="SimpleNameFilterTests.cs" />
+    <Compile Include="SimpleTestRunnerTests.cs" />
+    <Compile Include="StackOverflowTestFixture.cs" />
+    <Compile Include="SuiteBuilderTests.cs" />
+    <Compile Include="SuiteBuilderTests_Multiple.cs" />
+    <Compile Include="TestAssemblyBuilderTests.cs" />
+    <Compile Include="TestCaseAttributeTests.cs" />
+    <Compile Include="TestCaseResultFixture.cs" />
+    <Compile Include="TestCaseSourceTests.cs" />
+    <Compile Include="TestCaseTest.cs" />
+    <Compile Include="TestConsole.cs" />
+    <Compile Include="TestContextTests.cs" />
+    <Compile Include="TestDelegateFixture.cs" />
+    <Compile Include="TestExecutionContextTests.cs" />
+    <Compile Include="TestFixtureBuilderTests.cs" />
+    <Compile Include="TestFixtureExtension.cs" />
+    <Compile Include="TestFixtureTests.cs" />
+    <Compile Include="TestFrameworkTests.cs" />
+    <Compile Include="TestIDTests.cs" />
+    <Compile Include="TestInfoTests.cs" />
+    <Compile Include="TestMethodSignatureTests.cs" />
+    <Compile Include="TestNameTests.cs" />
+    <Compile Include="TestNodeTests.cs" />
+    <Compile Include="TestRunnerThreadTests.cs" />
+    <Compile Include="TestSuiteTest.cs" />
+    <Compile Include="TheoryTests.cs" />
+    <Compile Include="ThreadedTestRunnerTests.cs" />
+    <Compile Include="ThreadingTests.cs" />
+    <Compile Include="TypeHelperTests.cs" />
+    <Compile Include="UnhandledExceptionTests.cs" />
+    <Compile Include="ValueSourceTests.cs" />
+    <Compile Include="XmlTest.cs" />
+    <Compile Include="DirectoryChangeTests.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit.core.tests.build" />
+    <EmbeddedResource Include="Results.xsd" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/NUnitCore/tests/nunit.core.tests.dll.config b/src/NUnitCore/tests/nunit.core.tests.dll.config
deleted file mode 100644
index b022e8a..0000000
--- a/src/NUnitCore/tests/nunit.core.tests.dll.config
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<configuration>
-	<appSettings>
-		<!--   User application and configured property settings go here.-->
-		<!--   Example: <add key="settingName" value="settingValue"/> -->
-		<add key="test.setting" value="54321" />
-	</appSettings>
-
-	<!--
-     The following <runtime> section allows running nunit tests under 
-     .NET 1.0 by redirecting assemblies. The appliesTo attribute
-     causes the section to be ignored except under .NET 1.0.
-	-->
-	<runtime>
-		<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
-				appliesTo="v1.0.3705">
-			<dependentAssembly>
-				<assemblyIdentity name="System" publicKeyToken="b77a5c561934e089" culture="" />
-				<bindingRedirect oldVersion="1.0.5000.0" newVersion="1.0.3300.0" />
-			</dependentAssembly>
-			<dependentAssembly>
-				<assemblyIdentity name="System.Data" publicKeyToken="b77a5c561934e089" culture="" />
-				<bindingRedirect oldVersion="1.0.5000.0" newVersion="1.0.3300.0" />
-			</dependentAssembly>
-			<dependentAssembly>
-				<assemblyIdentity name="System.Drawing" publicKeyToken="b03f5f7f11d50a3a" culture="" />
-				<bindingRedirect oldVersion="1.0.5000.0" newVersion="1.0.3300.0" />
-			</dependentAssembly>
-			<dependentAssembly>
-				<assemblyIdentity name="System.Windows.Forms" publicKeyToken="b77a5c561934e089" culture="" />
-				<bindingRedirect oldVersion="1.0.5000.0" newVersion="1.0.3300.0" />
-			</dependentAssembly>
-			<dependentAssembly>
-				<assemblyIdentity name="System.Xml" publicKeyToken="b77a5c561934e089" culture="" />
-				<bindingRedirect oldVersion="1.0.5000.0" newVersion="1.0.3300.0" />
-			</dependentAssembly>
-		</assemblyBinding>
-	</runtime>
-</configuration>
diff --git a/src/NUnitCore/tests/nunit.core.tests_VS2005.csproj b/src/NUnitCore/tests/nunit.core.tests_VS2005.csproj
deleted file mode 100644
index d173574..0000000
--- a/src/NUnitCore/tests/nunit.core.tests_VS2005.csproj
+++ /dev/null
@@ -1,259 +0,0 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>8.0.50727</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{DD758D21-E5D5-4D40-9450-5F65A32F359C}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ApplicationIcon>
-    </ApplicationIcon>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit.core.tests</AssemblyName>
-    <AssemblyOriginatorKeyFile>
-    </AssemblyOriginatorKeyFile>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.Core.Tests</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <StartupObject>
-    </StartupObject>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release2005|AnyCPU' ">
-    <OutputPath>bin\Release2005\</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <Optimize>true</Optimize>
-    <NoWarn>618,1699</NoWarn>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug2005|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\Debug2005\</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <DebugType>full</DebugType>
-    <NoWarn>618,1699</NoWarn>
-    <UseVSHostingProcess>true</UseVSHostingProcess>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll_VS2005.csproj">
-      <Name>nunit.util.dll_VS2005</Name>
-      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
-      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll_VS2005.csproj">
-      <Name>nunit.framework.dll_VS2005</Name>
-      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
-      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitMocks\mocks\nunit.mocks_VS2005.csproj">
-      <Name>nunit.mocks_VS2005</Name>
-      <Project>{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}</Project>
-      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
-    </ProjectReference>
-    <ProjectReference Include="..\..\tests\mock-assembly\mock-assembly_VS2005.csproj">
-      <Name>mock-assembly_VS2005</Name>
-      <Project>{2E368281-3BA8-4050-B05E-0E0E43F8F446}</Project>
-      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
-    </ProjectReference>
-    <ProjectReference Include="..\..\tests\nonamespace-assembly\nonamespace-assembly_VS2005.csproj">
-      <Name>nonamespace-assembly_VS2005</Name>
-      <Project>{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}</Project>
-      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
-    </ProjectReference>
-    <ProjectReference Include="..\..\tests\notestfixtures-assembly\notestfixtures-assembly_VS2005.csproj">
-      <Project>{8D330DE4-B980-4A57-9F07-E9F7A7A33F4F}</Project>
-      <Name>notestfixtures-assembly_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\tests\test-assembly\test-assembly_VS2005.csproj">
-      <Project>{1960CAC4-9A82-47C5-A9B3-55BC37572C3C}</Project>
-      <Name>test-assembly_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\tests\test-utilities\test-utilities_VS2005.csproj">
-      <Name>test-utilities_VS2005</Name>
-      <Project>{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}</Project>
-      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
-    </ProjectReference>
-    <ProjectReference Include="..\core\nunit.core.dll_VS2005.csproj">
-      <Name>nunit.core.dll_VS2005</Name>
-      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
-      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
-    </ProjectReference>
-    <ProjectReference Include="..\interfaces\nunit.core.interfaces.dll_VS2005.csproj">
-      <Project>{DCC88998-255A-4247-B658-71DD932E9873}</Project>
-      <Name>nunit.core.interfaces.dll_VS2005</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="CategoryAttributeTests.cs" />
-    <Compile Include="CoreExtensionsTests.cs" />
-    <Compile Include="AllTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="AssemblyReaderTests.cs" />
-    <Compile Include="AssemblyResolverTests.cs" />
-    <Compile Include="AssemblyTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="AssemblyVersionFixture.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="AttributeDescriptionFixture.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="BasicRunnerTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="CallContextTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="CultureSettingAndDetectionTests.cs" />
-    <Compile Include="DirectorySwapperTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="EventQueueTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="EventTestFixture.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="ExpectExceptionTest.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="FailFixture.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="FixtureSetupTearDownTest.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="IgnoreFixture.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="LegacySuiteTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="MockTestRunner.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="NameFilterTest.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="NamespaceAssemblyTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="PlatformDetectionTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="PropertyAttributeTests.cs" />
-    <Compile Include="ReflectTests.cs" />
-    <Compile Include="RemoteRunnerTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="SerializationBug.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="SetUpFixtureTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="SetUpTest.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="SimpleNameFilterTests.cs" />
-    <Compile Include="SimpleTestRunnerTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="StackOverflowTestFixture.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="SuiteBuilderTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="SuiteBuilderTests_Multiple.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestAssemblyBuilderTests.cs" />
-    <Compile Include="TestCaseResultFixture.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestCaseTest.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestConsole.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestContextTests.cs" />
-    <Compile Include="TestDelegateFixture.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestFixtureBuilderTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestFixtureExtension.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestFixtureTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestFrameworkTests.cs" />
-    <Compile Include="testidtests.cs" />
-    <Compile Include="TestInfoTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestNameTests.cs" />
-    <Compile Include="TestNodeTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestRunnerThreadTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestSuiteResultFixture.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestSuiteTest.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="ThreadedTestRunnerTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="UnhandledExceptionTests.cs" />
-    <Compile Include="XmlTest.cs">
-      <SubType>Code</SubType>
-      <CustomToolNamespace>NUnit.Core.Tests</CustomToolNamespace>
-    </Compile>
-    <EmbeddedResource Include="..\core\Results.xsd">
-      <Link>Results.xsd</Link>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <None Include="..\core\Results.xsx">
-      <Link>Results.xsx</Link>
-      <DependentUpon>Results.xsd</DependentUpon>
-    </None>
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
-</Project>
\ No newline at end of file
diff --git a/src/NUnitDevTests.config b/src/NUnitDevTests.config
deleted file mode 100644
index ecbd55e..0000000
--- a/src/NUnitDevTests.config
+++ /dev/null
@@ -1,84 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<configuration>
-<!--
-	 This is the configuration file for the NUnitTests.nunit test project. You may
-	 need to create a similar configuration file for your own test project. 
- -->	 
-
-<!--
-	 The <NUnit> section is only needed if you want to use a non-default value
-	 for any of the settings. It is commented out below. If you are going to use
-   it, you must deifne the NUnit section group and the sections you need.
- 
-   The syntax shown here works for most runtimes. If NUnit fails at startup, you
-   can try specifying the name of the assembly containing the NameValueSectionHandler:
-   
-      <section name="TestCaseBuilder" type="System.Configuration.NameValueSectionHandler, System" />
-      
-   If that fails, try the fully qualified name of the assembly:
-   
-      <section name="TestCaseBuilder" type="System.Configuration.NameValueSectionHandler, System, 
-             Version=2.0.50727.832, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
-             
-   Unfortunately, this last approach makes your config file non-portable across runtimes.
-   -->
-
-<!--
-  <configSections>
-		<sectionGroup name="NUnit">
-			<section name="TestCaseBuilder" type="System.Configuration.NameValueSectionHandler"/>
-			<section name="TestRunner" type="System.Configuration.NameValueSectionHandler"/>
-		</sectionGroup>
-	</configSections>
- -->
-
-  <appSettings>
-		<!--   User application and configured property settings go here.-->
-		<!--   Example: <add key="settingName" value="settingValue"/> -->
-		<add key="test.setting" value="54321" />
-	</appSettings>
-
-<!-- Sample NUnit section group showing all default values -->
-<!--
-	<NUnit>
-		<TestCaseBuilder>
-			<add key="OldStyleTestCases" value="false" />
-		</TestCaseBuilder>
-		<TestRunner>
-			<add key="ApartmentState" value="MTA" />
-			<add key="ThreadPriority" value="Normal" />
-		</TestRunner>
-	</NUnit>
--->
-  
-   <!--
-    The following <runtime> section allows running nunit tests under 
-    .NET 1.0 by redirecting assemblies. The appliesTo attribute
-    causes the section to be ignored except under .NET 1.0.
-   --> 
-	<runtime>
-		<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
-				appliesTo="v1.0.3705">
-			<dependentAssembly>
-				<assemblyIdentity name="System" publicKeyToken="b77a5c561934e089" culture="" />
-				<bindingRedirect oldVersion="1.0.5000.0" newVersion="1.0.3300.0" />
-			</dependentAssembly>
-			<dependentAssembly>
-				<assemblyIdentity name="System.Data" publicKeyToken="b77a5c561934e089" culture="" />
-				<bindingRedirect oldVersion="1.0.5000.0" newVersion="1.0.3300.0" />
-			</dependentAssembly>
-			<dependentAssembly>
-				<assemblyIdentity name="System.Drawing" publicKeyToken="b03f5f7f11d50a3a" culture="" />
-				<bindingRedirect oldVersion="1.0.5000.0" newVersion="1.0.3300.0" />
-			</dependentAssembly>
-			<dependentAssembly>
-				<assemblyIdentity name="System.Windows.Forms" publicKeyToken="b77a5c561934e089" culture="" />
-				<bindingRedirect oldVersion="1.0.5000.0" newVersion="1.0.3300.0" />
-			</dependentAssembly>
-			<dependentAssembly>
-				<assemblyIdentity name="System.Xml" publicKeyToken="b77a5c561934e089" culture="" />
-				<bindingRedirect oldVersion="1.0.5000.0" newVersion="1.0.3300.0" />
-			</dependentAssembly>
-		</assemblyBinding>
-	</runtime>
-</configuration> 
diff --git a/src/NUnitDevTests.nunit b/src/NUnitDevTests.nunit
deleted file mode 100644
index 8fdddee..0000000
--- a/src/NUnitDevTests.nunit
+++ /dev/null
@@ -1,47 +0,0 @@
-<NUnitProject>
-  <Settings activeconfig="NUnitAutoConfig" appbase="." />
-  <Config name="Debug" binpathtype="Auto" configfile="NUnitTests.config">
-    <assembly path="NUnitFramework\tests\bin\Debug\nunit.framework.tests.dll" />
-    <assembly path="NUnitCore\tests\bin\Debug\nunit.core.tests.dll" />
-    <assembly path="ClientUtilities\tests\bin\Debug\nunit.util.tests.dll" />
-    <assembly path="NUnitMocks\tests\bin\Debug\nunit.mocks.tests.dll" />
-    <assembly path="NUnitExtensions\tests\bin\Debug\nunit.extensions.tests.dll" />
-    <assembly path="ConsoleRunner\tests\bin\Debug\nunit-console.tests.dll" />
-    <assembly path="GuiComponents\tests\bin\Debug\nunit.uikit.tests.dll" />
-    <assembly path="GuiRunner\tests\bin\Debug\nunit-gui.tests.dll" />
-    <assembly path="NUnitFixtures\tests\bin\Debug\nunit.fixtures.tests.dll" />
-  </Config>
-  <Config name="Debug2005" binpathtype="Auto" configfile="NUnitTests.config">
-    <assembly path="NUnitFramework\tests\bin\Debug2005\nunit.framework.tests.dll" />
-    <assembly path="NUnitCore\tests\bin\Debug2005\nunit.core.tests.dll" />
-    <assembly path="ClientUtilities\tests\bin\Debug2005\nunit.util.tests.dll" />
-    <assembly path="NUnitMocks\tests\bin\Debug2005\nunit.mocks.tests.dll" />
-    <assembly path="NUnitExtensions\tests\bin\Debug2005\nunit.extensions.tests.dll" />
-    <assembly path="ConsoleRunner\tests\bin\Debug2005\nunit-console.tests.dll" />
-    <assembly path="GuiComponents\tests\bin\Debug2005\nunit.uikit.tests.dll" />
-    <assembly path="GuiRunner\tests\bin\Debug2005\nunit-gui.tests.dll" />
-    <assembly path="NUnitFixtures\tests\bin\Debug2005\nunit.fixtures.tests.dll" />
-  </Config>
-  <Config name="Release" binpathtype="Auto" configfile="NUnitTests.config">
-    <assembly path="NUnitFramework\tests\bin\Release\nunit.framework.tests.dll" />
-    <assembly path="NUnitCore\tests\bin\Release\nunit.core.tests.dll" />
-    <assembly path="ClientUtilities\tests\bin\Release\nunit.util.tests.dll" />
-    <assembly path="NUnitMocks\tests\bin\Release\nunit.mocks.tests.dll" />
-    <assembly path="NUnitExtensions\tests\bin\Release\nunit.extensions.tests.dll" />
-    <assembly path="ConsoleRunner\tests\bin\Release\nunit-console.tests.dll" />
-    <assembly path="GuiComponents\tests\bin\Release\nunit.uikit.tests.dll" />
-    <assembly path="GuiRunner\tests\bin\Release\nunit-gui.tests.dll" />
-    <assembly path="NUnitFixtures\tests\bin\Release\nunit.fixtures.tests.dll" />
-</Config>
-  <Config name="Release2005" binpathtype="Auto" configfile="NUnitTests.config">
-    <assembly path="NUnitFramework\tests\bin\Release2005\nunit.framework.tests.dll" />
-    <assembly path="NUnitCore\tests\bin\Release2005\nunit.core.tests.dll" />
-    <assembly path="ClientUtilities\tests\bin\Release2005\nunit.util.tests.dll" />
-    <assembly path="NUnitMocks\tests\bin\Release2005\nunit.mocks.tests.dll" />
-    <assembly path="NUnitExtensions\tests\bin\Release2005\nunit.extensions.tests.dll" />
-    <assembly path="ConsoleRunner\tests\bin\Release2005\nunit-console.tests.dll" />
-    <assembly path="GuiComponents\tests\bin\Release2005\nunit.uikit.tests.dll" />
-    <assembly path="GuiRunner\tests\bin\Release2005\nunit-gui.tests.dll" />
-    <assembly path="NUnitFixtures\tests\bin\Release2005\nunit.fixtures.tests.dll" />
-  </Config>
-</NUnitProject>
\ No newline at end of file
diff --git a/src/NUnitExtensions/core/AssemblyInfo.cs b/src/NUnitExtensions/core/AssemblyInfo.cs
deleted file mode 100644
index c0a0da2..0000000
--- a/src/NUnitExtensions/core/AssemblyInfo.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-using System;
-using System.Reflection;
-
-[assembly: CLSCompliant(true)]
-
-[assembly: AssemblyDelaySign(false)]
-[assembly: AssemblyKeyFile("../../../../nunit.snk")]
-[assembly: AssemblyKeyName("")]
diff --git a/src/NUnitExtensions/core/RepeatedTestCase.cs b/src/NUnitExtensions/core/RepeatedTestCase.cs
deleted file mode 100644
index 4858c75..0000000
--- a/src/NUnitExtensions/core/RepeatedTestCase.cs
+++ /dev/null
@@ -1,39 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-using System;
-using System.Reflection;
-
-namespace NUnit.Core.Extensions
-{
-	/// <summary>
-	/// RepeatedTestCase aggregates another test case and runs it
-	/// a specified number of times.
-	/// </summary>
-	public class RepeatedTestCase : AbstractTestCaseDecoration
-	{
-		// The number of times to run the test
-		int count;
-
-		public RepeatedTestCase( TestCase testCase, int count )
-			: base( testCase )
-		{
-			this.count = count;
-		}
-
-		public override void Run(TestCaseResult result)
-		{
-			// So testCase can get the fixture
-			testCase.Parent = this.Parent;
-
-			for( int i = 0; i < count; i++ )
-			{
-				testCase.Run( result );
-				if ( result.IsFailure )
-					return;
-			}
-		}
-	}
-}
diff --git a/src/NUnitExtensions/core/RepeatedTestDecorator.cs b/src/NUnitExtensions/core/RepeatedTestDecorator.cs
deleted file mode 100644
index 963e411..0000000
--- a/src/NUnitExtensions/core/RepeatedTestDecorator.cs
+++ /dev/null
@@ -1,63 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-using System;
-using System.Reflection;
-using NUnit.Core.Extensibility;
-
-namespace NUnit.Core.Extensions
-{
-	/// <summary>
-	/// Summary description for RepeatedTestDecorator.
-	/// </summary>
-	[NUnitAddin(Description="Runs a test case multiple times")]
-	public class RepeatedTestDecorator : ITestDecorator, IAddin
-	{
-		private static readonly string RepeatAttributeType = "NUnit.Framework.Extensions.RepeatAttribute";
-
-		#region IAddin Members
-		public bool Install(IExtensionHost host)
-		{
-			IExtensionPoint decorators = host.GetExtensionPoint( "TestDecorators" );
-			if ( decorators == null )
-				return false;
-				
-			decorators.Install( this );
-			return true;
-		}
-		#endregion
-
-		#region ITestDecorator Members
-		public Test Decorate(Test test, MemberInfo member)
-		{
-			if ( member == null )
-				return test;
-
-			TestCase testCase = test as TestCase;
-			if ( testCase == null )
-				return test;
-
-			Attribute repeatAttr = Reflect.GetAttribute( member, RepeatAttributeType, true );
-			if ( repeatAttr == null )
-				return test;		
-
-			object propVal = Reflect.GetPropertyValue( repeatAttr, "Count", 
-				BindingFlags.Public | BindingFlags.Instance );
-
-			if ( propVal == null )
-				return test;
-
-			int count = (int)propVal;
-
-			return new RepeatedTestCase( testCase, count );
-		}
-
-//		public Test Decorate( Test test, Type fixtureType )
-//		{
-//			return test;
-//		}
-		#endregion
-	}
-}
diff --git a/src/NUnitExtensions/core/RowTest/RowTestAddIn.cs b/src/NUnitExtensions/core/RowTest/RowTestAddIn.cs
deleted file mode 100644
index 0fefc56..0000000
--- a/src/NUnitExtensions/core/RowTest/RowTestAddIn.cs
+++ /dev/null
@@ -1,54 +0,0 @@
-// *********************************************************************
-// Copyright 2007, Andreas Schlapsi
-// This is free software licensed under the MIT license. 
-// *********************************************************************
-using System;
-using System.Reflection;
-using NUnit.Core;
-using NUnit.Core.Extensibility;
-
-namespace NUnit.Core.Extensions.RowTest
-{
-	[NUnitAddin(Name = "Row Test Extension")]
-	public class RowTestAddIn : IAddin, ITestCaseBuilder
-	{
-		private RowTestFactory _testFactory;
-		
-		public RowTestAddIn()
-		{
-			_testFactory = new RowTestFactory();
-		}
-		
-		public bool Install(IExtensionHost host)
-		{
-			if (host == null)
-				throw new ArgumentNullException("host");
-			
-			IExtensionPoint testCaseBuilders = host.GetExtensionPoint("TestCaseBuilders");
-			if (testCaseBuilders == null)
-				return false;
-			
-			testCaseBuilders.Install(this);
-			return true;
-		}
-		
-		public bool CanBuildFrom(MethodInfo method)
-		{
-			return RowTestFramework.IsRowTest(method);
-		}
-		
-		public Test BuildFrom(MethodInfo method)
-		{
-			if (method == null)
-				throw new ArgumentNullException("method");
-			
-			RowTestSuite suite = _testFactory.CreateRowTestSuite(method);
-			Attribute[] rows = RowTestFramework.GetRowAttributes(method);
-
-			foreach (Attribute row in rows)
-				suite.Add(_testFactory.CreateRowTestCase(row, method));
-			
-			return suite;
-		}
-	}
-}
diff --git a/src/NUnitExtensions/core/RowTest/RowTestCase.cs b/src/NUnitExtensions/core/RowTest/RowTestCase.cs
deleted file mode 100644
index a2a8601..0000000
--- a/src/NUnitExtensions/core/RowTest/RowTestCase.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-// *********************************************************************
-// Copyright 2007, Andreas Schlapsi
-// This is free software licensed under the MIT license. 
-// *********************************************************************
-using System;
-using System.Reflection;
-using System.Text;
-using NUnit.Core;
-
-namespace NUnit.Core.Extensions.RowTest
-{
-	public class RowTestCase : NUnitTestMethod
-	{
-		private object[] _arguments;
-		
-		public RowTestCase(MethodInfo method, string testName, object[] arguments)
-			: base(method)
-		{
-			RowTestNameBuilder testNameBuilder = new RowTestNameBuilder(method, testName, arguments);
-			this.TestName.Name = testNameBuilder.TestName;
-			this.TestName.FullName = testNameBuilder.FullTestName;
-			
-			_arguments = arguments;
-		}
-		
-		public object[] Arguments
-		{
-			get { return _arguments; }
-		}
-		
-		public override void RunTestMethod(TestCaseResult testResult)
-		{
-			object[] arguments = _arguments != null ? _arguments : new object[] { null };			
-			Reflect.InvokeMethod(this.Method, this.Fixture, arguments);
-		}
-	}
-}
diff --git a/src/NUnitExtensions/core/RowTest/RowTestFactory.cs b/src/NUnitExtensions/core/RowTest/RowTestFactory.cs
deleted file mode 100644
index 39ce5f4..0000000
--- a/src/NUnitExtensions/core/RowTest/RowTestFactory.cs
+++ /dev/null
@@ -1,79 +0,0 @@
-// *********************************************************************
-// Copyright 2007, Andreas Schlapsi
-// This is free software licensed under the MIT license. 
-// *********************************************************************
-using System;
-using System.Reflection;
-using NUnit.Core;
-
-namespace NUnit.Core.Extensions.RowTest
-{
-	public class RowTestFactory
-	{
-		public RowTestFactory()
-		{
-		}
-		
-		public RowTestSuite CreateRowTestSuite(MethodInfo method)
-		{
-			if (method == null)
-				throw new ArgumentNullException("method");
-			
-			RowTestSuite testSuite = new RowTestSuite(method);
-			NUnitFramework.ApplyCommonAttributes(method, testSuite);
-			
-			return testSuite;
-		}
-		
-		public RowTestCase CreateRowTestCase(Attribute row, MethodInfo method)
-		{
-			if (row == null)
-				throw new ArgumentNullException("row");
-			
-			if (method == null)
-				throw new ArgumentNullException("method");
-			
-			object[] rowArguments = RowTestFramework.GetRowArguments(row);
-			rowArguments = FilterSpecialValues(rowArguments);
-			
-			string testName = RowTestFramework.GetTestName(row);
-			Type expectedExceptionType = RowTestFramework.GetExpectedExceptionType(row);
-			
-			RowTestCase testCase = new RowTestCase(method, testName, rowArguments);
-			if (expectedExceptionType != null)
-			{
-				testCase.ExceptionExpected = true;
-				testCase.ExpectedExceptionType = expectedExceptionType;
-				testCase.ExpectedMessage = RowTestFramework.GetExpectedExceptionMessage(row);
-			}
-
-			return testCase;
-		}
-		
-		private object[] FilterSpecialValues(object[] arguments)
-		{
-			if (arguments == null)
-				return null;
-			
-			for (int i = 0; i < arguments.Length; i++)
-			{
-				if (RowTestFramework.IsSpecialValue(arguments[i]))
-					arguments[i] = MapSpecialValue(arguments[i]);
-			}
-			
-			return arguments;
-		}
-		
-		private object MapSpecialValue(object specialValue)
-		{
-			switch (specialValue.ToString())
-			{
-				case "Null":
-					return null;
-				
-				default:
-					return specialValue;
-			}
-		}
-	}
-}
diff --git a/src/NUnitExtensions/core/RowTest/RowTestFramework.cs b/src/NUnitExtensions/core/RowTest/RowTestFramework.cs
deleted file mode 100644
index 581a53a..0000000
--- a/src/NUnitExtensions/core/RowTest/RowTestFramework.cs
+++ /dev/null
@@ -1,65 +0,0 @@
-// *********************************************************************
-// Copyright 2007, Andreas Schlapsi
-// This is free software licensed under the MIT license. 
-// *********************************************************************
-using System;
-using System.Reflection;
-using NUnit.Core;
-
-namespace NUnit.Core.Extensions.RowTest
-{
-	public sealed class RowTestFramework
-	{
-		public const string RowTestAttribute = "NUnit.Framework.Extensions.RowTestAttribute";
-		public const string RowAttribute = "NUnit.Framework.Extensions.RowAttribute";
-		public const string SpecialValueEnum = "NUnit.Framework.Extensions.SpecialValue";
-		
-		private RowTestFramework()
-		{
-		}
-		
-		public static bool IsRowTest(MethodInfo method)
-		{
-			if (method == null)
-				return false;
-			
-			return Reflect.HasAttribute(method, RowTestAttribute, false);;
-		}
-		
-		public static Attribute[] GetRowAttributes(MethodInfo method)
-		{
-			if (method == null)
-				throw new ArgumentNullException("method");
-			
-			return Reflect.GetAttributes(method, RowAttribute, false);
-		}
-		
-		public static object[] GetRowArguments(Attribute attribute)
-		{
-			return Reflect.GetPropertyValue(attribute, "Arguments") as object[];
-		}
-		
-		public static bool IsSpecialValue(object argument)
-		{
-			if (argument == null)
-				return false;
-			
-			return argument.GetType().FullName == SpecialValueEnum;
-		}
-		
-		public static Type GetExpectedExceptionType(Attribute attribute)
-		{
-			return Reflect.GetPropertyValue(attribute, "ExpectedException") as Type;
-		}
-		
-		public static string GetExpectedExceptionMessage(Attribute attribute)
-		{
-			return Reflect.GetPropertyValue(attribute, "ExceptionMessage") as string;
-		}
-		
-		public static string GetTestName(Attribute attribute)
-		{
-			return Reflect.GetPropertyValue(attribute, "TestName") as string;
-		}
-	}
-}
diff --git a/src/NUnitExtensions/core/RowTest/RowTestNameBuilder.cs b/src/NUnitExtensions/core/RowTest/RowTestNameBuilder.cs
deleted file mode 100644
index 676cc19..0000000
--- a/src/NUnitExtensions/core/RowTest/RowTestNameBuilder.cs
+++ /dev/null
@@ -1,92 +0,0 @@
-// *********************************************************************
-// Copyright 2007, Andreas Schlapsi
-// This is free software licensed under the MIT license. 
-// *********************************************************************
-using System;
-using System.Reflection;
-using System.Text;
-
-namespace NUnit.Core.Extensions.RowTest
-{
-	public class RowTestNameBuilder
-	{
-		private MethodInfo _method;
-		private string _baseTestName;
-		private object[] _arguments;
-		private string _argumentList;
-
-		public RowTestNameBuilder(MethodInfo method, string baseTestName, object[] arguments)
-		{
-			_method = method;
-			_baseTestName = baseTestName;
-			_arguments = arguments;
-		}
-		
-		public MethodInfo Method
-		{
-			get { return _method; }
-		}
-		
-		public string BaseTestName
-		{
-			get { return _baseTestName; }
-		}
-		
-		public object[] Arguments
-		{
-			get { return _arguments; }
-		}
-		
-		public string TestName
-		{
-			get 
-			{
-				string baseTestName = _baseTestName;
-				
-				if (baseTestName == null || baseTestName.Length == 0)
-					baseTestName = _method.Name;
-					
-				return baseTestName + GetArgumentList();
-			}
-		}
-		
-		public string FullTestName
-		{
-			get { return _method.DeclaringType.FullName + "." + TestName; }
-		}
-		
-		private string GetArgumentList()
-		{
-			if (_argumentList == null)
-				_argumentList = "(" + CreateArgumentList() + ")";
-			
-			return _argumentList;
-		}
-		
-		private string CreateArgumentList()
-		{
-			if (_arguments == null)
-				return "null";
-			
-			StringBuilder argumentListBuilder = new StringBuilder();
-
-			for (int i = 0; i < _arguments.Length; i++)
-			{
-				if (i > 0)
-					argumentListBuilder.Append(", ");
-				
-				argumentListBuilder.Append (GetArgumentString (_arguments[i]));
-			}
-			
-			return argumentListBuilder.ToString();
-		}
-		
-		private string GetArgumentString (object argument)
-		{
-			if (argument == null)
-				return "null";
-			
-			return argument.ToString();
-		}
-	}
-}
diff --git a/src/NUnitExtensions/core/RowTest/RowTestSuite.cs b/src/NUnitExtensions/core/RowTest/RowTestSuite.cs
deleted file mode 100644
index da74515..0000000
--- a/src/NUnitExtensions/core/RowTest/RowTestSuite.cs
+++ /dev/null
@@ -1,50 +0,0 @@
-// *********************************************************************
-// Copyright 2007, Andreas Schlapsi
-// This is free software licensed under the MIT license. 
-// *********************************************************************
-using System;
-using System.Reflection;
-using NUnit.Core;
-
-namespace NUnit.Core.Extensions.RowTest
-{
-	public class RowTestSuite : TestSuite
-	{
-		private static string GetParentName(MethodInfo method)
-		{
-			if (method == null)
-				throw new ArgumentNullException("method");
-			
-			return method.DeclaringType.ToString();
-		}
-		
-		private static string GetTestName(MethodInfo method)
-		{
-			if (method == null)
-				throw new ArgumentNullException("method");
-			
-			return method.Name;
-		}
-		
-		public RowTestSuite(MethodInfo method)
-			: base (GetParentName(method), GetTestName(method))
-		{
-		}
-		
-		public override TestResult Run(EventListener listener, ITestFilter filter)
-		{
-			if (this.Parent != null)
-				this.Fixture = this.Parent.Fixture;
-			
-			return base.Run(listener, filter);
-		}
-		
-		protected override void DoOneTimeSetUp(TestResult suiteResult)
-		{
-		}
-		
-		protected override void DoOneTimeTearDown(TestResult suiteResult)
-		{
-		}
-	}
-}
diff --git a/src/NUnitExtensions/core/nunit.core.extensions.build b/src/NUnitExtensions/core/nunit.core.extensions.build
deleted file mode 100644
index 7ec0aa6..0000000
--- a/src/NUnitExtensions/core/nunit.core.extensions.build
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0"?>
-<project name="NUnitCoreExtensions" default="build" basedir=".">
-
-  <target name="build">
-    <csc target="library" 
-        output="${current.build.dir}/nunit.core.extensions.dll"
-        debug="${build.debug}" define="${build.defines}">
-      <sources>
-        <include name="AssemblyInfo.cs"/>
-        <include name="RepeatedTestCase.cs"/>
-        <include name="RepeatedTestDecorator.cs"/>
-        <include name="RowTest/*.cs"/>
-        <include name="../../CommonAssemblyInfo.cs"/>
-      </sources>
-      <nowarn>
-        <warning number="1699" if="${runtime.version=='2.0'}"/>
-      </nowarn>
-      <references basedir="${current.build.dir}">
-        <include name="nunit.core.interfaces.dll"/>
-        <include name="nunit.core.dll"/>
-      </references>
-    </csc>
-  </target>
-
-  <target name="package">
-    <copy todir="${package.src.dir}/NUnitExtensions/core">
-      <fileset refid="source-files" />
-    </copy>
-  </target>
-
-</project>
\ No newline at end of file
diff --git a/src/NUnitExtensions/core/nunit.core.extensions.dll.csproj b/src/NUnitExtensions/core/nunit.core.extensions.dll.csproj
deleted file mode 100644
index a0fb70f..0000000
--- a/src/NUnitExtensions/core/nunit.core.extensions.dll.csproj
+++ /dev/null
@@ -1,151 +0,0 @@
-<VisualStudioProject>
-    <CSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{98B10E98-003C-45A0-9587-119142E39986}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = ""
-                AssemblyKeyContainerName = ""
-                AssemblyName = "nunit.core.extensions"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "Library"
-                PreBuildEvent = ""
-                PostBuildEvent = ""
-                RootNamespace = "NUnit.Core.Extensions"
-                RunPostBuildEvent = "OnBuildSuccess"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "true"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "true"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-                <Config
-                    Name = "Release"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "false"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "System"
-                    AssemblyName = "System"
-                    HintPath = "..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll"
-                />
-                <Reference
-                    Name = "System.Data"
-                    AssemblyName = "System.Data"
-                    HintPath = "..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll"
-                />
-                <Reference
-                    Name = "System.XML"
-                    AssemblyName = "System.Xml"
-                    HintPath = "..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll"
-                />
-                <Reference
-                    Name = "nunit.core.dll"
-                    Project = "{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.core.interfaces.dll"
-                    Project = "{435428F8-5995-4CE4-8022-93D595A8CC0F}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-            </References>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "AssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CommonAssemblyInfo.cs"
-                    Link = "..\..\CommonAssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RepeatedTestCase.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RepeatedTestDecorator.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RowTest\RowTestAddIn.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RowTest\RowTestCase.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RowTest\RowTestFactory.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RowTest\RowTestFramework.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RowTest\RowTestNameBuilder.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RowTest\RowTestSuite.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-            </Include>
-        </Files>
-    </CSHARP>
-</VisualStudioProject>
-
diff --git a/src/NUnitExtensions/core/nunit.core.extensions.dll_VS2005.csproj b/src/NUnitExtensions/core/nunit.core.extensions.dll_VS2005.csproj
deleted file mode 100644
index 0c53c59..0000000
--- a/src/NUnitExtensions/core/nunit.core.extensions.dll_VS2005.csproj
+++ /dev/null
@@ -1,85 +0,0 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>8.0.50727</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{98B10E98-003C-45A0-9587-119142E39986}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ApplicationIcon>
-    </ApplicationIcon>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit.core.extensions</AssemblyName>
-    <AssemblyOriginatorKeyFile>
-    </AssemblyOriginatorKeyFile>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.Core.Extensions</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <StartupObject>
-    </StartupObject>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release2005|AnyCPU' ">
-    <OutputPath>bin\Release2005\</OutputPath>
-    <DefineConstants>TRACE;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <Optimize>true</Optimize>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug2005|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\Debug2005\</OutputPath>
-    <DefineConstants>TRACE;DEBUG;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="RepeatedTestCase.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="RepeatedTestDecorator.cs" />
-    <Compile Include="RowTest\RowTestAddIn.cs" />
-    <Compile Include="RowTest\RowTestCase.cs" />
-    <Compile Include="RowTest\RowTestFactory.cs" />
-    <Compile Include="RowTest\RowTestFramework.cs" />
-    <Compile Include="RowTest\RowTestNameBuilder.cs" />
-    <Compile Include="RowTest\RowTestSuite.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll_VS2005.csproj">
-      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
-      <Name>nunit.core.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll_VS2005.csproj">
-      <Project>{DCC88998-255A-4247-B658-71DD932E9873}</Project>
-      <Name>nunit.core.interfaces.dll_VS2005</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
-</Project>
\ No newline at end of file
diff --git a/src/NUnitExtensions/docs/RowTest/License.txt b/src/NUnitExtensions/docs/RowTest/License.txt
deleted file mode 100644
index 44d10b5..0000000
--- a/src/NUnitExtensions/docs/RowTest/License.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-Copyright (c) 2007 Andreas Schlapsi
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
diff --git a/src/NUnitExtensions/docs/RowTest/Release Notes.txt b/src/NUnitExtensions/docs/RowTest/Release Notes.txt
deleted file mode 100644
index 0e4459d..0000000
--- a/src/NUnitExtensions/docs/RowTest/Release Notes.txt	
+++ /dev/null
@@ -1,48 +0,0 @@
-Version 1.2.2 - (2008-03-27)
-----------------------------
-
-* null cannot be used as argument on .NET Framework 1.1. A new enum value SpecialValue.Null can be
-  used instead. If the RowTest addin finds this value as argument the value will be translated to
-  null.
-* Fixed Bug: Common NUnit attributes like Category, Description etc. don't work for RowTest
-  methods.
-
-
-Version 1.2.1 - (2008-02-17)
-----------------------------
-
-* Fixed Bug: SetUp and TearDown are not called on RowTestSuite.
-* Created new Test project for functional tests and reorganized samples.
-
-
-Version 1.2.0 - (2008-01-29)
-----------------------------
-
-* Added build for .NET Framework 1.1.
-* Assemblies are now strongly named.
-* Added ExceptionMessage property to the [Row] attribute. It can be used to specify the
-  message of an expected exception.
-* Added TestName property to the [Row] attribute. It is used to provide a custom name
-  of the test. If TestName is null or empty the method name will be used.
-* Fixed Bug: TestFixtureSetUp and TestFixtureTearDown are not called on the RowTest
-  TestSuite.
-* Fixed Bug: When a TestFixture contains both RowTests and normal unit tests the row tests
-  are not alphabetically ordered.
-
-
-Version 1.1.0 - (2007-10-27)
-----------------------------
-
-* Added ExpectedException property to the [Row] attribute. It can be used to specify
-  which type of exception to expect when the given data is passed to the test.
-* The [Row] attribute accepts now null values.
-* Removed dependency from assembly NUnitExtension.RowTest.AddIn to NUnitExtension.RowTest.
-
-
-Version 1.0.0 - (2007-08-17)
-----------------------------
-
-Initial release.
-
-* Data-driven tests can be marked with the [RowTest] attribute.
-* Data for a RowTest can be specified by using the [Row] attribute.
diff --git a/src/NUnitExtensions/framework/AssemblyInfo.cs b/src/NUnitExtensions/framework/AssemblyInfo.cs
deleted file mode 100644
index 44940d4..0000000
--- a/src/NUnitExtensions/framework/AssemblyInfo.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-using System.Reflection;
-
-[assembly: CLSCompliant(true)]
-
-[assembly: AssemblyDelaySign(false)]
-[assembly: AssemblyKeyFile("../../../../nunit.snk")]
-[assembly: AssemblyKeyName("")]
diff --git a/src/NUnitExtensions/framework/RepeatAttribute.cs b/src/NUnitExtensions/framework/RepeatAttribute.cs
deleted file mode 100644
index 1af79b6..0000000
--- a/src/NUnitExtensions/framework/RepeatAttribute.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework.Extensions
-{
-	/// <summary>
-	/// RepeatAttribute may be applied to test case in order
-	/// to run it multiple times.
-	/// </summary>
-	[AttributeUsage(AttributeTargets.Method, AllowMultiple=false)]
-	public class RepeatAttribute : Attribute
-	{
-		private int count;
-
-		/// <summary>
-		/// Construct a RepeatAttribute
-		/// </summary>
-		/// <param name="count">The number of times to run the test</param>
-		public RepeatAttribute(int count)
-		{
-			this.count = count;
-		}
-
-		/// <summary>
-		/// Gets the number of times to run the test.
-		/// </summary>
-		public int Count
-		{
-			get { return count; }
-		}
-	}
-}
diff --git a/src/NUnitExtensions/framework/RowAttribute.cs b/src/NUnitExtensions/framework/RowAttribute.cs
deleted file mode 100644
index 6d65622..0000000
--- a/src/NUnitExtensions/framework/RowAttribute.cs
+++ /dev/null
@@ -1,67 +0,0 @@
-// *********************************************************************
-// Copyright 2007, Andreas Schlapsi
-// This is free software licensed under the MIT license. 
-// *********************************************************************
-using System;
-
-namespace NUnitExtension.RowTest
-{
-	[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
-	public sealed class RowAttribute : Attribute
-	{
-		private string _testName;
-		private object[] _arguments;
-		private string _description;
-		private Type _expectedExceptionType;
-		private string _exceptionMessage;
-		
-		public RowAttribute(object argument1)
-		{
-			_arguments = new object[] { argument1 };
-		}
-		
-		public RowAttribute(object argument1, object argument2)
-		{
-			_arguments = new object[] { argument1, argument2 };
-		}
-		
-		public RowAttribute(object argument1, object argument2, object argument3)
-		{
-			_arguments = new object[] { argument1, argument2, argument3 };
-		}
-		
-		public RowAttribute(params object[] arguments)
-		{
-			_arguments = arguments;
-		}
-		
-		public string TestName
-		{
-			get { return _testName; }
-			set { _testName = value; }
-		}
-		
-		public object[] Arguments
-		{
-			get { return _arguments; }
-		}
-		
-		public string Description
-		{
-			get { return _description; }
-			set { _description = value; }
-		}
-		
-		public Type ExpectedException
-		{
-			get { return _expectedExceptionType; }
-			set { _expectedExceptionType = value; }
-		}
-		
-		public string ExceptionMessage
-		{
-			get { return _exceptionMessage; }
-			set { _exceptionMessage = value; }
-		}
-	}
-}
diff --git a/src/NUnitExtensions/framework/RowTest/RowAttribute.cs b/src/NUnitExtensions/framework/RowTest/RowAttribute.cs
deleted file mode 100644
index 4d75f3f..0000000
--- a/src/NUnitExtensions/framework/RowTest/RowAttribute.cs
+++ /dev/null
@@ -1,67 +0,0 @@
-// *********************************************************************
-// Copyright 2007, Andreas Schlapsi
-// This is free software licensed under the MIT license. 
-// *********************************************************************
-using System;
-
-namespace NUnit.Framework.Extensions
-{
-	[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
-	public sealed class RowAttribute : Attribute
-	{
-		private string _testName;
-		private object[] _arguments;
-		private string _description;
-		private Type _expectedExceptionType;
-		private string _exceptionMessage;
-		
-		public RowAttribute(object argument1)
-		{
-			_arguments = new object[] { argument1 };
-		}
-		
-		public RowAttribute(object argument1, object argument2)
-		{
-			_arguments = new object[] { argument1, argument2 };
-		}
-		
-		public RowAttribute(object argument1, object argument2, object argument3)
-		{
-			_arguments = new object[] { argument1, argument2, argument3 };
-		}
-		
-		public RowAttribute(params object[] arguments)
-		{
-			_arguments = arguments;
-		}
-		
-		public string TestName
-		{
-			get { return _testName; }
-			set { _testName = value; }
-		}
-		
-		public object[] Arguments
-		{
-			get { return _arguments; }
-		}
-		
-		public string Description
-		{
-			get { return _description; }
-			set { _description = value; }
-		}
-		
-		public Type ExpectedException
-		{
-			get { return _expectedExceptionType; }
-			set { _expectedExceptionType = value; }
-		}
-		
-		public string ExceptionMessage
-		{
-			get { return _exceptionMessage; }
-			set { _exceptionMessage = value; }
-		}
-	}
-}
diff --git a/src/NUnitExtensions/framework/RowTest/RowTestAttribute.cs b/src/NUnitExtensions/framework/RowTest/RowTestAttribute.cs
deleted file mode 100644
index 7370054..0000000
--- a/src/NUnitExtensions/framework/RowTest/RowTestAttribute.cs
+++ /dev/null
@@ -1,13 +0,0 @@
-// *********************************************************************
-// Copyright 2007, Andreas Schlapsi
-// This is free software licensed under the MIT license. 
-// *********************************************************************
-using System;
-
-namespace NUnit.Framework.Extensions
-{
-	[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
-	public sealed class RowTestAttribute : Attribute
-	{
-	}
-}
diff --git a/src/NUnitExtensions/framework/RowTest/SpecialValue.cs b/src/NUnitExtensions/framework/RowTest/SpecialValue.cs
deleted file mode 100644
index da0aebe..0000000
--- a/src/NUnitExtensions/framework/RowTest/SpecialValue.cs
+++ /dev/null
@@ -1,13 +0,0 @@
-// *********************************************************************
-// Copyright 2007, Andreas Schlapsi
-// This is free software licensed under the MIT license. 
-// *********************************************************************
-using System;
-
-namespace NUnit.Framework.Extensions
-{
-	public enum SpecialValue
-	{
-		Null = 1
-	}
-}
diff --git a/src/NUnitExtensions/framework/RowTestAttribute.cs b/src/NUnitExtensions/framework/RowTestAttribute.cs
deleted file mode 100644
index 35ca2ec..0000000
--- a/src/NUnitExtensions/framework/RowTestAttribute.cs
+++ /dev/null
@@ -1,13 +0,0 @@
-// *********************************************************************
-// Copyright 2007, Andreas Schlapsi
-// This is free software licensed under the MIT license. 
-// *********************************************************************
-using System;
-
-namespace NUnitExtension.RowTest
-{
-	[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
-	public sealed class RowTestAttribute : Attribute
-	{
-	}
-}
diff --git a/src/NUnitExtensions/framework/SpecialValue.cs b/src/NUnitExtensions/framework/SpecialValue.cs
deleted file mode 100644
index 81c84ef..0000000
--- a/src/NUnitExtensions/framework/SpecialValue.cs
+++ /dev/null
@@ -1,13 +0,0 @@
-// *********************************************************************
-// Copyright 2007, Andreas Schlapsi
-// This is free software licensed under the MIT license. 
-// *********************************************************************
-using System;
-
-namespace NUnitExtension.RowTest
-{
-	public enum SpecialValue
-	{
-		Null = 1
-	}
-}
diff --git a/src/NUnitExtensions/framework/nunit.framework.extensions.build b/src/NUnitExtensions/framework/nunit.framework.extensions.build
deleted file mode 100644
index 148a5b6..0000000
--- a/src/NUnitExtensions/framework/nunit.framework.extensions.build
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0"?>
-<project name="NUnitFrameworkExtensions" default="build" basedir=".">
-
-  <target name="build">
-    <csc target="library" 
-        output="${current.build.dir}/nunit.framework.extensions.dll"
-        debug="${build.debug}" define="${build.defines}">
-      <sources>
-        <include name="AssemblyInfo.cs"/>
-        <include name="RepeatAttribute.cs"/>
-	<include name="RowTest/RowAttribute.cs"/>
-	<include name="RowTest/RowTestAttribute.cs"/>
-	<include name="RowTest/SpecialValue.cs"/>
-        <include name="../../CommonAssemblyInfo.cs"/>
-      </sources>
-      <nowarn>
-        <warning number="1699" if="${runtime.version=='2.0'}"/>
-      </nowarn>
-      <references basedir="${current.build.dir}">
-        <include name="nunit.framework.dll"/>
-      </references>
-    </csc>
-  </target>
-
-  <target name="package">
-    <copy todir="${package.src.dir}/NUnitExtensions/framework">
-      <fileset refid="source-files" />
-    </copy>
-  </target>
-
-</project>
\ No newline at end of file
diff --git a/src/NUnitExtensions/framework/nunit.framework.extensions.dll.csproj b/src/NUnitExtensions/framework/nunit.framework.extensions.dll.csproj
deleted file mode 100644
index 2f4a767..0000000
--- a/src/NUnitExtensions/framework/nunit.framework.extensions.dll.csproj
+++ /dev/null
@@ -1,126 +0,0 @@
-<VisualStudioProject>
-    <CSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{486C498D-B9F8-477F-ACA7-CED9245BBFCF}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = ""
-                AssemblyKeyContainerName = ""
-                AssemblyName = "nunit.framework.extensions"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "Library"
-                PreBuildEvent = ""
-                PostBuildEvent = ""
-                RootNamespace = "NUnit.Framework.Extensions"
-                RunPostBuildEvent = "OnBuildSuccess"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "true"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-                <Config
-                    Name = "Release"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "false"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "System"
-                    AssemblyName = "System"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.dll"
-                />
-                <Reference
-                    Name = "System.Data"
-                    AssemblyName = "System.Data"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Data.dll"
-                />
-                <Reference
-                    Name = "System.XML"
-                    AssemblyName = "System.Xml"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.XML.dll"
-                />
-                <Reference
-                    Name = "nunit.framework.dll"
-                    Project = "{83DD7E12-A705-4DBA-9D71-09C8973D9382}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-            </References>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "AssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CommonAssemblyInfo.cs"
-                    Link = "..\..\CommonAssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RepeatAttribute.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RowTest\RowAttribute.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RowTest\RowTestAttribute.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RowTest\SpecialValue.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-            </Include>
-        </Files>
-    </CSHARP>
-</VisualStudioProject>
-
diff --git a/src/NUnitExtensions/framework/nunit.framework.extensions.dll_VS2005.csproj b/src/NUnitExtensions/framework/nunit.framework.extensions.dll_VS2005.csproj
deleted file mode 100644
index 1afbe43..0000000
--- a/src/NUnitExtensions/framework/nunit.framework.extensions.dll_VS2005.csproj
+++ /dev/null
@@ -1,105 +0,0 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>8.0.50727</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{486C498D-B9F8-477F-ACA7-CED9245BBFCF}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ApplicationIcon>
-    </ApplicationIcon>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit.framework.extensions</AssemblyName>
-    <AssemblyOriginatorKeyFile>
-    </AssemblyOriginatorKeyFile>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.Framework.Extensions</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <StartupObject>
-    </StartupObject>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug2005|AnyCPU' ">
-    <OutputPath>bin\Debug\</OutputPath>
-    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
-    <BaseAddress>285212672</BaseAddress>
-    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <DebugSymbols>true</DebugSymbols>
-    <FileAlignment>4096</FileAlignment>
-    <NoStdLib>false</NoStdLib>
-    <NoWarn>
-    </NoWarn>
-    <Optimize>false</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>full</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release2005|AnyCPU' ">
-    <OutputPath>bin\Release\</OutputPath>
-    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
-    <BaseAddress>285212672</BaseAddress>
-    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <DebugSymbols>false</DebugSymbols>
-    <FileAlignment>4096</FileAlignment>
-    <NoStdLib>false</NoStdLib>
-    <NoWarn>
-    </NoWarn>
-    <Optimize>true</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>none</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="RepeatAttribute.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="RowTest\RowAttribute.cs" />
-    <Compile Include="RowTest\RowTestAttribute.cs" />
-    <Compile Include="RowTest\SpecialValue.cs" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
-</Project>
\ No newline at end of file
diff --git a/src/NUnitExtensions/tests/PathAssertTests.cs b/src/NUnitExtensions/tests/PathAssertTests.cs
deleted file mode 100644
index 4887733..0000000
--- a/src/NUnitExtensions/tests/PathAssertTests.cs
+++ /dev/null
@@ -1,50 +0,0 @@
-using System;
-
-namespace NUnit.Framework.Extensions.Tests
-{
-	[TestFixture]
-	public class PathAssertTests
-	{
-		[Test]
-		public void IdenticalPathsAreSame()
-		{
-			PathAssert.SamePath( @"C:\folder1\file.tmp", @"C:\folder1\file.tmp" );
-			PathAssert.SamePath( "/folder1/file.tmp", "/folder1/file.tmp" );
-		}
-
-		[Test, Platform("Win")]
-		public void CaseIsIgnoredOnWindows()
-		{
-			PathAssert.SamePath( @"C:\folder1\file.tmp", @"c:\folder1\File.TMP" );
-			PathAssert.SamePath( "/folder1/file.tmp", "/folder1/File.TMP" );
-		}
-
-		[Test, Platform("Linux")]
-		public void CaseMattersOnLinux()
-		{
-			PathAssert.NotSamePath( @"C:\folder1\file.tmp", @"c:\folder1\File.TMP" );
-			PathAssert.NotSamePath( "/folder1/file.tmp", "/folder1/File.TMP" );
-		}
-
-		[Test]
-		public void PathsAreCanonicalizedBeforeComparing()
-		{
-			PathAssert.SamePath( @"C:\folder1\file.tmp", @"C:\folder1\.\folder2\..\file.tmp" );
-			PathAssert.SamePath( "/folder1/file.tmp", "/folder1/./folder2/../file.tmp" );
-		}
-
-		[Test]
-		public void SlashAndBackslashAreEquivalent()
-		{
-			PathAssert.SamePath( "D:/folder1/folder2", @"D:\folder1\folder2" );
-			PathAssert.SamePath( "/folder1/folder2", @"\folder1\folder2" );
-		}
-
-		[Test]
-		public void NotSamePath()
-		{
-			PathAssert.NotSamePath( @"C:\folder1\file.tmp", @"C:\folder1\.\folder2\..\file.temp" );
-			PathAssert.NotSamePath( "/folder1/file.tmp", "/folder1/./folder1/../folder2/file.temp" );
-		}
-	}
-}
diff --git a/src/NUnitExtensions/tests/RepeatedTestFixture.cs b/src/NUnitExtensions/tests/RepeatedTestFixture.cs
deleted file mode 100644
index 78038fa..0000000
--- a/src/NUnitExtensions/tests/RepeatedTestFixture.cs
+++ /dev/null
@@ -1,105 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-using System.Reflection;
-using NUnit.Framework;
-using NUnit.TestData.RepeatedTestFixture;
-
-namespace NUnit.Core.Extensions
-{
-	[TestFixture]
-	public class RepeatedTestFixture
-	{
-		private MethodInfo successMethod;
-		private MethodInfo failOnFirstMethod;
-		private MethodInfo failOnThirdMethod;
-
-		[SetUp]
-		public void SetUp()
-		{
-			Type testType = typeof(RepeatSuccessFixture);
-			successMethod = testType.GetMethod ("RepeatSuccess");
-			testType = typeof(RepeatFailOnFirstFixture);
-			failOnFirstMethod = testType.GetMethod("RepeatFailOnFirst");
-			testType = typeof(RepeatFailOnThirdFixture);
-			failOnThirdMethod = testType.GetMethod("RepeatFailOnThird");
-		}
-
-		private TestResult RunTestOnFixture( object fixture )
-		{
-			Test suite = TestFixtureBuilder.BuildFrom( fixture );
-			Assert.AreEqual( 1, suite.Tests.Count, "Test case count" );
-			Assert.AreEqual( "NUnit.Core.Extensions.RepeatedTestCase", suite.Tests[0].GetType().FullName );
-			return suite.Run( NullListener.NULL );
-		}
-
-		[Test]
-		public void RepeatedTestIsBuiltCorrectly()
-		{
-			Test suite = TestFixtureBuilder.BuildFrom( typeof( RepeatSuccessFixture ) );
-			Assert.IsNotNull( suite, "Unable to build suite" );
-			Assert.AreEqual( 1, suite.Tests.Count );
-			Assert.AreEqual( "RepeatedTestCase", suite.Tests[0].GetType().Name );
-			TestCase repeatedTestCase = suite.Tests[0] as TestCase;
-			Assert.IsNotNull( repeatedTestCase, "Test case is not a RepeatedTestCase" );
-			Assert.AreSame( suite, repeatedTestCase.Parent );
-			Assert.AreEqual( "NUnit.TestData.RepeatedTestFixture.RepeatSuccessFixture.RepeatSuccess", repeatedTestCase.TestName.FullName );
-		}
-
-		[Test]
-		public void RepeatSuccess()
-		{
-			Assert.IsNotNull (successMethod);
-			RepeatSuccessFixture fixture = new RepeatSuccessFixture();
-			TestResult result = RunTestOnFixture( fixture );
-
-			Assert.IsTrue(result.IsSuccess);
-			Assert.AreEqual(1, fixture.FixtureSetupCount);
-			Assert.AreEqual(1, fixture.FixtureTeardownCount);
-			Assert.AreEqual(3, fixture.SetupCount);
-			Assert.AreEqual(3, fixture.TeardownCount);
-			Assert.AreEqual(3, fixture.Count);
-		}
-
-		[Test]
-		public void RepeatFailOnFirst()
-		{
-			Assert.IsNotNull (failOnFirstMethod);
-			RepeatFailOnFirstFixture fixture = new RepeatFailOnFirstFixture();
-			TestResult result = RunTestOnFixture( fixture );
-
-			Assert.IsFalse(result.IsSuccess);
-			Assert.AreEqual(1, fixture.SetupCount);
-			Assert.AreEqual(1, fixture.TeardownCount);
-			Assert.AreEqual(1, fixture.Count);
-		}
-
-		[Test]
-		public void RepeatFailOnThird()
-		{
-			Assert.IsNotNull (failOnThirdMethod);
-			RepeatFailOnThirdFixture fixture = new RepeatFailOnThirdFixture();
-			TestResult result = RunTestOnFixture( fixture );
-
-			Assert.IsFalse(result.IsSuccess);
-			Assert.AreEqual(3, fixture.SetupCount);
-			Assert.AreEqual(3, fixture.TeardownCount);
-			Assert.AreEqual(3, fixture.Count);
-		}
-
-		[Test]
-		public void IgnoreWorksWithRepeatedTest()
-		{
-			RepeatedTestWithIgnore fixture = new RepeatedTestWithIgnore();
-			RunTestOnFixture( fixture );
-
-			Assert.AreEqual( 0, fixture.SetupCount );
-			Assert.AreEqual( 0, fixture.TeardownCount );
-			Assert.AreEqual( 0, fixture.Count );
-		}
-	}
-}
diff --git a/src/NUnitExtensions/tests/RowTest/OrderedTest.cs b/src/NUnitExtensions/tests/RowTest/OrderedTest.cs
deleted file mode 100644
index aa7d911..0000000
--- a/src/NUnitExtensions/tests/RowTest/OrderedTest.cs
+++ /dev/null
@@ -1,34 +0,0 @@
-// *********************************************************************
-// Copyright 2007, Andreas Schlapsi
-// This is free software licensed under the MIT license. 
-// *********************************************************************
-using NUnit.Framework;
-using NUnit.Framework.Extensions;
-
-namespace NUnit.Core.Extensions.RowTest
-{
-	// The tests in this fixture should appear ordered in the NUnit GUI.
-	[TestFixture]
-	public class OrderedTest
-	{
-		[Test]
-		public void Test1_SomeTest()
-		{
-			Assert.AreEqual (1, 1);
-		}
-
-		[RowTest]
-		[Row(100)]
-		[Row(200)]
-		public void Test2_OtherTest(int argument)
-		{
-			Assert.AreEqual (argument, argument);
-		}
-		
-		[Test]
-		public void Test3_OneMoreTest()
-		{
-			Assert.AreEqual (1, 1);
-		}
-	}
-}
diff --git a/src/NUnitExtensions/tests/RowTest/RowTests.cs b/src/NUnitExtensions/tests/RowTest/RowTests.cs
deleted file mode 100644
index c1ef702..0000000
--- a/src/NUnitExtensions/tests/RowTest/RowTests.cs
+++ /dev/null
@@ -1,91 +0,0 @@
-// *********************************************************************
-// Copyright 2007, Andreas Schlapsi
-// This is free software licensed under the MIT license. 
-// *********************************************************************
-using System;
-using NUnit.Framework;
-using NUnit.Framework.Extensions;
-
-namespace NUnit.Core.Extensions.RowTest
-{
-	[TestFixture]
-	public class RowTests
-	{
-		private static string s_staticField;
-		
-		[TestFixtureSetUp]
-		public void TestFixtureSetUp()
-		{
-			s_staticField = "Class Member";
-		}
-		
-		[RowTest]
-		[Row("Other string", "Class Member")]
-		[Row("Class Member", "Other string")]
-		public void StaticFieldTest (string compareTo, string setNext)
-		{
-			Assert.AreEqual (s_staticField, compareTo);
-			s_staticField = setNext;
-		}
-		
-		[RowTest]
-		[Category("Category - 1")]
-		[Row( 1000, 10, 100.0000)]
-		[Row(-1000, 10, -100.0000)]
-		[Row( 1000, 7, 142.85715)]
-		[Row( 1000, 0.00001, 100000000)]
-		[Row(4195835, 3145729, 1.3338196)]
-		[Row( 1000, 0, 0, ExpectedException = typeof(DivideByZeroException))]
-		public void DivisionTest(double numerator, double denominator, double result)
-		{
-		 	if (denominator == 0)
-		 		throw new DivideByZeroException();
-		
-			Assert.AreEqual(result, numerator / denominator, 0.00001);
-		}
-		
-		[RowTest]
-		[Category("Category - 2")]
-		[Row(1, 2, 3)]
-		[Row(2, 3, 5)]
-		[Row(3, 4, 8, TestName="Special case")]
-		[Row(4, 5, 9)]
-		[Row(10, 10, 0, TestName="ExceptionTest1",
-		     ExpectedException=typeof(ArgumentException), ExceptionMessage="x and y may not be equal.")]
-		[Row(1, 1, 0, TestName="ExceptionTest2",
-		     ExpectedException=typeof(ArgumentException), ExceptionMessage="x and y may not be equal.")]
-		public void AddTest(int x, int y, int expectedSum)
-		{
-			int sum = Sum(x, y);
-
-			Assert.AreEqual(expectedSum, sum);
-		}
-		
-		[RowTest]
-		[Row(null)]
-		public void NullArgument(string argument)
-		{
-			Assert.IsNull(argument);
-		}
-		
-		[RowTest]
-		[Row(SpecialValue.Null)]
-		public void SpecialValueNullArgument(string argument)
-		{
-			Assert.IsNull(argument);
-		}
-		
-		private int Sum(int x, int y)
-		{
-			int sum = x + y;
-			
-			if (x == 3 && y == 4)
-				sum++;
-			
-			if (x == y)
-				throw new ArgumentException("x and y may not be equal.");
-			
-			return sum;
-		}
-	}
-}
diff --git a/src/NUnitExtensions/tests/RowTest/SetUpMethodsTestFixture.cs b/src/NUnitExtensions/tests/RowTest/SetUpMethodsTestFixture.cs
deleted file mode 100644
index 0d2b51d..0000000
--- a/src/NUnitExtensions/tests/RowTest/SetUpMethodsTestFixture.cs
+++ /dev/null
@@ -1,49 +0,0 @@
-// *********************************************************************
-// Copyright 2007, Andreas Schlapsi
-// This is free software licensed under the MIT license. 
-// *********************************************************************
-using NUnit.Framework;
-using NUnit.Framework.Extensions;
-
-namespace NUnit.Core.Extensions.RowTest
-{
-	[TestFixture]
-	public class SetUpMethodsTestFixture
-	{
-		private bool testFixtureSetUpHasRun = false;
-		private bool setUpHasRun = false;
-        private string setUpByTestFixtureSetUp;
-        private string setUpByTestSetUp;
-
-		[TestFixtureSetUp]
-		public void TestFixtureSetUp()
-		{
-			setUpByTestFixtureSetUp = "So Long,";
-			testFixtureSetUpHasRun = true;
-		}
-		
-		[SetUp]
-		public void SetUp()
-		{
-			setUpByTestSetUp = "and Thanks for All the Fish";
-			setUpHasRun = true;
-		}
-		
-		[RowTest]
-		[Row("So Long,", "and Thanks for All the Fish")]
-		public void ClassMemberTest (string string1, string string2)
-		{
-			Assert.IsTrue(testFixtureSetUpHasRun);
-			Assert.IsTrue(setUpHasRun);
-			Assert.AreEqual(string1, setUpByTestFixtureSetUp);
-			Assert.AreEqual(string2, setUpByTestSetUp);
-		}
-
-        [Test]
-        public void PrivateClassMemberTest()
-        {
-            Assert.AreEqual(setUpByTestFixtureSetUp, "So Long,");
-            Assert.AreEqual(setUpByTestSetUp, "and Thanks for All the Fish");
-        }
-	}
-}
diff --git a/src/NUnitExtensions/tests/RowTest/UnitTests/BaseTestFixture.cs b/src/NUnitExtensions/tests/RowTest/UnitTests/BaseTestFixture.cs
deleted file mode 100644
index 9ff10a7..0000000
--- a/src/NUnitExtensions/tests/RowTest/UnitTests/BaseTestFixture.cs
+++ /dev/null
@@ -1,59 +0,0 @@
-// *********************************************************************
-// Copyright 2007, Andreas Schlapsi
-// This is free software licensed under the MIT license. 
-// *********************************************************************
-using System;
-using System.Reflection;
-
-namespace NUnit.Core.Extensions.RowTest.UnitTests
-{
-	public class BaseTestFixture
-	{
-		protected const string Method_RowTestMethodWith2Rows = "RowTestMethodWith2Rows";
-		protected const string Method_RowTestMethodWithTestName = "RowTestMethodWithTestName";
-		protected const string Method_RowTestMethodWithExpectedException = "RowTestMethodWithExpectedException";
-		protected const string Method_RowTestMethodWithExpectedExceptionAndExceptionMessage = "RowTestMethodWithExpectedExceptionAndExceptionMessage";
-		protected const string Method_RowTestMethodWithNullArgument = "RowTestMethodWithNullArgument";
-		protected const string Method_RowTestMethodWithNormalAndNullArgument = "RowTestMethodWithNormalAndNullArgument";
-		
-		public BaseTestFixture()
-		{
-		}
-		
-		protected MethodInfo GetRowTestMethodWith2Rows()
-		{
-			return GetTestClassMethod(Method_RowTestMethodWith2Rows);
-		}
-		
-		protected MethodInfo GetRowTestMethodWithTestName()
-		{
-			return GetTestClassMethod(Method_RowTestMethodWithTestName);
-		}
-		
-		protected MethodInfo GetRowTestMethodWithExpectedException()
-		{
-			return GetTestClassMethod(Method_RowTestMethodWithExpectedException);
-		}
-		
-		protected MethodInfo GetRowTestMethodWithExpectedExceptionAndExceptionMessage()
-		{
-			return GetTestClassMethod(Method_RowTestMethodWithExpectedExceptionAndExceptionMessage);
-		}
-		
-		protected MethodInfo GetRowTestMethodWithNullArgument()
-		{
-			return GetTestClassMethod(Method_RowTestMethodWithNullArgument);
-		}
-		
-		protected MethodInfo GetRowTestMethodWithNormalAndNullArgument()
-		{
-			return GetTestClassMethod(Method_RowTestMethodWithNormalAndNullArgument);
-		}
-		
-		protected MethodInfo GetTestClassMethod(string methodName)
-		{
-			Type testClass = typeof(TestClass);
-			return testClass.GetMethod(methodName, BindingFlags.Public | BindingFlags.Instance);
-		}
-	}
-}
diff --git a/src/NUnitExtensions/tests/RowTest/UnitTests/RowTestAddInTest.cs b/src/NUnitExtensions/tests/RowTest/UnitTests/RowTestAddInTest.cs
deleted file mode 100644
index c5a2e1a..0000000
--- a/src/NUnitExtensions/tests/RowTest/UnitTests/RowTestAddInTest.cs
+++ /dev/null
@@ -1,281 +0,0 @@
-// *********************************************************************
-// Copyright 2007, Andreas Schlapsi
-// This is free software licensed under the MIT license. 
-// *********************************************************************
-using System;
-using System.Reflection;
-using NUnit.Core;
-using NUnit.Core.Extensibility;
-using NUnit.Framework;
-using NUnit.Framework.SyntaxHelpers;
-#if !NMOCK2
-using NUnit.Mocks;
-#endif
-
-namespace NUnit.Core.Extensions.RowTest.UnitTests
-{
-	[TestFixture]
-	public class RowTestAddInTest : BaseTestFixture
-	{
-#if NMOCK2
-		private NMock2.Mockery _mocks;
-		
-		[SetUp]
-		public void SetUp()
-		{
-			_mocks = new NMock2.Mockery();
-		}
-#endif
-		[Test]
-		public void Install_Successful()
-		{
-#if NMOCK2
-			IExtensionHost extensionHostMock = (IExtensionHost)_mocks.NewMock(typeof(IExtensionHost));
-			IExtensionPoint extensionPointMock = (IExtensionPoint)_mocks.NewMock(typeof(IExtensionPoint));
-			RowTestAddIn addIn = new RowTestAddIn();
-
-			NMock2.Expect.Once.On(extensionHostMock)
-					.Method("GetExtensionPoint").With("TestCaseBuilders")
-					.Will(NMock2.Return.Value(extensionPointMock));
-			
-			NMock2.Expect.Once.On(extensionPointMock)
-					.Method("Install").With(addIn);
-
-			bool installed = addIn.Install(extensionHost);
-
-			_mocks.VerifyAllExpectationsHaveBeenMet();
-			Assert.That(installed, Is.True);
-#else
-            DynamicMock extensionHostMock = new DynamicMock(typeof(IExtensionHost));
-		    IExtensionHost extensionHost = (IExtensionHost)extensionHostMock.MockInstance;
-            DynamicMock extensionPointMock = new DynamicMock(typeof(IExtensionPoint));
-		    IExtensionPoint extensionPoint = (IExtensionPoint)extensionPointMock.MockInstance;
-            RowTestAddIn addIn = new RowTestAddIn();
-
-            extensionHostMock.ExpectAndReturn("GetExtensionPoint", extensionPointMock.MockInstance, "TestCaseBuilders");
-            extensionPointMock.Expect("Install", addIn);
-
-            bool installed = addIn.Install(extensionHost);
-
-            extensionPointMock.Verify();
-            extensionHostMock.Verify();
-            Assert.That(installed, Is.True);
-#endif
-		}
-		
-		[Test]
-		public void Install_Failure()
-		{
-#if NMOCK2
-			IExtensionHost extensionHostMock = (IExtensionHost)_mocks.NewMock(typeof(IExtensionHost));
-			RowTestAddIn addIn = new RowTestAddIn();
-			
-			NMock2.Expect.Once.On(extensionHostMock)
-					.Method("GetExtensionPoint").With("TestCaseBuilders")
-					.Will(NMock2.Return.Value(null));
-			
-			bool installed = addIn.Install(extensionHostMock);
-			
-			_mocks.VerifyAllExpectationsHaveBeenMet();
-			Assert.That(installed, Is.False);
-#else
-            DynamicMock extensionHostMock = new DynamicMock(typeof(IExtensionHost));
-		    IExtensionHost extensionHost = (IExtensionHost) extensionHostMock.MockInstance;
-            RowTestAddIn addIn = new RowTestAddIn();
-
-            extensionHostMock.ExpectAndReturn("GetExtensionPoint",null,"TestCaseBuilders");
-
-		    bool installed = addIn.Install(extensionHost);
-
-            extensionHostMock.Verify();
-            Assert.That(installed, Is.False);
-#endif
-		}
-		
-		[Test]
-		public void CanBuildFrom_False()
-		{
-			RowTestAddIn addIn = new RowTestAddIn();
-			MethodInfo method = GetTestClassMethod("MethodWithoutRowTestAttribute");
-
-			bool canBuildFrom = addIn.CanBuildFrom(method);
-			
-			Assert.That(canBuildFrom, Is.False);
-		}
-		
-		[Test]
-		public void CanBuildFrom_True()
-		{
-			RowTestAddIn addIn = new RowTestAddIn();
-			MethodInfo method = GetTestClassMethod("MethodWithRowTestAttribute");
-
-			bool canBuildFrom = addIn.CanBuildFrom(method);
-			
-			Assert.That(canBuildFrom, Is.True);
-		}
-		
-		[Test]
-		public void BuildFrom_WithoutRows()
-		{
-			RowTestAddIn addIn = new RowTestAddIn();
-			MethodInfo method = GetTestClassMethod("MethodWithRowTestAttribute");
-			
-			Test test = addIn.BuildFrom(method);
-			
-			Assert.That(test, Is.InstanceOfType(typeof(RowTestSuite)));
-			RowTestSuite suite = (RowTestSuite) test;
-			
-			Assert.That(suite.TestCount, Is.EqualTo(0));
-		}
-		
-		[Test]
-		public void BuildFrom_WithRows()
-		{
-			RowTestAddIn addIn = new RowTestAddIn();
-			MethodInfo method = GetRowTestMethodWith2Rows();
-			
-			Test test = addIn.BuildFrom(method);
-			
-			Assert.That(test, Is.InstanceOfType(typeof(RowTestSuite)));
-			RowTestSuite suite = (RowTestSuite) test;
-			
-			Assert.That(suite.TestCount, Is.EqualTo(2));
-			Assert.That(suite.Tests[0], Is.InstanceOfType(typeof(RowTestCase)));
-			Assert.That(suite.Tests[1], Is.InstanceOfType(typeof(RowTestCase)));
-			
-			RowTestCase testCase1 = (RowTestCase) suite.Tests[0];
-			RowTestCase testCase2 = (RowTestCase) suite.Tests[1];
-			
-			Assert.That(testCase1.Arguments.Length, Is.EqualTo(2));
-			Assert.That(testCase2.Arguments.Length, Is.EqualTo(2));
-		}
-		
-		[Test]
-		public void BuildFrom_WithTestName()
-		{
-			RowTestAddIn addIn = new RowTestAddIn();
-			MethodInfo method = GetRowTestMethodWithTestName();
-			
-			Test test = addIn.BuildFrom(method);
-			
-			Assert.That(test, Is.InstanceOfType(typeof(RowTestSuite)));
-			RowTestSuite suite = (RowTestSuite) test;
-			
-			Assert.That(suite.TestCount, Is.EqualTo(1));
-			Assert.That(suite.Tests[0], Is.InstanceOfType(typeof(RowTestCase)));
-			
-			RowTestCase testCase = (RowTestCase) suite.Tests[0];
-
-			Assert.That(testCase.TestName.Name, Is.EqualTo("UnitTest(4, 5)"));
-		}
-		
-		[Test]
-		public void BuildFrom_WithExpectedException()
-		{
-			RowTestAddIn addIn = new RowTestAddIn();
-			MethodInfo method = GetRowTestMethodWithExpectedException();
-			
-			Test test = addIn.BuildFrom(method);
-			
-			Assert.That(test, Is.InstanceOfType(typeof(RowTestSuite)));
-			RowTestSuite suite = (RowTestSuite) test;
-			
-			Assert.That(suite.TestCount, Is.EqualTo(1));
-			Assert.That(suite.Tests[0], Is.InstanceOfType(typeof(RowTestCase)));
-			
-			RowTestCase testCase = (RowTestCase) suite.Tests[0];
-
-			Assert.That(testCase.ExceptionExpected, Is.True);
-			Assert.That(testCase.ExpectedExceptionType, Is.EqualTo(typeof(InvalidOperationException)));
-		}
-		
-		[Test]
-		public void BuildFrom_WithExpectedExceptionAndExceptionMessage()
-		{
-			RowTestAddIn addIn = new RowTestAddIn();
-			MethodInfo method = GetRowTestMethodWithExpectedExceptionAndExceptionMessage();
-			
-			Test test = addIn.BuildFrom(method);
-			
-			Assert.That(test, Is.InstanceOfType(typeof(RowTestSuite)));
-			RowTestSuite suite = (RowTestSuite) test;
-			
-			Assert.That(suite.TestCount, Is.EqualTo(1));
-			Assert.That(suite.Tests[0], Is.InstanceOfType(typeof(RowTestCase)));
-			
-			RowTestCase testCase = (RowTestCase) suite.Tests[0];
-
-			Assert.That(testCase.ExceptionExpected, Is.True);
-			Assert.That(testCase.ExpectedExceptionType, Is.EqualTo(typeof(InvalidOperationException)));
-			Assert.That(testCase.ExpectedMessage, Is.EqualTo("Expected Exception Message."));
-		}
-		
-		[Test]
-		public void BuildFrom_SetsNameCorrectly()
-		{
-			RowTestAddIn addIn = new RowTestAddIn();
-			Type testClass = typeof(TestClass);
-			MethodInfo method = testClass.GetMethod(Method_RowTestMethodWith2Rows, BindingFlags.Public | BindingFlags.Instance);
-			
-			Test test = addIn.BuildFrom(method);
-			
-			Assert.That(test, Is.InstanceOfType(typeof(RowTestSuite)));
-			RowTestSuite suite = (RowTestSuite) test;
-			
-			Assert.That(suite.TestName.Name, Is.EqualTo(method.Name));
-			Assert.That(suite.TestName.FullName, Is.EqualTo(testClass.FullName + "." + method.Name));
-		}
-		
-		[Test]
-		public void BuildFrom_SetsCommonNUnitAttributes()
-		{
-			RowTestAddIn addin = new RowTestAddIn();
-			MethodInfo method = GetTestClassMethod("RowTestMethodWithCategory");
-			
-			Test test = addin.BuildFrom(method);
-
-			Assert.That(test.Categories, Is.Not.Null);
-			Assert.That(test.Categories.Count, Is.EqualTo(1));
-			Assert.That(test.Categories[0], Is.EqualTo("Category"));
-		}
-		
-		[Test]
-		public void BuildFrom_WithSpecialValueNull()
-		{
-			RowTestAddIn addIn = new RowTestAddIn();
-			MethodInfo method = GetTestClassMethod("RowTestMethodWithSpecialValue");
-			
-			Test test = addIn.BuildFrom(method);
-			
-			Assert.That(test, Is.InstanceOfType(typeof(RowTestSuite)));
-			RowTestSuite suite = (RowTestSuite) test;
-			
-			Assert.That(suite.TestCount, Is.EqualTo(1));
-			Assert.That(suite.Tests[0], Is.InstanceOfType(typeof(RowTestCase)));
-			
-			RowTestCase testCase = (RowTestCase) suite.Tests[0];
-			
-			Assert.That(testCase.Arguments.Length, Is.EqualTo(1));
-			Assert.That(testCase.Arguments[0], Is.Null);
-		}
-		
-		[Test]
-		public void BuildFrom_WithNull()
-		{
-			RowTestAddIn addIn = new RowTestAddIn();
-			MethodInfo method = GetTestClassMethod("RowTestMethodWithNullArgument");
-			
-			Test test = addIn.BuildFrom(method);
-			
-			Assert.That(test, Is.InstanceOfType(typeof(RowTestSuite)));
-			RowTestSuite suite = (RowTestSuite) test;
-			
-			Assert.That(suite.TestCount, Is.EqualTo(1));
-			Assert.That(suite.Tests[0], Is.InstanceOfType(typeof(RowTestCase)));
-			
-			RowTestCase testCase = (RowTestCase) suite.Tests[0];
-			
-			Assert.That(testCase.Arguments, Is.Null);
-		}
-	}
-}
diff --git a/src/NUnitExtensions/tests/RowTest/UnitTests/RowTestCaseTest.cs b/src/NUnitExtensions/tests/RowTest/UnitTests/RowTestCaseTest.cs
deleted file mode 100644
index 0fe2f42..0000000
--- a/src/NUnitExtensions/tests/RowTest/UnitTests/RowTestCaseTest.cs
+++ /dev/null
@@ -1,126 +0,0 @@
-// *********************************************************************
-// Copyright 2007, Andreas Schlapsi
-// This is free software licensed under the MIT license. 
-// *********************************************************************
-using System;
-using System.Reflection;
-using NUnit.Core;
-using NUnit.Framework;
-using NUnit.Framework.SyntaxHelpers;
-
-namespace NUnit.Core.Extensions.RowTest.UnitTests
-{
-	[TestFixture]
-	public class RowTestCaseTest : BaseTestFixture
-	{
-		public RowTestCaseTest()
-		{
-		}
-	
-		[Test]
-		public void Initialize()
-		{
-			MethodInfo method = GetRowTestMethodWith2Rows();
-			object[] arguments = new object[] { 4, 5 };
-			
-			RowTestCase testCase = new RowTestCase(method, null, arguments);
-			
-			Assert.That(testCase.Arguments, Is.SameAs(arguments));
-			Assert.That(testCase.Method, Is.SameAs(method));
-			Assert.That(testCase.FixtureType, Is.SameAs(typeof (TestClass)));
-		}
-	
-		[Test]
-		public void Initialize_TestNameIsMethodName()
-		{
-			MethodInfo method = GetRowTestMethodWith2Rows();
-			object[] arguments = new object[] { 4, 5 };
-			
-			RowTestCase testCase = new RowTestCase(method, null, arguments);
-
-			string expectedTestName = Method_RowTestMethodWith2Rows + "(4, 5)";
-			string expectedFullTestName = typeof(TestClass).FullName + "." + expectedTestName;
-			Assert.That(testCase.TestName.Name, Is.EqualTo(expectedTestName));
-			Assert.That(testCase.TestName.FullName, Is.EqualTo(expectedFullTestName));
-		}
-		
-		[Test]
-		public void Initialize_TestNameIsProvided()
-		{
-			MethodInfo method = GetRowTestMethodWith2Rows();
-			object[] arguments = new object[] { 4, 5 };
-			string testName = "UnitTest";
-			
-			RowTestCase testCase = new RowTestCase(method, testName, arguments);
-
-			string expectedTestName = testName + "(4, 5)";
-			string expectedFullTestName = typeof(TestClass).FullName + "." + expectedTestName;
-			Assert.That(testCase.TestName.Name, Is.EqualTo(expectedTestName));
-			Assert.That(testCase.TestName.FullName, Is.EqualTo(expectedFullTestName));
-		}
-		
-		[Test]
-		public void RunTestMethod_WithArguments()
-		{
-			object[] arguments = new object[] { 42, 53 };
-			TestClass testFixture = new TestClass();
-			RowTestCase testCase = CreateRowTestCase(testFixture, Method_RowTestMethodWith2Rows, arguments);
-			TestCaseResult result = new TestCaseResult(testCase.TestName.Name);
-			
-			testCase.RunTestMethod(result);
-			
-			Assert.That(testFixture.Arguments, Is.Not.Null);
-			Assert.That(testFixture.Arguments[0], Is.EqualTo(arguments[0]));
-			Assert.That(testFixture.Arguments[1], Is.EqualTo(arguments[1]));
-		}
-
-#if VS2005 && !FX1_1
-		[Test]
-		public void RunTestMethod_WithNormalAndNullArguments()
-		{
-			object[] arguments = new object[] { 42, null };
-			TestClass testFixture = new TestClass();
-			RowTestCase testCase = CreateRowTestCase(testFixture, Method_RowTestMethodWithNormalAndNullArgument, arguments);
-			TestCaseResult result = new TestCaseResult(testCase.TestName.Name);
-			
-			testCase.RunTestMethod(result);
-			
-			Assert.That(testFixture.Arguments, Is.Not.Null);
-			Assert.That(testFixture.Arguments[0], Is.EqualTo(arguments[0]));
-			Assert.That(testFixture.Arguments[1], Is.Null);
-		}
-#endif
-		
-		[Test]
-		public void RunTestMethod_WithNullArgument()
-		{
-			object[] arguments = new object[] { null };
-			TestClass testFixture = new TestClass();
-			RowTestCase testCase = CreateRowTestCase(testFixture, Method_RowTestMethodWithNullArgument, arguments);
-			TestCaseResult result = new TestCaseResult(testCase.TestName.Name);
-			
-			testCase.RunTestMethod(result);
-			
-			Assert.That(testFixture.Arguments, Is.Not.Null);
-			Assert.That(testFixture.Arguments[0], Is.Null);
-		}
-		
-		private RowTestCase CreateRowTestCase(TestClass fixture, string methodName, params object[] arguments)
-		{
-			MethodInfo method = GetTestClassMethod(methodName);
-			
-			NUnitTestFixture nunitTestFixture = new NUnitTestFixture(fixture.GetType());
-			nunitTestFixture.Fixture = fixture;
-			
-			TestSuite suite = new TestSuite(nunitTestFixture.TestName.Name, method.Name);
-			suite.Parent = nunitTestFixture;
-			suite.Fixture = fixture;
-
-			RowTestCase testCase = new RowTestCase(method, method.Name, arguments);
-			testCase.Fixture = fixture;
-			suite.Add(testCase);
-			
-			return testCase;
-		}
-	}
-}
diff --git a/src/NUnitExtensions/tests/RowTest/UnitTests/RowTestFrameworkTest.cs b/src/NUnitExtensions/tests/RowTest/UnitTests/RowTestFrameworkTest.cs
deleted file mode 100644
index a84e6bd..0000000
--- a/src/NUnitExtensions/tests/RowTest/UnitTests/RowTestFrameworkTest.cs
+++ /dev/null
@@ -1,141 +0,0 @@
-// *********************************************************************
-// Copyright 2007, Andreas Schlapsi
-// This is free software licensed under the MIT license. 
-// *********************************************************************
-using System;
-using System.Reflection;
-using NUnit.Framework;
-using NUnit.Framework.Extensions;
-using NUnit.Framework.SyntaxHelpers;
-
-namespace NUnit.Core.Extensions.RowTest.UnitTests
-{
-	[TestFixture]
-	public class RowTestFrameworkTest : BaseTestFixture
-	{
-		[Test]
-		public void GetRowArguments()
-		{
-			object[] rowArguments = new object[] { 4, 5 };
-			RowAttribute row = new RowAttribute(rowArguments);
-			
-			object[] extractedRowArguments = RowTestFramework.GetRowArguments(row);
-			
-			Assert.That(extractedRowArguments, Is.SameAs(rowArguments));
-		}
-		
-		[Test]
-		public void IsSpecialValue_True()
-		{
-			bool isSpecialValue = RowTestFramework.IsSpecialValue(SpecialValue.Null);
-			
-			Assert.That(isSpecialValue, Is.True);
-		}
-		
-		[Test]
-		public void IsSpecialValue_False()
-		{
-			bool isSpecialValue = RowTestFramework.IsSpecialValue(42);
-			
-			Assert.That(isSpecialValue, Is.False);
-		}
-		
-		[Test]
-		public void IsSpecialValue_Null()
-		{
-			bool isSpecialValue = RowTestFramework.IsSpecialValue(null);
-			
-			Assert.That(isSpecialValue, Is.False);
-		}
-
-		[Test]
-		public void GetExpectedExceptionType()
-		{
-			Type expectedExceptionType = typeof(ArgumentException);
-			RowAttribute row = CreateRowAttribute();
-			row.ExpectedException = expectedExceptionType;
-			
-			Type extractedExpectedExceptionType = RowTestFramework.GetExpectedExceptionType(row);
-			
-			Assert.That(extractedExpectedExceptionType, Is.SameAs(expectedExceptionType));
-		}
-		
-		[Test]
-		public void GetExpectedExceptionMessage()
-		{
-			string expectedExceptionMessage = "Expected Exception Message.";
-			Type expectedExceptionType = typeof(ArgumentException);
-			RowAttribute row = CreateRowAttribute();
-			row.ExceptionMessage = expectedExceptionMessage;
-			
-			string extractedExceptionMessage = RowTestFramework.GetExpectedExceptionMessage(row);
-			
-			Assert.That(extractedExceptionMessage, Is.SameAs(expectedExceptionMessage));
-		}
-		
-		[Test]
-		public void GetTestName()
-		{
-			string testName = "UnitTest";
-			RowAttribute row = CreateRowAttribute();
-			row.TestName = testName;
-			
-			string extractedTestName = RowTestFramework.GetTestName(row);
-			
-			Assert.That(extractedTestName, Is.EqualTo(testName));
-		}
-		
-		[Test]
-		public void IsRowTest_False()
-		{
-			MethodInfo method = GetTestClassMethod("MethodWithoutRowTestAttribute");
-
-			bool isRowTest = RowTestFramework.IsRowTest(method);
-			
-			Assert.That(isRowTest, Is.False);
-		}
-		
-		[Test]
-		public void IsRowTest_True()
-		{
-			MethodInfo method = GetTestClassMethod("MethodWithRowTestAttribute");
-
-			bool isRowTest = RowTestFramework.IsRowTest(method);
-			
-			Assert.That(isRowTest, Is.True);
-		}
-		
-		[Test]
-		public void IsRowTest_MethodIsNull()
-		{
-			bool isRowTest = RowTestFramework.IsRowTest(null);
-			
-			Assert.That(isRowTest, Is.False);
-		}
-		
-		[Test]
-		public void GetRowAttributes_NoRows()
-		{
-			MethodInfo method = GetTestClassMethod("MethodWithRowTestAttribute");
-			
-			Attribute[] rowAttributes = RowTestFramework.GetRowAttributes(method);
-			
-			Assert.That(rowAttributes.Length, Is.EqualTo(0));
-		}
-		
-		[Test]
-		public void GetRowAttributes_TwoRows()
-		{
-			MethodInfo method = GetTestClassMethod("RowTestMethodWith2Rows");
-			
-			Attribute[] rowAttributes = RowTestFramework.GetRowAttributes(method);
-			
-			Assert.That(rowAttributes.Length, Is.EqualTo(2));
-		}
-		
-		private RowAttribute CreateRowAttribute()
-		{
-			return new RowAttribute(4, 5);
-		}
-	}
-}
diff --git a/src/NUnitExtensions/tests/RowTest/UnitTests/RowTestNameBuilderTest.cs b/src/NUnitExtensions/tests/RowTest/UnitTests/RowTestNameBuilderTest.cs
deleted file mode 100644
index 5261e5b..0000000
--- a/src/NUnitExtensions/tests/RowTest/UnitTests/RowTestNameBuilderTest.cs
+++ /dev/null
@@ -1,119 +0,0 @@
-// *********************************************************************
-// Copyright 2007, Andreas Schlapsi
-// This is free software licensed under the MIT license. 
-// *********************************************************************
-using System;
-using System.Reflection;
-using NUnit.Framework;
-using NUnit.Framework.SyntaxHelpers;
-
-namespace NUnit.Core.Extensions.RowTest.UnitTests
-{
-	[TestFixture]
-	public class RowTestNameBuilderTest : BaseTestFixture
-	{
-		[Test]
-		public void Initialize()
-		{
-			MethodInfo method = GetRowTestMethodWith2Rows();
-			object[] arguments = new object[] { 5, 6 };
-			string baseTestName = "UnitTest";
-			
-			RowTestNameBuilder testNameBuilder = new RowTestNameBuilder(method, baseTestName, arguments);
-			
-			Assert.That(testNameBuilder.Method, Is.SameAs(method));
-			Assert.That(testNameBuilder.BaseTestName, Is.EqualTo(baseTestName));
-			Assert.That(testNameBuilder.Arguments, Is.SameAs(arguments));
-		}
-		
-		[Test]
-		public void TestName_IsMethodName()
-		{
-			RowTestNameBuilder testNameBuilder = CreateRowTestNameBuilder(GetRowTestMethodWith2Rows(), 5, 6);
-
-			string testName = testNameBuilder.TestName;
-			
-			string expectedTestName = Method_RowTestMethodWith2Rows + "(5, 6)";
-			Assert.That(testName, Is.EqualTo(expectedTestName));
-		}
-		
-		[Test]
-		public void TestName_IsProvided()
-		{
-			string providedTestName = "UnitTest";
-			
-			RowTestNameBuilder testNameBuilder =
-					CreateRowTestNameBuilder(providedTestName, GetRowTestMethodWith2Rows(), 5, 6);
-
-			string testName = testNameBuilder.TestName;
-			
-			string expectedTestName = providedTestName + "(5, 6)";
-			Assert.That(testName, Is.EqualTo(expectedTestName));
-		}
-		
-		[Test]
-		public void TestName_ProvidedTestNameIsEmpty()
-		{
-			RowTestNameBuilder testNameBuilder = 
-					CreateRowTestNameBuilder(string.Empty, GetRowTestMethodWith2Rows(), 5, 6);
-
-			string testName = testNameBuilder.TestName;
-			
-			string expectedTestName = Method_RowTestMethodWith2Rows + "(5, 6)";
-			Assert.That(testName, Is.EqualTo(expectedTestName));
-		}
-		
-		[Test]
-		public void FullTestName()
-		{
-			RowTestNameBuilder testNameBuilder = CreateRowTestNameBuilder(GetRowTestMethodWith2Rows(), 5, 6);
-
-			string fullTestName = testNameBuilder.FullTestName;
-			
-			string expectedTestName = typeof(TestClass).FullName + "." + Method_RowTestMethodWith2Rows + "(5, 6)";
-			Assert.That(fullTestName, Is.EqualTo(expectedTestName));
-		}
-		
-		[Test]
-		public void TestName_NullArgument()
-		{
-			RowTestNameBuilder testNameBuilder = CreateRowTestNameBuilder(GetRowTestMethodWithNullArgument(), null);
-			
-			string testName = testNameBuilder.TestName;
-			
-			string expectedTestName = Method_RowTestMethodWithNullArgument + "(null)";
-			Assert.That(testName, Is.EqualTo(expectedTestName));
-		}
-		
-#if VS2005 && !FX_1
-		[Test]
-		public void TestName_SecondArgumentIsNull()
-		{
-			RowTestNameBuilder testNameBuilder = CreateRowTestNameBuilder(GetRowTestMethodWithNormalAndNullArgument(), 5, null);
-			
-			string testName = testNameBuilder.TestName;
-			
-			string expectedTestName = Method_RowTestMethodWithNormalAndNullArgument + "(5, null)";
-			Assert.That(testName, Is.EqualTo(expectedTestName));
-		}
-#endif
-		
-		private RowTestNameBuilder CreateRowTestNameBuilder(params object[] arguments)
-		{
-			return CreateRowTestNameBuilder(GetRowTestMethodWith2Rows(), arguments);
-		}
-		
-		private RowTestNameBuilder CreateRowTestNameBuilder(MethodInfo method, params object[] arguments)
-		{
-			return CreateRowTestNameBuilder(null, method, arguments);
-		}
-		
-		private RowTestNameBuilder CreateRowTestNameBuilder(
-				string baseTestName,
-				MethodInfo method,
-				params object[] arguments)
-		{
-			return new RowTestNameBuilder(method, baseTestName, arguments);
-		}
-	}
-}
diff --git a/src/NUnitExtensions/tests/RowTest/UnitTests/RowTestSuiteTest.cs b/src/NUnitExtensions/tests/RowTest/UnitTests/RowTestSuiteTest.cs
deleted file mode 100644
index 501171e..0000000
--- a/src/NUnitExtensions/tests/RowTest/UnitTests/RowTestSuiteTest.cs
+++ /dev/null
@@ -1,69 +0,0 @@
-// *********************************************************************
-// Copyright 2007, Andreas Schlapsi
-// This is free software licensed under the MIT license. 
-// *********************************************************************
-using System;
-using System.Reflection;
-using NUnit.Core;
-using NUnit.Framework;
-using NUnit.Framework.SyntaxHelpers;
-
-namespace NUnit.Core.Extensions.RowTest.UnitTests
-{
-	[TestFixture]
-	public class RowTestSuiteTest : BaseTestFixture
-	{
-		[Test]
-		public void Initialize()
-		{
-			MethodInfo method = GetRowTestMethodWith2Rows();
-			
-			RowTestSuite testSuite = new RowTestSuite(method);
-			
-			string pathName = method.DeclaringType.ToString();
-			Assert.That(testSuite.TestName.FullName, Is.EqualTo (pathName + "." + method.Name));
-		}
-		
-		[Test]
-		public void Run()
-		{
-			TestClass fixture = new TestClass();
-			
-			TestSuite parentSuite = new TestSuite("ParentSuiteName", "Name");
-			parentSuite.Fixture = fixture;
-			
-			RowTestSuite rowTestSuite = new RowTestSuite(GetRowTestMethodWith2Rows());
-			parentSuite.Add(rowTestSuite);
-			
-			rowTestSuite.Run(new NullListener());
-			
-			Assert.That(rowTestSuite.Fixture, Is.SameAs(fixture));
-		}
-		
-		[Test]
-		public void Run_WithoutParent()
-		{
-			RowTestSuite rowTestSuite = new RowTestSuite(GetRowTestMethodWith2Rows());
-			
-			rowTestSuite.Run(new NullListener());
-			
-			Assert.That(rowTestSuite.Fixture, Is.Null);
-		}
-		
-		[Test]
-		public void Run_WithTestFilter()
-		{
-			TestClass fixture = new TestClass();
-			
-			TestSuite parentSuite = new TestSuite("ParentSuiteName", "Name");
-			parentSuite.Fixture = fixture;
-			
-			RowTestSuite rowTestSuite = new RowTestSuite(GetRowTestMethodWith2Rows());
-			parentSuite.Add(rowTestSuite);
-			
-			rowTestSuite.Run(new NullListener(), TestFilter.Empty);
-			
-			Assert.That(rowTestSuite.Fixture, Is.SameAs(fixture));
-		}
-	}
-}
diff --git a/src/NUnitExtensions/tests/RowTest/UnitTests/TestClass.cs b/src/NUnitExtensions/tests/RowTest/UnitTests/TestClass.cs
deleted file mode 100644
index 8d6f4fd..0000000
--- a/src/NUnitExtensions/tests/RowTest/UnitTests/TestClass.cs
+++ /dev/null
@@ -1,117 +0,0 @@
-// *********************************************************************
-// Copyright 2007, Andreas Schlapsi
-// This is free software licensed under the MIT license. 
-// *********************************************************************
-using System;
-using NUnit.Framework;
-using NUnit.Framework.Extensions;
-
-namespace NUnit.Core.Extensions.RowTest.UnitTests
-{
-	public class TestClass
-	{
-		private object[] _arguments;
-		
-		public TestClass()
-		{
-		}
-		
-		public object[] Arguments
-		{
-			get { return _arguments; }
-		}
-
-		public void MethodWithoutRowTestAttribute()
-		{
-		}
-
-		[RowTest]
-		public void MethodWithRowTestAttribute()
-		{
-		}
-
-		[RowTest]
-		[Row(4, 5)]
-		[Row(5, 6)]
-		public void RowTestMethodWith2Rows(int a, int b)
-		{
-			if (_arguments != null)
-				throw new InvalidOperationException("Arguments are already set.");
-			
-			_arguments = new object[] { a, b };
-		}
-
-		[RowTest]
-		[Row(4, 5, ExpectedException=typeof(InvalidOperationException))]
-		public void RowTestMethodWithExpectedException(int a, int b)
-		{
-			if (_arguments != null)
-				throw new InvalidOperationException("Arguments are already set.");
-			
-			_arguments = new object[] { a, b };
-		}
-
-		[RowTest]
-		[Row(4, 5, ExpectedException=typeof(InvalidOperationException), ExceptionMessage="Expected Exception Message.")]
-		public void RowTestMethodWithExpectedExceptionAndExceptionMessage(int a, int b)
-		{
-			if (_arguments != null)
-				throw new InvalidOperationException("Arguments are already set.");
-			
-			_arguments = new object[] { a, b };
-		}
-
-		[RowTest]
-		[Row(4, 5, TestName="UnitTest")]
-		public void RowTestMethodWithTestName(int a, int b)
-		{
-			if (_arguments != null)
-				throw new InvalidOperationException("Arguments are already set.");
-			
-			_arguments = new object[] { a, b };
-		}
-		
-		[RowTest]
-		[Row(null)]
-		public void RowTestMethodWithNullArgument(object a)
-		{
-			if (_arguments != null)
-				throw new InvalidOperationException("Arguments are already set.");
-			
-			_arguments = new object[] { a };
-		}
-		
-#if VS2005 && !FX1_1
-		[RowTest]
-		[Row(9, null)]
-		public void RowTestMethodWithNormalAndNullArgument(int a, object b)
-		{
-			if (_arguments != null)
-				throw new InvalidOperationException("Arguments are already set.");
-			
-			_arguments = new object[] { a, b };
-		}
-#endif
-
-		[RowTest]
-		[Category("Category")]
-		[Row(5, 6)]
-		public void RowTestMethodWithCategory(int a, int b)
-		{
-			if (_arguments != null)
-				throw new InvalidOperationException("Arguments are already set.");
-			
-			_arguments = new object[] { a, b };
-		}
-		
-		[RowTest]
-		[Row(SpecialValue.Null)]
-		public void RowTestMethodWithSpecialValue(object a)
-		{
-			if (_arguments != null)
-				throw new InvalidOperationException("Arguments are already set.");
-			
-			_arguments = new object[] { a };
-		}
-	}
-}
diff --git a/src/NUnitExtensions/tests/nunit.extensions.tests.build b/src/NUnitExtensions/tests/nunit.extensions.tests.build
deleted file mode 100644
index dec483a..0000000
--- a/src/NUnitExtensions/tests/nunit.extensions.tests.build
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0"?>
-<project name="NUnitExtensionsTests" default="build" basedir=".">
-
-  <target name="build">
-    <csc target="library" 
-        output="${current.build.dir}/nunit.extensions.tests.dll"
-        debug="${build.debug}" define="${build.defines}">
-      <sources>
-        <include name="RepeatedTestFixture.cs"/>
-        <include name="RowTest/*.cs"/>
-        <include name="RowTest/UnitTests/*.cs"/>
-        <include name="../../CommonAssemblyInfo.cs"/>
-      </sources>
-      <references basedir="${current.build.dir}">
-        <include name="nunit.mocks.dll"/>
-        <include name="nunit.framework.dll"/>
-        <include name="nunit.framework.extensions.dll"/>
-        <include name="nunit.core.interfaces.dll"/>
-        <include name="nunit.core.dll"/>
-        <include name="nunit.core.extensions.dll"/>
-        <include name="nunit.core.tests.dll"/>
-        <include name="test-assembly.dll"/>
-      </references>
-    </csc>
-  </target>
-
-  <target name="package">
-    <copy todir="${package.src.dir}/NUnitExtensions/tests">
-      <fileset refid="source-files" />
-    </copy>
-  </target>
-
-</project>
\ No newline at end of file
diff --git a/src/NUnitExtensions/tests/nunit.extensions.tests.csproj b/src/NUnitExtensions/tests/nunit.extensions.tests.csproj
deleted file mode 100644
index 8149b85..0000000
--- a/src/NUnitExtensions/tests/nunit.extensions.tests.csproj
+++ /dev/null
@@ -1,186 +0,0 @@
-<VisualStudioProject>
-    <CSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{92961F10-EB6D-4C91-AD4F-B4F27BA571B2}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = ""
-                AssemblyKeyContainerName = ""
-                AssemblyName = "nunit.extensions.tests"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "Library"
-                PreBuildEvent = ""
-                PostBuildEvent = ""
-                RootNamespace = "NUnit.Extensions.Tests"
-                RunPostBuildEvent = "OnBuildSuccess"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "true"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-                <Config
-                    Name = "Release"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "false"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "System"
-                    AssemblyName = "System"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.dll"
-                />
-                <Reference
-                    Name = "System.Data"
-                    AssemblyName = "System.Data"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Data.dll"
-                />
-                <Reference
-                    Name = "System.XML"
-                    AssemblyName = "System.Xml"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.XML.dll"
-                />
-                <Reference
-                    Name = "nunit.framework.dll"
-                    Project = "{83DD7E12-A705-4DBA-9D71-09C8973D9382}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.core.extensions.dll"
-                    Project = "{98B10E98-003C-45A0-9587-119142E39986}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.core.dll"
-                    Project = "{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "test-assembly"
-                    Project = "{1960CAC4-9A82-47C5-A9B3-55BC37572C3C}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.core.interfaces.dll"
-                    Project = "{435428F8-5995-4CE4-8022-93D595A8CC0F}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.framework.extensions.dll"
-                    Project = "{486C498D-B9F8-477F-ACA7-CED9245BBFCF}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.mocks"
-                    Project = "{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-            </References>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "CommonAssemblyInfo.cs"
-                    Link = "..\..\CommonAssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RepeatedTestFixture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RowTest\OrderedTest.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RowTest\RowTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RowTest\SetUpMethodsTestFixture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RowTest\UnitTests\BaseTestFixture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RowTest\UnitTests\RowTestAddInTest.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RowTest\UnitTests\RowTestCaseTest.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RowTest\UnitTests\RowTestFrameworkTest.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RowTest\UnitTests\RowTestNameBuilderTest.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RowTest\UnitTests\RowTestSuiteTest.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RowTest\UnitTests\TestClass.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-            </Include>
-        </Files>
-    </CSHARP>
-</VisualStudioProject>
-
diff --git a/src/NUnitExtensions/tests/nunit.extensions.tests.dll.config b/src/NUnitExtensions/tests/nunit.extensions.tests.dll.config
deleted file mode 100644
index 0e85c3e..0000000
--- a/src/NUnitExtensions/tests/nunit.extensions.tests.dll.config
+++ /dev/null
@@ -1,94 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<configuration>
-
-	<!--
-	 This is the configuration file for the NUnitTests.nunit test project. You may
-	 need to create a similar configuration file for your own test project. 
-	 
-	 In your own configuration file, the include any appSettings that you require.
-	 The <NUnit> section is only needed if you want to use a non-default value
-	 for any of the settings.
-	-->
-  <configSections>
-	<sectionGroup name="NUnit">
-		<section name="TestCaseBuilder" type="System.Configuration.NameValueSectionHandler"/>
-		<section name="TestRunner" type="System.Configuration.NameValueSectionHandler"/>
-	</sectionGroup>
-  </configSections>
-  
-  <appSettings>
-    <!--   User application and configured property settings go here.-->
-    <!--   Example: <add key="settingName" value="settingValue"/> -->
-    <add key="test.setting" value="54321" />
-  </appSettings>
-
-  <NUnit>
-    <TestCaseBuilder>
-        <!-- Set to true to recognize old style test 
-             cases starting with "Test..." -->
-		<add key="OldStyleTestCases" value="false" />
-    </TestCaseBuilder>
-	<TestRunner>
-		<!-- Valid values are STA,MTA. Others ignored. -->
-		<add key="ApartmentState" value="MTA" />
-		
-		<!-- See ThreadPriority enum for other valid values -->
-		<add key="ThreadPriority" value="Normal" />	
-	</TestRunner>
-  </NUnit>
-
-   <!--
-    The following <runtime> section allows running nunit tests under 
-    .NET 1.0 by redirecting assemblies. The appliesTo attribute
-    causes the section to be ignored except under .NET 1.0.
-   --> 
- <runtime>
-   
-    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
-			appliesTo="v1.0.3705">
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Data" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Drawing" 
-                          publicKeyToken="b03f5f7f11d50a3a" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Windows.Forms" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Xml" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-    </assemblyBinding>
-  
-  </runtime>
-
-</configuration> 
diff --git a/src/NUnitExtensions/tests/nunit.extensions.tests_VS2005.csproj b/src/NUnitExtensions/tests/nunit.extensions.tests_VS2005.csproj
deleted file mode 100644
index 639d118..0000000
--- a/src/NUnitExtensions/tests/nunit.extensions.tests_VS2005.csproj
+++ /dev/null
@@ -1,112 +0,0 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>8.0.50727</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{92961F10-EB6D-4C91-AD4F-B4F27BA571B2}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ApplicationIcon>
-    </ApplicationIcon>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit.extensions.tests</AssemblyName>
-    <AssemblyOriginatorKeyFile>
-    </AssemblyOriginatorKeyFile>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.Extensions.Tests</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <StartupObject>
-    </StartupObject>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release2005|AnyCPU' ">
-    <OutputPath>bin\Release2005\</OutputPath>
-    <DefineConstants>TRACE;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <Optimize>true</Optimize>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug2005|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\Debug2005\</OutputPath>
-    <DefineConstants>TRACE;DEBUG;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.XML">
-      <Name>System.XML</Name>
-    </Reference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="RepeatedTestFixture.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="RowTest\UnitTests\BaseTestFixture.cs" />
-    <Compile Include="RowTest\OrderedTest.cs" />
-    <Compile Include="RowTest\UnitTests\RowTestAddInTest.cs" />
-    <Compile Include="RowTest\UnitTests\RowTestCaseTest.cs" />
-    <Compile Include="RowTest\UnitTests\RowTestFrameworkTest.cs" />
-    <Compile Include="RowTest\UnitTests\RowTestNameBuilderTest.cs" />
-    <Compile Include="RowTest\RowTests.cs" />
-    <Compile Include="RowTest\SetUpMethodsTestFixture.cs" />
-    <Compile Include="RowTest\UnitTests\RowTestSuiteTest.cs" />
-    <Compile Include="RowTest\UnitTests\TestClass.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll_VS2005.csproj">
-      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
-      <Name>nunit.core.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll_VS2005.csproj">
-      <Project>{DCC88998-255A-4247-B658-71DD932E9873}</Project>
-      <Name>nunit.core.interfaces.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\tests\nunit.core.tests_VS2005.csproj">
-      <Project>{DD758D21-E5D5-4D40-9450-5F65A32F359C}</Project>
-      <Name>nunit.core.tests_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll_VS2005.csproj">
-      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
-      <Name>nunit.framework.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitMocks\mocks\nunit.mocks_VS2005.csproj">
-      <Project>{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}</Project>
-      <Name>nunit.mocks_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\tests\test-assembly\test-assembly_VS2005.csproj">
-      <Project>{1960CAC4-9A82-47C5-A9B3-55BC37572C3C}</Project>
-      <Name>test-assembly_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\core\nunit.core.extensions.dll_VS2005.csproj">
-      <Project>{98B10E98-003C-45A0-9587-119142E39986}</Project>
-      <Name>nunit.core.extensions.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\framework\nunit.framework.extensions.dll_VS2005.csproj">
-      <Project>{486C498D-B9F8-477F-ACA7-CED9245BBFCF}</Project>
-      <Name>nunit.framework.extensions.dll_VS2005</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
-</Project>
\ No newline at end of file
diff --git a/src/NUnitFixtures/fixtures/AssemblyRunner.cs b/src/NUnitFixtures/fixtures/AssemblyRunner.cs
index 1bced0d..9efa3b5 100644
--- a/src/NUnitFixtures/fixtures/AssemblyRunner.cs
+++ b/src/NUnitFixtures/fixtures/AssemblyRunner.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitFixtures/fixtures/PlatformInfo.cs b/src/NUnitFixtures/fixtures/PlatformInfo.cs
index 365be13..84027bd 100644
--- a/src/NUnitFixtures/fixtures/PlatformInfo.cs
+++ b/src/NUnitFixtures/fixtures/PlatformInfo.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitFixtures/fixtures/SnippetRunner.cs b/src/NUnitFixtures/fixtures/SnippetRunner.cs
index 22ea204..8e8583a 100644
--- a/src/NUnitFixtures/fixtures/SnippetRunner.cs
+++ b/src/NUnitFixtures/fixtures/SnippetRunner.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitFixtures/fixtures/TestCompiler.cs b/src/NUnitFixtures/fixtures/TestCompiler.cs
index 644120f..0443c72 100644
--- a/src/NUnitFixtures/fixtures/TestCompiler.cs
+++ b/src/NUnitFixtures/fixtures/TestCompiler.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -14,7 +14,10 @@ namespace NUnit.Fixtures
 	/// </summary>
 	public class TestCompiler
 	{
+        Microsoft.CSharp.CSharpCodeProvider provider;
+#if !NET_2_0
 		ICodeCompiler compiler;
+#endif
 		CompilerParameters options;
 
 		public TestCompiler() : this( null, null ) { }
@@ -23,8 +26,10 @@ namespace NUnit.Fixtures
 
 		public TestCompiler( string[] assemblyNames, string outputName )
 		{
-			Microsoft.CSharp.CSharpCodeProvider provider = new Microsoft.CSharp.CSharpCodeProvider();
+			this.provider = new Microsoft.CSharp.CSharpCodeProvider();
+#if !NET_2_0
 			this.compiler = provider.CreateCompiler();
+#endif
 			this.options = new CompilerParameters();
 
 			if ( assemblyNames != null && assemblyNames.Length > 0 )
@@ -44,7 +49,11 @@ namespace NUnit.Fixtures
 
 		public CompilerResults CompileCode( string code )
 		{
-			return compiler.CompileAssemblyFromSource( options, code );
-		}
+#if NET_2_0
+			return provider.CompileAssemblyFromSource( options, code );
+#else
+            return compiler.CompileAssemblyFromSource(options, code);
+#endif
+        }
 	}
 }
diff --git a/src/NUnitFixtures/fixtures/TestLoadFixture.cs b/src/NUnitFixtures/fixtures/TestLoadFixture.cs
index 22fa5af..4672b4e 100644
--- a/src/NUnitFixtures/fixtures/TestLoadFixture.cs
+++ b/src/NUnitFixtures/fixtures/TestLoadFixture.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -50,7 +50,7 @@ namespace NUnit.Fixtures
 
 		public int Skipped()
 		{
-			return testRunner.Test.TestCount - testSummary.ResultCount - testSummary.IgnoreCount;
+			return testRunner.Test.TestCount - testSummary.TestsRun - testSummary.Ignored;
 		}
 
 		public int Tests()
@@ -60,17 +60,17 @@ namespace NUnit.Fixtures
 
 		public int Run()
 		{
-			return testSummary.ResultCount;
+			return testSummary.TestsRun;
 		}
 
 		public int Failures()
 		{
-			return testSummary.FailureCount;
+			return testSummary.Failures;
 		}
 
 		public int Ignored()
 		{
-			return testSummary.IgnoreCount;
+			return testSummary.Ignored;
 		}
 	}
 }
diff --git a/src/NUnitFixtures/fixtures/TestTree.cs b/src/NUnitFixtures/fixtures/TestTree.cs
index dda3f0b..092193b 100644
--- a/src/NUnitFixtures/fixtures/TestTree.cs
+++ b/src/NUnitFixtures/fixtures/TestTree.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitFixtures/fixtures/nunit.fixtures.build b/src/NUnitFixtures/fixtures/nunit.fixtures.build
index 56227f7..d43b5ee 100644
--- a/src/NUnitFixtures/fixtures/nunit.fixtures.build
+++ b/src/NUnitFixtures/fixtures/nunit.fixtures.build
@@ -1,33 +1,38 @@
 <?xml version="1.0"?>
 <project name="NUnitFixtures" default="build" basedir=".">
 
+  <patternset id="source-files">
+        <include name="AssemblyRunner.cs"/>
+        <include name="PlatformInfo.cs"/>
+        <include name="SnippetRunner.cs"/>
+        <include name="TestLoadFixture.cs"/>
+        <include name="TestCompiler.cs"/>
+        <include name="TestTree.cs"/>
+  </patternset>
+
   <target name="build">
+    <copy file="${project.tools.dir}/fit/fit.dll" todir="${current.lib.dir}" />
+
     <csc target="library" 
-        output="${current.build.dir}/nunit.fixtures.dll"
+        output="${current.lib.dir}/nunit.fixtures.dll"
         debug="${build.debug}" define="${build.defines}">
       <sources >
-        <include name="AssemblyRunner.cs" asis="true"/>
-        <include name="PlatformInfo.cs" asis="true"/>
-        <include name="SnippetRunner.cs" asis="true"/>
-        <include name="TestLoadFixture.cs" asis="true"/>
-        <include name="TestCompiler.cs" asis="true"/>
-        <include name="TestTree.cs" asis="true"/>
-        <include name="../../CommonAssemblyInfo.cs"/>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
       </sources>
       <nowarn>
         <warning number="618" if="${runtime.version=='2.0'}"/>
       </nowarn>
-      <references basedir="${current.build.dir}">
+      <references basedir="${current.lib.dir}">
         <include name="nunit.core.interfaces.dll"/>
         <include name="nunit.core.dll"/>
         <include name="nunit.util.dll"/>
-        <include name="${fit.dir}/fit.dll"/>
+        <include name="fit.dll"/>
       </references>
     </csc>
 
     <copy todir="${current.build.dir}">
-      <fileset basedir="${fit.dir}">
-        <include name="fit.dll"/>
+      <fileset basedir="${project.tools.dir}/fit">
         <include name="runFile.exe"/>
         <include name="runFile.exe.config"/>
       </fileset>
@@ -36,7 +41,11 @@
 
   <target name="package">
     <copy todir="${package.src.dir}/NUnitFixtures/fixtures">
-      <fileset refid="source-files" />
+      <fileset>
+        <patternset refid="source-files"/>
+        <include name="nunit.fixtures.csproj"/>
+        <include name="nunit.fixtures.build"/>
+      </fileset>
     </copy>
   </target>
 
diff --git a/src/NUnitFixtures/fixtures/nunit.fixtures.csproj b/src/NUnitFixtures/fixtures/nunit.fixtures.csproj
index 727589f..c09a127 100644
--- a/src/NUnitFixtures/fixtures/nunit.fixtures.csproj
+++ b/src/NUnitFixtures/fixtures/nunit.fixtures.csproj
@@ -1,146 +1,111 @@
-<VisualStudioProject>
-    <CSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{A8D36198-BE2F-44E5-AC4F-4E052AFCCF78}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = ""
-                AssemblyKeyContainerName = ""
-                AssemblyName = "nunit.fixtures"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "Library"
-                PreBuildEvent = ""
-                PostBuildEvent = ""
-                RootNamespace = "NUnit.Fixtures"
-                RunPostBuildEvent = "OnBuildSuccess"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "true"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-                <Config
-                    Name = "Release"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "false"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "System"
-                    AssemblyName = "System"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.dll"
-                />
-                <Reference
-                    Name = "fit"
-                    AssemblyName = "fit"
-                    HintPath = "..\..\..\tools\fit\fit.dll"
-                />
-                <Reference
-                    Name = "nunit.core.dll"
-                    Project = "{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.core.interfaces.dll"
-                    Project = "{435428F8-5995-4CE4-8022-93D595A8CC0F}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.util.dll"
-                    Project = "{61CE9CE5-943E-44D4-A381-814DC1406767}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "System.Data"
-                    AssemblyName = "System.Data"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Data.dll"
-                />
-                <Reference
-                    Name = "System.XML"
-                    AssemblyName = "System.Xml"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.XML.dll"
-                />
-            </References>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "AssemblyRunner.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CommonAssemblyInfo.cs"
-                    Link = "..\..\CommonAssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "PlatformInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SnippetRunner.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestCompiler.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestLoadFixture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestTree.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-            </Include>
-        </Files>
-    </CSHARP>
-</VisualStudioProject>
-
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{A8D36198-BE2F-44E5-AC4F-4E052AFCCF78}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit.fixtures</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.Fixtures</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\lib\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG;NET_2_0</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\lib\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;NET_2_0</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="fit, Version=1.1.0.40850, Culture=neutral, PublicKeyToken=5b16339c2b9d4af9">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\tools\fit\fit.dll</HintPath>
+    </Reference>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
+      <Name>nunit.util.dll</Name>
+      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
+      <Name>nunit.core.dll</Name>
+      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
+      <Name>nunit.core.interfaces.dll</Name>
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="AssemblyRunner.cs" />
+    <Compile Include="PlatformInfo.cs" />
+    <Compile Include="SnippetRunner.cs" />
+    <Compile Include="TestCompiler.cs" />
+    <Compile Include="TestLoadFixture.cs" />
+    <Compile Include="TestTree.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit.fixtures.build" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/NUnitFixtures/fixtures/nunit.fixtures_VS2005.csproj b/src/NUnitFixtures/fixtures/nunit.fixtures_VS2005.csproj
deleted file mode 100644
index f10b441..0000000
--- a/src/NUnitFixtures/fixtures/nunit.fixtures_VS2005.csproj
+++ /dev/null
@@ -1,144 +0,0 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release2005|AnyCPU' ">
-    <OutputPath>bin\Release2005\</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <Optimize>true</Optimize>
-    <DebugType>
-    </DebugType>
-    <PlatformTarget>AnyCPU</PlatformTarget>
-    <CodeAnalysisRuleAssemblies>\rules</CodeAnalysisRuleAssemblies>
-    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
-    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
-    <ErrorReport>prompt</ErrorReport>
-    <NoWarn>618</NoWarn>
-  </PropertyGroup>
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>8.0.50727</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{67D6949E-F4D2-4821-B02B-4AAFC3F18B52}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ApplicationIcon>
-    </ApplicationIcon>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit.fixtures</AssemblyName>
-    <AssemblyOriginatorKeyFile>
-    </AssemblyOriginatorKeyFile>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.Fixtures</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <StartupObject>
-    </StartupObject>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <OutputPath>bin\Debug\</OutputPath>
-    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
-    <BaseAddress>285212672</BaseAddress>
-    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <DebugSymbols>true</DebugSymbols>
-    <FileAlignment>4096</FileAlignment>
-    <NoStdLib>false</NoStdLib>
-    <NoWarn>
-    </NoWarn>
-    <Optimize>false</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>full</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <OutputPath>bin\Release\</OutputPath>
-    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
-    <BaseAddress>285212672</BaseAddress>
-    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <DebugSymbols>false</DebugSymbols>
-    <FileAlignment>4096</FileAlignment>
-    <NoStdLib>false</NoStdLib>
-    <NoWarn>
-    </NoWarn>
-    <Optimize>true</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>none</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug2005|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\Debug2005\</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <DebugType>full</DebugType>
-    <PlatformTarget>AnyCPU</PlatformTarget>
-    <CodeAnalysisRuleAssemblies>\rules</CodeAnalysisRuleAssemblies>
-    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
-    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="fit">
-      <Name>fit</Name>
-      <HintPath>..\..\..\tools\fit\fit.dll</HintPath>
-    </Reference>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll_VS2005.csproj">
-      <Name>nunit.util.dll_VS2005</Name>
-      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
-      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll_VS2005.csproj">
-      <Name>nunit.core.dll_VS2005</Name>
-      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
-      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll_VS2005.csproj">
-      <Project>{DCC88998-255A-4247-B658-71DD932E9873}</Project>
-      <Name>nunit.core.interfaces.dll_VS2005</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="AssemblyRunner.cs" />
-    <Compile Include="PlatformInfo.cs" />
-    <Compile Include="SnippetRunner.cs" />
-    <Compile Include="TestCompiler.cs" />
-    <Compile Include="TestLoadFixture.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestTree.cs">
-      <SubType>Code</SubType>
-    </Compile>
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
-</Project>
\ No newline at end of file
diff --git a/src/NUnitFixtures/tests/AssemblyInfo.cs b/src/NUnitFixtures/tests/AssemblyInfo.cs
deleted file mode 100644
index 177a4f0..0000000
--- a/src/NUnitFixtures/tests/AssemblyInfo.cs
+++ /dev/null
@@ -1,58 +0,0 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-
-//
-// General Information about an assembly is controlled through the following 
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-//
-[assembly: AssemblyTitle("")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("")]
-[assembly: AssemblyCopyright("")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]		
-
-//
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version 
-//      Build Number
-//      Revision
-//
-// You can specify all the values or you can default the Revision and Build Numbers 
-// by using the '*' as shown below:
-
-[assembly: AssemblyVersion("1.0.*")]
-
-//
-// In order to sign your assembly you must specify a key to use. Refer to the 
-// Microsoft .NET Framework documentation for more information on assembly signing.
-//
-// Use the attributes below to control which key is used for signing. 
-//
-// Notes: 
-//   (*) If no key is specified, the assembly is not signed.
-//   (*) KeyName refers to a key that has been installed in the Crypto Service
-//       Provider (CSP) on your machine. KeyFile refers to a file which contains
-//       a key.
-//   (*) If the KeyFile and the KeyName values are both specified, the 
-//       following processing occurs:
-//       (1) If the KeyName can be found in the CSP, that key is used.
-//       (2) If the KeyName does not exist and the KeyFile does exist, the key 
-//           in the KeyFile is installed into the CSP and used.
-//   (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
-//       When specifying the KeyFile, the location of the KeyFile should be
-//       relative to the project output directory which is
-//       %Project Directory%\obj\<configuration>. For example, if your KeyFile is
-//       located in the project directory, you would specify the AssemblyKeyFile 
-//       attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
-//   (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
-//       documentation for more information on this.
-//
-[assembly: AssemblyDelaySign(false)]
-[assembly: AssemblyKeyFile("")]
-[assembly: AssemblyKeyName("")]
diff --git a/src/NUnitFixtures/tests/CompilationTests.cs b/src/NUnitFixtures/tests/CompilationTests.cs
index 44ddb5a..dfd489e 100644
--- a/src/NUnitFixtures/tests/CompilationTests.cs
+++ b/src/NUnitFixtures/tests/CompilationTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -16,12 +16,15 @@ namespace NUnit.Fixtures.Tests
 	/// <summary>
 	/// Summary description for CompilationTests.
 	/// </summary>
-	[TestFixture,Platform(Exclude="Mono",Reason="Holds output file open")]
-	public class CompilationTests
+	[TestFixture]
+    // TODO: Exclusion should really only apply to Mono on Windows
+    //[Platform(Exclude = "Mono")]
+    [Explicit]
+    public class CompilationTests
 	{
 		private TestCompiler compiler;
 		private static string[] references = new string[] { "System.dll", "nunit.framework.dll" };
-		private static string outputName = "test.dll";
+		private static string outputName = Path.GetFullPath("test.dll");
 		private static string goodCode = 
 @"using System;
 using NUnit.Framework;
diff --git a/src/NUnitFixtures/tests/TestTreeTests.cs b/src/NUnitFixtures/tests/TestTreeTests.cs
index b7832ab..b0c0673 100644
--- a/src/NUnitFixtures/tests/TestTreeTests.cs
+++ b/src/NUnitFixtures/tests/TestTreeTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitFixtures/tests/nunit.fixtures.tests.build b/src/NUnitFixtures/tests/nunit.fixtures.tests.build
index 0be2fd2..7cb7fd0 100644
--- a/src/NUnitFixtures/tests/nunit.fixtures.tests.build
+++ b/src/NUnitFixtures/tests/nunit.fixtures.tests.build
@@ -1,28 +1,36 @@
 <?xml version="1.0"?>
 <project name="NUnitFixtureTests" default="build" basedir=".">
 
+  <patternset id="source-files">
+        <include name="CompilationTests.cs"/>
+        <include name="TestTreeTests.cs"/>
+  </patternset>
+
   <target name="build">
     <csc target="library" 
-        output="${current.build.dir}/nunit.fixtures.tests.dll"
+        output="${current.test.dir}/nunit.fixtures.tests.dll"
         debug="${build.debug}" define="${build.defines}">
       <sources>
-        <include name="CompilationTests.cs"/>
-        <include name="TestTreeTests.cs"/>
-        <include name="../../CommonAssemblyInfo.cs"/>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
       </sources>
-      <references basedir="${current.build.dir}">
-        <include name="nunit.framework.dll"/>
-        <include name="nunit.core.interfaces.dll"/>
-        <include name="nunit.core.dll"/>
-        <include name="nunit.util.dll"/>
-        <include name="nunit.fixtures.dll"/>
+      <references>
+        <include name="${current.framework.dir}/nunit.framework.dll"/>
+        <include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
+        <include name="${current.lib.dir}/nunit.core.dll"/>
+        <include name="${current.lib.dir}/nunit.util.dll"/>
+        <include name="${current.lib.dir}/nunit.fixtures.dll"/>
       </references>
     </csc>
   </target>
 
   <target name="package">
     <copy todir="${package.src.dir}/NUnitFixtures/tests">
-      <fileset refid="source-files" />
+      <fileset>
+        <patternset refid="source-files"/>
+        <include name="nunit.fixtures.tests.csproj"/>
+        <include name="nunit.fixtures.tests.build"/>
+      </fileset>
     </copy>
   </target>
 
diff --git a/src/NUnitFixtures/tests/nunit.fixtures.tests.csproj b/src/NUnitFixtures/tests/nunit.fixtures.tests.csproj
index 97cc356..317b99d 100644
--- a/src/NUnitFixtures/tests/nunit.fixtures.tests.csproj
+++ b/src/NUnitFixtures/tests/nunit.fixtures.tests.csproj
@@ -1,136 +1,117 @@
-<VisualStudioProject>
-    <CSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{55F2D231-743C-48DD-B79A-00E5A7236CBE}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = ""
-                AssemblyKeyContainerName = ""
-                AssemblyName = "nunit.fixtures.tests"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "Library"
-                PreBuildEvent = ""
-                PostBuildEvent = ""
-                RootNamespace = "NUnit.Fixtures.Tests"
-                RunPostBuildEvent = "OnBuildSuccess"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "true"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-                <Config
-                    Name = "Release"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "false"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "System"
-                    AssemblyName = "System"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.dll"
-                />
-                <Reference
-                    Name = "nunit.framework.dll"
-                    Project = "{83DD7E12-A705-4DBA-9D71-09C8973D9382}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.fixtures"
-                    Project = "{A8D36198-BE2F-44E5-AC4F-4E052AFCCF78}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.core.interfaces.dll"
-                    Project = "{435428F8-5995-4CE4-8022-93D595A8CC0F}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.util.dll"
-                    Project = "{61CE9CE5-943E-44D4-A381-814DC1406767}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "System.Data"
-                    AssemblyName = "System.Data"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Data.dll"
-                />
-                <Reference
-                    Name = "System.XML"
-                    AssemblyName = "System.Xml"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.XML.dll"
-                />
-                <Reference
-                    Name = "nunit.core.tests"
-                    Project = "{DD758D21-E5D5-4D40-9450-5F65A32F359C}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.core.dll"
-                    Project = "{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-            </References>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "CommonAssemblyInfo.cs"
-                    Link = "..\..\CommonAssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CompilationTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestTreeTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-            </Include>
-        </Files>
-    </CSHARP>
-</VisualStudioProject>
-
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{55F2D231-743C-48DD-B79A-00E5A7236CBE}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit.fixtures.tests</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.Fixtures.Tests</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
+      <Name>nunit.util.dll</Name>
+      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
+      <Name>nunit.core.dll</Name>
+      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
+      <Name>nunit.core.interfaces.dll</Name>
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\tests\nunit.core.tests.csproj">
+      <Name>nunit.core.tests</Name>
+      <Project>{DD758D21-E5D5-4D40-9450-5F65A32F359C}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
+      <Name>nunit.framework.dll</Name>
+      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\fixtures\nunit.fixtures.csproj">
+      <Name>nunit.fixtures</Name>
+      <Project>{A8D36198-BE2F-44E5-AC4F-4E052AFCCF78}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="CompilationTests.cs" />
+    <Compile Include="TestTreeTests.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit.fixtures.tests.build" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/NUnitFixtures/tests/nunit.fixtures.tests_VS2005.csproj b/src/NUnitFixtures/tests/nunit.fixtures.tests_VS2005.csproj
deleted file mode 100644
index 54b006e..0000000
--- a/src/NUnitFixtures/tests/nunit.fixtures.tests_VS2005.csproj
+++ /dev/null
@@ -1,147 +0,0 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>8.0.50727</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{55F2D231-743C-48DD-B79A-00E5A7236CBE}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ApplicationIcon>
-    </ApplicationIcon>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit.fixtures.tests</AssemblyName>
-    <AssemblyOriginatorKeyFile>
-    </AssemblyOriginatorKeyFile>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.Fixtures.Tests</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <StartupObject>
-    </StartupObject>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <OutputPath>bin\Debug2005\</OutputPath>
-    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
-    <BaseAddress>285212672</BaseAddress>
-    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <DebugSymbols>true</DebugSymbols>
-    <FileAlignment>4096</FileAlignment>
-    <NoStdLib>false</NoStdLib>
-    <NoWarn>
-    </NoWarn>
-    <Optimize>false</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>full</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <OutputPath>bin\Release\</OutputPath>
-    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
-    <BaseAddress>285212672</BaseAddress>
-    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <DebugSymbols>false</DebugSymbols>
-    <FileAlignment>4096</FileAlignment>
-    <NoStdLib>false</NoStdLib>
-    <NoWarn>
-    </NoWarn>
-    <Optimize>true</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>none</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release2005|AnyCPU' ">
-    <OutputPath>bin\Release2005\</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <Optimize>true</Optimize>
-    <DebugType>
-    </DebugType>
-    <PlatformTarget>AnyCPU</PlatformTarget>
-    <CodeAnalysisRuleAssemblies>\rules</CodeAnalysisRuleAssemblies>
-    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
-    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug2005|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\Debug2005\</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <DebugType>full</DebugType>
-    <PlatformTarget>AnyCPU</PlatformTarget>
-    <CodeAnalysisRuleAssemblies>\rules</CodeAnalysisRuleAssemblies>
-    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
-    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll_VS2005.csproj">
-      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
-      <Name>nunit.util.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll_VS2005.csproj">
-      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
-      <Name>nunit.core.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll_VS2005.csproj">
-      <Project>{DCC88998-255A-4247-B658-71DD932E9873}</Project>
-      <Name>nunit.core.interfaces.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\tests\nunit.core.tests_VS2005.csproj">
-      <Project>{DD758D21-E5D5-4D40-9450-5F65A32F359C}</Project>
-      <Name>nunit.core.tests_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll_VS2005.csproj">
-      <Name>nunit.framework.dll</Name>
-      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
-      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
-    </ProjectReference>
-    <ProjectReference Include="..\fixtures\nunit.fixtures_VS2005.csproj">
-      <Project>{67D6949E-F4D2-4821-B02B-4AAFC3F18B52}</Project>
-      <Name>nunit.fixtures_VS2005</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="AssemblyInfo.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="CompilationTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestTreeTests.cs" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
-</Project>
\ No newline at end of file
diff --git a/src/NUnitFramework/framework/AbstractAsserter.cs b/src/NUnitFramework/framework/AbstractAsserter.cs
deleted file mode 100644
index c3784eb..0000000
--- a/src/NUnitFramework/framework/AbstractAsserter.cs
+++ /dev/null
@@ -1,88 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework
-{
-	/// <summary>
-	/// NOTE: The use of asserters for extending NUnit has
-	/// now been replaced by the use of constraints. This
-	/// class is marked obsolete.
-	/// 
-	/// AbstractAsserter is the base class for all asserters.
-	/// Asserters encapsulate a condition test and generation 
-	/// of an AssertionException with a tailored message. They
-	/// are used by the Assert class as helper objects.
-	/// 
-	/// User-defined asserters may be passed to the 
-	/// Assert.DoAssert method in order to implement 
-	/// extended asserts.
-	/// </summary>
-	[Obsolete("Use Constraints rather than Asserters for new work")]
-	public abstract class AbstractAsserter : IAsserter
-	{
-		/// <summary>
-		/// The user-defined message for this asserter.
-		/// </summary>
-		protected readonly string userMessage;
-		
-		/// <summary>
-		/// Arguments to use in formatting the user-defined message.
-		/// </summary>
-		protected readonly object[] args;
-
-		/// <summary>
-		/// Our failure message object, initialized as needed
-		/// </summary>
-		private AssertionFailureMessage failureMessage;
-
-		/// <summary>
-		/// Constructs an AbstractAsserter
-		/// </summary>
-		/// <param name="message">The message issued upon failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		public AbstractAsserter( string message, params object[] args )
-		{
-			this.userMessage = message;
-			this.args = args;
-		}
-
-		/// <summary>
-		/// AssertionFailureMessage object used internally
-		/// </summary>
-		protected AssertionFailureMessage FailureMessage
-		{
-			get
-			{
-				if ( failureMessage == null )
-					failureMessage = new AssertionFailureMessage( userMessage, args );
-				return failureMessage;
-			}
-		}
-
-		#region IAsserter Interface
-		/// <summary>
-		/// Test method to be implemented by derived types.
-		/// Default always succeeds.
-		/// </summary>
-		/// <returns>True if the test succeeds</returns>
-		public abstract bool Test();
-
-		/// <summary>
-		/// Message related to a failure. If no failure has
-		/// occured, the result is unspecified.
-		/// </summary>
-		public virtual string Message
-		{
-			get
-			{
-				return FailureMessage.ToString();
-			}
-		}
-		#endregion
-	}
-}
diff --git a/src/NUnitFramework/framework/AssemblyInfo.cs b/src/NUnitFramework/framework/AssemblyInfo.cs
index c0a0da2..d08af6e 100644
--- a/src/NUnitFramework/framework/AssemblyInfo.cs
+++ b/src/NUnitFramework/framework/AssemblyInfo.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -10,5 +10,5 @@ using System.Reflection;
 [assembly: CLSCompliant(true)]
 
 [assembly: AssemblyDelaySign(false)]
-[assembly: AssemblyKeyFile("../../../../nunit.snk")]
+[assembly: AssemblyKeyFile("../../nunit.snk")]
 [assembly: AssemblyKeyName("")]
diff --git a/src/NUnitFramework/framework/Assert.cs b/src/NUnitFramework/framework/Assert.cs
index f27e6e1..4ec1af4 100644
--- a/src/NUnitFramework/framework/Assert.cs
+++ b/src/NUnitFramework/framework/Assert.cs
@@ -1,2211 +1,466 @@
 // ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+// ****************************************************************
+//              Generated by the NUnit Syntax Generator
+//
+// Command Line: GenSyntax.exe SyntaxElements.txt
+// 
+//                  DO NOT MODIFY THIS FILE DIRECTLY
 // ****************************************************************
 
 using System;
 using System.Collections;
 using System.ComponentModel;
 using NUnit.Framework.Constraints;
-using NUnit.Framework.SyntaxHelpers;
 
 namespace NUnit.Framework
 {
-	/// <summary>
-	/// The Assert class contains a collection of static methods that
-	/// implement the most common assertions used in NUnit.
-	/// </summary>
-	public class Assert
-	{
-		#region Assert Counting
-
-		private static int counter = 0;
-		
-		/// <summary>
-		/// Gets the number of assertions executed so far and 
-		/// resets the counter to zero.
-		/// </summary>
-		public static int Counter
-		{
-			get
-			{
-				int cnt = counter;
-				counter = 0;
-				return cnt;
-			}
-		}
-
-		private static void IncrementAssertCount()
-		{
-			++counter;
-		}
-
-		#endregion
-
-		#region Constructor
-
-		/// <summary>
-		/// We don't actually want any instances of this object, but some people
-		/// like to inherit from it to add other static methods. Hence, the
-		/// protected constructor disallows any instances of this object. 
-		/// </summary>
-		protected Assert() {}
-
-		#endregion
-
-		#region Equals and ReferenceEquals
-
-		/// <summary>
-		/// The Equals method throws an AssertionException. This is done 
-		/// to make sure there is no mistake by calling this function.
-		/// </summary>
-		/// <param name="a"></param>
-		/// <param name="b"></param>
-		[EditorBrowsable(EditorBrowsableState.Never)]
-		public static new bool Equals(object a, object b)
-		{
-			throw new AssertionException("Assert.Equals should not be used for Assertions");
-		}
-
-		/// <summary>
-		/// override the default ReferenceEquals to throw an AssertionException. This 
-		/// implementation makes sure there is no mistake in calling this function 
-		/// as part of Assert. 
-		/// </summary>
-		/// <param name="a"></param>
-		/// <param name="b"></param>
-		public static new void ReferenceEquals(object a, object b)
-		{
-			throw new AssertionException("Assert.ReferenceEquals should not be used for Assertions");
-		}
-
-		#endregion
-				
-		#region IsTrue
-
-		/// <summary>
-		/// Asserts that a condition is true. If the condition is false the method throws
-		/// an <see cref="AssertionException"/>.
-		/// </summary> 
-		/// <param name="condition">The evaluated condition</param>
-		/// <param name="message">The message to display if the condition is false</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void IsTrue(bool condition, string message, params object[] args) 
-		{
-            Assert.That(condition, Is.True, message, args);
-		}
-    
-		/// <summary>
-		/// Asserts that a condition is true. If the condition is false the method throws
-		/// an <see cref="AssertionException"/>.
-		/// </summary>
-		/// <param name="condition">The evaluated condition</param>
-		/// <param name="message">The message to display if the condition is false</param>
-		static public void IsTrue(bool condition, string message) 
-		{
-			Assert.IsTrue(condition, message, null);
-		}
-
-		/// <summary>
-		/// Asserts that a condition is true. If the condition is false the method throws
-		/// an <see cref="AssertionException"/>.
-		/// </summary>
-		/// <param name="condition">The evaluated condition</param>
-		static public void IsTrue(bool condition) 
-		{
-			Assert.IsTrue(condition, null, null);
-		}
-
-		#endregion
-
-		#region IsFalse
-
-		/// <summary>
-		/// Asserts that a condition is false. If the condition is true the method throws
-		/// an <see cref="AssertionException"/>.
-		/// </summary>
-		/// <param name="condition">The evaluated condition</param>
-		/// <param name="message">The message to display if the condition is true</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void IsFalse(bool condition, string message, params object[] args) 
-		{
-            Assert.That(condition, Is.False, message, args);
-		}
-		
-		/// <summary>
-		/// Asserts that a condition is false. If the condition is true the method throws
-		/// an <see cref="AssertionException"/>.
-		/// </summary>
-		/// <param name="condition">The evaluated condition</param>
-		/// <param name="message">The message to display if the condition is true</param>
-		static public void IsFalse(bool condition, string message) 
-		{
-			Assert.IsFalse( condition, message, null );
-		}
-		
-		/// <summary>
-		/// Asserts that a condition is false. If the condition is true the method throws
-		/// an <see cref="AssertionException"/>.
-		/// </summary>
-		/// <param name="condition">The evaluated condition</param>
-		static public void IsFalse(bool condition) 
-		{
-			Assert.IsFalse(condition, string.Empty, null);
-		}
-
-		#endregion
-
-		#region IsNotNull
-
-		/// <summary>
-		/// Verifies that the object that is passed in is not equal to <code>null</code>
-		/// If the object is <code>null</code> then an <see cref="AssertionException"/>
-		/// is thrown.
-		/// </summary>
-		/// <param name="anObject">The object that is to be tested</param>
-		/// <param name="message">The message to be displayed when the object is null</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void IsNotNull(Object anObject, string message, params object[] args) 
-		{
-            Assert.That(anObject, Is.Not.Null, message, args);
-		}
-
-		/// <summary>
-		/// Verifies that the object that is passed in is not equal to <code>null</code>
-		/// If the object is <code>null</code> then an <see cref="AssertionException"/>
-		/// is thrown.
-		/// </summary>
-		/// <param name="anObject">The object that is to be tested</param>
-		/// <param name="message">The message to be displayed when the object is null</param>
-		static public void IsNotNull(Object anObject, string message) 
-		{
-			Assert.IsNotNull(anObject, message, null);
-		}
-    
-		/// <summary>
-		/// Verifies that the object that is passed in is not equal to <code>null</code>
-		/// If the object is <code>null</code> then an <see cref="AssertionException"/>
-		/// is thrown.
-		/// </summary>
-		/// <param name="anObject">The object that is to be tested</param>
-		static public void IsNotNull(Object anObject) 
-		{
-			Assert.IsNotNull(anObject, string.Empty, null);
-		}
-    
-		#endregion
-		    
-		#region IsNull
-
-		/// <summary>
-		/// Verifies that the object that is passed in is equal to <code>null</code>
-		/// If the object is not <code>null</code> then an <see cref="AssertionException"/>
-		/// is thrown.
-		/// </summary>
-		/// <param name="anObject">The object that is to be tested</param>
-		/// <param name="message">The message to be displayed when the object is not null</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void IsNull(Object anObject, string message, params object[] args) 
-		{
-			Assert.That( anObject, Is.Null, message, args );
-		}
-
-		/// <summary>
-		/// Verifies that the object that is passed in is equal to <code>null</code>
-		/// If the object is not <code>null</code> then an <see cref="AssertionException"/>
-		/// is thrown.
-		/// </summary>
-		/// <param name="anObject">The object that is to be tested</param>
-		/// <param name="message">The message to be displayed when the object is not null</param>
-		static public void IsNull(Object anObject, string message) 
-		{
-			Assert.IsNull(anObject, message, null);
-		}
-    
-		/// <summary>
-		/// Verifies that the object that is passed in is equal to <code>null</code>
-		/// If the object is not null <code>null</code> then an <see cref="AssertionException"/>
-		/// is thrown.
-		/// </summary>
-		/// <param name="anObject">The object that is to be tested</param>
-		static public void IsNull(Object anObject) 
-		{
-			Assert.IsNull(anObject, string.Empty, null);
-		}
-    
-		#endregion
-
-		#region IsNaN
-
-		/// <summary>
-		/// Verifies that the double is passed is an <code>NaN</code> value.
-		/// If the object is not <code>NaN</code> then an <see cref="AssertionException"/>
-		/// is thrown.
-		/// </summary>
-		/// <param name="aDouble">The value that is to be tested</param>
-		/// <param name="message">The message to be displayed when the object is not null</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void IsNaN(double aDouble, string message, params object[] args) 
-		{
-            Assert.That(aDouble, Is.NaN, message, args);
-		}
-
-		/// <summary>
-		/// Verifies that the double is passed is an <code>NaN</code> value.
-		/// If the object is not <code>NaN</code> then an <see cref="AssertionException"/>
-		/// is thrown.
-		/// </summary>
-		/// <param name="aDouble">The object that is to be tested</param>
-		/// <param name="message">The message to be displayed when the object is not null</param>
-		static public void IsNaN(double aDouble, string message) 
-		{
-			Assert.IsNaN(aDouble, message, null);
-		}
-    
-		/// <summary>
-		/// Verifies that the double is passed is an <code>NaN</code> value.
-		/// If the object is not <code>NaN</code> then an <see cref="AssertionException"/>
-		/// is thrown.
-		/// </summary>
-		/// <param name="aDouble">The object that is to be tested</param>
-		static public void IsNaN(double aDouble) 
-		{
-			Assert.IsNaN(aDouble, string.Empty, null);
-		}
-    
-		#endregion
-
-		#region IsEmpty
-
-		/// <summary>
-		/// Assert that a string is empty - that is equal to string.Empty
-		/// </summary>
-		/// <param name="aString">The string to be tested</param>
-		/// <param name="message">The message to be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		public static void IsEmpty( string aString, string message, params object[] args )
-		{
-            Assert.That(aString, new EmptyStringConstraint(), message, args);
-		}
-
-		/// <summary>
-		/// Assert that a string is empty - that is equal to string.Emtpy
-		/// </summary>
-		/// <param name="aString">The string to be tested</param>
-		/// <param name="message">The message to be displayed on failure</param>
-		public static void IsEmpty( string aString, string message )
-		{
-			IsEmpty( aString, message, null );
-		}
-
-		/// <summary>
-		/// Assert that a string is empty - that is equal to string.Emtpy
-		/// </summary>
-		/// <param name="aString">The string to be tested</param>
-		public static void IsEmpty( string aString )
-		{
-			IsEmpty( aString, string.Empty, null );
-		}
-
-		/// <summary>
-		/// Assert that an array, list or other collection is empty
-		/// </summary>
-		/// <param name="collection">An array, list or other collection implementing ICollection</param>
-		/// <param name="message">The message to be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		public static void IsEmpty( ICollection collection, string message, params object[] args )
-		{
-            Assert.That(collection, new EmptyCollectionConstraint(), message, args);
-		}
-
-		/// <summary>
-		/// Assert that an array, list or other collection is empty
-		/// </summary>
-		/// <param name="collection">An array, list or other collection implementing ICollection</param>
-		/// <param name="message">The message to be displayed on failure</param>
-		public static void IsEmpty( ICollection collection, string message )
-		{
-			IsEmpty( collection, message, null );
-		}
-
-		/// <summary>
-		/// Assert that an array,list or other collection is empty
-		/// </summary>
-		/// <param name="collection">An array, list or other collection implementing ICollection</param>
-		public static void IsEmpty( ICollection collection )
-		{
-			IsEmpty( collection, string.Empty, null );
-		}
-		#endregion
-
-		#region IsNotEmpty
-		/// <summary>
-		/// Assert that a string is not empty - that is not equal to string.Empty
-		/// </summary>
-		/// <param name="aString">The string to be tested</param>
-		/// <param name="message">The message to be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		public static void IsNotEmpty( string aString, string message, params object[] args )
-		{
-            Assert.That(aString, Is.Not.Empty, message, args);
-		}
-
-		/// <summary>
-		/// Assert that a string is empty - that is equal to string.Emtpy
-		/// </summary>
-		/// <param name="aString">The string to be tested</param>
-		/// <param name="message">The message to be displayed on failure</param>
-		public static void IsNotEmpty( string aString, string message )
-		{
-			IsNotEmpty( aString, message, null );
-		}
-
-		/// <summary>
-		/// Assert that a string is empty - that is equal to string.Emtpy
-		/// </summary>
-		/// <param name="aString">The string to be tested</param>
-		public static void IsNotEmpty( string aString )
-		{
-			IsNotEmpty( aString, string.Empty, null );
-		}
-
-		/// <summary>
-		/// Assert that an array, list or other collection is empty
-		/// </summary>
-		/// <param name="collection">An array, list or other collection implementing ICollection</param>
-		/// <param name="message">The message to be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		public static void IsNotEmpty( ICollection collection, string message, params object[] args )
-		{
-            Assert.That(collection, Is.Not.Empty, message, args);
-		}
-
-		/// <summary>
-		/// Assert that an array, list or other collection is empty
-		/// </summary>
-		/// <param name="collection">An array, list or other collection implementing ICollection</param>
-		/// <param name="message">The message to be displayed on failure</param>
-		public static void IsNotEmpty( ICollection collection, string message )
-		{
-			IsNotEmpty( collection, message, null );
-		}
-
-		/// <summary>
-		/// Assert that an array,list or other collection is empty
-		/// </summary>
-		/// <param name="collection">An array, list or other collection implementing ICollection</param>
-		public static void IsNotEmpty( ICollection collection )
-		{
-			IsNotEmpty( collection, string.Empty, null );
-		}
-		#endregion
-
-		#region IsAssignableFrom
-		/// <summary>
-		/// Asserts that an object may be assigned a  value of a given Type.
-		/// </summary>
-		/// <param name="expected">The expected Type.</param>
-		/// <param name="actual">The object under examination</param>
-		static public void IsAssignableFrom( System.Type expected, object actual )
-		{
-			IsAssignableFrom(expected, actual, "");
-		}
-
-		/// <summary>
-		/// Asserts that an object may be assigned a  value of a given Type.
-		/// </summary>
-		/// <param name="expected">The expected Type.</param>
-		/// <param name="actual">The object under examination</param>
-		/// <param name="message">The messge to display in case of failure</param>
-		static public void IsAssignableFrom( System.Type expected, object actual, string message )
-		{
-			IsAssignableFrom(expected, actual, message, null);
-		}
-		
-		/// <summary>
-		/// Asserts that an object may be assigned a  value of a given Type.
-		/// </summary>
-		/// <param name="expected">The expected Type.</param>
-		/// <param name="actual">The object under examination</param>
-		/// <param name="message">The message to display in case of failure</param>
-		/// <param name="args">Array of objects to be used in formatting the message</param>
-		static public void IsAssignableFrom( System.Type expected, object actual, string message, params object[] args )
-		{
-            Assert.That(actual, Is.AssignableFrom(expected), message, args);
-		}
-		#endregion
-		
-		#region IsNotAssignableFrom
-		/// <summary>
-		/// Asserts that an object may not be assigned a  value of a given Type.
-		/// </summary>
-		/// <param name="expected">The expected Type.</param>
-		/// <param name="actual">The object under examination</param>
-		static public void IsNotAssignableFrom( System.Type expected, object actual )
-		{
-			IsNotAssignableFrom(expected, actual, "");
-		}
-		
-		/// <summary>
-		/// Asserts that an object may not be assigned a  value of a given Type.
-		/// </summary>
-		/// <param name="expected">The expected Type.</param>
-		/// <param name="actual">The object under examination</param>
-		/// <param name="message">The messge to display in case of failure</param>
-		static public void IsNotAssignableFrom( System.Type expected, object actual, string message )
-		{
-			IsNotAssignableFrom(expected, actual, message, null);
-		}
-		
-		/// <summary>
-		/// Asserts that an object may not be assigned a  value of a given Type.
-		/// </summary>
-		/// <param name="expected">The expected Type.</param>
-		/// <param name="actual">The object under examination</param>
-		/// <param name="message">The message to display in case of failure</param>
-		/// <param name="args">Array of objects to be used in formatting the message</param>
-		static public void IsNotAssignableFrom( System.Type expected, object actual, string message, params object[] args )
-		{
-            Assert.That(actual, Is.Not.AssignableFrom(expected), message, args);
-		}
-		#endregion
-		
-		#region IsInstanceOfType
-		/// <summary>
-		/// Asserts that an object is an instance of a given type.
-		/// </summary>
-		/// <param name="expected">The expected Type</param>
-		/// <param name="actual">The object being examined</param>
-		public static void IsInstanceOfType( System.Type expected, object actual )
-		{
-			IsInstanceOfType( expected, actual, string.Empty, null );
-		}
-
-		/// <summary>
-		/// Asserts that an object is an instance of a given type.
-		/// </summary>
-		/// <param name="expected">The expected Type</param>
-		/// <param name="actual">The object being examined</param>
-		/// <param name="message">A message to display in case of failure</param>
-		public static void IsInstanceOfType( System.Type expected, object actual, string message )
-		{
-			IsInstanceOfType( expected, actual, message, null );
-		}
-
-		/// <summary>
-		/// Asserts that an object is an instance of a given type.
-		/// </summary>
-		/// <param name="expected">The expected Type</param>
-		/// <param name="actual">The object being examined</param>
-		/// <param name="message">A message to display in case of failure</param>
-		/// <param name="args">An array of objects to be used in formatting the message</param>
-		public static void IsInstanceOfType( System.Type expected, object actual, string message, params object[] args )
-		{
-            Assert.That(actual, Is.InstanceOfType(expected), message, args);
-		}
-		#endregion
-
-		#region IsNotInstanceOfType
-		/// <summary>
-		/// Asserts that an object is not an instance of a given type.
-		/// </summary>
-		/// <param name="expected">The expected Type</param>
-		/// <param name="actual">The object being examined</param>
-		public static void IsNotInstanceOfType( System.Type expected, object actual )
-		{
-			IsNotInstanceOfType( expected, actual, string.Empty, null );
-		}
-
-		/// <summary>
-		/// Asserts that an object is not an instance of a given type.
-		/// </summary>
-		/// <param name="expected">The expected Type</param>
-		/// <param name="actual">The object being examined</param>
-		/// <param name="message">A message to display in case of failure</param>
-		public static void IsNotInstanceOfType( System.Type expected, object actual, string message )
-		{
-			IsNotInstanceOfType( expected, actual, message, null );
-		}
-
-		/// <summary>
-		/// Asserts that an object is not an instance of a given type.
-		/// </summary>
-		/// <param name="expected">The expected Type</param>
-		/// <param name="actual">The object being examined</param>
-		/// <param name="message">A message to display in case of failure</param>
-		/// <param name="args">An array of objects to be used in formatting the message</param>
-		public static void IsNotInstanceOfType( System.Type expected, object actual, string message, params object[] args )
-		{
-            Assert.That(actual, Is.Not.InstanceOfType(expected), message, args);
-		}
-		#endregion
-
-		#region AreEqual
-
-        #region Ints
-
-        /// <summary>
-        /// Verifies that two ints are equal. If they are not, then an 
-        /// <see cref="AssertionException"/> is thrown.
+    /// <summary>
+    /// Delegate used by tests that execute code and
+    /// capture any thrown exception.
+    /// </summary>
+    public delegate void TestDelegate();
+
+    /// <summary>
+    /// The Assert class contains a collection of static methods that
+    /// implement the most common assertions used in NUnit.
+    /// </summary>
+    public class Assert
+    {
+        #region Constructor
+
+        /// <summary>
+        /// We don't actually want any instances of this object, but some people
+        /// like to inherit from it to add other static methods. Hence, the
+        /// protected constructor disallows any instances of this object. 
         /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void AreEqual(int expected,
-            int actual, string message, params object[] args)
+        protected Assert() { }
+
+        #endregion
+
+        #region Assert Counting
+
+        private static int counter = 0;
+
+        /// <summary>
+        /// Gets the number of assertions executed so far and 
+        /// resets the counter to zero.
+        /// </summary>
+        public static int Counter
         {
-            Assert.That(actual, Is.EqualTo(expected), message, args);
+            get
+            {
+                int cnt = counter;
+                counter = 0;
+                return cnt;
+            }
         }
 
+        private static void IncrementAssertCount()
+        {
+            ++counter;
+        }
+
+        #endregion
+
+        #region Equals and ReferenceEquals
+
         /// <summary>
-        /// Verifies that two ints are equal. If they are not, then an 
-        /// <see cref="AssertionException"/> is thrown.
+        /// The Equals method throws an AssertionException. This is done 
+        /// to make sure there is no mistake by calling this function.
         /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="message">The message that will be displayed on failure</param>
-        static public void AreEqual(int expected, int actual, string message)
+        /// <param name="a"></param>
+        /// <param name="b"></param>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public static new bool Equals(object a, object b)
         {
-            Assert.AreEqual(expected, actual, message, null);
+            // TODO: This should probably be InvalidOperationException
+            throw new AssertionException("Assert.Equals should not be used for Assertions");
         }
 
         /// <summary>
-        /// Verifies that two ints are equal. If they are not, then an 
-        /// <see cref="AssertionException"/> is thrown.
+        /// override the default ReferenceEquals to throw an AssertionException. This 
+        /// implementation makes sure there is no mistake in calling this function 
+        /// as part of Assert. 
         /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        static public void AreEqual(int expected, int actual)
+        /// <param name="a"></param>
+        /// <param name="b"></param>
+        public static new void ReferenceEquals(object a, object b)
         {
-            Assert.AreEqual(expected, actual, string.Empty, null);
+            throw new AssertionException("Assert.ReferenceEquals should not be used for Assertions");
         }
 
         #endregion
 
-        #region Longs
-
+        #region Helper Methods
         /// <summary>
-        /// Verifies that two longs are equal. If they are not, then an 
-        /// <see cref="AssertionException"/> is thrown.
+        /// Helper for Assert.AreEqual(double expected, double actual, ...)
+        /// allowing code generation to work consistently.
         /// </summary>
         /// <param name="expected">The expected value</param>
         /// <param name="actual">The actual value</param>
-        /// <param name="message">The message that will be displayed on failure</param>
+        /// <param name="delta">The maximum acceptable difference between the
+        /// the expected and the actual</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        protected static void AssertDoublesAreEqual(double expected, double actual, double delta, string message, object[] args)
+        {
+            if (double.IsNaN(expected) || double.IsInfinity(expected))
+                Assert.That(actual, Is.EqualTo(expected), message, args);
+            else
+                Assert.That(actual, Is.EqualTo(expected).Within(delta), message, args);
+        }
+        #endregion
+
+        #region Utility Asserts
+
+        #region Pass
+
+        /// <summary>
+        /// Throws a <see cref="SuccessException"/> with the message and arguments 
+        /// that are passed in. This allows a test to be cut short, with a result
+        /// of success returned to NUnit.
+        /// </summary>
+        /// <param name="message">The message to initialize the <see cref="AssertionException"/> with.</param>
         /// <param name="args">Arguments to be used in formatting the message</param>
-        static public void AreEqual(long expected,
-            long actual, string message, params object[] args)
+        static public void Pass(string message, params object[] args)
         {
-            Assert.That(actual, Is.EqualTo(expected), message, args);
+            if (message == null) message = string.Empty;
+            else if (args != null && args.Length > 0)
+                message = string.Format(message, args);
+
+            throw new SuccessException(message);
         }
 
         /// <summary>
-        /// Verifies that two longs are equal. If they are not, then an 
-        /// <see cref="AssertionException"/> is thrown.
+        /// Throws a <see cref="SuccessException"/> with the message and arguments 
+        /// that are passed in. This allows a test to be cut short, with a result
+        /// of success returned to NUnit.
         /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="message">The message that will be displayed on failure</param>
-        static public void AreEqual(long expected, long actual, string message)
+        /// <param name="message">The message to initialize the <see cref="AssertionException"/> with.</param>
+        static public void Pass(string message)
         {
-            Assert.AreEqual(expected, actual, message, null);
+            Assert.Pass(message, null);
         }
 
         /// <summary>
-        /// Verifies that two longs are equal. If they are not, then an 
-        /// <see cref="AssertionException"/> is thrown.
+        /// Throws a <see cref="SuccessException"/> with the message and arguments 
+        /// that are passed in. This allows a test to be cut short, with a result
+        /// of success returned to NUnit.
         /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        static public void AreEqual(long expected, long actual)
+        static public void Pass()
         {
-            Assert.AreEqual(expected, actual, string.Empty, null);
+            Assert.Pass(string.Empty, null);
         }
 
         #endregion
 
-        #region UInts
+        #region Fail
 
         /// <summary>
-        /// Verifies that two uints are equal. If they are not, then an 
-        /// <see cref="AssertionException"/> is thrown.
+        /// Throws an <see cref="AssertionException"/> with the message and arguments 
+        /// that are passed in. This is used by the other Assert functions. 
         /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="message">The message that will be displayed on failure</param>
+        /// <param name="message">The message to initialize the <see cref="AssertionException"/> with.</param>
         /// <param name="args">Arguments to be used in formatting the message</param>
-		[CLSCompliant(false)]
-		static public void AreEqual(uint expected,
-            uint actual, string message, params object[] args)
+        static public void Fail(string message, params object[] args)
         {
-            Assert.That(actual, Is.EqualTo(expected), message, args);
+            if (message == null) message = string.Empty;
+            else if (args != null && args.Length > 0)
+                message = string.Format(message, args);
+
+            throw new AssertionException(message);
         }
 
         /// <summary>
-        /// Verifies that two uints are equal. If they are not, then an 
-        /// <see cref="AssertionException"/> is thrown.
+        /// Throws an <see cref="AssertionException"/> with the message that is 
+        /// passed in. This is used by the other Assert functions. 
         /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="message">The message that will be displayed on failure</param>
-		[CLSCompliant(false)]
-		static public void AreEqual(uint expected, uint actual, string message)
+        /// <param name="message">The message to initialize the <see cref="AssertionException"/> with.</param>
+        static public void Fail(string message)
         {
-            Assert.AreEqual(expected, actual, message, null);
+            Assert.Fail(message, null);
         }
 
         /// <summary>
-        /// Verifies that two uints are equal. If they are not, then an 
-        /// <see cref="AssertionException"/> is thrown.
+        /// Throws an <see cref="AssertionException"/>. 
+        /// This is used by the other Assert functions. 
         /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-		[CLSCompliant(false)]
-		static public void AreEqual(uint expected, uint actual)
+        static public void Fail()
         {
-            Assert.AreEqual(expected, actual, string.Empty, null);
+            Assert.Fail(string.Empty, null);
         }
 
         #endregion
 
-        #region Ulongs
+        #region Ignore
 
         /// <summary>
-        /// Verifies that two ulongs are equal. If they are not, then an 
-        /// <see cref="AssertionException"/> is thrown.
+        /// Throws an <see cref="IgnoreException"/> with the message and arguments 
+        /// that are passed in.  This causes the test to be reported as ignored.
         /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="message">The message that will be displayed on failure</param>
+        /// <param name="message">The message to initialize the <see cref="AssertionException"/> with.</param>
         /// <param name="args">Arguments to be used in formatting the message</param>
-		[CLSCompliant(false)]
-		static public void AreEqual(ulong expected,
-            ulong actual, string message, params object[] args)
+        static public void Ignore(string message, params object[] args)
         {
-            Assert.That(actual, Is.EqualTo(expected), message, args);
+            if (message == null) message = string.Empty;
+            else if (args != null && args.Length > 0)
+                message = string.Format(message, args);
+
+            throw new IgnoreException(message);
         }
 
         /// <summary>
-        /// Verifies that two ulongs are equal. If they are not, then an 
-        /// <see cref="AssertionException"/> is thrown.
+        /// Throws an <see cref="IgnoreException"/> with the message that is 
+        /// passed in. This causes the test to be reported as ignored. 
         /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="message">The message that will be displayed on failure</param>
-		[CLSCompliant(false)]
-		static public void AreEqual(ulong expected, ulong actual, string message)
+        /// <param name="message">The message to initialize the <see cref="AssertionException"/> with.</param>
+        static public void Ignore(string message)
         {
-            Assert.AreEqual(expected, actual, message, null);
+            Assert.Ignore(message, null);
         }
 
         /// <summary>
-        /// Verifies that two ulongs are equal. If they are not, then an 
-        /// <see cref="AssertionException"/> is thrown.
+        /// Throws an <see cref="IgnoreException"/>. 
+        /// This causes the test to be reported as ignored. 
         /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-		[CLSCompliant(false)]
-		static public void AreEqual(ulong expected, ulong actual)
+        static public void Ignore()
         {
-            Assert.AreEqual(expected, actual, string.Empty, null);
+            Assert.Ignore(string.Empty, null);
         }
 
         #endregion
 
-        #region Decimals
-
-		/// <summary>
-		/// Verifies that two decimals are equal. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">The expected value</param>
-		/// <param name="actual">The actual value</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void AreEqual(decimal expected, 
-			decimal actual, string message, params object[] args) 
-		{
-            Assert.That(actual, Is.EqualTo(expected), message, args);
-        }
-
-		/// <summary>
-		/// Verifies that two decimal are equal. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">The expected value</param>
-		/// <param name="actual">The actual value</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		static public void AreEqual(decimal expected, decimal actual, string message) 
-		{
-			Assert.AreEqual( expected, actual, message, null );
-		}
-
-		/// <summary>
-		/// Verifies that two decimals are equal. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">The expected value</param>
-		/// <param name="actual">The actual value</param>
-		static public void AreEqual(decimal expected, decimal actual ) 
-		{
-			Assert.AreEqual( expected, actual, string.Empty, null );
-		}
-
-		#endregion
-
-		#region Doubles
-
-		/// <summary>
-		/// Verifies that two doubles are equal considering a delta. If the
-		/// expected value is infinity then the delta value is ignored. If 
-		/// they are not equals then an <see cref="AssertionException"/> is
-		/// thrown.
-		/// </summary>
-		/// <param name="expected">The expected value</param>
-		/// <param name="actual">The actual value</param>
-		/// <param name="delta">The maximum acceptable difference between the
-		/// the expected and the actual</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void AreEqual(double expected, 
-			double actual, double delta, string message, params object[] args) 
-		{
-			Constraint constraint = new EqualConstraint( expected );
-			if ( double.IsNaN(expected) || double.IsInfinity(expected) )
-				Assert.That(actual, Is.EqualTo( expected ), message, args);
-			else
-				Assert.That(actual, Is.EqualTo(expected).Within(delta), message, args);
-        }
-
-		/// <summary>
-		/// Verifies that two doubles are equal considering a delta. If the
-		/// expected value is infinity then the delta value is ignored. If 
-		/// they are not equals then an <see cref="AssertionException"/> is
-		/// thrown.
-		/// </summary>
-		/// <param name="expected">The expected value</param>
-		/// <param name="actual">The actual value</param>
-		/// <param name="delta">The maximum acceptable difference between the
-		/// the expected and the actual</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		static public void AreEqual(double expected, 
-			double actual, double delta, string message) 
-		{
-			Assert.AreEqual( expected, actual, delta, message, null );
-		}
-
-		/// <summary>
-		/// Verifies that two doubles are equal considering a delta. If the
-		/// expected value is infinity then the delta value is ignored. If 
-		/// they are not equals then an <see cref="AssertionException"/> is
-		/// thrown.
-		/// </summary>
-		/// <param name="expected">The expected value</param>
-		/// <param name="actual">The actual value</param>
-		/// <param name="delta">The maximum acceptable difference between the
-		/// the expected and the actual</param>
-		static public void AreEqual(double expected, double actual, double delta) 
-		{
-			Assert.AreEqual(expected, actual, delta, string.Empty, null);
-		}
-
-		#endregion
-
-		#region Floats
-
-		/// <summary>
-		/// Verifies that two floats are equal considering a delta. If the
-		/// expected value is infinity then the delta value is ignored. If 
-		/// they are not equals then an <see cref="AssertionException"/> is
-		/// thrown.
-		/// </summary>
-		/// <param name="expected">The expected value</param>
-		/// <param name="actual">The actual value</param>
-		/// <param name="delta">The maximum acceptable difference between the
-		/// the expected and the actual</param>
-		/// <param name="message">The message displayed upon failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void AreEqual(float expected, 
-			float actual, float delta, string message, params object[] args) 
-		{
-			if (float.IsNaN(expected) || float.IsInfinity(expected))
-				Assert.That(actual, Is.EqualTo( expected), message, args );
-			else
-				Assert.That(actual, Is.EqualTo(expected).Within(delta), message, args);
-		}
-
-		/// <summary>
-		/// Verifies that two floats are equal considering a delta. If the
-		/// expected value is infinity then the delta value is ignored. If 
-		/// they are not equals then an <see cref="AssertionException"/> is
-		/// thrown.
-		/// </summary>
-		/// <param name="expected">The expected value</param>
-		/// <param name="actual">The actual value</param>
-		/// <param name="delta">The maximum acceptable difference between the
-		/// the expected and the actual</param>
-		/// <param name="message">The message displayed upon failure</param>
-		static public void AreEqual(float expected, float actual, float delta, string message) 
-		{
-			Assert.AreEqual(expected, actual, delta, message, null);
-		}
-
-		/// <summary>
-		/// Verifies that two floats are equal considering a delta. If the
-		/// expected value is infinity then the delta value is ignored. If 
-		/// they are not equals then an <see cref="AssertionException"/> is
-		/// thrown.
-		/// </summary>
-		/// <param name="expected">The expected value</param>
-		/// <param name="actual">The actual value</param>
-		/// <param name="delta">The maximum acceptable difference between the
-		/// the expected and the actual</param>
-		static public void AreEqual(float expected, float actual, float delta) 
-		{
-			Assert.AreEqual(expected, actual, delta, string.Empty, null);
-		}
-
-		#endregion
-
-		#region Objects
-		
-		/// <summary>
-		/// Verifies that two objects are equal.  Two objects are considered
-		/// equal if both are null, or if both have the same value.  All
-		/// non-numeric types are compared by using the <c>Equals</c> method.
-		/// Arrays are compared by comparing each element using the same rules.
-		/// If they are not equal an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">The value that is expected</param>
-		/// <param name="actual">The actual value</param>
-		/// <param name="message">The message to display if objects are not equal</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void AreEqual(Object expected, Object actual, string message, params object[] args)
-		{
-            Assert.That(actual, Is.EqualTo(expected), message, args);
-        }
-
-		/// <summary>
-		/// Verifies that two objects are equal.  Two objects are considered
-		/// equal if both are null, or if both have the same value.  All
-		/// non-numeric types are compared by using the <c>Equals</c> method.
-		/// If they are not equal an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">The value that is expected</param>
-		/// <param name="actual">The actual value</param>
-		/// <param name="message">The message to display if objects are not equal</param>
-		static public void AreEqual(Object expected, Object actual, string message) 
-		{
-			Assert.AreEqual(expected, actual, message, null);
-		}
-
-		/// <summary>
-		/// Verifies that two objects are equal.  Two objects are considered
-		/// equal if both are null, or if both have the same value.  All
-		/// non-numeric types are compared by using the <c>Equals</c> method.
-		/// If they are not equal an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">The value that is expected</param>
-		/// <param name="actual">The actual value</param>
-		static public void AreEqual(Object expected, Object actual) 
-		{
-			Assert.AreEqual(expected, actual, string.Empty, null);
-		}
-
-		#endregion
-
-		#endregion
-
-		#region AreNotEqual
-
-		#region Objects
-		/// <summary>
-		/// Asserts that two objects are not equal. If they are equal
-		/// an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">The expected object</param>
-		/// <param name="actual">The actual object</param>
-		/// <param name="message">The message to be displayed when the two objects are the same object.</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void AreNotEqual( Object expected, Object actual, string message, params object[] args)
-		{
-            Assert.That(actual, Is.Not.EqualTo(expected), message, args);
-        }
-
-		/// <summary>
-		/// Asserts that two objects are not equal. If they are equal
-		/// an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">The expected object</param>
-		/// <param name="actual">The actual object</param>
-		/// <param name="message">The message to be displayed when the objects are the same</param>
-		static public void AreNotEqual(Object expected, Object actual, string message) 
-		{
-			Assert.AreNotEqual(expected, actual, message, null);
-		}
-   
-		/// <summary>
-		/// Asserts that two objects are not equal. If they are equal
-		/// an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">The expected object</param>
-		/// <param name="actual">The actual object</param>
-		static public void AreNotEqual(Object expected, Object actual) 
-		{
-			Assert.AreNotEqual(expected, actual, string.Empty, null);
-		}
-   
-		#endregion
-
-        #region Ints
-        /// <summary>
-        /// Asserts that two ints are not equal. If they are equal
-        /// an <see cref="AssertionException"/> is thrown.
+        #region InConclusive
+        /// <summary>
+        /// Throws an <see cref="InconclusiveException"/> with the message and arguments 
+        /// that are passed in.  This causes the test to be reported as inconclusive.
         /// </summary>
-        /// <param name="expected">The expected object</param>
-        /// <param name="actual">The actual object</param>
-        /// <param name="message">The message to be displayed when the two objects are the same object.</param>
+        /// <param name="message">The message to initialize the <see cref="InconclusiveException"/> with.</param>
         /// <param name="args">Arguments to be used in formatting the message</param>
-        static public void AreNotEqual(int expected, int actual, string message, params object[] args)
+        static public void Inconclusive(string message, params object[] args)
         {
-            Assert.That(actual, Is.Not.EqualTo(expected), message, args);
+            if (message == null) message = string.Empty;
+            else if (args != null && args.Length > 0)
+                message = string.Format(message, args);
+
+            throw new InconclusiveException(message);
         }
 
         /// <summary>
-        /// Asserts that two ints are not equal. If they are equal
-        /// an <see cref="AssertionException"/> is thrown.
+        /// Throws an <see cref="InconclusiveException"/> with the message that is 
+        /// passed in. This causes the test to be reported as inconclusive. 
         /// </summary>
-        /// <param name="expected">The expected object</param>
-        /// <param name="actual">The actual object</param>
-        /// <param name="message">The message to be displayed when the objects are the same</param>
-        static public void AreNotEqual(int expected, int actual, string message)
+        /// <param name="message">The message to initialize the <see cref="InconclusiveException"/> with.</param>
+        static public void Inconclusive(string message)
         {
-            Assert.AreNotEqual(expected, actual, message, null);
+            Assert.Inconclusive(message, null);
         }
 
         /// <summary>
-        /// Asserts that two ints are not equal. If they are equal
-        /// an <see cref="AssertionException"/> is thrown.
+        /// Throws an <see cref="InconclusiveException"/>. 
+        /// This causes the test to be reported as Inconclusive. 
         /// </summary>
-        /// <param name="expected">The expected object</param>
-        /// <param name="actual">The actual object</param>
-        static public void AreNotEqual(int expected, int actual)
+        static public void Inconclusive()
         {
-            Assert.AreNotEqual(expected, actual, string.Empty, null);
+            Assert.Inconclusive(string.Empty, null);
         }
+
+        #endregion
+
         #endregion
 
-        #region Longs
+        #region Assert.That
+
+        #region Object
         /// <summary>
-        /// Asserts that two longss are not equal. If they are equal
-        /// an <see cref="AssertionException"/> is thrown.
+        /// Apply a constraint to an actual value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
         /// </summary>
-        /// <param name="expected">The expected object</param>
-        /// <param name="actual">The actual object</param>
-        /// <param name="message">The message to be displayed when the two objects are the same object.</param>
-        /// <param name="args">Arguments to be used in formatting the message</param>
-        static public void AreNotEqual(long expected, long actual, string message, params object[] args)
+        /// <param name="expression">A Constraint to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        static public void That(object actual, IResolveConstraint expression)
         {
-            Assert.That(actual, Is.Not.EqualTo(expected), message, args);
+            Assert.That(actual, expression, null, null);
         }
 
         /// <summary>
-        /// Asserts that two longs are not equal. If they are equal
-        /// an <see cref="AssertionException"/> is thrown.
+        /// Apply a constraint to an actual value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
         /// </summary>
-        /// <param name="expected">The expected object</param>
-        /// <param name="actual">The actual object</param>
-        /// <param name="message">The message to be displayed when the objects are the same</param>
-        static public void AreNotEqual(long expected, long actual, string message)
+        /// <param name="expression">A Constraint to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        static public void That(object actual, IResolveConstraint expression, string message)
         {
-            Assert.AreNotEqual(expected, actual, message, null);
+            Assert.That(actual, expression, message, null);
         }
 
         /// <summary>
-        /// Asserts that two longs are not equal. If they are equal
-        /// an <see cref="AssertionException"/> is thrown.
+        /// Apply a constraint to an actual value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
         /// </summary>
-        /// <param name="expected">The expected object</param>
-        /// <param name="actual">The actual object</param>
-        static public void AreNotEqual(long expected, long actual)
+        /// <param name="expression">A Constraint expression to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void That(object actual, IResolveConstraint expression, string message, params object[] args)
         {
-            Assert.AreNotEqual(expected, actual, string.Empty, null);
+            Constraint constraint = expression.Resolve();
+
+            Assert.IncrementAssertCount();
+            if (!constraint.Matches(actual))
+            {
+                MessageWriter writer = new TextMessageWriter(message, args);
+                constraint.WriteMessageTo(writer);
+                throw new AssertionException(writer.ToString());
+            }
         }
         #endregion
 
-        #region UInts
+        #region ActualValueDelegate
         /// <summary>
-        /// Asserts that two uints are not equal. If they are equal
-        /// an <see cref="AssertionException"/> is thrown.
+        /// Apply a constraint to an actual value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
         /// </summary>
-        /// <param name="expected">The expected object</param>
-        /// <param name="actual">The actual object</param>
-        /// <param name="message">The message to be displayed when the two objects are the same object.</param>
-        /// <param name="args">Arguments to be used in formatting the message</param>
-		[CLSCompliant(false)]
-		static public void AreNotEqual(uint expected, uint actual, string message, params object[] args)
+        /// <param name="expr">A Constraint expression to be applied</param>
+        /// <param name="del">An ActualValueDelegate returning the value to be tested</param>
+        static public void That(ActualValueDelegate del, IResolveConstraint expr)
         {
-            Assert.That(actual, Is.Not.EqualTo(expected), message, args);
+            Assert.That(del, expr.Resolve(), null, null);
         }
 
         /// <summary>
-        /// Asserts that two uints are not equal. If they are equal
-        /// an <see cref="AssertionException"/> is thrown.
+        /// Apply a constraint to an actual value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
         /// </summary>
-        /// <param name="expected">The expected object</param>
-        /// <param name="actual">The actual object</param>
-        /// <param name="message">The message to be displayed when the objects are the same</param>
-		[CLSCompliant(false)]
-		static public void AreNotEqual(uint expected, uint actual, string message)
+        /// <param name="expr">A Constraint expression to be applied</param>
+        /// <param name="del">An ActualValueDelegate returning the value to be tested</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        static public void That(ActualValueDelegate del, IResolveConstraint expr, string message)
         {
-            Assert.AreNotEqual(expected, actual, message, null);
+            Assert.That(del, expr.Resolve(), message, null);
         }
 
         /// <summary>
-        /// Asserts that two uints are not equal. If they are equal
-        /// an <see cref="AssertionException"/> is thrown.
+        /// Apply a constraint to an actual value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
         /// </summary>
-        /// <param name="expected">The expected object</param>
-        /// <param name="actual">The actual object</param>
-		[CLSCompliant(false)]
-		static public void AreNotEqual(uint expected, uint actual)
+        /// <param name="del">An ActualValueDelegate returning the value to be tested</param>
+        /// <param name="expr">A Constraint expression to be applied</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void That(ActualValueDelegate del, IResolveConstraint expr, string message, params object[] args)
         {
-            Assert.AreNotEqual(expected, actual, string.Empty, null);
+            Constraint constraint = expr.Resolve();
+
+            Assert.IncrementAssertCount();
+            if (!constraint.Matches(del))
+            {
+                MessageWriter writer = new TextMessageWriter(message, args);
+                constraint.WriteMessageTo(writer);
+                throw new AssertionException(writer.ToString());
+            }
         }
         #endregion
 
-        #region Ulongs
+        #region ref Object
+#if NET_2_0
         /// <summary>
-        /// Asserts that two ulongs are not equal. If they are equal
-        /// an <see cref="AssertionException"/> is thrown.
+        /// Apply a constraint to a referenced value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
         /// </summary>
-        /// <param name="expected">The expected object</param>
-        /// <param name="actual">The actual object</param>
-        /// <param name="message">The message to be displayed when the two objects are the same object.</param>
+        /// <param name="expression">A Constraint to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        static public void That<T>(ref T actual, IResolveConstraint expression)
+        {
+            Assert.That(ref actual, expression.Resolve(), null, null);
+        }
+
+        /// <summary>
+        /// Apply a constraint to a referenced value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
+        /// </summary>
+        /// <param name="expression">A Constraint to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        static public void That<T>(ref T actual, IResolveConstraint expression, string message)
+        {
+            Assert.That(ref actual, expression.Resolve(), message, null);
+        }
+
+        /// <summary>
+        /// Apply a constraint to a referenced value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
+        /// </summary>
+        /// <param name="expression">A Constraint to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        /// <param name="message">The message that will be displayed on failure</param>
         /// <param name="args">Arguments to be used in formatting the message</param>
-		[CLSCompliant(false)]
-		static public void AreNotEqual(ulong expected, ulong actual, string message, params object[] args)
+        static public void That<T>(ref T actual, IResolveConstraint expression, string message, params object[] args)
+        {
+            Constraint constraint = expression.Resolve();
+
+            Assert.IncrementAssertCount();
+            if (!constraint.Matches(ref actual))
+            {
+                MessageWriter writer = new TextMessageWriter(message, args);
+                constraint.WriteMessageTo(writer);
+                throw new AssertionException(writer.ToString());
+            }
+        }
+#else
+        /// <summary>
+        /// Apply a constraint to a referenced boolean, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
+        /// </summary>
+        /// <param name="constraint">A Constraint to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        static public void That(ref bool actual, IResolveConstraint constraint)
         {
-            Assert.That(actual, Is.Not.EqualTo(expected), message, args);
+            Assert.That(ref actual, constraint.Resolve(), null, null);
         }
 
         /// <summary>
-        /// Asserts that two ulongs are not equal. If they are equal
-        /// an <see cref="AssertionException"/> is thrown.
+        /// Apply a constraint to a referenced value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
         /// </summary>
-        /// <param name="expected">The expected object</param>
-        /// <param name="actual">The actual object</param>
-        /// <param name="message">The message to be displayed when the objects are the same</param>
-		[CLSCompliant(false)]
-		static public void AreNotEqual(ulong expected, ulong actual, string message)
+        /// <param name="constraint">A Constraint to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        static public void That(ref bool actual, IResolveConstraint constraint, string message)
         {
-            Assert.AreNotEqual(expected, actual, message, null);
+            Assert.That(ref actual, constraint.Resolve(), message, null);
         }
 
         /// <summary>
-        /// Asserts that two ulong are not equal. If they are equal
-        /// an <see cref="AssertionException"/> is thrown.
+        /// Apply a constraint to a referenced value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
         /// </summary>
-        /// <param name="expected">The expected object</param>
-        /// <param name="actual">The actual object</param>
-		[CLSCompliant(false)]
-		static public void AreNotEqual(ulong expected, ulong actual)
+        /// <param name="constraint">A Constraint to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void That(ref bool actual, IResolveConstraint expression, string message, params object[] args)
         {
-            Assert.AreNotEqual(expected, actual, string.Empty, null);
+            Constraint constraint = expression.Resolve();
+
+            Assert.IncrementAssertCount();
+            if (!constraint.Matches(ref actual))
+            {
+                MessageWriter writer = new TextMessageWriter(message, args);
+                constraint.WriteMessageTo(writer);
+                throw new AssertionException(writer.ToString());
+            }
         }
+#endif
         #endregion
 
-        #region Decimals
-		/// <summary>
-		/// Asserts that two decimals are not equal. If they are equal
-		/// an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">The expected object</param>
-		/// <param name="actual">The actual object</param>
-		/// <param name="message">The message to be displayed when the two objects are the same object.</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void AreNotEqual( decimal expected, decimal actual, string message, params object[] args)
-		{
-            Assert.That(actual, Is.Not.EqualTo(expected), message, args);
-        }
-
-		/// <summary>
-		/// Asserts that two decimals are not equal. If they are equal
-		/// an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">The expected object</param>
-		/// <param name="actual">The actual object</param>
-		/// <param name="message">The message to be displayed when the objects are the same</param>
-		static public void AreNotEqual(decimal expected, decimal actual, string message) 
-		{
-			Assert.AreNotEqual(expected, actual, message, null);
-		}
-   
-		/// <summary>
-		/// Asserts that two decimals are not equal. If they are equal
-		/// an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">The expected object</param>
-		/// <param name="actual">The actual object</param>
-		static public void AreNotEqual(decimal expected, decimal actual) 
-		{
-			Assert.AreNotEqual(expected, actual, string.Empty, null);
-		}
-		#endregion
-
-		#region Floats
-		/// <summary>
-		/// Asserts that two floats are not equal. If they are equal
-		/// an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">The expected object</param>
-		/// <param name="actual">The actual object</param>
-		/// <param name="message">The message to be displayed when the two objects are the same object.</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void AreNotEqual( float expected, float actual, string message, params object[] args)
-		{
-            Assert.That(actual, Is.Not.EqualTo(expected), message, args);
-		}
-
-		/// <summary>
-		/// Asserts that two floats are not equal. If they are equal
-		/// an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">The expected object</param>
-		/// <param name="actual">The actual object</param>
-		/// <param name="message">The message to be displayed when the objects are the same</param>
-		static public void AreNotEqual(float expected, float actual, string message) 
-		{
-			Assert.AreNotEqual(expected, actual, message, null);
-		}
-   
-		/// <summary>
-		/// Asserts that two floats are not equal. If they are equal
-		/// an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">The expected object</param>
-		/// <param name="actual">The actual object</param>
-		static public void AreNotEqual(float expected, float actual) 
-		{
-			Assert.AreNotEqual(expected, actual, string.Empty, null);
-		}
-		#endregion
-
-		#region Doubles
-		/// <summary>
-		/// Asserts that two doubles are not equal. If they are equal
-		/// an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">The expected object</param>
-		/// <param name="actual">The actual object</param>
-		/// <param name="message">The message to be displayed when the two objects are the same object.</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void AreNotEqual( double expected, double actual, string message, params object[] args)
-		{
-            Assert.That(actual, Is.Not.EqualTo(expected), message, args);
-		}
-
-		/// <summary>
-		/// Asserts that two doubles are not equal. If they are equal
-		/// an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">The expected object</param>
-		/// <param name="actual">The actual object</param>
-		/// <param name="message">The message to be displayed when the objects are the same</param>
-		static public void AreNotEqual(double expected, double actual, string message) 
-		{
-			Assert.AreNotEqual(expected, actual, message, null);
-		}
-   
-		/// <summary>
-		/// Asserts that two doubles are not equal. If they are equal
-		/// an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">The expected object</param>
-		/// <param name="actual">The actual object</param>
-		static public void AreNotEqual(double expected, double actual) 
-		{
-			Assert.AreNotEqual(expected, actual, string.Empty, null);
-		}
-		#endregion
-
-		#endregion
-
-		#region AreSame
-
-		/// <summary>
-		/// Asserts that two objects refer to the same object. If they
-		/// are not the same an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">The expected object</param>
-		/// <param name="actual">The actual object</param>
-		/// <param name="message">The message to be displayed when the two objects are not the same object.</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void AreSame(Object expected, Object actual, string message, params object[] args)
-		{
-            Assert.That(actual, Is.SameAs(expected), message, args);
-		}
-
-		/// <summary>
-		/// Asserts that two objects refer to the same object. If they
-		/// are not the same an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">The expected object</param>
-		/// <param name="actual">The actual object</param>
-		/// <param name="message">The message to be displayed when the object is null</param>
-		static public void AreSame(Object expected, Object actual, string message) 
-		{
-			Assert.AreSame(expected, actual, message, null);
-		}
-   
-		/// <summary>
-		/// Asserts that two objects refer to the same object. If they
-		/// are not the same an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">The expected object</param>
-		/// <param name="actual">The actual object</param>
-		static public void AreSame(Object expected, Object actual) 
-		{
-			Assert.AreSame(expected, actual, string.Empty, null);
-		}
-   
-		#endregion
-
-		#region AreNotSame
-
-		/// <summary>
-		/// Asserts that two objects do not refer to the same object. If they
-		/// are the same an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">The expected object</param>
-		/// <param name="actual">The actual object</param>
-		/// <param name="message">The message to be displayed when the two objects are the same object.</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void AreNotSame(Object expected, Object actual, string message, params object[] args)
-		{
-            Assert.That(actual, Is.Not.SameAs(expected), message, args);
-		}
-
-		/// <summary>
-		/// Asserts that two objects do not refer to the same object. If they
-		/// are the same an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">The expected object</param>
-		/// <param name="actual">The actual object</param>
-		/// <param name="message">The message to be displayed when the objects are the same</param>
-		static public void AreNotSame(Object expected, Object actual, string message) 
-		{
-			Assert.AreNotSame(expected, actual, message, null);
-		}
-   
-		/// <summary>
-		/// Asserts that two objects do not refer to the same object. If they
-		/// are the same an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">The expected object</param>
-		/// <param name="actual">The actual object</param>
-		static public void AreNotSame(Object expected, Object actual) 
-		{
-			Assert.AreNotSame(expected, actual, string.Empty, null);
-		}
-   
-		#endregion
-
-		#region Greater
-
-		#region Ints
-
-		/// <summary>
-		/// Verifies that the first value is greater than the second
-		/// value. If they are not, then an
-		/// <see cref="AssertionException"/> is thrown. 
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void Greater(int arg1, 
-			int arg2, string message, params object[] args) 
-		{
-            Assert.That(arg1, Is.GreaterThan(arg2), message, args);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is greater than the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		static public void Greater(int arg1, int arg2, string message) 
-		{
-			Assert.Greater( arg1, arg2, message, null );
-		}
-
-		/// <summary>
-		/// Verifies that the first value is greater than the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		static public void Greater(int arg1, int arg2 ) 
-		{
-			Assert.Greater( arg1, arg2, string.Empty, null );
-		}
-
-		#endregion
-
-		#region UInts
-
-		/// <summary>
-		/// Verifies that the first value is greater than the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		[CLSCompliant(false)]
-		static public void Greater(uint arg1, 
-			uint arg2, string message, params object[] args) 
-		{
-			Assert.That(arg1, Is.GreaterThan(arg2), message, args);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is greater than the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		[CLSCompliant(false)]
-		static public void Greater(uint arg1, uint arg2, string message) 
-		{
-			Assert.Greater( arg1, arg2, message, null );
-		}
-
-		/// <summary>
-		/// Verifies that the first value is greater than the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		[CLSCompliant(false)]
-		static public void Greater(uint arg1, uint arg2 ) 
-		{
-			Assert.Greater( arg1, arg2, string.Empty, null );
-		}
-
-		#endregion
-
-		#region Longs
-
-		/// <summary>
-		/// Verifies that the first value is greater than the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void Greater(long arg1, 
-			long arg2, string message, params object[] args) 
-		{
-			Assert.That(arg1, Is.GreaterThan(arg2), message, args);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is greater than the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		static public void Greater(long arg1, long arg2, string message) 
-		{
-			Assert.Greater( arg1, arg2, message, null );
-		}
-
-		/// <summary>
-		/// Verifies that the first value is greater than the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		static public void Greater(long arg1, long arg2 ) 
-		{
-			Assert.Greater( arg1, arg2, string.Empty, null );
-		}
-
-		#endregion
-
-		#region ULongs
-
-		/// <summary>
-		/// Verifies that the first value is greater than the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		[CLSCompliant(false)]
-		static public void Greater(ulong arg1, 
-			ulong arg2, string message, params object[] args) 
-		{
-			Assert.That(arg1, Is.GreaterThan(arg2), message, args);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is greater than the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		[CLSCompliant(false)]
-		static public void Greater(ulong arg1, ulong arg2, string message) 
-		{
-			Assert.Greater( arg1, arg2, message, null );
-		}
-
-		/// <summary>
-		/// Verifies that the first value is greater than the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		[CLSCompliant(false)]
-		static public void Greater(ulong arg1, ulong arg2 ) 
-		{
-			Assert.Greater( arg1, arg2, string.Empty, null );
-		}
-
-		#endregion
-
-		#region Decimals
-
-		/// <summary>
-		/// Verifies that the first value is greater than the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void Greater(decimal arg1, 
-			decimal arg2, string message, params object[] args) 
-		{
-            Assert.That(arg1, Is.GreaterThan(arg2), message, args);
-        }
-
-		/// <summary>
-		/// Verifies that the first value is greater than the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		static public void Greater(decimal arg1, decimal arg2, string message) 
-		{
-			Assert.Greater( arg1, arg2, message, null );
-		}
-
-		/// <summary>
-		/// Verifies that the first value is greater than the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		static public void Greater(decimal arg1, decimal arg2 ) 
-		{
-			Assert.Greater( arg1, arg2, string.Empty, null );
-		}
-
-		#endregion
-
-		#region Doubles
-
-		/// <summary>
-		/// Verifies that the first value is greater than the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void Greater(double arg1, 
-			double arg2, string message, params object[] args) 
-		{
-            Assert.That(arg1, Is.GreaterThan(arg2), message, args);
-        }
-
-		/// <summary>
-		/// Verifies that the first value is greater than the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		static public void Greater(double arg1, 
-			double arg2, string message) 
-		{
-			Assert.Greater( arg1, arg2, message, null );
-		}
-
-		/// <summary>
-		/// Verifies that the first value is greater than the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		static public void Greater(double arg1, double arg2) 
-		{
-			Assert.Greater(arg1, arg2, string.Empty, null);
-		}
-
-		#endregion
-
-		#region Floats
-
-		/// <summary>
-		/// Verifies that the first value is greater than the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void Greater(float arg1, 
-			float arg2, string message, params object[] args) 
-		{
-            Assert.That(arg1, Is.GreaterThan(arg2), message, args);
-        }
-
-		/// <summary>
-		/// Verifies that the first value is greater than the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		static public void Greater(float arg1, float arg2, string message) 
-		{
-			Assert.Greater(arg1, arg2, message, null);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is greater than the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		static public void Greater(float arg1, float arg2) 
-		{
-			Assert.Greater(arg1, arg2, string.Empty, null);
-		}
-
-		#endregion
-
-		#region IComparables
-
-		/// <summary>
-		/// Verifies that the first value is greater than the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void Greater(IComparable arg1, 
-			IComparable arg2, string message, params object[] args) 
-		{
-            Assert.That(arg1, Is.GreaterThan(arg2), message, args);
-        }
-
-		/// <summary>
-		/// Verifies that the first value is greater than the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		static public void Greater(IComparable arg1, IComparable arg2, string message) 
-		{
-			Assert.Greater(arg1, arg2, message, null);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is greater than the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		static public void Greater(IComparable arg1, IComparable arg2) 
-		{
-			Assert.Greater(arg1, arg2, string.Empty, null);
-		}
-
-		#endregion
-
-		#endregion
-
-		#region Less
-
-		#region Ints
-
-		/// <summary>
-		/// Verifies that the first value is less than the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void Less(int arg1, int arg2, string message, params object[] args) 
-		{
-            Assert.That(arg1, Is.LessThan(arg2), message, args);
-        }
-
-		/// <summary>
-		/// Verifies that the first value is less than the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		static public void Less(int arg1, int arg2, string message) 
-		{
-			Assert.Less(arg1, arg2, message, null);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is less than the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		static public void Less(int arg1, int arg2) 
-		{
-			Assert.Less( arg1, arg2, string.Empty, null);
-		}
-
-		#endregion
-
-		#region UInts
-
-		/// <summary>
-		/// Verifies that the first value is less than the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		[CLSCompliant(false)]
-		static public void Less(uint arg1, uint arg2, string message, params object[] args) 
-		{
-			Assert.That(arg1, Is.LessThan(arg2), message, args);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is less than the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		[CLSCompliant(false)]
-		static public void Less(uint arg1, uint arg2, string message) 
-		{
-			Assert.Less(arg1, arg2, message, null);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is less than the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		[CLSCompliant(false)]
-		static public void Less(uint arg1, uint arg2) 
-		{
-			Assert.Less( arg1, arg2, string.Empty, null);
-		}
-
-		#endregion
-
-		#region Longs
-
-		/// <summary>
-		/// Verifies that the first value is less than the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void Less(long arg1, long arg2, string message, params object[] args) 
-		{
-			Assert.That(arg1, Is.LessThan(arg2), message, args);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is less than the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		static public void Less(long arg1, long arg2, string message) 
-		{
-			Assert.Less(arg1, arg2, message, null);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is less than the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		static public void Less(long arg1, long arg2) 
-		{
-			Assert.Less( arg1, arg2, string.Empty, null);
-		}
-
-		#endregion
-
-		#region ULongs
-
-		/// <summary>
-		/// Verifies that the first value is less than the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		[CLSCompliant(false)]
-		static public void Less(ulong arg1, ulong arg2, string message, params object[] args) 
-		{
-			Assert.That(arg1, Is.LessThan(arg2), message, args);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is less than the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		[CLSCompliant(false)]
-		static public void Less(ulong arg1, ulong arg2, string message) 
-		{
-			Assert.Less(arg1, arg2, message, null);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is less than the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		[CLSCompliant(false)]
-		static public void Less(ulong arg1, ulong arg2) 
-		{
-			Assert.Less( arg1, arg2, string.Empty, null);
-		}
-
-		#endregion
-
-		#region Decimals
-
-		/// <summary>
-		/// Verifies that the first value is less than the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void Less(decimal arg1, decimal arg2, string message, params object[] args) 
-		{
-            Assert.That(arg1, Is.LessThan(arg2), message, args);
-        }
-
-		/// <summary>
-		/// Verifies that the first value is less than the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		static public void Less(decimal arg1, decimal arg2, string message) 
-		{
-			Assert.Less(arg1, arg2, message, null);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is less than the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		static public void Less(decimal arg1, decimal arg2) 
-		{
-			Assert.Less(arg1, arg2, string.Empty, null);
-		}
-
-		#endregion
-
-		#region Doubles
-
-		/// <summary>
-		/// Verifies that the first value is less than the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void Less(double arg1, double arg2, string message, params object[] args) 
-		{
-            Assert.That(arg1, Is.LessThan(arg2), message, args);
-        }
-
-		/// <summary>
-		/// Verifies that the first value is less than the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		static public void Less(double arg1, double arg2, string message) 
-		{
-			Assert.Less(arg1, arg2, message, null);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is less than the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		static public void Less(double arg1, double arg2) 
-		{
-			Assert.Less(arg1, arg2, string.Empty, null);
-		}
-
-		#endregion
-
-		#region Floats
-
-		/// <summary>
-		/// Verifies that the first value is less than the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void Less(float arg1, float arg2, string message, params object[] args) 
-		{
-            Assert.That(arg1, Is.LessThan(arg2), message, args);
-        }
-
-		/// <summary>
-		/// Verifies that the first value is less than the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		static public void Less(float arg1, float arg2, string message) 
-		{
-			Assert.Less(arg1, arg2, message, null);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is less than the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		static public void Less(float arg1, float arg2) 
-		{
-			Assert.Less(arg1, arg2, string.Empty, null);
-		}
-
-		#endregion
-
-		#region IComparables
-
-		/// <summary>
-		/// Verifies that the first value is less than the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void Less(IComparable arg1, IComparable arg2, string message, params object[] args) 
-		{
-            Assert.That(arg1, Is.LessThan(arg2), message, args);
-        }
-
-		/// <summary>
-		/// Verifies that the first value is less than the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		static public void Less(IComparable arg1, IComparable arg2, string message) 
-		{
-			Assert.Less(arg1, arg2, message, null);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is less than the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		static public void Less(IComparable arg1, IComparable arg2) 
-		{
-			Assert.Less(arg1, arg2, string.Empty, null);
-		}
-
-		#endregion
-
-		#endregion
-
-		#region Collection Containment
-
-		/// <summary>
-		/// Asserts that an object is contained in a list.
-		/// </summary>
-		/// <param name="expected">The expected object</param>
-		/// <param name="actual">The list to be examined</param>
-		/// <param name="message">The message to display in case of failure</param>
-		/// <param name="args">Arguments used in formatting the message</param>
-		static public void Contains( object expected, ICollection actual, string message, params object[] args )
-		{
-            Assert.That(actual, new CollectionContainsConstraint(expected), message, args);
-		}
-
-		/// <summary>
-		/// Asserts that an object is contained in a list.
-		/// </summary>
-		/// <param name="expected">The expected object</param>
-		/// <param name="actual">The list to be examined</param>
-		/// <param name="message">The message to display in case of failure</param>
-		static public void Contains( object expected, ICollection actual, string message )
-		{
-			Contains( expected, actual, message, null );
-		}
-
-		/// <summary>
-		/// Asserts that an object is contained in a list.
-		/// </summary>
-		/// <param name="expected">The expected object</param>
-		/// <param name="actual">The list to be examined</param>
-		static public void Contains( object expected, ICollection actual )
-		{
-			Contains( expected, actual, string.Empty, null );
-		}
-
-		#endregion
-		
-		#region Fail
-
-		/// <summary>
-		/// Throws an <see cref="AssertionException"/> with the message and arguments 
-		/// that are passed in. This is used by the other Assert functions. 
-		/// </summary>
-		/// <param name="message">The message to initialize the <see cref="AssertionException"/> with.</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void Fail(string message, params object[] args ) 
-		{
-			if (message == null) message = string.Empty;
-			else if ( args != null && args.Length > 0 )
-				message = string.Format( message, args );
-
-			throw new AssertionException(message);
-		}
-
-		/// <summary>
-		/// Throws an <see cref="AssertionException"/> with the message that is 
-		/// passed in. This is used by the other Assert functions. 
-		/// </summary>
-		/// <param name="message">The message to initialize the <see cref="AssertionException"/> with.</param>
-		static public void Fail(string message) 
-		{
-			Assert.Fail(message, null);
-		}
-    
-		/// <summary>
-		/// Throws an <see cref="AssertionException"/>. 
-		/// This is used by the other Assert functions. 
-		/// </summary>
-		static public void Fail() 
-		{
-			Assert.Fail(string.Empty, null);
-		}
-
-		#endregion 
-
-		#region Ignore
-
-		/// <summary>
-		/// Throws an <see cref="IgnoreException"/> with the message and arguments 
-		/// that are passed in.  This causes the test to be reported as ignored.
-		/// </summary>
-		/// <param name="message">The message to initialize the <see cref="AssertionException"/> with.</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void Ignore( string message, params object[] args )
-		{
-			if (message == null) message = string.Empty;
-			else if ( args != null && args.Length > 0 )
-				message = string.Format( message, args );
-
-			throw new IgnoreException(message);
-		}
-
-		/// <summary>
-		/// Throws an <see cref="IgnoreException"/> with the message that is 
-		/// passed in. This causes the test to be reported as ignored. 
-		/// </summary>
-		/// <param name="message">The message to initialize the <see cref="AssertionException"/> with.</param>
-		static public void Ignore( string message )
-		{
-			Assert.Ignore( message, null );
-		}
-    
-		/// <summary>
-		/// Throws an <see cref="IgnoreException"/>. 
-		/// This causes the test to be reported as ignored. 
-		/// </summary>
-		static public void Ignore()
-		{
-			Assert.Ignore( string.Empty, null );
-		}
-    
-		#endregion
-
-		#region DoAssert
-
-		/// <summary>
-		/// NOTE: The use of asserters for extending NUnit has
-		/// now been replaced by the use of constraints. This
-		/// method is marked obsolete.
-		/// 
-		/// Test the condition asserted by an asserter and throw
-		/// an assertion exception using provided message on failure.
-		/// </summary>
-		/// <param name="asserter">An object that implements IAsserter</param>
-		[Obsolete("Use Constraints rather than Asserters for new work")]
-		static public void DoAssert( IAsserter asserter )
-		{
-			Assert.IncrementAssertCount();
-			if ( !asserter.Test() )
-				throw new AssertionException( asserter.Message );
-		}
-
-		#endregion
-
-		#region That
-		/// <summary>
-		/// Apply a constraint to an actual value, succeeding if the constraint
-		/// is satisfied and throwing an assertion exception on failure.
-		/// </summary>
-		/// <param name="constraint">A Constraint to be applied</param>
-		/// <param name="actual">The actual value to test</param>
-		static public void That( object actual, Constraint constraint )
-		{
-			Assert.That( actual, constraint, null, null );
-		}
-
-		/// <summary>
-		/// Apply a constraint to an actual value, succeedingt if the constraint
-		/// is satisfied and throwing an assertion exception on failure.
-		/// </summary>
-		/// <param name="constraint">A Constraint to be applied</param>
-		/// <param name="actual">The actual value to test</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		static public void That( object actual, Constraint constraint, string message )
-		{
-			Assert.That( actual, constraint, message, null );
-		}
-
-		/// <summary>
-		/// Apply a constraint to an actual value, succeedingt if the constraint
-		/// is satisfied and throwing an assertion exception on failure.
-		/// </summary>
-		/// <param name="constraint">A Constraint to be applied</param>
-		/// <param name="actual">The actual value to test</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void That( object actual, Constraint constraint, string message, params object[] args )
-		{
-			Assert.IncrementAssertCount();
-			if ( !constraint.Matches( actual ) )
-			{
-				MessageWriter writer = new TextMessageWriter( message, args );
-				constraint.WriteMessageTo( writer );
-				throw new AssertionException( writer.ToString() );
-			}
-		}
-
+        #region Boolean
         /// <summary>
         /// Asserts that a condition is true. If the condition is false the method throws
         /// an <see cref="AssertionException"/>.
@@ -2240,721 +495,3295 @@ namespace NUnit.Framework
         }
         #endregion
 
-		#region GreaterOrEqual
-
-		#region Ints
-
-		/// <summary>
-		/// Verifies that the first value is greater than or equal to the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown. 
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void GreaterOrEqual(int arg1,
-		    int arg2, string message, params object[] args)
-		{
-            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, args);
-        }
-
-		/// <summary>
-		/// Verifies that the first value is greater than or equal to the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		static public void GreaterOrEqual(int arg1, int arg2, string message)
-		{
-		    Assert.GreaterOrEqual(arg1, arg2, message, null);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is greater than or equal to the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		static public void GreaterOrEqual(int arg1, int arg2)
-		{
-		    Assert.GreaterOrEqual(arg1, arg2, string.Empty, null);
-		}
-
-		#endregion
-
-		#region UInts
-
-		/// <summary>
-		/// Verifies that the first value is greater than or equal to the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		[CLSCompliant(false)]
-		static public void GreaterOrEqual(uint arg1,
-			uint arg2, string message, params object[] args)
-		{
-			Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, args);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is greater than or equal to the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		[CLSCompliant(false)]
-		static public void GreaterOrEqual(uint arg1, uint arg2, string message)
-		{
-			Assert.GreaterOrEqual(arg1, arg2, message, null);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is greater or equal to than the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		[CLSCompliant(false)]
-		static public void GreaterOrEqual(uint arg1, uint arg2)
-		{
-			Assert.GreaterOrEqual(arg1, arg2, string.Empty, null);
-		}
-
-		#endregion
-
-		#region Longs
-
-		/// <summary>
-		/// Verifies that the first value is greater than or equal to the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void GreaterOrEqual(long arg1,
-			long arg2, string message, params object[] args)
-		{
-			Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, args);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is greater than or equal to the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		static public void GreaterOrEqual(long arg1, long arg2, string message)
-		{
-			Assert.GreaterOrEqual(arg1, arg2, message, null);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is greater or equal to than the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		static public void GreaterOrEqual(long arg1, long arg2)
-		{
-			Assert.GreaterOrEqual(arg1, arg2, string.Empty, null);
-		}
-
-		#endregion
-
-		#region ULongs
-
-		/// <summary>
-		/// Verifies that the first value is greater than or equal to the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		[CLSCompliant(false)]
-		static public void GreaterOrEqual(ulong arg1,
-			ulong arg2, string message, params object[] args)
-		{
-			Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, args);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is greater than or equal to the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		[CLSCompliant(false)]
-		static public void GreaterOrEqual(ulong arg1, ulong arg2, string message)
-		{
-			Assert.GreaterOrEqual(arg1, arg2, message, null);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is greater or equal to than the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		[CLSCompliant(false)]
-		static public void GreaterOrEqual(ulong arg1, ulong arg2)
-		{
-			Assert.GreaterOrEqual(arg1, arg2, string.Empty, null);
-		}
-
-		#endregion
-
-		#region Decimals
-
-		/// <summary>
-		/// Verifies that the first value is greater than or equal to the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void GreaterOrEqual(decimal arg1,
-		    decimal arg2, string message, params object[] args)
-		{
-            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, args);
-        }
-
-		/// <summary>
-		/// Verifies that the first value is greater than or equal to the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		static public void GreaterOrEqual(decimal arg1, decimal arg2, string message)
-		{
-		    Assert.GreaterOrEqual(arg1, arg2, message, null);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is greater than or equal to the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		static public void GreaterOrEqual(decimal arg1, decimal arg2)
-		{
-		    Assert.GreaterOrEqual(arg1, arg2, string.Empty, null);
-		}
-
-		#endregion
-
-		#region Doubles
-
-		/// <summary>
-		/// Verifies that the first value is greater than or equal to the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void GreaterOrEqual(double arg1,
-		    double arg2, string message, params object[] args)
-		{
-            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, args);
-        }
-
-		/// <summary>
-		/// Verifies that the first value is greater than or equal to the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		static public void GreaterOrEqual(double arg1,
-		    double arg2, string message)
-		{
-		    Assert.GreaterOrEqual(arg1, arg2, message, null);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is greater than or equal to the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		static public void GreaterOrEqual(double arg1, double arg2)
-		{
-		    Assert.GreaterOrEqual(arg1, arg2, string.Empty, null);
-		}
-
-		#endregion
-
-		#region Floats
-
-		/// <summary>
-		/// Verifies that the first value is greater than or equal to the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void GreaterOrEqual(float arg1,
-		    float arg2, string message, params object[] args)
-		{
-            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, args);
-        }
-
-		/// <summary>
-		/// Verifies that the first value is greater than or equal to the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		static public void GreaterOrEqual(float arg1, float arg2, string message)
-		{
-		    Assert.GreaterOrEqual(arg1, arg2, message, null);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is greater than or equal to the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		static public void GreaterOrEqual(float arg1, float arg2)
-		{
-		    Assert.GreaterOrEqual(arg1, arg2, string.Empty, null);
-		}
-
-		#endregion
-
-		#region IComparables
-
-		/// <summary>
-		/// Verifies that the first value is greater than the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void GreaterOrEqual(IComparable arg1,
-		    IComparable arg2, string message, params object[] args)
-		{
-            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, args);
-        }
-
-		/// <summary>
-		/// Verifies that the first value is greater than the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		static public void GreaterOrEqual(IComparable arg1, IComparable arg2, string message)
-		{
-		    Assert.GreaterOrEqual(arg1, arg2, message, null);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is greater than the second
-		/// value. If they are not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be greater</param>
-		/// <param name="arg2">The second value, expected to be less</param>
-		static public void GreaterOrEqual(IComparable arg1, IComparable arg2)
-		{
-		    Assert.GreaterOrEqual(arg1, arg2, string.Empty, null);
-		}
-
-		#endregion
-
-		#endregion
-
-		#region LessOrEqual
-
-		#region Ints
-
-		/// <summary>
-		/// Verifies that the first value is less than or equal to the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void LessOrEqual(int arg1, int arg2, string message, params object[] args)
-		{
-            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, args);
-        }
-
-		/// <summary>
-		/// Verifies that the first value is less than or equal to the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		static public void LessOrEqual(int arg1, int arg2, string message)
-		{
-		    Assert.LessOrEqual(arg1, arg2, message, null);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is less than or equal to the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		static public void LessOrEqual(int arg1, int arg2)
-		{
-		    Assert.LessOrEqual(arg1, arg2, string.Empty, null);
-		}
-
-		#endregion
-
-		#region UInts
-
-		/// <summary>
-		/// Verifies that the first value is less than or equal to the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		[CLSCompliant(false)]
-		static public void LessOrEqual(uint arg1, uint arg2, string message, params object[] args)
-		{
-			Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, args);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is less than or equal to the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		[CLSCompliant(false)]
-		static public void LessOrEqual(uint arg1, uint arg2, string message)
-		{
-			Assert.LessOrEqual(arg1, arg2, message, null);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is less than or equal to the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		[CLSCompliant(false)]
-		static public void LessOrEqual(uint arg1, uint arg2)
-		{
-			Assert.LessOrEqual(arg1, arg2, string.Empty, null);
-		}
-
-		#endregion
-
-		#region Longs
-
-		/// <summary>
-		/// Verifies that the first value is less than or equal to the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void LessOrEqual(long arg1, long arg2, string message, params object[] args)
-		{
-			Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, args);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is less than or equal to the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		static public void LessOrEqual(long arg1, long arg2, string message)
-		{
-			Assert.LessOrEqual(arg1, arg2, message, null);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is less than or equal to the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		static public void LessOrEqual(long arg1, long arg2)
-		{
-			Assert.LessOrEqual(arg1, arg2, string.Empty, null);
-		}
-
-		#endregion
-
-		#region ULongs
-
-		/// <summary>
-		/// Verifies that the first value is less than or equal to the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		[CLSCompliant(false)]
-		static public void LessOrEqual(ulong arg1, ulong arg2, string message, params object[] args)
-		{
-			Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, args);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is less than or equal to the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		[CLSCompliant(false)]
-		static public void LessOrEqual(ulong arg1, ulong arg2, string message)
-		{
-			Assert.LessOrEqual(arg1, arg2, message, null);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is less than or equal to the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		[CLSCompliant(false)]
-		static public void LessOrEqual(ulong arg1, ulong arg2)
-		{
-			Assert.LessOrEqual(arg1, arg2, string.Empty, null);
-		}
-
-		#endregion
-
-		#region Decimals
-
-		/// <summary>
-		/// Verifies that the first value is less than or equal to the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void LessOrEqual(decimal arg1, decimal arg2, string message, params object[] args)
-		{
-            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, args);
-        }
-
-		/// <summary>
-		/// Verifies that the first value is less than or equal to the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		static public void LessOrEqual(decimal arg1, decimal arg2, string message)
-		{
-		    Assert.LessOrEqual(arg1, arg2, message, null);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is less than or equal to the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		static public void LessOrEqual(decimal arg1, decimal arg2)
-		{
-		    Assert.LessOrEqual(arg1, arg2, string.Empty, null);
-		}
-
-		#endregion
-
-		#region Doubles
-
-		/// <summary>
-		/// Verifies that the first value is less than or equal to the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void LessOrEqual(double arg1, double arg2, string message, params object[] args)
-		{
-            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, args);
-        }
-
-		/// <summary>
-		/// Verifies that the first value is less than or equal to the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		static public void LessOrEqual(double arg1, double arg2, string message)
-		{
-		    Assert.LessOrEqual(arg1, arg2, message, null);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is less than or equal to the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		static public void LessOrEqual(double arg1, double arg2)
-		{
-		    Assert.LessOrEqual(arg1, arg2, string.Empty, null);
-		}
-
-		#endregion
-
-		#region Floats
-
-		/// <summary>
-		/// Verifies that the first value is less than or equal to the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void LessOrEqual(float arg1, float arg2, string message, params object[] args)
-		{
-            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, args);
-        }
-
-		/// <summary>
-		/// Verifies that the first value is less than or equal to the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		static public void LessOrEqual(float arg1, float arg2, string message)
-		{
-		    Assert.LessOrEqual(arg1, arg2, message, null);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is less than or equal to the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		static public void LessOrEqual(float arg1, float arg2)
-		{
-		    Assert.LessOrEqual(arg1, arg2, string.Empty, null);
-		}
-
-		#endregion
-
-		#region IComparables
-
-		/// <summary>
-		/// Verifies that the first value is less than or equal to the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void LessOrEqual(IComparable arg1, IComparable arg2, string message, params object[] args)
-		{
-            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, args);
-        }
-
-		/// <summary>
-		/// Verifies that the first value is less than or equal to the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		static public void LessOrEqual(IComparable arg1, IComparable arg2, string message)
-		{
-		    Assert.LessOrEqual(arg1, arg2, message, null);
-		}
-
-		/// <summary>
-		/// Verifies that the first value is less than or equal to the second
-		/// value. If it is not, then an 
-		/// <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="arg1">The first value, expected to be less</param>
-		/// <param name="arg2">The second value, expected to be greater</param>
-		static public void LessOrEqual(IComparable arg1, IComparable arg2)
-		{
-		    Assert.LessOrEqual(arg1, arg2, string.Empty, null);
-		}
-
-		#endregion
+        /// <summary>
+        /// Asserts that the code represented by a delegate throws an exception
+        /// that satisfies the constraint provided.
+        /// </summary>
+        /// <param name="code">A TestDelegate to be executed</param>
+        /// <param name="constraint">A ThrowsConstraint used in the test</param>
+        static public void That(TestDelegate code, IResolveConstraint constraint)
+        {
+            Assert.That((object)code, constraint);
+        }
+        #endregion
+
+        #region Throws, Catch and DoesNotThrow
+
+        #region Throws
+        /// <summary>
+        /// Verifies that a delegate throws a particular exception when called.
+        /// </summary>
+        /// <param name="expression">A constraint to be satisfied by the exception</param>
+        /// <param name="code">A TestSnippet delegate</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        public static Exception Throws(IResolveConstraint expression, TestDelegate code, string message, params object[] args)
+        {
+            Exception caughtException = null;
+
+            try
+            {
+                code();
+            }
+            catch(Exception ex)
+            {
+                caughtException = ex;
+            }
+
+            Assert.That(caughtException, expression, message, args);
+
+            return caughtException;
+        }
+
+        /// <summary>
+        /// Verifies that a delegate throws a particular exception when called.
+        /// </summary>
+        /// <param name="expression">A constraint to be satisfied by the exception</param>
+        /// <param name="code">A TestSnippet delegate</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        public static Exception Throws(IResolveConstraint expression, TestDelegate code, string message)
+        {
+            return Throws(expression, code, message, null);
+        }
+
+        /// <summary>
+        /// Verifies that a delegate throws a particular exception when called.
+        /// </summary>
+        /// <param name="expression">A constraint to be satisfied by the exception</param>
+        /// <param name="code">A TestSnippet delegate</param>
+        public static Exception Throws(IResolveConstraint expression, TestDelegate code)
+        {
+            return Throws(expression, code, string.Empty, null);
+        }
+
+        /// <summary>
+        /// Verifies that a delegate throws a particular exception when called.
+        /// </summary>
+        /// <param name="expectedExceptionType">The exception Type expected</param>
+        /// <param name="code">A TestSnippet delegate</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        public static Exception Throws(Type expectedExceptionType, TestDelegate code, string message, params object[] args)
+        {
+            return Throws(new ExactTypeConstraint(expectedExceptionType), code, message, args);
+        }
+
+        /// <summary>
+        /// Verifies that a delegate throws a particular exception when called.
+        /// </summary>
+        /// <param name="expectedExceptionType">The exception Type expected</param>
+        /// <param name="code">A TestSnippet delegate</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        public static Exception Throws(Type expectedExceptionType, TestDelegate code, string message)
+        {
+            return Throws(new ExactTypeConstraint(expectedExceptionType), code, message, null);
+        }
+
+        /// <summary>
+        /// Verifies that a delegate throws a particular exception when called.
+        /// </summary>
+        /// <param name="expectedExceptionType">The exception Type expected</param>
+        /// <param name="code">A TestSnippet delegate</param>
+        public static Exception Throws(Type expectedExceptionType, TestDelegate code)
+        {
+            return Throws(new ExactTypeConstraint(expectedExceptionType), code, string.Empty, null);
+        }
+
+        #endregion
+
+        #region Throws<T>
+#if NET_2_0
+        /// <summary>
+        /// Verifies that a delegate throws a particular exception when called.
+        /// </summary>
+        /// <typeparam name="T">Type of the expected exception</typeparam>
+        /// <param name="code">A TestSnippet delegate</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        public static T Throws<T>(TestDelegate code, string message, params object[] args) where T : Exception
+        {
+            return (T)Throws(typeof(T), code, message, args);
+        }
+
+        /// <summary>
+        /// Verifies that a delegate throws a particular exception when called.
+        /// </summary>
+        /// <typeparam name="T">Type of the expected exception</typeparam>
+        /// <param name="code">A TestSnippet delegate</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        public static T Throws<T>(TestDelegate code, string message) where T : Exception
+        {
+            return Throws<T>(code, message, null);
+        }
+
+        /// <summary>
+        /// Verifies that a delegate throws a particular exception when called.
+        /// </summary>
+        /// <typeparam name="T">Type of the expected exception</typeparam>
+        /// <param name="code">A TestSnippet delegate</param>
+        public static T Throws<T>(TestDelegate code) where T : Exception
+        {
+            return Throws<T>(code, string.Empty, null);
+        }
+#endif
+        #endregion
+
+        #region Catch
+        /// <summary>
+        /// Verifies that a delegate throws an exception when called
+        /// and returns it.
+        /// </summary>
+        /// <param name="code">A TestDelegate</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        public static Exception Catch(TestDelegate code, string message, params object[] args)
+        {
+            return Throws(new InstanceOfTypeConstraint(typeof(Exception)), code, message, args);
+        }
+
+        /// <summary>
+        /// Verifies that a delegate throws an exception when called
+        /// and returns it.
+        /// </summary>
+        /// <param name="code">A TestDelegate</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        public static Exception Catch(TestDelegate code, string message)
+        {
+            return Throws(new InstanceOfTypeConstraint(typeof(Exception)), code, message);
+        }
+
+        /// <summary>
+        /// Verifies that a delegate throws an exception when called
+        /// and returns it.
+        /// </summary>
+        /// <param name="code">A TestDelegate</param>
+        public static Exception Catch(TestDelegate code)
+        {
+            return Throws(new InstanceOfTypeConstraint(typeof(Exception)), code);
+        }
+
+        /// <summary>
+        /// Verifies that a delegate throws an exception of a certain Type
+        /// or one derived from it when called and returns it.
+        /// </summary>
+        /// <param name="expectedExceptionType">The expected Exception Type</param>
+        /// <param name="code">A TestDelegate</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        public static Exception Catch(Type expectedExceptionType, TestDelegate code, string message, params object[] args)
+        {
+            return Throws(new InstanceOfTypeConstraint(expectedExceptionType), code, message, args);
+        }
+
+        /// <summary>
+        /// Verifies that a delegate throws an exception of a certain Type
+        /// or one derived from it when called and returns it.
+        /// </summary>
+        /// <param name="expectedExceptionType">The expected Exception Type</param>
+        /// <param name="code">A TestDelegate</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        public static Exception Catch(Type expectedExceptionType, TestDelegate code, string message)
+        {
+            return Throws(new InstanceOfTypeConstraint(expectedExceptionType), code, message);
+        }
+
+        /// <summary>
+        /// Verifies that a delegate throws an exception of a certain Type
+        /// or one derived from it when called and returns it.
+        /// </summary>
+        /// <param name="expectedExceptionType">The expected Exception Type</param>
+        /// <param name="code">A TestDelegate</param>
+        public static Exception Catch(Type expectedExceptionType, TestDelegate code)
+        {
+            return Throws(new InstanceOfTypeConstraint(expectedExceptionType), code);
+        }       
+        #endregion
+
+        #region Catch<T>
+#if NET_2_0
+        /// <summary>
+        /// Verifies that a delegate throws an exception of a certain Type
+        /// or one derived from it when called and returns it.
+        /// </summary>
+        /// <typeparam name="T">The expected Exception Type</typeparam>
+        /// <param name="code">A TestDelegate</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        public static T Catch<T>(TestDelegate code, string message, params object[] args) where T : System.Exception
+        {
+            return (T)Throws(new InstanceOfTypeConstraint(typeof(T)), code, message, args);
+        }
+
+        /// <summary>
+        /// Verifies that a delegate throws an exception of a certain Type
+        /// or one derived from it when called and returns it.
+        /// </summary>
+        /// <typeparam name="T">The expected Exception Type</typeparam>
+        /// <param name="code">A TestDelegate</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        public static T Catch<T>(TestDelegate code, string message) where T : System.Exception
+        {
+            return (T)Throws(new InstanceOfTypeConstraint(typeof(T)), code, message);
+        }
+
+        /// <summary>
+        /// Verifies that a delegate throws an exception of a certain Type
+        /// or one derived from it when called and returns it.
+        /// </summary>
+        /// <typeparam name="T">The expected Exception Type</typeparam>
+        /// <param name="code">A TestDelegate</param>
+        public static T Catch<T>(TestDelegate code) where T : System.Exception
+        {
+            return (T)Throws(new InstanceOfTypeConstraint(typeof(T)), code);
+        }
+#endif
+        #endregion
+
+        #region DoesNotThrow
 
+        /// <summary>
+        /// Verifies that a delegate does not throw an exception
+        /// </summary>
+        /// <param name="code">A TestSnippet delegate</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        public static void DoesNotThrow(TestDelegate code, string message, params object[] args)
+        {
+            try
+            {
+                code();
+            }
+            catch (Exception ex)
+            {
+                TextMessageWriter writer = new TextMessageWriter(message, args);
+                writer.WriteLine("Unexpected exception: {0}", ex.GetType());
+                Assert.Fail(writer.ToString());
+            }
+        }
+
+        /// <summary>
+        /// Verifies that a delegate does not throw an exception.
+        /// </summary>
+        /// <param name="code">A TestSnippet delegate</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        public static void DoesNotThrow(TestDelegate code, string message)
+        {
+            DoesNotThrow(code, message, null);
+        }
+
+        /// <summary>
+        /// Verifies that a delegate does not throw an exception.
+        /// </summary>
+        /// <param name="code">A TestSnippet delegate</param>
+        public static void DoesNotThrow(TestDelegate code)
+        {
+            DoesNotThrow(code, string.Empty, null);
+        }
+
+        #endregion
+
+        #endregion
+
+        #region True
+        
+        /// <summary>
+        /// Asserts that a condition is true. If the condition is false the method throws
+        /// an <see cref="AssertionException"/>.
+        /// </summary>
+        /// <param name="condition">The evaluated condition</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void True(bool condition, string message, params object[] args)
+        {
+            Assert.That(condition, Is.True ,message, args);
+        }
+        
+        /// <summary>
+        /// Asserts that a condition is true. If the condition is false the method throws
+        /// an <see cref="AssertionException"/>.
+        /// </summary>
+        /// <param name="condition">The evaluated condition</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void True(bool condition, string message)
+        {
+            Assert.That(condition, Is.True ,message, null);
+        }
+        
+        /// <summary>
+        /// Asserts that a condition is true. If the condition is false the method throws
+        /// an <see cref="AssertionException"/>.
+        /// </summary>
+        /// <param name="condition">The evaluated condition</param>
+        public static void True(bool condition)
+        {
+            Assert.That(condition, Is.True ,null, null);
+        }
+        
+        /// <summary>
+        /// Asserts that a condition is true. If the condition is false the method throws
+        /// an <see cref="AssertionException"/>.
+        /// </summary>
+        /// <param name="condition">The evaluated condition</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsTrue(bool condition, string message, params object[] args)
+        {
+            Assert.That(condition, Is.True ,message, args);
+        }
+        
+        /// <summary>
+        /// Asserts that a condition is true. If the condition is false the method throws
+        /// an <see cref="AssertionException"/>.
+        /// </summary>
+        /// <param name="condition">The evaluated condition</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsTrue(bool condition, string message)
+        {
+            Assert.That(condition, Is.True ,message, null);
+        }
+        
+        /// <summary>
+        /// Asserts that a condition is true. If the condition is false the method throws
+        /// an <see cref="AssertionException"/>.
+        /// </summary>
+        /// <param name="condition">The evaluated condition</param>
+        public static void IsTrue(bool condition)
+        {
+            Assert.That(condition, Is.True ,null, null);
+        }
+        
+        #endregion
+        
+        #region False
+        
+        /// <summary>
+        /// Asserts that a condition is false. If the condition is true the method throws
+        /// an <see cref="AssertionException"/>.
+        /// </summary> 
+        /// <param name="condition">The evaluated condition</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void False(bool condition, string message, params object[] args)
+        {
+            Assert.That(condition, Is.False ,message, args);
+        }
+        
+        /// <summary>
+        /// Asserts that a condition is false. If the condition is true the method throws
+        /// an <see cref="AssertionException"/>.
+        /// </summary> 
+        /// <param name="condition">The evaluated condition</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void False(bool condition, string message)
+        {
+            Assert.That(condition, Is.False ,message, null);
+        }
+        
+        /// <summary>
+        /// Asserts that a condition is false. If the condition is true the method throws
+        /// an <see cref="AssertionException"/>.
+        /// </summary> 
+        /// <param name="condition">The evaluated condition</param>
+        public static void False(bool condition)
+        {
+            Assert.That(condition, Is.False ,null, null);
+        }
+        
+        /// <summary>
+        /// Asserts that a condition is false. If the condition is true the method throws
+        /// an <see cref="AssertionException"/>.
+        /// </summary> 
+        /// <param name="condition">The evaluated condition</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsFalse(bool condition, string message, params object[] args)
+        {
+            Assert.That(condition, Is.False ,message, args);
+        }
+        
+        /// <summary>
+        /// Asserts that a condition is false. If the condition is true the method throws
+        /// an <see cref="AssertionException"/>.
+        /// </summary> 
+        /// <param name="condition">The evaluated condition</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsFalse(bool condition, string message)
+        {
+            Assert.That(condition, Is.False ,message, null);
+        }
+        
+        /// <summary>
+        /// Asserts that a condition is false. If the condition is true the method throws
+        /// an <see cref="AssertionException"/>.
+        /// </summary> 
+        /// <param name="condition">The evaluated condition</param>
+        public static void IsFalse(bool condition)
+        {
+            Assert.That(condition, Is.False ,null, null);
+        }
+        
+        #endregion
+        
+        #region NotNull
+        
+        /// <summary>
+        /// Verifies that the object that is passed in is not equal to <code>null</code>
+        /// If the object is <code>null</code> then an <see cref="AssertionException"/>
+        /// is thrown.
+        /// </summary>
+        /// <param name="anObject">The object that is to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void NotNull(object anObject, string message, params object[] args)
+        {
+            Assert.That(anObject, Is.Not.Null ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the object that is passed in is not equal to <code>null</code>
+        /// If the object is <code>null</code> then an <see cref="AssertionException"/>
+        /// is thrown.
+        /// </summary>
+        /// <param name="anObject">The object that is to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void NotNull(object anObject, string message)
+        {
+            Assert.That(anObject, Is.Not.Null ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the object that is passed in is not equal to <code>null</code>
+        /// If the object is <code>null</code> then an <see cref="AssertionException"/>
+        /// is thrown.
+        /// </summary>
+        /// <param name="anObject">The object that is to be tested</param>
+        public static void NotNull(object anObject)
+        {
+            Assert.That(anObject, Is.Not.Null ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the object that is passed in is not equal to <code>null</code>
+        /// If the object is <code>null</code> then an <see cref="AssertionException"/>
+        /// is thrown.
+        /// </summary>
+        /// <param name="anObject">The object that is to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsNotNull(object anObject, string message, params object[] args)
+        {
+            Assert.That(anObject, Is.Not.Null ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the object that is passed in is not equal to <code>null</code>
+        /// If the object is <code>null</code> then an <see cref="AssertionException"/>
+        /// is thrown.
+        /// </summary>
+        /// <param name="anObject">The object that is to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsNotNull(object anObject, string message)
+        {
+            Assert.That(anObject, Is.Not.Null ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the object that is passed in is not equal to <code>null</code>
+        /// If the object is <code>null</code> then an <see cref="AssertionException"/>
+        /// is thrown.
+        /// </summary>
+        /// <param name="anObject">The object that is to be tested</param>
+        public static void IsNotNull(object anObject)
+        {
+            Assert.That(anObject, Is.Not.Null ,null, null);
+        }
+        
+        #endregion
+        
+        #region Null
+        
+        /// <summary>
+        /// Verifies that the object that is passed in is equal to <code>null</code>
+        /// If the object is not <code>null</code> then an <see cref="AssertionException"/>
+        /// is thrown.
+        /// </summary>
+        /// <param name="anObject">The object that is to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void Null(object anObject, string message, params object[] args)
+        {
+            Assert.That(anObject, Is.Null ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the object that is passed in is equal to <code>null</code>
+        /// If the object is not <code>null</code> then an <see cref="AssertionException"/>
+        /// is thrown.
+        /// </summary>
+        /// <param name="anObject">The object that is to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void Null(object anObject, string message)
+        {
+            Assert.That(anObject, Is.Null ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the object that is passed in is equal to <code>null</code>
+        /// If the object is not <code>null</code> then an <see cref="AssertionException"/>
+        /// is thrown.
+        /// </summary>
+        /// <param name="anObject">The object that is to be tested</param>
+        public static void Null(object anObject)
+        {
+            Assert.That(anObject, Is.Null ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the object that is passed in is equal to <code>null</code>
+        /// If the object is not <code>null</code> then an <see cref="AssertionException"/>
+        /// is thrown.
+        /// </summary>
+        /// <param name="anObject">The object that is to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsNull(object anObject, string message, params object[] args)
+        {
+            Assert.That(anObject, Is.Null ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the object that is passed in is equal to <code>null</code>
+        /// If the object is not <code>null</code> then an <see cref="AssertionException"/>
+        /// is thrown.
+        /// </summary>
+        /// <param name="anObject">The object that is to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsNull(object anObject, string message)
+        {
+            Assert.That(anObject, Is.Null ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the object that is passed in is equal to <code>null</code>
+        /// If the object is not <code>null</code> then an <see cref="AssertionException"/>
+        /// is thrown.
+        /// </summary>
+        /// <param name="anObject">The object that is to be tested</param>
+        public static void IsNull(object anObject)
+        {
+            Assert.That(anObject, Is.Null ,null, null);
+        }
+        
+        #endregion
+        
+        #region IsNaN
+        
+        /// <summary>
+        /// Verifies that the double that is passed in is an <code>NaN</code> value.
+        /// If the object is not <code>NaN</code> then an <see cref="AssertionException"/>
+        /// is thrown.
+        /// </summary>
+        /// <param name="aDouble">The value that is to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsNaN(double aDouble, string message, params object[] args)
+        {
+            Assert.That(aDouble, Is.NaN ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the double that is passed in is an <code>NaN</code> value.
+        /// If the object is not <code>NaN</code> then an <see cref="AssertionException"/>
+        /// is thrown.
+        /// </summary>
+        /// <param name="aDouble">The value that is to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsNaN(double aDouble, string message)
+        {
+            Assert.That(aDouble, Is.NaN ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the double that is passed in is an <code>NaN</code> value.
+        /// If the object is not <code>NaN</code> then an <see cref="AssertionException"/>
+        /// is thrown.
+        /// </summary>
+        /// <param name="aDouble">The value that is to be tested</param>
+        public static void IsNaN(double aDouble)
+        {
+            Assert.That(aDouble, Is.NaN ,null, null);
+        }
+        
+#if NET_2_0
+        /// <summary>
+        /// Verifies that the double that is passed in is an <code>NaN</code> value.
+        /// If the object is not <code>NaN</code> then an <see cref="AssertionException"/>
+        /// is thrown.
+        /// </summary>
+        /// <param name="aDouble">The value that is to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsNaN(double? aDouble, string message, params object[] args)
+        {
+            Assert.That(aDouble, Is.NaN ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the double that is passed in is an <code>NaN</code> value.
+        /// If the object is not <code>NaN</code> then an <see cref="AssertionException"/>
+        /// is thrown.
+        /// </summary>
+        /// <param name="aDouble">The value that is to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsNaN(double? aDouble, string message)
+        {
+            Assert.That(aDouble, Is.NaN ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the double that is passed in is an <code>NaN</code> value.
+        /// If the object is not <code>NaN</code> then an <see cref="AssertionException"/>
+        /// is thrown.
+        /// </summary>
+        /// <param name="aDouble">The value that is to be tested</param>
+        public static void IsNaN(double? aDouble)
+        {
+            Assert.That(aDouble, Is.NaN ,null, null);
+        }
+        
+#endif
+        #endregion
+        
+        #region IsEmpty
+        
+        /// <summary>
+        /// Assert that a string is empty - that is equal to string.Empty
+        /// </summary>
+        /// <param name="aString">The string to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsEmpty(string aString, string message, params object[] args)
+        {
+            Assert.That(aString, new EmptyStringConstraint() ,message, args);
+        }
+        
+        /// <summary>
+        /// Assert that a string is empty - that is equal to string.Empty
+        /// </summary>
+        /// <param name="aString">The string to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsEmpty(string aString, string message)
+        {
+            Assert.That(aString, new EmptyStringConstraint() ,message, null);
+        }
+        
+        /// <summary>
+        /// Assert that a string is empty - that is equal to string.Empty
+        /// </summary>
+        /// <param name="aString">The string to be tested</param>
+        public static void IsEmpty(string aString)
+        {
+            Assert.That(aString, new EmptyStringConstraint() ,null, null);
+        }
+        
+        #endregion
+        
+        #region IsEmpty
+        
+        /// <summary>
+        /// Assert that an array, list or other collection is empty
+        /// </summary>
+        /// <param name="collection">An array, list or other collection implementing ICollection</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsEmpty(ICollection collection, string message, params object[] args)
+        {
+            Assert.That(collection, new EmptyCollectionConstraint() ,message, args);
+        }
+        
+        /// <summary>
+        /// Assert that an array, list or other collection is empty
+        /// </summary>
+        /// <param name="collection">An array, list or other collection implementing ICollection</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsEmpty(ICollection collection, string message)
+        {
+            Assert.That(collection, new EmptyCollectionConstraint() ,message, null);
+        }
+        
+        /// <summary>
+        /// Assert that an array, list or other collection is empty
+        /// </summary>
+        /// <param name="collection">An array, list or other collection implementing ICollection</param>
+        public static void IsEmpty(ICollection collection)
+        {
+            Assert.That(collection, new EmptyCollectionConstraint() ,null, null);
+        }
+        
+        #endregion
+        
+        #region IsNotEmpty
+        
+        /// <summary>
+        /// Assert that a string is not empty - that is not equal to string.Empty
+        /// </summary>
+        /// <param name="aString">The string to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsNotEmpty(string aString, string message, params object[] args)
+        {
+            Assert.That(aString, Is.Not.Empty ,message, args);
+        }
+        
+        /// <summary>
+        /// Assert that a string is not empty - that is not equal to string.Empty
+        /// </summary>
+        /// <param name="aString">The string to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsNotEmpty(string aString, string message)
+        {
+            Assert.That(aString, Is.Not.Empty ,message, null);
+        }
+        
+        /// <summary>
+        /// Assert that a string is not empty - that is not equal to string.Empty
+        /// </summary>
+        /// <param name="aString">The string to be tested</param>
+        public static void IsNotEmpty(string aString)
+        {
+            Assert.That(aString, Is.Not.Empty ,null, null);
+        }
+        
+        #endregion
+        
+        #region IsNotEmpty
+        
+        /// <summary>
+        /// Assert that an array, list or other collection is not empty
+        /// </summary>
+        /// <param name="collection">An array, list or other collection implementing ICollection</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsNotEmpty(ICollection collection, string message, params object[] args)
+        {
+            Assert.That(collection, Is.Not.Empty ,message, args);
+        }
+        
+        /// <summary>
+        /// Assert that an array, list or other collection is not empty
+        /// </summary>
+        /// <param name="collection">An array, list or other collection implementing ICollection</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsNotEmpty(ICollection collection, string message)
+        {
+            Assert.That(collection, Is.Not.Empty ,message, null);
+        }
+        
+        /// <summary>
+        /// Assert that an array, list or other collection is not empty
+        /// </summary>
+        /// <param name="collection">An array, list or other collection implementing ICollection</param>
+        public static void IsNotEmpty(ICollection collection)
+        {
+            Assert.That(collection, Is.Not.Empty ,null, null);
+        }
+        
+        #endregion
+        
+        #region IsNullOrEmpty
+        
+        /// <summary>
+        /// Assert that a string is either null or equal to string.Empty
+        /// </summary>
+        /// <param name="aString">The string to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsNullOrEmpty(string aString, string message, params object[] args)
+        {
+            Assert.That(aString, new NullOrEmptyStringConstraint() ,message, args);
+        }
+        
+        /// <summary>
+        /// Assert that a string is either null or equal to string.Empty
+        /// </summary>
+        /// <param name="aString">The string to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsNullOrEmpty(string aString, string message)
+        {
+            Assert.That(aString, new NullOrEmptyStringConstraint() ,message, null);
+        }
+        
+        /// <summary>
+        /// Assert that a string is either null or equal to string.Empty
+        /// </summary>
+        /// <param name="aString">The string to be tested</param>
+        public static void IsNullOrEmpty(string aString)
+        {
+            Assert.That(aString, new NullOrEmptyStringConstraint() ,null, null);
+        }
+        
+        #endregion
+        
+        #region IsNotNullOrEmpty
+        
+        /// <summary>
+        /// Assert that a string is not null or empty
+        /// </summary>
+        /// <param name="aString">The string to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsNotNullOrEmpty(string aString, string message, params object[] args)
+        {
+            Assert.That(aString, new NotConstraint( new NullOrEmptyStringConstraint()) ,message, args);
+        }
+        
+        /// <summary>
+        /// Assert that a string is not null or empty
+        /// </summary>
+        /// <param name="aString">The string to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsNotNullOrEmpty(string aString, string message)
+        {
+            Assert.That(aString, new NotConstraint( new NullOrEmptyStringConstraint()) ,message, null);
+        }
+        
+        /// <summary>
+        /// Assert that a string is not null or empty
+        /// </summary>
+        /// <param name="aString">The string to be tested</param>
+        public static void IsNotNullOrEmpty(string aString)
+        {
+            Assert.That(aString, new NotConstraint( new NullOrEmptyStringConstraint()) ,null, null);
+        }
+        
+        #endregion
+        
+        #region IsAssignableFrom
+        
+        /// <summary>
+        /// Asserts that an object may be assigned a  value of a given Type.
+        /// </summary>
+        /// <param name="expected">The expected Type.</param>
+        /// <param name="actual">The object under examination</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsAssignableFrom(Type expected, object actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.AssignableFrom(expected) ,message, args);
+        }
+        
+        /// <summary>
+        /// Asserts that an object may be assigned a  value of a given Type.
+        /// </summary>
+        /// <param name="expected">The expected Type.</param>
+        /// <param name="actual">The object under examination</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsAssignableFrom(Type expected, object actual, string message)
+        {
+            Assert.That(actual, Is.AssignableFrom(expected) ,message, null);
+        }
+        
+        /// <summary>
+        /// Asserts that an object may be assigned a  value of a given Type.
+        /// </summary>
+        /// <param name="expected">The expected Type.</param>
+        /// <param name="actual">The object under examination</param>
+        public static void IsAssignableFrom(Type expected, object actual)
+        {
+            Assert.That(actual, Is.AssignableFrom(expected) ,null, null);
+        }
+        
+        #endregion
+        
+        #region IsAssignableFrom<T>
+        
+#if NET_2_0
+        /// <summary>
+        /// Asserts that an object may be assigned a  value of a given Type.
+        /// </summary>
+        /// <typeparam name="T">The expected Type.</typeparam>
+        /// <param name="actual">The object under examination</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsAssignableFrom<T>(object actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.AssignableFrom(typeof(T)) ,message, args);
+        }
+        
+        /// <summary>
+        /// Asserts that an object may be assigned a  value of a given Type.
+        /// </summary>
+        /// <typeparam name="T">The expected Type.</typeparam>
+        /// <param name="actual">The object under examination</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsAssignableFrom<T>(object actual, string message)
+        {
+            Assert.That(actual, Is.AssignableFrom(typeof(T)) ,message, null);
+        }
+        
+        /// <summary>
+        /// Asserts that an object may be assigned a  value of a given Type.
+        /// </summary>
+        /// <typeparam name="T">The expected Type.</typeparam>
+        /// <param name="actual">The object under examination</param>
+        public static void IsAssignableFrom<T>(object actual)
+        {
+            Assert.That(actual, Is.AssignableFrom(typeof(T)) ,null, null);
+        }
+        
+#endif
+        #endregion
+        
+        #region IsNotAssignableFrom
+        
+        /// <summary>
+        /// Asserts that an object may not be assigned a  value of a given Type.
+        /// </summary>
+        /// <param name="expected">The expected Type.</param>
+        /// <param name="actual">The object under examination</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsNotAssignableFrom(Type expected, object actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.Not.AssignableFrom(expected) ,message, args);
+        }
+        
+        /// <summary>
+        /// Asserts that an object may not be assigned a  value of a given Type.
+        /// </summary>
+        /// <param name="expected">The expected Type.</param>
+        /// <param name="actual">The object under examination</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsNotAssignableFrom(Type expected, object actual, string message)
+        {
+            Assert.That(actual, Is.Not.AssignableFrom(expected) ,message, null);
+        }
+        
+        /// <summary>
+        /// Asserts that an object may not be assigned a  value of a given Type.
+        /// </summary>
+        /// <param name="expected">The expected Type.</param>
+        /// <param name="actual">The object under examination</param>
+        public static void IsNotAssignableFrom(Type expected, object actual)
+        {
+            Assert.That(actual, Is.Not.AssignableFrom(expected) ,null, null);
+        }
+        
+        #endregion
+        
+        #region IsNotAssignableFrom<T>
+        
+#if NET_2_0
+        /// <summary>
+        /// Asserts that an object may not be assigned a  value of a given Type.
+        /// </summary>
+        /// <typeparam name="T">The expected Type.</typeparam>
+        /// <param name="actual">The object under examination</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsNotAssignableFrom<T>(object actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.Not.AssignableFrom(typeof(T)) ,message, args);
+        }
+        
+        /// <summary>
+        /// Asserts that an object may not be assigned a  value of a given Type.
+        /// </summary>
+        /// <typeparam name="T">The expected Type.</typeparam>
+        /// <param name="actual">The object under examination</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsNotAssignableFrom<T>(object actual, string message)
+        {
+            Assert.That(actual, Is.Not.AssignableFrom(typeof(T)) ,message, null);
+        }
+        
+        /// <summary>
+        /// Asserts that an object may not be assigned a  value of a given Type.
+        /// </summary>
+        /// <typeparam name="T">The expected Type.</typeparam>
+        /// <param name="actual">The object under examination</param>
+        public static void IsNotAssignableFrom<T>(object actual)
+        {
+            Assert.That(actual, Is.Not.AssignableFrom(typeof(T)) ,null, null);
+        }
+        
+#endif
+        #endregion
+        
+        #region IsInstanceOf
+        
+        /// <summary>
+        /// Asserts that an object is an instance of a given type.
+        /// </summary>
+        /// <param name="expected">The expected Type</param>
+        /// <param name="actual">The object being examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsInstanceOf(Type expected, object actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.InstanceOf(expected) ,message, args);
+        }
+        
+        /// <summary>
+        /// Asserts that an object is an instance of a given type.
+        /// </summary>
+        /// <param name="expected">The expected Type</param>
+        /// <param name="actual">The object being examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsInstanceOf(Type expected, object actual, string message)
+        {
+            Assert.That(actual, Is.InstanceOf(expected) ,message, null);
+        }
+        
+        /// <summary>
+        /// Asserts that an object is an instance of a given type.
+        /// </summary>
+        /// <param name="expected">The expected Type</param>
+        /// <param name="actual">The object being examined</param>
+        public static void IsInstanceOf(Type expected, object actual)
+        {
+            Assert.That(actual, Is.InstanceOf(expected) ,null, null);
+        }
+        
+        /// <summary>
+        /// Asserts that an object is an instance of a given type.
+        /// </summary>
+        /// <param name="expected">The expected Type</param>
+        /// <param name="actual">The object being examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        [Obsolete]
+        public static void IsInstanceOfType(Type expected, object actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.InstanceOf(expected) ,message, args);
+        }
+        
+        /// <summary>
+        /// Asserts that an object is an instance of a given type.
+        /// </summary>
+        /// <param name="expected">The expected Type</param>
+        /// <param name="actual">The object being examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        [Obsolete]
+        public static void IsInstanceOfType(Type expected, object actual, string message)
+        {
+            Assert.That(actual, Is.InstanceOf(expected) ,message, null);
+        }
+        
+        /// <summary>
+        /// Asserts that an object is an instance of a given type.
+        /// </summary>
+        /// <param name="expected">The expected Type</param>
+        /// <param name="actual">The object being examined</param>
+        [Obsolete]
+        public static void IsInstanceOfType(Type expected, object actual)
+        {
+            Assert.That(actual, Is.InstanceOf(expected) ,null, null);
+        }
+        
+        #endregion
+        
+        #region IsInstanceOf<T>
+        
+#if NET_2_0
+        /// <summary>
+        /// Asserts that an object is an instance of a given type.
+        /// </summary>
+        /// <typeparam name="T">The expected Type</typeparam>
+        /// <param name="actual">The object being examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsInstanceOf<T>(object actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.InstanceOf(typeof(T)) ,message, args);
+        }
+        
+        /// <summary>
+        /// Asserts that an object is an instance of a given type.
+        /// </summary>
+        /// <typeparam name="T">The expected Type</typeparam>
+        /// <param name="actual">The object being examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsInstanceOf<T>(object actual, string message)
+        {
+            Assert.That(actual, Is.InstanceOf(typeof(T)) ,message, null);
+        }
+        
+        /// <summary>
+        /// Asserts that an object is an instance of a given type.
+        /// </summary>
+        /// <typeparam name="T">The expected Type</typeparam>
+        /// <param name="actual">The object being examined</param>
+        public static void IsInstanceOf<T>(object actual)
+        {
+            Assert.That(actual, Is.InstanceOf(typeof(T)) ,null, null);
+        }
+        
+#endif
+        #endregion
+        
+        #region IsNotInstanceOf
+        
+        /// <summary>
+        /// Asserts that an object is not an instance of a given type.
+        /// </summary>
+        /// <param name="expected">The expected Type</param>
+        /// <param name="actual">The object being examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsNotInstanceOf(Type expected, object actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.Not.InstanceOf(expected) ,message, args);
+        }
+        
+        /// <summary>
+        /// Asserts that an object is not an instance of a given type.
+        /// </summary>
+        /// <param name="expected">The expected Type</param>
+        /// <param name="actual">The object being examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsNotInstanceOf(Type expected, object actual, string message)
+        {
+            Assert.That(actual, Is.Not.InstanceOf(expected) ,message, null);
+        }
+        
+        /// <summary>
+        /// Asserts that an object is not an instance of a given type.
+        /// </summary>
+        /// <param name="expected">The expected Type</param>
+        /// <param name="actual">The object being examined</param>
+        public static void IsNotInstanceOf(Type expected, object actual)
+        {
+            Assert.That(actual, Is.Not.InstanceOf(expected) ,null, null);
+        }
+        
+        /// <summary>
+        /// Asserts that an object is not an instance of a given type.
+        /// </summary>
+        /// <param name="expected">The expected Type</param>
+        /// <param name="actual">The object being examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        [Obsolete]
+        public static void IsNotInstanceOfType(Type expected, object actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.Not.InstanceOf(expected) ,message, args);
+        }
+        
+        /// <summary>
+        /// Asserts that an object is not an instance of a given type.
+        /// </summary>
+        /// <param name="expected">The expected Type</param>
+        /// <param name="actual">The object being examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        [Obsolete]
+        public static void IsNotInstanceOfType(Type expected, object actual, string message)
+        {
+            Assert.That(actual, Is.Not.InstanceOf(expected) ,message, null);
+        }
+        
+        /// <summary>
+        /// Asserts that an object is not an instance of a given type.
+        /// </summary>
+        /// <param name="expected">The expected Type</param>
+        /// <param name="actual">The object being examined</param>
+        [Obsolete]
+        public static void IsNotInstanceOfType(Type expected, object actual)
+        {
+            Assert.That(actual, Is.Not.InstanceOf(expected) ,null, null);
+        }
+        
+        #endregion
+        
+        #region IsNotInstanceOf<T>
+        
+#if NET_2_0
+        /// <summary>
+        /// Asserts that an object is not an instance of a given type.
+        /// </summary>
+        /// <typeparam name="T">The expected Type</typeparam>
+        /// <param name="actual">The object being examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsNotInstanceOf<T>(object actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.Not.InstanceOf(typeof(T)) ,message, args);
+        }
+        
+        /// <summary>
+        /// Asserts that an object is not an instance of a given type.
+        /// </summary>
+        /// <typeparam name="T">The expected Type</typeparam>
+        /// <param name="actual">The object being examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsNotInstanceOf<T>(object actual, string message)
+        {
+            Assert.That(actual, Is.Not.InstanceOf(typeof(T)) ,message, null);
+        }
+        
+        /// <summary>
+        /// Asserts that an object is not an instance of a given type.
+        /// </summary>
+        /// <typeparam name="T">The expected Type</typeparam>
+        /// <param name="actual">The object being examined</param>
+        public static void IsNotInstanceOf<T>(object actual)
+        {
+            Assert.That(actual, Is.Not.InstanceOf(typeof(T)) ,null, null);
+        }
+        
+#endif
+        #endregion
+        
+        #region AreEqual
+        
+        /// <summary>
+        /// Verifies that two values are equal. If they are not, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void AreEqual(int expected, int actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.EqualTo(expected) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that two values are equal. If they are not, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void AreEqual(int expected, int actual, string message)
+        {
+            Assert.That(actual, Is.EqualTo(expected) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that two values are equal. If they are not, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        public static void AreEqual(int expected, int actual)
+        {
+            Assert.That(actual, Is.EqualTo(expected) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that two values are equal. If they are not, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void AreEqual(long expected, long actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.EqualTo(expected) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that two values are equal. If they are not, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void AreEqual(long expected, long actual, string message)
+        {
+            Assert.That(actual, Is.EqualTo(expected) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that two values are equal. If they are not, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        public static void AreEqual(long expected, long actual)
+        {
+            Assert.That(actual, Is.EqualTo(expected) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that two values are equal. If they are not, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        [CLSCompliant(false)]
+        public static void AreEqual(uint expected, uint actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.EqualTo(expected) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that two values are equal. If they are not, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        [CLSCompliant(false)]
+        public static void AreEqual(uint expected, uint actual, string message)
+        {
+            Assert.That(actual, Is.EqualTo(expected) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that two values are equal. If they are not, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        [CLSCompliant(false)]
+        public static void AreEqual(uint expected, uint actual)
+        {
+            Assert.That(actual, Is.EqualTo(expected) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that two values are equal. If they are not, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        [CLSCompliant(false)]
+        public static void AreEqual(ulong expected, ulong actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.EqualTo(expected) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that two values are equal. If they are not, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        [CLSCompliant(false)]
+        public static void AreEqual(ulong expected, ulong actual, string message)
+        {
+            Assert.That(actual, Is.EqualTo(expected) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that two values are equal. If they are not, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        [CLSCompliant(false)]
+        public static void AreEqual(ulong expected, ulong actual)
+        {
+            Assert.That(actual, Is.EqualTo(expected) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that two values are equal. If they are not, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void AreEqual(decimal expected, decimal actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.EqualTo(expected) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that two values are equal. If they are not, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void AreEqual(decimal expected, decimal actual, string message)
+        {
+            Assert.That(actual, Is.EqualTo(expected) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that two values are equal. If they are not, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        public static void AreEqual(decimal expected, decimal actual)
+        {
+            Assert.That(actual, Is.EqualTo(expected) ,null, null);
+        }
+        
+        #endregion
+        
+        #region AreEqual
+        
+        /// <summary>
+        /// Verifies that two doubles are equal considering a delta. If the
+        /// expected value is infinity then the delta value is ignored. If 
+        /// they are not equal then an <see cref="AssertionException"/> is
+        /// thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="delta">The maximum acceptable difference between the
+        /// the expected and the actual</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void AreEqual(double expected, double actual, double delta, string message, params object[] args)
+        {
+            AssertDoublesAreEqual(expected, actual, delta ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that two doubles are equal considering a delta. If the
+        /// expected value is infinity then the delta value is ignored. If 
+        /// they are not equal then an <see cref="AssertionException"/> is
+        /// thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="delta">The maximum acceptable difference between the
+        /// the expected and the actual</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void AreEqual(double expected, double actual, double delta, string message)
+        {
+            AssertDoublesAreEqual(expected, actual, delta ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that two doubles are equal considering a delta. If the
+        /// expected value is infinity then the delta value is ignored. If 
+        /// they are not equal then an <see cref="AssertionException"/> is
+        /// thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="delta">The maximum acceptable difference between the
+        /// the expected and the actual</param>
+        public static void AreEqual(double expected, double actual, double delta)
+        {
+            AssertDoublesAreEqual(expected, actual, delta ,null, null);
+        }
+        
+#if NET_2_0
+        /// <summary>
+        /// Verifies that two doubles are equal considering a delta. If the
+        /// expected value is infinity then the delta value is ignored. If 
+        /// they are not equal then an <see cref="AssertionException"/> is
+        /// thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="delta">The maximum acceptable difference between the
+        /// the expected and the actual</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void AreEqual(double expected, double? actual, double delta, string message, params object[] args)
+        {
+            AssertDoublesAreEqual(expected, (double)actual, delta ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that two doubles are equal considering a delta. If the
+        /// expected value is infinity then the delta value is ignored. If 
+        /// they are not equal then an <see cref="AssertionException"/> is
+        /// thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="delta">The maximum acceptable difference between the
+        /// the expected and the actual</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void AreEqual(double expected, double? actual, double delta, string message)
+        {
+            AssertDoublesAreEqual(expected, (double)actual, delta ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that two doubles are equal considering a delta. If the
+        /// expected value is infinity then the delta value is ignored. If 
+        /// they are not equal then an <see cref="AssertionException"/> is
+        /// thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="delta">The maximum acceptable difference between the
+        /// the expected and the actual</param>
+        public static void AreEqual(double expected, double? actual, double delta)
+        {
+            AssertDoublesAreEqual(expected, (double)actual, delta ,null, null);
+        }
+        
+#endif
+        #endregion
+        
+        #region AreEqual
+        
+        /// <summary>
+        /// Verifies that two objects are equal.  Two objects are considered
+        /// equal if both are null, or if both have the same value. NUnit
+        /// has special semantics for some object types.
+        /// If they are not equal an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The value that is expected</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void AreEqual(object expected, object actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.EqualTo(expected) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that two objects are equal.  Two objects are considered
+        /// equal if both are null, or if both have the same value. NUnit
+        /// has special semantics for some object types.
+        /// If they are not equal an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The value that is expected</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void AreEqual(object expected, object actual, string message)
+        {
+            Assert.That(actual, Is.EqualTo(expected) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that two objects are equal.  Two objects are considered
+        /// equal if both are null, or if both have the same value. NUnit
+        /// has special semantics for some object types.
+        /// If they are not equal an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The value that is expected</param>
+        /// <param name="actual">The actual value</param>
+        public static void AreEqual(object expected, object actual)
+        {
+            Assert.That(actual, Is.EqualTo(expected) ,null, null);
+        }
+        
+        #endregion
+        
+        #region AreNotEqual
+        
+        /// <summary>
+        /// Verifies that two values are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void AreNotEqual(int expected, int actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that two values are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void AreNotEqual(int expected, int actual, string message)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that two values are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        public static void AreNotEqual(int expected, int actual)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that two values are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void AreNotEqual(long expected, long actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that two values are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void AreNotEqual(long expected, long actual, string message)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that two values are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        public static void AreNotEqual(long expected, long actual)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that two values are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        [CLSCompliant(false)]
+        public static void AreNotEqual(uint expected, uint actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that two values are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        [CLSCompliant(false)]
+        public static void AreNotEqual(uint expected, uint actual, string message)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that two values are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        [CLSCompliant(false)]
+        public static void AreNotEqual(uint expected, uint actual)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that two values are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        [CLSCompliant(false)]
+        public static void AreNotEqual(ulong expected, ulong actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that two values are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        [CLSCompliant(false)]
+        public static void AreNotEqual(ulong expected, ulong actual, string message)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that two values are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        [CLSCompliant(false)]
+        public static void AreNotEqual(ulong expected, ulong actual)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that two values are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void AreNotEqual(decimal expected, decimal actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that two values are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void AreNotEqual(decimal expected, decimal actual, string message)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that two values are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        public static void AreNotEqual(decimal expected, decimal actual)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that two values are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void AreNotEqual(float expected, float actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that two values are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void AreNotEqual(float expected, float actual, string message)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that two values are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        public static void AreNotEqual(float expected, float actual)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that two values are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void AreNotEqual(double expected, double actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that two values are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void AreNotEqual(double expected, double actual, string message)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that two values are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        public static void AreNotEqual(double expected, double actual)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected) ,null, null);
+        }
+        
+        #endregion
+        
+        #region AreNotEqual
+        
+        /// <summary>
+        /// Verifies that two objects are not equal.  Two objects are considered
+        /// equal if both are null, or if both have the same value. NUnit
+        /// has special semantics for some object types.
+        /// If they are equal an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The value that is expected</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void AreNotEqual(object expected, object actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that two objects are not equal.  Two objects are considered
+        /// equal if both are null, or if both have the same value. NUnit
+        /// has special semantics for some object types.
+        /// If they are equal an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The value that is expected</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void AreNotEqual(object expected, object actual, string message)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that two objects are not equal.  Two objects are considered
+        /// equal if both are null, or if both have the same value. NUnit
+        /// has special semantics for some object types.
+        /// If they are equal an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The value that is expected</param>
+        /// <param name="actual">The actual value</param>
+        public static void AreNotEqual(object expected, object actual)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected) ,null, null);
+        }
+        
+        #endregion
+        
+        #region AreSame
+        
+        /// <summary>
+        /// Asserts that two objects refer to the same object. If they
+        /// are not the same an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected object</param>
+        /// <param name="actual">The actual object</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void AreSame(object expected, object actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.SameAs(expected) ,message, args);
+        }
+        
+        /// <summary>
+        /// Asserts that two objects refer to the same object. If they
+        /// are not the same an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected object</param>
+        /// <param name="actual">The actual object</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void AreSame(object expected, object actual, string message)
+        {
+            Assert.That(actual, Is.SameAs(expected) ,message, null);
+        }
+        
+        /// <summary>
+        /// Asserts that two objects refer to the same object. If they
+        /// are not the same an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected object</param>
+        /// <param name="actual">The actual object</param>
+        public static void AreSame(object expected, object actual)
+        {
+            Assert.That(actual, Is.SameAs(expected) ,null, null);
+        }
+        
+        #endregion
+        
+        #region AreNotSame
+        
+        /// <summary>
+        /// Asserts that two objects do not refer to the same object. If they
+        /// are the same an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected object</param>
+        /// <param name="actual">The actual object</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void AreNotSame(object expected, object actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.Not.SameAs(expected) ,message, args);
+        }
+        
+        /// <summary>
+        /// Asserts that two objects do not refer to the same object. If they
+        /// are the same an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected object</param>
+        /// <param name="actual">The actual object</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void AreNotSame(object expected, object actual, string message)
+        {
+            Assert.That(actual, Is.Not.SameAs(expected) ,message, null);
+        }
+        
+        /// <summary>
+        /// Asserts that two objects do not refer to the same object. If they
+        /// are the same an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected object</param>
+        /// <param name="actual">The actual object</param>
+        public static void AreNotSame(object expected, object actual)
+        {
+            Assert.That(actual, Is.Not.SameAs(expected) ,null, null);
+        }
+        
+        #endregion
+        
+        #region Greater
+        
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void Greater(int arg1, int arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void Greater(int arg1, int arg2, string message)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        public static void Greater(int arg1, int arg2)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        [CLSCompliant(false)]
+        public static void Greater(uint arg1, uint arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        [CLSCompliant(false)]
+        public static void Greater(uint arg1, uint arg2, string message)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        [CLSCompliant(false)]
+        public static void Greater(uint arg1, uint arg2)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void Greater(long arg1, long arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void Greater(long arg1, long arg2, string message)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        public static void Greater(long arg1, long arg2)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        [CLSCompliant(false)]
+        public static void Greater(ulong arg1, ulong arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        [CLSCompliant(false)]
+        public static void Greater(ulong arg1, ulong arg2, string message)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        [CLSCompliant(false)]
+        public static void Greater(ulong arg1, ulong arg2)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void Greater(decimal arg1, decimal arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void Greater(decimal arg1, decimal arg2, string message)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        public static void Greater(decimal arg1, decimal arg2)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void Greater(double arg1, double arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void Greater(double arg1, double arg2, string message)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        public static void Greater(double arg1, double arg2)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void Greater(float arg1, float arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void Greater(float arg1, float arg2, string message)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        public static void Greater(float arg1, float arg2)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void Greater(IComparable arg1, IComparable arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void Greater(IComparable arg1, IComparable arg2, string message)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        public static void Greater(IComparable arg1, IComparable arg2)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2) ,null, null);
+        }
+        
+        #endregion
+        
+        #region Less
+        
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void Less(int arg1, int arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.LessThan(arg2) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void Less(int arg1, int arg2, string message)
+        {
+            Assert.That(arg1, Is.LessThan(arg2) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        public static void Less(int arg1, int arg2)
+        {
+            Assert.That(arg1, Is.LessThan(arg2) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        [CLSCompliant(false)]
+        public static void Less(uint arg1, uint arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.LessThan(arg2) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        [CLSCompliant(false)]
+        public static void Less(uint arg1, uint arg2, string message)
+        {
+            Assert.That(arg1, Is.LessThan(arg2) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        [CLSCompliant(false)]
+        public static void Less(uint arg1, uint arg2)
+        {
+            Assert.That(arg1, Is.LessThan(arg2) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void Less(long arg1, long arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.LessThan(arg2) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void Less(long arg1, long arg2, string message)
+        {
+            Assert.That(arg1, Is.LessThan(arg2) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        public static void Less(long arg1, long arg2)
+        {
+            Assert.That(arg1, Is.LessThan(arg2) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        [CLSCompliant(false)]
+        public static void Less(ulong arg1, ulong arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.LessThan(arg2) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        [CLSCompliant(false)]
+        public static void Less(ulong arg1, ulong arg2, string message)
+        {
+            Assert.That(arg1, Is.LessThan(arg2) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        [CLSCompliant(false)]
+        public static void Less(ulong arg1, ulong arg2)
+        {
+            Assert.That(arg1, Is.LessThan(arg2) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void Less(decimal arg1, decimal arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.LessThan(arg2) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void Less(decimal arg1, decimal arg2, string message)
+        {
+            Assert.That(arg1, Is.LessThan(arg2) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        public static void Less(decimal arg1, decimal arg2)
+        {
+            Assert.That(arg1, Is.LessThan(arg2) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void Less(double arg1, double arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.LessThan(arg2) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void Less(double arg1, double arg2, string message)
+        {
+            Assert.That(arg1, Is.LessThan(arg2) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        public static void Less(double arg1, double arg2)
+        {
+            Assert.That(arg1, Is.LessThan(arg2) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void Less(float arg1, float arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.LessThan(arg2) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void Less(float arg1, float arg2, string message)
+        {
+            Assert.That(arg1, Is.LessThan(arg2) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        public static void Less(float arg1, float arg2)
+        {
+            Assert.That(arg1, Is.LessThan(arg2) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void Less(IComparable arg1, IComparable arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.LessThan(arg2) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void Less(IComparable arg1, IComparable arg2, string message)
+        {
+            Assert.That(arg1, Is.LessThan(arg2) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        public static void Less(IComparable arg1, IComparable arg2)
+        {
+            Assert.That(arg1, Is.LessThan(arg2) ,null, null);
+        }
+        
+        #endregion
+        
+        #region GreaterOrEqual
+        
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void GreaterOrEqual(int arg1, int arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void GreaterOrEqual(int arg1, int arg2, string message)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        public static void GreaterOrEqual(int arg1, int arg2)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        [CLSCompliant(false)]
+        public static void GreaterOrEqual(uint arg1, uint arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        [CLSCompliant(false)]
+        public static void GreaterOrEqual(uint arg1, uint arg2, string message)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        [CLSCompliant(false)]
+        public static void GreaterOrEqual(uint arg1, uint arg2)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void GreaterOrEqual(long arg1, long arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void GreaterOrEqual(long arg1, long arg2, string message)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        public static void GreaterOrEqual(long arg1, long arg2)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        [CLSCompliant(false)]
+        public static void GreaterOrEqual(ulong arg1, ulong arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        [CLSCompliant(false)]
+        public static void GreaterOrEqual(ulong arg1, ulong arg2, string message)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        [CLSCompliant(false)]
+        public static void GreaterOrEqual(ulong arg1, ulong arg2)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void GreaterOrEqual(decimal arg1, decimal arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void GreaterOrEqual(decimal arg1, decimal arg2, string message)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        public static void GreaterOrEqual(decimal arg1, decimal arg2)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void GreaterOrEqual(double arg1, double arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void GreaterOrEqual(double arg1, double arg2, string message)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        public static void GreaterOrEqual(double arg1, double arg2)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void GreaterOrEqual(float arg1, float arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void GreaterOrEqual(float arg1, float arg2, string message)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        public static void GreaterOrEqual(float arg1, float arg2)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void GreaterOrEqual(IComparable arg1, IComparable arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void GreaterOrEqual(IComparable arg1, IComparable arg2, string message)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        public static void GreaterOrEqual(IComparable arg1, IComparable arg2)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2) ,null, null);
+        }
+        
+        #endregion
+        
+        #region LessOrEqual
+        
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void LessOrEqual(int arg1, int arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void LessOrEqual(int arg1, int arg2, string message)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        public static void LessOrEqual(int arg1, int arg2)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        [CLSCompliant(false)]
+        public static void LessOrEqual(uint arg1, uint arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        [CLSCompliant(false)]
+        public static void LessOrEqual(uint arg1, uint arg2, string message)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        [CLSCompliant(false)]
+        public static void LessOrEqual(uint arg1, uint arg2)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void LessOrEqual(long arg1, long arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void LessOrEqual(long arg1, long arg2, string message)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        public static void LessOrEqual(long arg1, long arg2)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        [CLSCompliant(false)]
+        public static void LessOrEqual(ulong arg1, ulong arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        [CLSCompliant(false)]
+        public static void LessOrEqual(ulong arg1, ulong arg2, string message)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        [CLSCompliant(false)]
+        public static void LessOrEqual(ulong arg1, ulong arg2)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void LessOrEqual(decimal arg1, decimal arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void LessOrEqual(decimal arg1, decimal arg2, string message)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        public static void LessOrEqual(decimal arg1, decimal arg2)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void LessOrEqual(double arg1, double arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void LessOrEqual(double arg1, double arg2, string message)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        public static void LessOrEqual(double arg1, double arg2)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void LessOrEqual(float arg1, float arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void LessOrEqual(float arg1, float arg2, string message)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        public static void LessOrEqual(float arg1, float arg2)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2) ,null, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void LessOrEqual(IComparable arg1, IComparable arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2) ,message, args);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void LessOrEqual(IComparable arg1, IComparable arg2, string message)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2) ,message, null);
+        }
+        
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        public static void LessOrEqual(IComparable arg1, IComparable arg2)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2) ,null, null);
+        }
+        
+        #endregion
+        
+        #region Contains
+        
+        /// <summary>
+        /// Asserts that an object is contained in a list.
+        /// </summary>
+        /// <param name="expected">The expected object</param>
+        /// <param name="actual">The list to be examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void Contains(object expected, ICollection actual, string message, params object[] args)
+        {
+            Assert.That(actual, new CollectionContainsConstraint(expected) ,message, args);
+        }
+        
+        /// <summary>
+        /// Asserts that an object is contained in a list.
+        /// </summary>
+        /// <param name="expected">The expected object</param>
+        /// <param name="actual">The list to be examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void Contains(object expected, ICollection actual, string message)
+        {
+            Assert.That(actual, new CollectionContainsConstraint(expected) ,message, null);
+        }
+        
+        /// <summary>
+        /// Asserts that an object is contained in a list.
+        /// </summary>
+        /// <param name="expected">The expected object</param>
+        /// <param name="actual">The list to be examined</param>
+        public static void Contains(object expected, ICollection actual)
+        {
+            Assert.That(actual, new CollectionContainsConstraint(expected) ,null, null);
+        }
+        
         #endregion
-	}
+        
+    }
 }
diff --git a/src/NUnitFramework/framework/Assertion.cs b/src/NUnitFramework/framework/Assertion.cs
deleted file mode 100644
index a561fdd..0000000
--- a/src/NUnitFramework/framework/Assertion.cs
+++ /dev/null
@@ -1,169 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-namespace NUnit.Framework 
-{
-	using System;
-
-	/// <summary>
-	/// The Assertion class is obsolete and has been
-	/// replaced by the Assert class.
-	/// </summary>
-	[Obsolete("Use Assert class instead")]
-	public class Assertion
-	{
-		/// <summary>
-		/// Asserts that a condition is true. If it isn't it throws
-		/// an <see cref="AssertionException"/>.
-		/// </summary>
-		/// <param name="message">The message to display is the condition
-		/// is false</param>
-		/// <param name="condition">The evaluated condition</param>
-		static public void Assert(string message, bool condition) 
-		{
-			NUnit.Framework.Assert.IsTrue(condition, message);
-		}
-    
-		/// <summary>
-		/// Asserts that a condition is true. If it isn't it throws
-		/// an <see cref="AssertionException"/>.
-		/// </summary>
-		/// <param name="condition">The evaluated condition</param>
-		static public void Assert(bool condition) 
-		{
-			Assertion.Assert(string.Empty, condition);
-		}
-
-		/// <summary>
-		/// /// Asserts that two doubles are equal concerning a delta. If the
-		/// expected value is infinity then the delta value is ignored.
-		/// </summary>
-		/// <param name="expected">The expected value</param>
-		/// <param name="actual">The actual value</param>
-		/// <param name="delta">The maximum acceptable difference between the
-		/// the expected and the actual</param>
-		static public void AssertEquals(double expected, double actual, double delta) 
-		{
-			Assertion.AssertEquals(string.Empty, expected, actual, delta);
-		}
-		/// <summary>
-		/// /// Asserts that two singles are equal concerning a delta. If the
-		/// expected value is infinity then the delta value is ignored.
-		/// </summary>
-		/// <param name="expected">The expected value</param>
-		/// <param name="actual">The actual value</param>
-		/// <param name="delta">The maximum acceptable difference between the
-		/// the expected and the actual</param>
-		static public void AssertEquals(float expected, float actual, float delta) 
-		{
-			Assertion.AssertEquals(string.Empty, expected, actual, delta);
-		}
-
-		/// <summary>Asserts that two objects are equal. If they are not
-		/// an <see cref="AssertionException"/> is thrown.</summary>
-		static public void AssertEquals(Object expected, Object actual) 
-		{
-			Assertion.AssertEquals(string.Empty, expected, actual);
-		}
-
-		/// <summary>Asserts that two ints are equal. If they are not
-		/// an <see cref="AssertionException"/> is thrown.</summary>
-		static public void AssertEquals(int expected, int actual) 
-		{
-			Assertion.AssertEquals(string.Empty, expected, actual);
-		}
-
-		/// <summary>Asserts that two ints are equal. If they are not
-		/// an <see cref="AssertionException"/> is thrown.</summary>
-		static public void AssertEquals(string message, int expected, int actual) 
-		{
-			NUnit.Framework.Assert.AreEqual(expected, actual, message);
-		}
-		
-		/// <summary>Asserts that two doubles are equal concerning a delta.
-		/// If the expected value is infinity then the delta value is ignored.
-		/// </summary>
-		static public void AssertEquals(string message, double expected, 
-			double actual, double delta) 
-		{
-			NUnit.Framework.Assert.AreEqual(expected, actual, delta, message);
-		}
-		
-		/// <summary>Asserts that two floats are equal concerning a delta.
-		/// If the expected value is infinity then the delta value is ignored.
-		/// </summary>
-		static public void AssertEquals(string message, float expected, 
-			float actual, float delta) 
-		{
-			NUnit.Framework.Assert.AreEqual(expected, actual, delta, message);
-		}
-
-		/// <summary>
-		/// Asserts that two objects are equal.  Two objects are considered
-		/// equal if both are null, or if both have the same value.  Numeric
-		/// types are compared via string comparision on their contents to
-		/// avoid problems comparing values between different types.  All
-		/// non-numeric types are compared by using the <c>Equals</c> method.
-		/// If they are not equal an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		static public void AssertEquals(string message, Object expected, Object actual)
-		{
-			NUnit.Framework.Assert.AreEqual(expected, actual, message);
-		}
-    
-		/// <summary>Asserts that an object isn't null.</summary>
-		static public void AssertNotNull(Object anObject) 
-		{
-			NUnit.Framework.Assert.IsNotNull(anObject, string.Empty);
-		}
-    
-		/// <summary>Asserts that an object isn't null.</summary>
-		static public void AssertNotNull(string message, Object anObject) 
-		{
-			NUnit.Framework.Assert.IsNotNull(anObject, message);
-		}
-    
-		/// <summary>Asserts that an object is null.</summary>
-		static public void AssertNull(Object anObject) 
-		{
-			NUnit.Framework.Assert.IsNull(anObject, string.Empty);
-		}
-    
-		/// <summary>Asserts that an object is null.</summary>
-		static public void AssertNull(string message, Object anObject) 
-		{
-			NUnit.Framework.Assert.IsNull(anObject, message);
-		}
-    
-		/// <summary>Asserts that two objects refer to the same object. If they
-		/// are not the same an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		static public void AssertSame(Object expected, Object actual) 
-		{
-			NUnit.Framework.Assert.AreSame(expected, actual, string.Empty);
-		}
-    
-		/// <summary>Asserts that two objects refer to the same object. 
-		/// If they are not an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		static public void AssertSame(string message, Object expected, Object actual)
-		{
-			NUnit.Framework.Assert.AreSame(expected, actual, message);
-		}
-    
-		/// <summary>Fails a test with no message.</summary>
-		static public void Fail() 
-		{
-			NUnit.Framework.Assert.Fail();
-		}
-    
-		/// <summary>Fails a test with the given message.</summary>
-		static public void Fail(string message) 
-		{
-			NUnit.Framework.Assert.Fail(message);
-		}
-	}
-}
diff --git a/src/NUnitFramework/framework/AssertionException.cs b/src/NUnitFramework/framework/AssertionException.cs
deleted file mode 100644
index 26baa1c..0000000
--- a/src/NUnitFramework/framework/AssertionException.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-namespace NUnit.Framework 
-{
-	using System;
-	using System.Runtime.Serialization;
-	
-	/// <summary>
-	/// Thrown when an assertion failed.
-	/// </summary>
-	/// 
-	[Serializable]
-	public class AssertionException : System.Exception
-	{
-		/// <param name="message">The error message that explains 
-		/// the reason for the exception</param>
-		public AssertionException (string message) : base(message) 
-		{}
-
-		/// <param name="message">The error message that explains 
-		/// the reason for the exception</param>
-		/// <param name="inner">The exception that caused the 
-		/// current exception</param>
-		public AssertionException(string message, Exception inner) :
-			base(message, inner) 
-		{}
-
-		/// <summary>
-		/// Serialization Constructor
-		/// </summary>
-		protected AssertionException(SerializationInfo info, 
-			StreamingContext context) : base(info,context)
-		{}
-
-	}
-}
diff --git a/src/NUnitFramework/framework/AssertionFailureMessage.cs b/src/NUnitFramework/framework/AssertionFailureMessage.cs
deleted file mode 100644
index db07dc2..0000000
--- a/src/NUnitFramework/framework/AssertionFailureMessage.cs
+++ /dev/null
@@ -1,533 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-using System;
-using System.Text;
-using System.IO;
-using System.Collections;
-
-namespace NUnit.Framework
-{
-	/// <summary>
-	/// AssertionFailureMessage encapsulates a failure message
-	/// issued as a result of an Assert failure.
-	/// </summary>
-	[Obsolete( "Use MessageWriter for new work" )]
-	public class AssertionFailureMessage : StringWriter
-	{
-		#region Static Constants
-
-		/// <summary>
-		/// Number of characters before a highlighted position before
-		/// clipping will occur.  Clipped text is replaced with an
-		/// elipsis "..."
-		/// </summary>
-		static public readonly int PreClipLength = 35;
-
-		/// <summary>
-		/// Number of characters after a highlighted position before
-		/// clipping will occur.  Clipped text is replaced with an
-		/// elipsis "..."
-		/// </summary>
-		static public readonly int PostClipLength = 35;
-
-		/// <summary>
-		/// Prefix used to start an expected value line.
-		/// Must be same length as actualPrefix.
-		/// </summary>
-		static protected readonly string expectedPrefix = "expected:";
-		
-		/// <summary>
-		/// Prefix used to start an actual value line.
-		/// Must be same length as expectedPrefix.
-		/// </summary>
-		static protected readonly string actualPrefix   = " but was:";
-
-		static private readonly string expectedAndActualFmt = "\t{0} {1}";
-		static private readonly string diffStringLengthsFmt 
-			= "\tString lengths differ.  Expected length={0}, but was length={1}.";
-		static private readonly string sameStringLengthsFmt
-			= "\tString lengths are both {0}.";
-		static private readonly string diffArrayLengthsFmt
-			= "Array lengths differ.  Expected length={0}, but was length={1}.";
-		static private readonly string sameArrayLengthsFmt
-			= "Array lengths are both {0}.";
-		static private readonly string stringsDifferAtIndexFmt
-			= "\tStrings differ at index {0}.";
-		static private readonly string arraysDifferAtIndexFmt
-			= "Arrays differ at index {0}.";
-
-		#endregion
-
-		#region Constructors
-
-		/// <summary>
-		/// Construct an AssertionFailureMessage with a message
-		/// and optional arguments.
-		/// </summary>
-		/// <param name="message"></param>
-		/// <param name="args"></param>
-		public AssertionFailureMessage( string message, params object[] args )
-		{
-			if ( message != null && message != string.Empty )
-				if ( args != null )
-					WriteLine( message, args );
-				else
-					WriteLine( message );
-		}
-
-		/// <summary>
-		/// Construct an empty AssertionFailureMessage
-		/// </summary>
-		public AssertionFailureMessage() : this( null, null ) { }
-
-		#endregion
-
-		/// <summary>
-		/// Add an expected value line to the message containing
-		/// the text provided as an argument.
-		/// </summary>
-		/// <param name="text">Text describing what was expected.</param>
-		public void WriteExpectedLine( string text )
-		{
-			WriteLine( string.Format( expectedAndActualFmt, expectedPrefix, text ) );
-		}
-
-		/// <summary>
-		/// Add an actual value line to the message containing
-		/// the text provided as an argument.
-		/// </summary>
-		/// <param name="text">Text describing the actual value.</param>
-		public void WriteActualLine( string text )
-		{
-			WriteLine( string.Format( expectedAndActualFmt, actualPrefix, text ) );
-		}
-
-		/// <summary>
-		/// Add an expected value line to the message containing
-		/// a string representation of the object provided.
-		/// </summary>
-		/// <param name="expected">An object representing the expected value</param>
-		public void DisplayExpectedValue( object expected )
-		{
-			WriteExpectedLine( FormatObjectForDisplay( expected ) );
-		}
-
-		/// <summary>
-		/// Add an expected value line to the message containing a double
-		/// and the tolerance used in making the comparison.
-		/// </summary>
-		/// <param name="expected">The expected value</param>
-		/// <param name="tolerance">The tolerance specified in the Assert</param>
-		public void DisplayExpectedValue( double expected, double tolerance )
-		{
-			WriteExpectedLine( FormatObjectForDisplay( expected ) + " +/- " + tolerance.ToString() );
-		}
-
-		/// <summary>
-		/// Add an actual value line to the message containing
-		/// a string representation of the object provided.
-		/// </summary>
-		/// <param name="actual">An object representing what was actually found</param>
-		public void DisplayActualValue( object actual )
-		{
-			WriteActualLine( FormatObjectForDisplay( actual ) );
-		}
-
-		/// <summary>
-		/// Display two lines that communicate the expected value, and the actual value
-		/// </summary>
-		/// <param name="expected">The expected value</param>
-		/// <param name="actual">The actual value found</param>
-		public void DisplayExpectedAndActual( Object expected, Object actual )
-		{
-			DisplayExpectedValue( expected );
-			DisplayActualValue( actual );
-		}
-
-		/// <summary>
-		/// Display two lines that communicate the expected value, the actual value and
-		/// the tolerance used in comparing two doubles.
-		/// </summary>
-		/// <param name="expected">The expected value</param>
-		/// <param name="actual">The actual value found</param>
-		/// <param name="tolerance">The tolerance specified in the Assert</param>
-		public void DisplayExpectedAndActual( double expected, double actual, double tolerance )
-		{
-			DisplayExpectedValue( expected, tolerance );
-			DisplayActualValue( actual );
-		}
-
-		/// <summary>
-		/// Draws a marker under the expected/actual strings that highlights
-		/// where in the string a mismatch occurred.
-		/// </summary>
-		/// <param name="iPosition">The position of the mismatch</param>
-		public void DisplayPositionMarker( int iPosition )
-		{
-			WriteLine( "\t{0}^", new String( '-', expectedPrefix.Length + iPosition + 3 ) );
-		}
-
-		/// <summary>
-		/// Reports whether the string lengths are the same or different, and
-		/// what the string lengths are.
-		/// </summary>
-		/// <param name="sExpected">The expected string</param>
-		/// <param name="sActual">The actual string value</param>
-		protected void BuildStringLengthReport( string sExpected, string sActual )
-		{
-			if( sExpected.Length != sActual.Length )
-				WriteLine( diffStringLengthsFmt, sExpected.Length, sActual.Length );
-			else
-				WriteLine( sameStringLengthsFmt, sExpected.Length );
-		}
-
-		/// <summary>
-		/// Called to create additional message lines when two objects have been 
-		/// found to be unequal.  If the inputs are strings, a special message is
-		/// rendered that can help track down where the strings are different,
-		/// based on differences in length, or differences in content.
-		/// 
-		/// If the inputs are not strings, the ToString method of the objects
-		/// is used to show what is different about them.
-		/// </summary>
-		/// <param name="expected">The expected value</param>
-		/// <param name="actual">The actual value</param>
-		/// <param name="caseInsensitive">True if a case-insensitive comparison is being performed</param>
-		public void DisplayDifferences( object expected, object actual, bool caseInsensitive )
-		{
-			if( InputsAreStrings( expected, actual ) )
-			{
-				DisplayStringDifferences( 
-					(string)expected, 
-					(string)actual,
-					caseInsensitive );
-			}
-			else
-			{
-				DisplayExpectedAndActual( expected, actual );
-			}
-		}
-
-		/// <summary>
-		/// Called to create additional message lines when two doubles have been 
-		/// found to be unequal, within the specified tolerance.
-		/// </summary>
-		public void DisplayDifferencesWithTolerance( double expected, double actual, double tolerance )
-		{
-			DisplayExpectedAndActual( expected, actual, tolerance );
-		}
-
-		/// <summary>
-		/// Constructs a message that can be displayed when the content of two
-		/// strings are different, but the string lengths are the same.  The
-		/// message will clip the strings to a reasonable length, centered
-		/// around the first position where they are mismatched, and draw 
-		/// a line marking the position of the difference to make comparison
-		/// quicker.
-		/// </summary>
-		/// <param name="sExpected">The expected string value</param>
-		/// <param name="sActual">The actual string value</param>
-		/// <param name="caseInsensitive">True if a case-insensitive comparison is being performed</param>
-		protected void DisplayStringDifferences( string sExpected, string sActual, bool caseInsensitive )
-		{
-			//
-			// If they mismatch at a specified position, report the
-			// difference.
-			//
-			int iPosition = caseInsensitive
-				? FindMismatchPosition( sExpected.ToLower(), sActual.ToLower(), 0 )
-				: FindMismatchPosition( sExpected, sActual, 0 );
-			//
-			// If the lengths differ, but they match up to the length,
-			// show the difference just past the length of the shorter
-			// string
-			//
-			if( iPosition == -1 ) 
-				iPosition = Math.Min( sExpected.Length, sActual.Length );
-			
-			BuildStringLengthReport( sExpected, sActual );
-
-			WriteLine( stringsDifferAtIndexFmt, iPosition );
-
-			//
-			// Clips the strings, then turns any hidden whitespace into visible
-			// characters
-			//
-			string sClippedExpected = ConvertWhitespace(ClipAroundPosition( sExpected, iPosition ));
-			string sClippedActual   = ConvertWhitespace(ClipAroundPosition( sActual,   iPosition ));
-
-			DisplayExpectedAndActual( 
-				sClippedExpected, 
-				sClippedActual );
-
-			// Add a line showing where they differ.  If the string lengths are
-			// different, they start differing just past the length of the 
-			// shorter string
-			DisplayPositionMarker( caseInsensitive
-				? FindMismatchPosition( sClippedExpected.ToLower(), sClippedActual.ToLower(), 0 )
-				: FindMismatchPosition( sClippedExpected, sClippedActual, 0 ) );
-		}
-
-		/// <summary>
-		/// Display a standard message showing the differences found between 
-		/// two arrays that were expected to be equal.
-		/// </summary>
-		/// <param name="expected">The expected array value</param>
-		/// <param name="actual">The actual array value</param>
-		/// <param name="index">The index at which a difference was found</param>
-		public void DisplayArrayDifferences( Array expected, Array actual, int index )
-		{
-			if( expected.Length != actual.Length )
-				WriteLine( diffArrayLengthsFmt, expected.Length, actual.Length );
-			else
-				WriteLine( sameArrayLengthsFmt, expected.Length );
-			
-			WriteLine( arraysDifferAtIndexFmt, index );
-				
-			if ( index < expected.Length && index < actual.Length )
-			{
-				DisplayDifferences( GetValueFromCollection(expected, index ), GetValueFromCollection(actual, index), false );
-			}
-			else if( expected.Length < actual.Length )
-				DisplayListElements( "   extra:", actual, index, 3 );
-			else
-				DisplayListElements( " missing:", expected, index, 3 );
-		}
-
-		/// <summary>
-		/// Display a standard message showing the differences found between 
-		/// two collections that were expected to be equal.
-		/// </summary>
-		/// <param name="expected">The expected collection value</param>
-		/// <param name="actual">The actual collection value</param>
-		/// <param name="index">The index at which a difference was found</param>
-		// NOTE: This is a temporary method for use until the code from NUnitLite
-		// is integrated into NUnit.
-		public void DisplayCollectionDifferences( ICollection expected, ICollection actual, int index )
-		{
-			if( expected.Count != actual.Count )
-				WriteLine( diffArrayLengthsFmt, expected.Count, actual.Count );
-			else
-				WriteLine( sameArrayLengthsFmt, expected.Count );
-			
-			WriteLine( arraysDifferAtIndexFmt, index );
-				
-			if ( index < expected.Count && index < actual.Count )
-			{
-				DisplayDifferences( GetValueFromCollection(expected, index ), GetValueFromCollection(actual, index), false );
-			}
-//			else if( expected.Count < actual.Count )
-//				DisplayListElements( "   extra:", actual, index, 3 );
-//			else
-//				DisplayListElements( " missing:", expected, index, 3 );
-		}
-
-		private static object GetValueFromCollection(ICollection collection, int index)
-		{
-			Array array = collection as Array;
-
-			if (array != null && array.Rank > 1)
-				return array.GetValue(GetArrayIndicesFromCollectionIndex(array, index));
-
-			if (collection is IList)
-				return ((IList)collection)[index];
-
-			foreach (object obj in collection)
-				if (--index < 0)
-					return obj;
-
-			return null;
-		}
-
-		/// <summary>
-		/// Get an array of indices representing the point in a collection or
-		/// array corresponding to a single int index into the collection.
-		/// </summary>
-		/// <param name="collection">The collection to which the indices apply</param>
-		/// <param name="index">Index in the collection</param>
-		/// <returns>Array of indices</returns>
-		private static int[] GetArrayIndicesFromCollectionIndex(ICollection collection, int index)
-		{
-			Array array = collection as Array;
-			int rank = array == null ? 1 : array.Rank;
-			int[] result = new int[rank];
-
-			for (int r = array.Rank; --r > 0; )
-			{
-				int l = array.GetLength(r);
-				result[r] = index % l;
-				index /= l;
-			}
-
-			result[0] = index;
-			return result;
-		}
-
-		/// <summary>
-		/// Displays elements from a list on a line
-		/// </summary>
-		/// <param name="label">Text to prefix the line with</param>
-		/// <param name="list">The list of items to display</param>
-		/// <param name="index">The index in the list of the first element to display</param>
-		/// <param name="max">The maximum number of elements to display</param>
-		public void DisplayListElements( string label, IList list, int index, int max )
-		{
-			Write( "{0}<", label );
-
-			if ( list == null )
-				Write( "null" );
-			else if ( list.Count == 0 )
-				Write( "empty" );
-			else
-			{
-				for( int i = 0; i < max && index < list.Count; i++ )
-				{
-					Write( FormatObjectForDisplay( list[index++] ) );
-				
-					if ( index < list.Count )
-						Write( "," );
-				}
-
-				if ( index < list.Count )
-					Write( "..." );
-			}
-
-			WriteLine( ">" );
-		}
-
-		#region Static Methods
-
-		/// <summary>
-		/// Formats an object for display in a message line
-		/// </summary>
-		/// <param name="obj">The object to be displayed</param>
-		/// <returns></returns>
-		static public string FormatObjectForDisplay( object  obj )
-		{
-			if ( obj == null ) 
-				return "<(null)>";
-			else if ( obj is string )
-				return string.Format( "<\"{0}\">", obj );
-			else if ( obj is double )
-				return string.Format( "<{0}>", ((double)obj).ToString( "G17" ) );
-			else if ( obj is float )
-				return string.Format( "<{0}>", ((float)obj).ToString( "G9" ) );
-			else
-				return string.Format( "<{0}>", obj );
-		}
-
-		/// <summary>
-		/// Tests two objects to determine if they are strings.
-		/// </summary>
-		/// <param name="expected"></param>
-		/// <param name="actual"></param>
-		/// <returns></returns>
-		static protected bool InputsAreStrings( Object expected, Object actual )
-		{
-			return expected != null && actual != null && 
-				expected is string && actual is string;
-		}
-
-		/// <summary>
-		/// Renders up to M characters before, and up to N characters after
-		/// the specified index position.  If leading or trailing text is
-		/// clipped, and elipses "..." is added where the missing text would
-		/// be.
-		/// 
-		/// Clips strings to limit previous or post newline characters,
-		/// since these mess up the comparison
-		/// </summary>
-		/// <param name="sString"></param>
-		/// <param name="iPosition"></param>
-		/// <returns></returns>
-		static protected string ClipAroundPosition( string sString, int iPosition )
-		{
-			if( sString == null || sString.Length == 0 )
-				return "";
-
-			bool preClip = iPosition > PreClipLength;
-			bool postClip = iPosition + PostClipLength < sString.Length;
-
-			int start = preClip 
-				? iPosition - PreClipLength : 0;
-			int length = postClip 
-				? iPosition + PostClipLength - start : sString.Length - start;
-
-			if ( start + length > iPosition + PostClipLength )
-				length = iPosition + PostClipLength - start;
-
-			StringBuilder sb = new StringBuilder();
-			if ( preClip ) sb.Append("...");
-			sb.Append( sString.Substring( start, length ) );
-			if ( postClip ) sb.Append("...");
-
-			return sb.ToString();
-		}
-
-		/// <summary>
-		/// Shows the position two strings start to differ.  Comparison 
-		/// starts at the start index.
-		/// </summary>
-		/// <param name="sExpected"></param>
-		/// <param name="sActual"></param>
-		/// <param name="iStart"></param>
-		/// <returns>-1 if no mismatch found, or the index where mismatch found</returns>
-		static private int FindMismatchPosition( string sExpected, string sActual, int iStart )
-		{
-			int iLength = Math.Min( sExpected.Length, sActual.Length );
-			for( int i=iStart; i<iLength; i++ )
-			{
-				//
-				// If they mismatch at a specified position, report the
-				// difference.
-				//
-				if( sExpected[i] != sActual[i] )
-				{
-					return i;
-				}
-			}
-			//
-			// Strings have same content up to the length of the shorter string.
-			// Mismatch occurs because string lengths are different, so show
-			// that they start differing where the shortest string ends
-			//
-			if( sExpected.Length != sActual.Length )
-			{
-				return iLength;
-			}
-            
-			//
-			// Same strings
-			//
-			Assert.IsTrue( sExpected.Equals( sActual ) );
-			return -1;
-		}
-
-		/// <summary>
-		/// Turns CR, LF, or TAB into visual indicator to preserve visual marker 
-		/// position.   This is done by replacing the '\r' into '\\' and 'r' 
-		/// characters, and the '\n' into '\\' and 'n' characters, and '\t' into
-		/// '\\' and 't' characters.  
-		/// 
-		/// Thus the single character becomes two characters for display.
-		/// </summary>
-		/// <param name="sInput"></param>
-		/// <returns></returns>
-		static protected string ConvertWhitespace( string sInput )
-		{
-			if( null != sInput )
-			{
-				sInput = sInput.Replace( "\\", "\\\\" );
-				sInput = sInput.Replace( "\r", "\\r" );
-				sInput = sInput.Replace( "\n", "\\n" );
-				sInput = sInput.Replace( "\t", "\\t" );
-			}
-			return sInput;
-		}
-		#endregion
-	}
-}
diff --git a/src/NUnitFramework/framework/AssertionHelper.cs b/src/NUnitFramework/framework/AssertionHelper.cs
index 6846aff..1001a31 100644
--- a/src/NUnitFramework/framework/AssertionHelper.cs
+++ b/src/NUnitFramework/framework/AssertionHelper.cs
@@ -1,12 +1,12 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
 using System.Collections;
-using NUnit.Framework.SyntaxHelpers;
+using NUnit.Framework;
 using NUnit.Framework.Constraints;
 
 namespace NUnit.Framework
@@ -18,49 +18,175 @@ namespace NUnit.Framework
 	/// <see cref="Is"/>, from which it inherits much of its
 	/// behavior, in certain mock object frameworks.
 	/// </summary>
-	public class AssertionHelper : ConstraintBuilder
-	{
-		#region Expect
-		/// <summary>
-		/// Apply a constraint to an actual value, succeeding if the constraint
-		/// is satisfied and throwing an assertion exception on failure. Works
-		/// identically to <see cref="NUnit.Framework.Assert.That(object, Constraint)"/>
-		/// </summary>
-		/// <param name="constraint">A Constraint to be applied</param>
-		/// <param name="actual">The actual value to test</param>
-		static public void Expect( object actual, Constraint constraint )
-		{
-			Assert.That( actual, constraint, null, null );
-		}
+	public class AssertionHelper : ConstraintFactory
+    {
+        #region Assert
+        //private Assertions assert = new Assertions();
+        //public virtual Assertions Assert
+        //{
+        //    get { return assert; }
+        //}
+        #endregion
 
-		/// <summary>
-		/// Apply a constraint to an actual value, succeeding if the constraint
-		/// is satisfied and throwing an assertion exception on failure. Works
-		/// identically to <see cref="NUnit.Framework.Assert.That(object, Constraint, string)"/>
-		/// </summary>
-		/// <param name="constraint">A Constraint to be applied</param>
-		/// <param name="actual">The actual value to test</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		static public void Expect( object actual, Constraint constraint, string message )
-		{
-			Assert.That( actual, constraint, message, null );
-		}
+        #region Expect
 
-		/// <summary>
-		/// Apply a constraint to an actual value, succeeding if the constraint
-		/// is satisfied and throwing an assertion exception on failure. Works
-		/// identically to <see cref="NUnit.Framework.Assert.That(object, Constraint, string, object[])"/>
-		/// </summary>
-		/// <param name="constraint">A Constraint to be applied</param>
-		/// <param name="actual">The actual value to test</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void Expect( object actual, Constraint constraint, string message, params object[] args )
-		{
-			Assert.That( actual, constraint, message, args );
-		}
+        #region Object
+        /// <summary>
+        /// Apply a constraint to an actual value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure. Works
+        /// identically to <see cref="NUnit.Framework.Assert.That(object, IResolveConstraint)"/>
+        /// </summary>
+        /// <param name="constraint">A Constraint to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        public void Expect(object actual, IResolveConstraint constraint)
+        {
+            Assert.That(actual, constraint, null, null);
+        }
 
-		/// <summary>
+        /// <summary>
+        /// Apply a constraint to an actual value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure. Works
+        /// identically to <see cref="NUnit.Framework.Assert.That(object, IResolveConstraint, string)"/>
+        /// </summary>
+        /// <param name="constraint">A Constraint to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        public void Expect(object actual, IResolveConstraint constraint, string message)
+        {
+            Assert.That(actual, constraint, message, null);
+        }
+
+        /// <summary>
+        /// Apply a constraint to an actual value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure. Works
+        /// identically to <see cref="NUnit.Framework.Assert.That(object, IResolveConstraint, string, object[])"/>
+        /// </summary>
+        /// <param name="constraint">A Constraint to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        public void Expect(object actual, IResolveConstraint constraint, string message, params object[] args)
+        {
+            Assert.That(actual, constraint, message, args);
+        }
+        #endregion
+
+        #region ActualValueDelegate
+        /// <summary>
+        /// Apply a constraint to an actual value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
+        /// </summary>
+        /// <param name="expr">A Constraint expression to be applied</param>
+        /// <param name="del">An ActualValueDelegate returning the value to be tested</param>
+        public void Expect(ActualValueDelegate del, IResolveConstraint expr)
+        {
+            Assert.That(del, expr.Resolve(), null, null);
+        }
+
+        /// <summary>
+        /// Apply a constraint to an actual value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
+        /// </summary>
+        /// <param name="expr">A Constraint expression to be applied</param>
+        /// <param name="del">An ActualValueDelegate returning the value to be tested</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        public void Expect(ActualValueDelegate del, IResolveConstraint expr, string message)
+        {
+            Assert.That(del, expr.Resolve(), message, null);
+        }
+
+        /// <summary>
+        /// Apply a constraint to an actual value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
+        /// </summary>
+        /// <param name="del">An ActualValueDelegate returning the value to be tested</param>
+        /// <param name="expr">A Constraint expression to be applied</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        public void Expect(ActualValueDelegate del, IResolveConstraint expr, string message, params object[] args)
+        {
+            Assert.That(del, expr, message, args);
+        }
+        #endregion
+
+        #region ref Object
+#if NET_2_0
+        /// <summary>
+        /// Apply a constraint to a referenced value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
+        /// </summary>
+        /// <param name="constraint">A Constraint to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        public void Expect<T>(ref T actual, IResolveConstraint constraint)
+        {
+            Assert.That(ref actual, constraint.Resolve(), null, null);
+        }
+
+        /// <summary>
+        /// Apply a constraint to a referenced value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
+        /// </summary>
+        /// <param name="constraint">A Constraint to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        public void Expect<T>(ref T actual, IResolveConstraint constraint, string message)
+        {
+            Assert.That(ref actual, constraint.Resolve(), message, null);
+        }
+
+        /// <summary>
+        /// Apply a constraint to a referenced value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
+        /// </summary>
+        /// <param name="expression">A Constraint to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        public void Expect<T>(ref T actual, IResolveConstraint expression, string message, params object[] args)
+        {
+            Assert.That(ref actual, expression, message, args);
+        }
+#else
+        /// <summary>
+        /// Apply a constraint to a referenced boolean, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
+        /// </summary>
+        /// <param name="constraint">A Constraint to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        public void Expect(ref bool actual, IResolveConstraint constraint)
+        {
+            Assert.That(ref actual, constraint.Resolve(), null, null);
+        }
+
+        /// <summary>
+        /// Apply a constraint to a referenced value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
+        /// </summary>
+        /// <param name="constraint">A Constraint to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        public void Expect(ref bool actual, IResolveConstraint constraint, string message)
+        {
+            Assert.That(ref actual, constraint.Resolve(), message, null);
+        }
+
+        /// <summary>
+        /// Apply a constraint to a referenced value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
+        /// </summary>
+        /// <param name="constraint">A Constraint to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        public void Expect(ref bool actual, IResolveConstraint expression, string message, params object[] args)
+        {
+            Assert.That( ref actual, expression, message, args );
+        }
+#endif
+        #endregion
+
+        #region Boolean
+        /// <summary>
 		/// Asserts that a condition is true. If the condition is false the method throws
 		/// an <see cref="AssertionException"/>. Works Identically to 
         /// <see cref="Assert.That(bool, string, object[])"/>.
@@ -68,7 +194,7 @@ namespace NUnit.Framework
 		/// <param name="condition">The evaluated condition</param>
 		/// <param name="message">The message to display if the condition is false</param>
 		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void Expect(bool condition, string message, params object[] args)
+		public void Expect(bool condition, string message, params object[] args)
 		{
 			Assert.That(condition, Is.True, message, args);
 		}
@@ -80,7 +206,7 @@ namespace NUnit.Framework
 		/// </summary>
 		/// <param name="condition">The evaluated condition</param>
 		/// <param name="message">The message to display if the condition is false</param>
-		static public void Expect(bool condition, string message)
+		public void Expect(bool condition, string message)
 		{
 			Assert.That(condition, Is.True, message, null);
 		}
@@ -90,14 +216,27 @@ namespace NUnit.Framework
 		/// an <see cref="AssertionException"/>. Works Identically to <see cref="Assert.That(bool)"/>.
 		/// </summary>
 		/// <param name="condition">The evaluated condition</param>
-		static public void Expect(bool condition)
+		public void Expect(bool condition)
 		{
 			Assert.That(condition, Is.True, null, null);
-		}
-		#endregion
+        }
+        #endregion
 
-		#region Map
-		/// <summary>
+        /// <summary>
+        /// Asserts that the code represented by a delegate throws an exception
+        /// that satisfies the constraint provided.
+        /// </summary>
+        /// <param name="code">A TestDelegate to be executed</param>
+        /// <param name="constraint">A ThrowsConstraint used in the test</param>
+        public void Expect(TestDelegate code, IResolveConstraint constraint)
+        {
+            Assert.That((object)code, constraint);
+        }
+
+        #endregion
+
+        #region Map
+        /// <summary>
 		/// Returns a ListMapper based on a collection.
 		/// </summary>
 		/// <param name="original">The original collection</param>
diff --git a/src/NUnitFramework/framework/Assume.cs b/src/NUnitFramework/framework/Assume.cs
new file mode 100644
index 0000000..6309eca
--- /dev/null
+++ b/src/NUnitFramework/framework/Assume.cs
@@ -0,0 +1,279 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.ComponentModel;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// Provides static methods to express the assumptions
+    /// that must be met for a test to give a meaningful
+    /// result. If an assumption is not met, the test
+    /// should produce an inconclusive result.
+    /// </summary>
+    public class Assume
+    {
+        #region Equals and ReferenceEquals
+
+        /// <summary>
+        /// The Equals method throws an AssertionException. This is done 
+        /// to make sure there is no mistake by calling this function.
+        /// </summary>
+        /// <param name="a"></param>
+        /// <param name="b"></param>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public static new bool Equals(object a, object b)
+        {
+            // TODO: This should probably be InvalidOperationException
+            throw new AssertionException("Assert.Equals should not be used for Assertions");
+        }
+
+        /// <summary>
+        /// override the default ReferenceEquals to throw an AssertionException. This 
+        /// implementation makes sure there is no mistake in calling this function 
+        /// as part of Assert. 
+        /// </summary>
+        /// <param name="a"></param>
+        /// <param name="b"></param>
+        public static new void ReferenceEquals(object a, object b)
+        {
+            throw new AssertionException("Assert.ReferenceEquals should not be used for Assertions");
+        }
+
+        #endregion
+
+        #region Assume.That
+
+        #region Object
+        /// <summary>
+        /// Apply a constraint to an actual value, succeeding if the constraint
+        /// is satisfied and throwing an InconclusiveException on failure.
+        /// </summary>
+        /// <param name="expression">A Constraint expression to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        static public void That(object actual, IResolveConstraint expression)
+        {
+            Assume.That(actual, expression, null, null);
+        }
+
+        /// <summary>
+        /// Apply a constraint to an actual value, succeeding if the constraint
+        /// is satisfied and throwing an InconclusiveException on failure.
+        /// </summary>
+        /// <param name="expression">A Constraint expression to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        static public void That(object actual, IResolveConstraint expression, string message)
+        {
+            Assume.That(actual, expression, message, null);
+        }
+
+        /// <summary>
+        /// Apply a constraint to an actual value, succeeding if the constraint
+        /// is satisfied and throwing an InconclusiveException on failure.
+        /// </summary>
+        /// <param name="expression">A Constraint expression to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void That(object actual, IResolveConstraint expression, string message, params object[] args)
+        {
+            Constraint constraint = expression.Resolve();
+
+            if (!constraint.Matches(actual))
+            {
+                MessageWriter writer = new TextMessageWriter(message, args);
+                constraint.WriteMessageTo(writer);
+                throw new InconclusiveException(writer.ToString());
+            }
+        }
+        #endregion
+
+        #region ActualValueDelegate
+        /// <summary>
+        /// Apply a constraint to an actual value, succeeding if the constraint
+        /// is satisfied and throwing an InconclusiveException on failure.
+        /// </summary>
+        /// <param name="expr">A Constraint expression to be applied</param>
+        /// <param name="del">An ActualValueDelegate returning the value to be tested</param>
+        static public void That(ActualValueDelegate del, IResolveConstraint expr)
+        {
+            Assume.That(del, expr.Resolve(), null, null);
+        }
+
+        /// <summary>
+        /// Apply a constraint to an actual value, succeeding if the constraint
+        /// is satisfied and throwing an InconclusiveException on failure.
+        /// </summary>
+        /// <param name="expr">A Constraint expression to be applied</param>
+        /// <param name="del">An ActualValueDelegate returning the value to be tested</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        static public void That(ActualValueDelegate del, IResolveConstraint expr, string message)
+        {
+            Assume.That(del, expr.Resolve(), message, null);
+        }
+
+        /// <summary>
+        /// Apply a constraint to an actual value, succeeding if the constraint
+        /// is satisfied and throwing an InconclusiveException on failure.
+        /// </summary>
+        /// <param name="del">An ActualValueDelegate returning the value to be tested</param>
+        /// <param name="expr">A Constraint expression to be applied</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void That(ActualValueDelegate del, IResolveConstraint expr, string message, params object[] args)
+        {
+            Constraint constraint = expr.Resolve();
+
+            if (!constraint.Matches(del))
+            {
+                MessageWriter writer = new TextMessageWriter(message, args);
+                constraint.WriteMessageTo(writer);
+                throw new InconclusiveException(writer.ToString());
+            }
+        }
+        #endregion
+
+        #region ref Object
+#if NET_2_0
+        /// <summary>
+        /// Apply a constraint to a referenced value, succeeding if the constraint
+        /// is satisfied and throwing an InconclusiveException on failure.
+        /// </summary>
+        /// <param name="expression">A Constraint expression to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        static public void That<T>(ref T actual, IResolveConstraint expression)
+        {
+            Assume.That(ref actual, expression.Resolve(), null, null);
+        }
+
+        /// <summary>
+        /// Apply a constraint to a referenced value, succeeding if the constraint
+        /// is satisfied and throwing an InconclusiveException on failure.
+        /// </summary>
+        /// <param name="expression">A Constraint expression to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        static public void That<T>(ref T actual, IResolveConstraint expression, string message)
+        {
+            Assume.That(ref actual, expression.Resolve(), message, null);
+        }
+
+        /// <summary>
+        /// Apply a constraint to a referenced value, succeeding if the constraint
+        /// is satisfied and throwing an InconclusiveException on failure.
+        /// </summary>
+        /// <param name="expression">A Constraint expression to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void That<T>(ref T actual, IResolveConstraint expression, string message, params object[] args)
+        {
+            Constraint constraint = expression.Resolve();
+
+            if (!constraint.Matches(ref actual))
+            {
+                MessageWriter writer = new TextMessageWriter(message, args);
+                constraint.WriteMessageTo(writer);
+                throw new InconclusiveException(writer.ToString());
+            }
+        }
+#else
+        /// <summary>
+        /// Apply a constraint to a referenced boolean, succeeding if the constraint
+        /// is satisfied and throwing an InconclusiveException on failure.
+        /// </summary>
+        /// <param name="constraint">A Constraint to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        static public void That(ref bool actual, IResolveConstraint constraint)
+        {
+            Assume.That(ref actual, constraint.Resolve(), null, null);
+        }
+
+        /// <summary>
+        /// Apply a constraint to a referenced value, succeeding if the constraint
+        /// is satisfied and throwing an InconclusiveException on failure.
+        /// </summary>
+        /// <param name="constraint">A Constraint to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        static public void That(ref bool actual, IResolveConstraint constraint, string message)
+        {
+            Assume.That(ref actual, constraint.Resolve(), message, null);
+        }
+
+        /// <summary>
+        /// Apply a constraint to a referenced value, succeeding if the constraint
+        /// is satisfied and throwing an InconclusiveException on failure.
+        /// </summary>
+        /// <param name="constraint">A Constraint to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void That(ref bool actual, IResolveConstraint expression, string message, params object[] args)
+        {
+            Constraint constraint = expression.Resolve();
+
+            if (!constraint.Matches(ref actual))
+            {
+                MessageWriter writer = new TextMessageWriter(message, args);
+                constraint.WriteMessageTo(writer);
+                throw new InconclusiveException(writer.ToString());
+            }
+        }
+#endif
+        #endregion
+
+        #region Boolean
+        /// <summary>
+        /// Asserts that a condition is true. If the condition is false the method throws
+        /// an <see cref="InconclusiveException"/>.
+        /// </summary> 
+        /// <param name="condition">The evaluated condition</param>
+        /// <param name="message">The message to display if the condition is false</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void That(bool condition, string message, params object[] args)
+        {
+            Assume.That(condition, Is.True, message, args);
+        }
+
+        /// <summary>
+        /// Asserts that a condition is true. If the condition is false the method throws
+        /// an <see cref="InconclusiveException"/>.
+        /// </summary>
+        /// <param name="condition">The evaluated condition</param>
+        /// <param name="message">The message to display if the condition is false</param>
+        static public void That(bool condition, string message)
+        {
+            Assume.That(condition, Is.True, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that a condition is true. If the condition is false the 
+        /// method throws an <see cref="InconclusiveException"/>.
+        /// </summary>
+        /// <param name="condition">The evaluated condition</param>
+        static public void That(bool condition)
+        {
+            Assume.That(condition, Is.True, null, null);
+        }
+        #endregion
+
+        /// <summary>
+        /// Asserts that the code represented by a delegate throws an exception
+        /// that satisfies the constraint provided.
+        /// </summary>
+        /// <param name="code">A TestDelegate to be executed</param>
+        /// <param name="constraint">A ThrowsConstraint used in the test</param>
+        static public void That(TestDelegate code, IResolveConstraint constraint)
+        {
+            Assume.That((object)code, constraint);
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitFramework/framework/Attributes/CategoryAttribute.cs b/src/NUnitFramework/framework/Attributes/CategoryAttribute.cs
new file mode 100644
index 0000000..d4bbe6f
--- /dev/null
+++ b/src/NUnitFramework/framework/Attributes/CategoryAttribute.cs
@@ -0,0 +1,57 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework
+{
+	/// <summary>
+	/// Attribute used to apply a category to a test
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method|AttributeTargets.Assembly, AllowMultiple=true, Inherited=true)]
+	public class CategoryAttribute : Attribute
+	{
+		/// <summary>
+		/// The name of the category
+		/// </summary>
+		protected string categoryName;
+
+		/// <summary>
+		/// Construct attribute for a given category based on
+        /// a name. The name may not contain the characters ',',
+        /// '+', '-' or '!'. However, this is not checked in the
+        /// constructor since it would cause an error to arise at
+        /// as the test was loaded without giving a clear indication
+        /// of where the problem is located. The error is handled
+        /// in NUnitFramework.cs by marking the test as not
+        /// runnable.
+		/// </summary>
+		/// <param name="name">The name of the category</param>
+		public CategoryAttribute(string name)
+		{
+			this.categoryName = name.Trim();
+		}
+
+		/// <summary>
+		/// Protected constructor uses the Type name as the name
+		/// of the category.
+		/// </summary>
+		protected CategoryAttribute()
+		{
+			this.categoryName = this.GetType().Name;
+			if ( categoryName.EndsWith( "Attribute" ) )
+				categoryName = categoryName.Substring( 0, categoryName.Length - 9 );
+		}
+
+		/// <summary>
+		/// The name of the category
+		/// </summary>
+		public string Name 
+		{
+			get { return categoryName; }
+		}
+	}
+}
diff --git a/src/NUnitFramework/framework/Attributes/DatapointAttributes.cs b/src/NUnitFramework/framework/Attributes/DatapointAttributes.cs
new file mode 100644
index 0000000..3d6ac0b
--- /dev/null
+++ b/src/NUnitFramework/framework/Attributes/DatapointAttributes.cs
@@ -0,0 +1,29 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// Used to mark a field for use as a datapoint when executing a theory
+    /// within the same fixture that requires an argument of the field's Type.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)]
+    public class DatapointAttribute : Attribute
+    {
+    }
+
+    /// <summary>
+    /// Used to mark an array as containing a set of datapoints to be used
+    /// executing a theory within the same fixture that requires an argument 
+    /// of the Type of the array elements.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
+    public class DatapointsAttribute : Attribute
+    {
+    }
+}
diff --git a/src/NUnitFramework/framework/Attributes/DescriptionAttribute.cs b/src/NUnitFramework/framework/Attributes/DescriptionAttribute.cs
new file mode 100644
index 0000000..4d8c4cf
--- /dev/null
+++ b/src/NUnitFramework/framework/Attributes/DescriptionAttribute.cs
@@ -0,0 +1,37 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework
+{
+	/// <summary>
+	/// Attribute used to provide descriptive text about a 
+	/// test case or fixture.
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method|AttributeTargets.Assembly, AllowMultiple=false, Inherited=false)]
+	public class DescriptionAttribute : Attribute
+	{
+		string description;
+
+		/// <summary>
+		/// Construct the attribute
+		/// </summary>
+		/// <param name="description">Text describing the test</param>
+		public DescriptionAttribute(string description)
+		{
+			this.description=description;
+		}
+
+		/// <summary>
+		/// Gets the test description
+		/// </summary>
+		public string Description
+		{
+			get { return description; }
+		}
+	}
+}
diff --git a/src/NUnitFramework/framework/Attributes/ExpectedExceptionAttribute.cs b/src/NUnitFramework/framework/Attributes/ExpectedExceptionAttribute.cs
new file mode 100644
index 0000000..c26c504
--- /dev/null
+++ b/src/NUnitFramework/framework/Attributes/ExpectedExceptionAttribute.cs
@@ -0,0 +1,123 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Framework
+{
+	using System;
+
+	/// <summary>
+	/// Enumeration indicating how the expected message parameter is to be used
+	/// </summary>
+	public enum MessageMatch
+	{
+		/// Expect an exact match
+		Exact,	
+		/// Expect a message containing the parameter string
+		Contains,
+		/// Match the regular expression provided as a parameter
+		Regex,
+        /// Expect a message that starts with the parameter string
+        StartsWith
+	}
+
+	/// <summary>
+	/// ExpectedExceptionAttribute
+	/// </summary>
+	/// 
+	[AttributeUsage(AttributeTargets.Method, AllowMultiple=false, Inherited=false)]
+	public class ExpectedExceptionAttribute : Attribute
+	{
+		private Type expectedException;
+		private string expectedExceptionName;
+		private string expectedMessage;
+		private MessageMatch matchType;
+		private string userMessage;
+		private string handler;
+
+		/// <summary>
+		/// Constructor for a non-specific exception
+		/// </summary>
+		public ExpectedExceptionAttribute()
+		{
+		}
+
+		/// <summary>
+		/// Constructor for a given type of exception
+		/// </summary>
+		/// <param name="exceptionType">The type of the expected exception</param>
+		public ExpectedExceptionAttribute(Type exceptionType)
+		{
+			this.expectedException = exceptionType;
+			this.expectedExceptionName = exceptionType.FullName;
+		}
+
+		/// <summary>
+		/// Constructor for a given exception name
+		/// </summary>
+		/// <param name="exceptionName">The full name of the expected exception</param>
+		public ExpectedExceptionAttribute(string exceptionName)
+		{
+			this.expectedExceptionName = exceptionName;
+		}
+
+		/// <summary>
+		/// Gets or sets the expected exception type
+		/// </summary>
+		public Type ExpectedException
+		{
+			get{ return expectedException; }
+			set
+            { 
+                expectedException = value;
+                expectedExceptionName = expectedException.FullName;
+            }
+		}
+
+		/// <summary>
+		/// Gets or sets the full Type name of the expected exception
+		/// </summary>
+		public string ExpectedExceptionName
+		{
+			get{ return expectedExceptionName; }
+			set{ expectedExceptionName = value; }
+		}
+
+		/// <summary>
+		/// Gets or sets the expected message text
+		/// </summary>
+		public string ExpectedMessage 
+		{
+			get { return expectedMessage; }
+			set { expectedMessage = value; }
+		}
+
+		/// <summary>
+		/// Gets or sets the user message displayed in case of failure
+		/// </summary>
+		public string UserMessage
+		{
+			get { return userMessage; }
+			set { userMessage = value; }
+		}
+
+		/// <summary>
+		///  Gets or sets the type of match to be performed on the expected message
+		/// </summary>
+		public MessageMatch MatchType
+		{
+			get { return matchType; }
+			set { matchType = value; }
+		}
+
+		/// <summary>
+		///  Gets the name of a method to be used as an exception handler
+		/// </summary>
+		public string Handler
+		{
+			get { return handler; }
+			set { handler = value; }
+		}
+	}
+}
diff --git a/src/NUnitFramework/framework/Attributes/ExplicitAttribute.cs b/src/NUnitFramework/framework/Attributes/ExplicitAttribute.cs
new file mode 100644
index 0000000..56a87a5
--- /dev/null
+++ b/src/NUnitFramework/framework/Attributes/ExplicitAttribute.cs
@@ -0,0 +1,47 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework
+{
+	/// <summary>
+	/// ExplicitAttribute marks a test or test fixture so that it will
+	/// only be run if explicitly executed from the gui or command line
+	/// or if it is included by use of a filter. The test will not be
+	/// run simply because an enclosing suite is run.
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method|AttributeTargets.Assembly, AllowMultiple=false, Inherited=false)]
+	public class ExplicitAttribute : Attribute
+	{
+        private string reason;
+
+        /// <summary>
+		/// Default constructor
+		/// </summary>
+		public ExplicitAttribute()
+		{
+            this.reason = "";
+        }
+
+        /// <summary>
+        /// Constructor with a reason
+        /// </summary>
+        /// <param name="reason">The reason test is marked explicit</param>
+        public ExplicitAttribute(string reason)
+        {
+            this.reason = reason;
+        }
+
+        /// <summary>
+        /// The reason test is marked explicit
+        /// </summary>
+        public string Reason
+        {
+            get { return reason; }
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Attributes/IgnoreAttribute.cs b/src/NUnitFramework/framework/Attributes/IgnoreAttribute.cs
new file mode 100644
index 0000000..7f34008
--- /dev/null
+++ b/src/NUnitFramework/framework/Attributes/IgnoreAttribute.cs
@@ -0,0 +1,47 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Framework
+{
+	using System;
+
+	/// <summary>
+	/// Attribute used to mark a test that is to be ignored.
+	/// Ignored tests result in a warning message when the
+	/// tests are run.
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Method|AttributeTargets.Class|AttributeTargets.Assembly, AllowMultiple=false, Inherited=false)]
+	public class IgnoreAttribute : Attribute
+	{
+		private string reason;
+
+		/// <summary>
+		/// Constructs the attribute without giving a reason 
+		/// for ignoring the test.
+		/// </summary>
+		public IgnoreAttribute()
+		{
+			this.reason = "";
+		}
+
+		/// <summary>
+		/// Constructs the attribute giving a reason for ignoring the test
+		/// </summary>
+		/// <param name="reason">The reason for ignoring the test</param>
+		public IgnoreAttribute(string reason)
+		{
+			this.reason = reason;
+		}
+
+		/// <summary>
+		/// The reason for ignoring a test
+		/// </summary>
+		public string Reason
+		{
+			get { return reason; }
+		}
+	}
+}
diff --git a/src/NUnitFramework/framework/Attributes/IncludeExcludeAttributes.cs b/src/NUnitFramework/framework/Attributes/IncludeExcludeAttributes.cs
new file mode 100644
index 0000000..6b54a72
--- /dev/null
+++ b/src/NUnitFramework/framework/Attributes/IncludeExcludeAttributes.cs
@@ -0,0 +1,106 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework
+{
+	/// <summary>
+	/// Abstract base for Attributes that are used to include tests
+	/// in the test run based on environmental settings.
+	/// </summary>
+	public abstract class IncludeExcludeAttribute : Attribute
+	{
+		private string include;
+		private string exclude;
+		private string reason;
+
+		/// <summary>
+		/// Constructor with no included items specified, for use
+		/// with named property syntax.
+		/// </summary>
+		public IncludeExcludeAttribute() { }
+
+		/// <summary>
+		/// Constructor taking one or more included items
+		/// </summary>
+		/// <param name="include">Comma-delimited list of included items</param>
+		public IncludeExcludeAttribute( string include )
+		{
+			this.include = include;
+		}
+
+		/// <summary>
+		/// Name of the item that is needed in order for
+		/// a test to run. Multiple itemss may be given,
+		/// separated by a comma.
+		/// </summary>
+		public string Include
+		{
+			get { return this.include; }
+			set { include = value; }
+		}
+
+		/// <summary>
+		/// Name of the item to be excluded. Multiple items
+		/// may be given, separated by a comma.
+		/// </summary>
+		public string Exclude
+		{
+			get { return this.exclude; }
+			set { this.exclude = value; }
+		}
+
+		/// <summary>
+		/// The reason for including or excluding the test
+		/// </summary>
+		public string Reason
+		{
+			get { return reason; }
+			set { reason = value; }
+		}
+	}
+
+	/// <summary>
+	/// PlatformAttribute is used to mark a test fixture or an
+	/// individual method as applying to a particular platform only.
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method|AttributeTargets.Assembly, AllowMultiple=true, Inherited=false)]
+	public class PlatformAttribute : IncludeExcludeAttribute
+	{
+		/// <summary>
+		/// Constructor with no platforms specified, for use
+		/// with named property syntax.
+		/// </summary>
+		public PlatformAttribute() { }
+
+		/// <summary>
+		/// Constructor taking one or more platforms
+		/// </summary>
+		/// <param name="platforms">Comma-deliminted list of platforms</param>
+		public PlatformAttribute( string platforms ) : base( platforms ) { }
+	}
+
+	/// <summary>
+	/// CultureAttribute is used to mark a test fixture or an
+	/// individual method as applying to a particular Culture only.
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method|AttributeTargets.Assembly, AllowMultiple=false, Inherited=false)]
+	public class CultureAttribute : IncludeExcludeAttribute
+	{
+		/// <summary>
+		/// Constructor with no cultures specified, for use
+		/// with named property syntax.
+		/// </summary>
+		public CultureAttribute() { }
+
+		/// <summary>
+		/// Constructor taking one or more cultures
+		/// </summary>
+		/// <param name="cultures">Comma-deliminted list of cultures</param>
+		public CultureAttribute( string cultures ) : base( cultures ) { }
+	}
+}
diff --git a/src/NUnitFramework/framework/Attributes/JoinTypeAttributes.cs b/src/NUnitFramework/framework/Attributes/JoinTypeAttributes.cs
new file mode 100644
index 0000000..0bfa343
--- /dev/null
+++ b/src/NUnitFramework/framework/Attributes/JoinTypeAttributes.cs
@@ -0,0 +1,58 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// Marks a test to use a combinatorial join of any argument data 
+    /// provided. NUnit will create a test case for every combination of 
+    /// the arguments provided. This can result in a large number of test
+    /// cases and so should be used judiciously. This is the default join
+    /// type, so the attribute need not be used except as documentation.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited=false)]
+    public class CombinatorialAttribute : PropertyAttribute
+    {
+        /// <summary>
+        /// Default constructor
+        /// </summary>
+        public CombinatorialAttribute() : base("_JOINTYPE", "Combinatorial") { }
+    }
+
+    /// <summary>
+    /// Marks a test to use pairwise join of any argument data provided. 
+    /// NUnit will attempt too excercise every pair of argument values at 
+    /// least once, using as small a number of test cases as it can. With
+    /// only two arguments, this is the same as a combinatorial join.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited=false)]
+    public class PairwiseAttribute : PropertyAttribute
+    {
+        /// <summary>
+        /// Default constructor
+        /// </summary>
+        public PairwiseAttribute() : base("_JOINTYPE", "Pairwise") { }
+    }
+
+    /// <summary>
+    /// Marks a test to use a sequential join of any argument data
+    /// provided. NUnit will use arguements for each parameter in
+    /// sequence, generating test cases up to the largest number
+    /// of argument values provided and using null for any arguments
+    /// for which it runs out of values. Normally, this should be
+    /// used with the same number of arguments for each parameter.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited=false)]
+    public class SequentialAttribute : PropertyAttribute
+    {
+        /// <summary>
+        /// Default constructor
+        /// </summary>
+        public SequentialAttribute() : base("_JOINTYPE", "Sequential") { }
+    }
+}
diff --git a/src/NUnitFramework/framework/Attributes/MaxTimeAttribute.cs b/src/NUnitFramework/framework/Attributes/MaxTimeAttribute.cs
new file mode 100644
index 0000000..4ed2a02
--- /dev/null
+++ b/src/NUnitFramework/framework/Attributes/MaxTimeAttribute.cs
@@ -0,0 +1,23 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+
+namespace NUnit.Framework
+{
+	/// <summary>
+	/// Summary description for MaxTimeAttribute.
+	/// </summary>
+	[AttributeUsage( AttributeTargets.Method, AllowMultiple=false, Inherited=false )]
+	public sealed class MaxTimeAttribute : PropertyAttribute
+	{
+        /// <summary>
+        /// Construct a MaxTimeAttribute, given a time in milliseconds.
+        /// </summary>
+        /// <param name="milliseconds">The maximum elapsed time in milliseconds</param>
+		public MaxTimeAttribute( int milliseconds )
+            : base( milliseconds ) { }
+	}
+}
diff --git a/src/NUnitFramework/framework/Attributes/PropertyAttribute.cs b/src/NUnitFramework/framework/Attributes/PropertyAttribute.cs
new file mode 100644
index 0000000..e320a27
--- /dev/null
+++ b/src/NUnitFramework/framework/Attributes/PropertyAttribute.cs
@@ -0,0 +1,81 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Collections.Specialized;
+
+namespace NUnit.Framework
+{
+	/// <summary>
+	/// PropertyAttribute is used to attach information to a test as a name/value pair..
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method|AttributeTargets.Assembly, AllowMultiple=true, Inherited=true)]
+	public class PropertyAttribute : Attribute
+	{
+        private IDictionary properties = new ListDictionary();
+
+        /// <summary>
+        /// Construct a PropertyAttribute with a name and string value
+        /// </summary>
+        /// <param name="propertyName">The name of the property</param>
+        /// <param name="propertyValue">The property value</param>
+        public PropertyAttribute(string propertyName, string propertyValue)
+        {
+            this.properties.Add(propertyName, propertyValue);
+        }
+
+        /// <summary>
+        /// Construct a PropertyAttribute with a name and int value
+        /// </summary>
+        /// <param name="propertyName">The name of the property</param>
+        /// <param name="propertyValue">The property value</param>
+        public PropertyAttribute(string propertyName, int propertyValue)
+        {
+            this.properties.Add(propertyName, propertyValue);
+        }
+
+        /// <summary>
+        /// Construct a PropertyAttribute with a name and double value
+        /// </summary>
+        /// <param name="propertyName">The name of the property</param>
+        /// <param name="propertyValue">The property value</param>
+        public PropertyAttribute(string propertyName, double propertyValue)
+        {
+            this.properties.Add(propertyName, propertyValue);
+        }
+
+        /// <summary>
+        /// Constructor for derived classes that set the
+        /// property dictionary directly.
+        /// </summary>
+        protected PropertyAttribute() { }
+
+        /// <summary>
+		/// Constructor for use by derived classes that use the
+		/// name of the type as the property name. Derived classes
+        /// must ensure that the Type of the property value is
+        /// a standard type supported by the BCL. Any custom
+        /// types will cause a serialization Exception when
+        /// in the client.
+		/// </summary>
+		protected PropertyAttribute( object propertyValue )
+		{
+			string propertyName = this.GetType().Name;
+			if ( propertyName.EndsWith( "Attribute" ) )
+				propertyName = propertyName.Substring( 0, propertyName.Length - 9 );
+            this.properties.Add(propertyName, propertyValue);
+		}
+
+        /// <summary>
+        /// Gets the property dictionary for this attribute
+        /// </summary>
+        public IDictionary Properties
+        {
+            get { return properties; }
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Attributes/RandomAttribute.cs b/src/NUnitFramework/framework/Attributes/RandomAttribute.cs
new file mode 100644
index 0000000..a17c741
--- /dev/null
+++ b/src/NUnitFramework/framework/Attributes/RandomAttribute.cs
@@ -0,0 +1,102 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Reflection;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// RandomAttribute is used to supply a set of random values
+    /// to a single parameter of a parameterized test.
+    /// </summary>
+    public class RandomAttribute : ValuesAttribute
+    {
+        enum SampleType
+        {
+            Raw,
+            IntRange,
+            DoubleRange
+        }
+
+        SampleType sampleType;
+        private int count;
+        private int min, max;
+        private double dmin, dmax;
+
+        /// <summary>
+        /// Construct a set of doubles from 0.0 to 1.0,
+        /// specifying only the count.
+        /// </summary>
+        /// <param name="count"></param>
+        public RandomAttribute(int count)
+        {
+            this.count = count;
+            this.sampleType = SampleType.Raw;
+        }
+
+        /// <summary>
+        /// Construct a set of doubles from min to max
+        /// </summary>
+        /// <param name="min"></param>
+        /// <param name="max"></param>
+        /// <param name="count"></param>
+        public RandomAttribute(double min, double max, int count)
+        {
+            this.count = count;
+            this.dmin = min;
+            this.dmax = max;
+            this.sampleType = SampleType.DoubleRange;
+        }
+
+        /// <summary>
+        /// Construct a set of ints from min to max
+        /// </summary>
+        /// <param name="min"></param>
+        /// <param name="max"></param>
+        /// <param name="count"></param>
+        public RandomAttribute(int min, int max, int count)
+        {
+            this.count = count;
+            this.min = min;
+            this.max = max;
+            this.sampleType = SampleType.IntRange;
+        }
+
+        /// <summary>
+        /// Get the collection of values to be used as arguments
+        /// </summary>
+        public override IEnumerable GetData(ParameterInfo parameter)
+        {
+            Randomizer r = Randomizer.GetRandomizer(parameter);
+            IList values;
+
+            switch (sampleType)
+            {
+                default:
+                case SampleType.Raw:
+                    values = r.GetDoubles(count);
+                    break;
+                case SampleType.IntRange:
+                    values = r.GetInts(min, max, count);
+                    break;
+                case SampleType.DoubleRange:
+                    values = r.GetDoubles(dmin, dmax, count);
+                    break;
+            }
+
+            // Copy the random values into the data array
+            // and call the base class which may need to
+            // convert them to another type.
+            this.data = new object[values.Count];
+            for (int i = 0; i < values.Count; i++)
+                this.data[i] = values[i];
+
+            return base.GetData(parameter);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Attributes/RangeAttribute.cs b/src/NUnitFramework/framework/Attributes/RangeAttribute.cs
new file mode 100644
index 0000000..da1c60f
--- /dev/null
+++ b/src/NUnitFramework/framework/Attributes/RangeAttribute.cs
@@ -0,0 +1,87 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// RangeAttribute is used to supply a range of values to an
+    /// individual parameter of a parameterized test.
+    /// </summary>
+    public class RangeAttribute : ValuesAttribute
+    {
+        /// <summary>
+        /// Construct a range of ints using default step of 1
+        /// </summary>
+        /// <param name="from"></param>
+        /// <param name="to"></param>
+        public RangeAttribute(int from, int to) : this(from, to, 1) { }
+
+        /// <summary>
+        /// Construct a range of ints specifying the step size 
+        /// </summary>
+        /// <param name="from"></param>
+        /// <param name="to"></param>
+        /// <param name="step"></param>
+        public RangeAttribute(int from, int to, int step)
+        {
+            int count = (to - from) / step + 1;
+            this.data = new object[count];
+            int index = 0;
+            for (int val = from; index < count; val += step)
+                this.data[index++] = val;
+        }
+
+        /// <summary>
+        /// Construct a range of longs
+        /// </summary>
+        /// <param name="from"></param>
+        /// <param name="to"></param>
+        /// <param name="step"></param>
+        public RangeAttribute(long from, long to, long step)
+        {
+            long count = (to - from) / step + 1;
+            this.data = new object[count];
+            int index = 0;
+            for (long val = from; index < count; val += step)
+                data[index++] = val;
+        }
+
+        /// <summary>
+        /// Construct a range of doubles
+        /// </summary>
+        /// <param name="from"></param>
+        /// <param name="to"></param>
+        /// <param name="step"></param>
+        public RangeAttribute(double from, double to, double step)
+        {
+            double tol = step / 1000;
+            int count = (int)((to - from) / step + tol + 1);
+            this.data = new object[count];
+            int index = 0;
+            for (double val = from; index < count; val += step)
+                data[index++] = val;
+        }
+
+        /// <summary>
+        /// Construct a range of floats
+        /// </summary>
+        /// <param name="from"></param>
+        /// <param name="to"></param>
+        /// <param name="step"></param>
+        public RangeAttribute(float from, float to, float step)
+        {
+            float tol = step / 1000;
+            int count = (int)((to - from) / step + tol + 1);
+            this.data = new object[count];
+            int index = 0;
+            for (float val = from; index < count; val += step)
+                data[index++] = val;
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Attributes/RepeatAttribute.cs b/src/NUnitFramework/framework/Attributes/RepeatAttribute.cs
new file mode 100644
index 0000000..5eb1f3c
--- /dev/null
+++ b/src/NUnitFramework/framework/Attributes/RepeatAttribute.cs
@@ -0,0 +1,43 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework
+{
+	/// <summary>
+	/// RepeatAttribute may be applied to test case in order
+	/// to run it multiple times.
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Method, AllowMultiple=false, Inherited=false)]
+	public class RepeatAttribute : PropertyAttribute
+	{
+        /// <summary>
+        /// Construct a RepeatAttribute
+        /// </summary>
+        /// <param name="count">The number of times to run the test</param>
+        public RepeatAttribute(int count) : base(count) { }
+
+        //private int count;
+
+        ///// <summary>
+        ///// Construct a RepeatAttribute
+        ///// </summary>
+        ///// <param name="count">The number of times to run the test</param>
+        //public RepeatAttribute(int count)
+        //{
+        //    this.count = count;
+        //}
+
+        ///// <summary>
+        ///// Gets the number of times to run the test.
+        ///// </summary>
+        //public int Count
+        //{
+        //    get { return count; }
+        //}
+	}
+}
diff --git a/src/NUnitFramework/framework/Attributes/RequiredAddinAttribute.cs b/src/NUnitFramework/framework/Attributes/RequiredAddinAttribute.cs
new file mode 100644
index 0000000..7f7e427
--- /dev/null
+++ b/src/NUnitFramework/framework/Attributes/RequiredAddinAttribute.cs
@@ -0,0 +1,40 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// RequiredAddinAttribute may be used to indicate the names of any addins
+    /// that must be present in order to run some or all of the tests in an
+    /// assembly. If the addin is not loaded, the entire assembly is marked
+    /// as NotRunnable.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Assembly,AllowMultiple=true, Inherited=false)]
+    public class RequiredAddinAttribute : Attribute
+    {
+        private string requiredAddin;
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:RequiredAddinAttribute"/> class.
+        /// </summary>
+        /// <param name="requiredAddin">The required addin.</param>
+        public RequiredAddinAttribute(string requiredAddin)
+        {
+            this.requiredAddin = requiredAddin;
+        }
+
+        /// <summary>
+        /// Gets the name of required addin.
+        /// </summary>
+        /// <value>The required addin name.</value>
+        public string RequiredAddin
+        {
+            get { return requiredAddin; }
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Attributes/SetCultureAttribute.cs b/src/NUnitFramework/framework/Attributes/SetCultureAttribute.cs
new file mode 100644
index 0000000..5e80470
--- /dev/null
+++ b/src/NUnitFramework/framework/Attributes/SetCultureAttribute.cs
@@ -0,0 +1,23 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework
+{
+	/// <summary>
+	/// Summary description for SetCultureAttribute.
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method|AttributeTargets.Assembly, AllowMultiple=true, Inherited=true)]
+	public class SetCultureAttribute : PropertyAttribute
+	{
+		/// <summary>
+		/// Construct given the name of a culture
+		/// </summary>
+		/// <param name="culture"></param>
+		public SetCultureAttribute( string culture ) : base( "_SETCULTURE", culture ) { }
+	}
+}
diff --git a/src/NUnitFramework/framework/Attributes/SetUICultureAttribute.cs b/src/NUnitFramework/framework/Attributes/SetUICultureAttribute.cs
new file mode 100644
index 0000000..696b7d6
--- /dev/null
+++ b/src/NUnitFramework/framework/Attributes/SetUICultureAttribute.cs
@@ -0,0 +1,23 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// Summary description for SetUICultureAttribute.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method | AttributeTargets.Assembly, AllowMultiple = true, Inherited=true)]
+    public class SetUICultureAttribute : PropertyAttribute
+    {
+        /// <summary>
+        /// Construct given the name of a culture
+        /// </summary>
+        /// <param name="culture"></param>
+        public SetUICultureAttribute(string culture) : base("_SETUICULTURE", culture) { }
+    }
+}
diff --git a/src/NUnitFramework/framework/Attributes/SetUpAttribute.cs b/src/NUnitFramework/framework/Attributes/SetUpAttribute.cs
new file mode 100644
index 0000000..b1f167d
--- /dev/null
+++ b/src/NUnitFramework/framework/Attributes/SetUpAttribute.cs
@@ -0,0 +1,19 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Framework
+{
+	using System;
+
+	/// <summary>
+	/// Attribute used to mark a class that contains one-time SetUp 
+	/// and/or TearDown methods that apply to all the tests in a
+	/// namespace or an assembly.
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Method, AllowMultiple=false, Inherited=true)]
+	public class SetUpAttribute : Attribute
+	{}
+}
diff --git a/src/NUnitFramework/framework/Attributes/SetUpFixtureAttribute.cs b/src/NUnitFramework/framework/Attributes/SetUpFixtureAttribute.cs
new file mode 100644
index 0000000..c83674e
--- /dev/null
+++ b/src/NUnitFramework/framework/Attributes/SetUpFixtureAttribute.cs
@@ -0,0 +1,18 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework
+{
+	/// <summary>
+	/// SetUpFixtureAttribute is used to identify a SetUpFixture
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Class, AllowMultiple=false, Inherited=true)]
+	public class SetUpFixtureAttribute : Attribute
+	{
+	}
+}
diff --git a/src/NUnitFramework/framework/Attributes/SuiteAttribute.cs b/src/NUnitFramework/framework/Attributes/SuiteAttribute.cs
new file mode 100644
index 0000000..6724c67
--- /dev/null
+++ b/src/NUnitFramework/framework/Attributes/SuiteAttribute.cs
@@ -0,0 +1,18 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Framework
+{
+	using System;
+
+	/// <summary>
+	/// Attribute used to mark a static (shared in VB) property
+	/// that returns a list of tests.
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Property, AllowMultiple=false, Inherited=false)]
+	public class SuiteAttribute : Attribute
+	{}
+}
diff --git a/src/NUnitFramework/framework/Attributes/TearDownAttribute.cs b/src/NUnitFramework/framework/Attributes/TearDownAttribute.cs
new file mode 100644
index 0000000..8b578f6
--- /dev/null
+++ b/src/NUnitFramework/framework/Attributes/TearDownAttribute.cs
@@ -0,0 +1,19 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Framework
+{
+	using System;
+
+	/// <summary>
+	/// Attribute used to identify a method that is called 
+	/// immediately after each test is run. The method is 
+	/// guaranteed to be called, even if an exception is thrown.
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Method, AllowMultiple=false, Inherited=true)]
+	public class TearDownAttribute : Attribute
+	{}
+}
diff --git a/src/NUnitFramework/framework/Attributes/TestAttribute.cs b/src/NUnitFramework/framework/Attributes/TestAttribute.cs
new file mode 100644
index 0000000..428fbd5
--- /dev/null
+++ b/src/NUnitFramework/framework/Attributes/TestAttribute.cs
@@ -0,0 +1,46 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Framework
+{
+	using System;
+
+	/// <summary>
+	/// Adding this attribute to a method within a <seealso cref="TestFixtureAttribute"/> 
+	/// class makes the method callable from the NUnit test runner. There is a property 
+	/// called Description which is optional which you can provide a more detailed test
+	/// description. This class cannot be inherited.
+	/// </summary>
+	/// 
+	/// <example>
+	/// [TestFixture]
+	/// public class Fixture
+	/// {
+	///   [Test]
+	///   public void MethodToTest()
+	///   {}
+	///   
+	///   [Test(Description = "more detailed description")]
+	///   publc void TestDescriptionMethod()
+	///   {}
+	/// }
+	/// </example>
+	/// 
+	[AttributeUsage(AttributeTargets.Method, AllowMultiple=false, Inherited=true)]
+	public class TestAttribute : Attribute
+	{
+		private string description;
+
+		/// <summary>
+		/// Descriptive text for this test
+		/// </summary>
+		public string Description
+		{
+			get { return description; }
+			set { description = value; }
+		}
+	}
+}
diff --git a/src/NUnitFramework/framework/Attributes/TestCaseAttribute.cs b/src/NUnitFramework/framework/Attributes/TestCaseAttribute.cs
new file mode 100644
index 0000000..6ede3a8
--- /dev/null
+++ b/src/NUnitFramework/framework/Attributes/TestCaseAttribute.cs
@@ -0,0 +1,210 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Collections.Specialized;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// TestCaseAttribute is used to mark parameterized test cases
+    /// and provide them with their arguments.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited=false)]
+    public class TestCaseAttribute : Attribute, ITestCaseData
+    {
+        private object[] arguments;
+        private object result;
+        private Type expectedExceptionType;
+        private string expectedExceptionName;
+        private string expectedMessage;
+        private MessageMatch matchType;
+        private string description;
+        private string testName;
+        private bool isIgnored;
+        private string ignoreReason;
+        private string category;
+
+        /// <summary>
+        /// Construct a TestCaseAttribute with a list of arguments.
+        /// This constructor is not CLS-Compliant
+        /// </summary>
+        /// <param name="arguments"></param>
+        public TestCaseAttribute(params object[] arguments)
+        {
+         	if (arguments == null)
+         		this.arguments = new object[] { null };
+         	else
+ 	        	this.arguments = arguments;
+        }
+
+        /// <summary>
+        /// Construct a TestCaseAttribute with a single argument
+        /// </summary>
+        /// <param name="arg"></param>
+        public TestCaseAttribute(object arg)
+        {
+            this.arguments = new object[] { arg };
+        }
+
+        /// <summary>
+        /// Construct a TestCaseAttribute with a two arguments
+        /// </summary>
+        /// <param name="arg1"></param>
+        /// <param name="arg2"></param>
+        public TestCaseAttribute(object arg1, object arg2)
+        {
+            this.arguments = new object[] { arg1, arg2 };
+        }
+
+        /// <summary>
+        /// Construct a TestCaseAttribute with a three arguments
+        /// </summary>
+        /// <param name="arg1"></param>
+        /// <param name="arg2"></param>
+        /// <param name="arg3"></param>
+        public TestCaseAttribute(object arg1, object arg2, object arg3)
+        {
+            this.arguments = new object[] { arg1, arg2, arg3 };
+        }
+
+        /// <summary>
+        /// Gets the list of arguments to a test case
+        /// </summary>
+        public object[] Arguments
+        {
+            get { return arguments; }
+        }
+
+        /// <summary>
+        /// Gets or sets the expected result.
+        /// </summary>
+        /// <value>The result.</value>
+        public object Result
+        {
+            get { return result; }
+            set { result = value; }
+        }
+
+        /// <summary>
+        /// Gets a list of categories associated with this test;
+        /// </summary>
+        public IList Categories
+        {
+            get { return category == null ? null : category.Split(','); }
+        }
+
+        /// <summary>
+        /// Gets or sets the category associated with this test.
+        /// May be a single category or a comma-separated list.
+        /// </summary>
+        public string Category
+        {
+            get { return category; }
+            set { category = value; }
+        }
+
+        /// <summary>
+        /// Gets or sets the expected exception.
+        /// </summary>
+        /// <value>The expected exception.</value>
+        public Type ExpectedException
+        {
+            get { return expectedExceptionType;  }
+            set
+            {
+                expectedExceptionType = value;
+                expectedExceptionName = expectedExceptionType.FullName;
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the name the expected exception.
+        /// </summary>
+        /// <value>The expected name of the exception.</value>
+        public string ExpectedExceptionName
+        {
+            get { return expectedExceptionName; }
+            set
+            {
+                expectedExceptionName = value;
+                expectedExceptionType = null;
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the expected message of the expected exception
+        /// </summary>
+        /// <value>The expected message of the exception.</value>
+        public string ExpectedMessage
+        {
+            get { return expectedMessage; }
+         	set { expectedMessage = value; }
+        }
+
+        /// <summary>
+        ///  Gets or sets the type of match to be performed on the expected message
+        /// </summary>
+        public MessageMatch MatchType
+        {
+            get { return matchType; }
+            set { matchType = value; }
+        }
+
+        /// <summary>
+        /// Gets or sets the description.
+        /// </summary>
+        /// <value>The description.</value>
+        public string Description
+        {
+            get { return description; }
+            set { description = value; }
+        }
+
+        /// <summary>
+        /// Gets or sets the name of the test.
+        /// </summary>
+        /// <value>The name of the test.</value>
+        public string TestName
+        {
+            get { return testName; }
+            set { testName = value; }
+        }
+
+        /// <summary>
+        /// Gets or sets the ignored status of the test
+        /// </summary>
+        public bool Ignore
+        {
+            get { return isIgnored; }
+            set { isIgnored = value; }
+        }
+
+        /// <summary>
+        /// Gets or sets the ignored status of the test
+        /// </summary>
+        public bool Ignored
+        {
+            get { return isIgnored; }
+            set { isIgnored = value; }
+        }
+
+        /// <summary>
+        /// Gets the ignore reason.
+        /// </summary>
+        /// <value>The ignore reason.</value>
+        public string IgnoreReason
+        {
+            get { return ignoreReason; }
+            set 
+            { 
+                ignoreReason = value;
+                isIgnored = ignoreReason != null && ignoreReason != string.Empty;
+            }
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Attributes/TestCaseSourceAttribute.cs b/src/NUnitFramework/framework/Attributes/TestCaseSourceAttribute.cs
new file mode 100644
index 0000000..880c363
--- /dev/null
+++ b/src/NUnitFramework/framework/Attributes/TestCaseSourceAttribute.cs
@@ -0,0 +1,59 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// FactoryAttribute indicates the source to be used to
+    /// provide test cases for a test method.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = false)]
+    public class TestCaseSourceAttribute : Attribute
+    {
+        private readonly string sourceName;
+        private readonly Type sourceType;
+
+        /// <summary>
+        /// Construct with the name of the factory - for use with languages
+        /// that don't support params arrays.
+        /// </summary>
+        /// <param name="sourceName">An array of the names of the factories that will provide data</param>
+        public TestCaseSourceAttribute(string sourceName)
+        {
+            this.sourceName = sourceName;
+        }
+
+        /// <summary>
+        /// Construct with a Type and name - for use with languages
+        /// that don't support params arrays.
+        /// </summary>
+        /// <param name="sourceType">The Type that will provide data</param>
+        /// <param name="sourceName">The name of the method, property or field that will provide data</param>
+        public TestCaseSourceAttribute(Type sourceType, string sourceName)
+        {
+            this.sourceType = sourceType;
+            this.sourceName = sourceName;
+        }
+
+        /// <summary>
+        /// The name of a the method, property or fiend to be used as a source
+        /// </summary>
+        public string SourceName
+        {
+            get { return sourceName; }   
+        }
+
+        /// <summary>
+        /// A Type to be used as a source
+        /// </summary>
+        public Type SourceType
+        {
+            get { return sourceType;  }
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Attributes/TestFixtureAttribute.cs b/src/NUnitFramework/framework/Attributes/TestFixtureAttribute.cs
new file mode 100644
index 0000000..2acd0ea
--- /dev/null
+++ b/src/NUnitFramework/framework/Attributes/TestFixtureAttribute.cs
@@ -0,0 +1,171 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Framework
+{
+	using System;
+    using System.Collections;
+
+	/// <example>
+	/// [TestFixture]
+	/// public class ExampleClass 
+	/// {}
+	/// </example>
+	[AttributeUsage(AttributeTargets.Class, AllowMultiple=true, Inherited=true)]
+	public class TestFixtureAttribute : Attribute
+	{
+		private string description;
+
+        private object[] arguments;
+        private bool isIgnored;
+        private string ignoreReason;
+        private string category;
+
+#if NET_2_0
+        private Type[] typeArgs;
+        private bool argsSeparated;
+#endif
+
+        /// <summary>
+        /// Default constructor
+        /// </summary>
+        public TestFixtureAttribute() : this( null ) { }
+        
+        /// <summary>
+        /// Construct with a object[] representing a set of arguments. 
+        /// In .NET 2.0, the arguments may later be separated into
+        /// type arguments and constructor arguments.
+        /// </summary>
+        /// <param name="arguments"></param>
+        public TestFixtureAttribute(params object[] arguments)
+        {
+            this.arguments = arguments == null
+                ? new object[0]
+                : arguments;
+
+            for (int i = 0; i < this.arguments.Length; i++)
+                if (arguments[i] is SpecialValue && (SpecialValue)arguments[i] == SpecialValue.Null)
+                    arguments[i] = null;
+        }
+
+        /// <summary>
+        /// Descriptive text for this fixture
+        /// </summary>
+        public string Description
+		{
+			get { return description; }
+			set { description = value; }
+		}
+
+        /// <summary>
+        /// Gets and sets the category for this fixture.
+        /// May be a comma-separated list of categories.
+        /// </summary>
+        public string Category
+        {
+            get { return category; }
+            set { category = value; }
+        }
+
+        /// <summary>
+        /// Gets a list of categories for this fixture
+        /// </summary>
+        public IList Categories
+        {
+            get { return category == null ? null : category.Split(','); }
+        }
+
+        /// <summary>
+        /// The arguments originally provided to the attribute
+        /// </summary>
+        public object[] Arguments
+        {
+            get 
+            {
+#if NET_2_0
+                if (!argsSeparated)
+                    SeparateArgs();
+#endif
+                return arguments; 
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets a value indicating whether this <see cref="TestFixtureAttribute"/> should be ignored.
+        /// </summary>
+        /// <value><c>true</c> if ignore; otherwise, <c>false</c>.</value>
+        public bool Ignore
+        {
+            get { return isIgnored; }
+            set { isIgnored = value; }
+        }
+
+        /// <summary>
+        /// Gets or sets the ignore reason. May set Ignored as a side effect.
+        /// </summary>
+        /// <value>The ignore reason.</value>
+        public string IgnoreReason
+        {
+            get { return ignoreReason; }
+            set
+            {
+                ignoreReason = value;
+                isIgnored = ignoreReason != null && ignoreReason != string.Empty;
+            }
+        }
+
+#if NET_2_0
+        /// <summary>
+        /// Get or set the type arguments. If not set
+        /// explicitly, any leading arguments that are
+        /// Types are taken as type arguments.
+        /// </summary>
+        public Type[] TypeArgs
+        {
+            get
+            {
+                if (!argsSeparated)
+                    SeparateArgs();
+
+                return typeArgs;
+            }
+            set 
+            { 
+                typeArgs = value;
+                argsSeparated = true;
+            }
+        }
+
+        private void SeparateArgs()
+        {
+            int cnt = 0;
+            if (arguments != null)
+            {
+                foreach (object o in arguments)
+                    if (o is Type) cnt++;
+                    else break;
+
+                typeArgs = new Type[cnt];
+                for (int i = 0; i < cnt; i++)
+                    typeArgs[i] = (Type)arguments[i];
+
+                if (cnt > 0)
+                {
+                    object[] args = new object[arguments.Length - cnt];
+                    for (int i = 0; i < args.Length; i++)
+                        args[i] = arguments[cnt + i];
+
+                    arguments = args;
+                }
+            }
+            else
+                typeArgs = new Type[0];
+
+            argsSeparated = true;
+        }
+#endif
+	}
+}
diff --git a/src/NUnitFramework/framework/Attributes/TestFixtureSetUpAttribute.cs b/src/NUnitFramework/framework/Attributes/TestFixtureSetUpAttribute.cs
new file mode 100644
index 0000000..a88a434
--- /dev/null
+++ b/src/NUnitFramework/framework/Attributes/TestFixtureSetUpAttribute.cs
@@ -0,0 +1,19 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Framework
+{
+	using System;
+
+	/// <summary>
+	/// Attribute used to identify a method that is 
+	/// called before any tests in a fixture are run.
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Method, AllowMultiple=false, Inherited=true)]
+	public class TestFixtureSetUpAttribute : Attribute
+	{
+	}
+}
diff --git a/src/NUnitFramework/framework/Attributes/TestFixtureTearDownAttribute.cs b/src/NUnitFramework/framework/Attributes/TestFixtureTearDownAttribute.cs
new file mode 100644
index 0000000..0de7357
--- /dev/null
+++ b/src/NUnitFramework/framework/Attributes/TestFixtureTearDownAttribute.cs
@@ -0,0 +1,21 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Framework
+{
+	using System;
+
+	/// <summary>
+	/// Attribute used to identify a method that is called after
+	/// all the tests in a fixture have run. The method is 
+	/// guaranteed to be called, even if an exception is thrown.
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Method, AllowMultiple=false, Inherited=true)]
+	public class TestFixtureTearDownAttribute : Attribute
+	{
+	}
+}
+
diff --git a/src/NUnitFramework/framework/Attributes/TheoryAttribute.cs b/src/NUnitFramework/framework/Attributes/TheoryAttribute.cs
new file mode 100644
index 0000000..c0467ae
--- /dev/null
+++ b/src/NUnitFramework/framework/Attributes/TheoryAttribute.cs
@@ -0,0 +1,46 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Framework
+{
+    using System;
+
+    /// <summary>
+    /// Adding this attribute to a method within a <seealso cref="TestFixtureAttribute"/> 
+    /// class makes the method callable from the NUnit test runner. There is a property 
+    /// called Description which is optional which you can provide a more detailed test
+    /// description. This class cannot be inherited.
+    /// </summary>
+    /// 
+    /// <example>
+    /// [TestFixture]
+    /// public class Fixture
+    /// {
+    ///   [Test]
+    ///   public void MethodToTest()
+    ///   {}
+    ///   
+    ///   [Test(Description = "more detailed description")]
+    ///   publc void TestDescriptionMethod()
+    ///   {}
+    /// }
+    /// </example>
+    /// 
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited=true)]
+    public class TheoryAttribute : Attribute
+    {
+        //private string description;
+
+        ///// <summary>
+        ///// Descriptive text for this test
+        ///// </summary>
+        //public string Description
+        //{
+        //    get { return description; }
+        //    set { description = value; }
+        //}
+    }
+}
diff --git a/src/NUnitFramework/framework/Attributes/ThreadingAttributes.cs b/src/NUnitFramework/framework/Attributes/ThreadingAttributes.cs
new file mode 100644
index 0000000..f145b04
--- /dev/null
+++ b/src/NUnitFramework/framework/Attributes/ThreadingAttributes.cs
@@ -0,0 +1,88 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Threading;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// WUsed on a method, marks the test with a timeout value in milliseconds. 
+    /// The test will be run in a separate thread and is cancelled if the timeout 
+    /// is exceeded. Used on a method or assembly, sets the default timeout 
+    /// for all contained test methods.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly, AllowMultiple = false, Inherited=false)]
+    public class TimeoutAttribute : PropertyAttribute
+    {
+        /// <summary>
+        /// Construct a TimeoutAttribute given a time in milliseconds
+        /// </summary>
+        /// <param name="timeout">The timeout value in milliseconds</param>
+        public TimeoutAttribute(int timeout)
+            : base(timeout) { }
+    }
+
+    /// <summary>
+    /// Marks a test that must run in the STA, causing it
+    /// to run in a separate thread if necessary.
+    /// 
+    /// On methods, you may also use STAThreadAttribute
+    /// to serve the same purpose.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly, AllowMultiple = false, Inherited=false)]
+    public class RequiresSTAAttribute : PropertyAttribute
+    {
+        /// <summary>
+        /// Construct a RequiresSTAAttribute
+        /// </summary>
+        public RequiresSTAAttribute()
+        {
+            this.Properties.Add("APARTMENT_STATE", ApartmentState.STA);
+        }
+    }
+
+    /// <summary>
+    /// Marks a test that must run in the MTA, causing it
+    /// to run in a separate thread if necessary.
+    /// 
+    /// On methods, you may also use MTAThreadAttribute
+    /// to serve the same purpose.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly, AllowMultiple = false, Inherited=false)]
+    public class RequiresMTAAttribute : PropertyAttribute
+    {
+        /// <summary>
+        /// Construct a RequiresMTAAttribute
+        /// </summary>
+        public RequiresMTAAttribute()
+        {
+            this.Properties.Add("APARTMENT_STATE", ApartmentState.MTA);
+        }
+    }
+
+    /// <summary>
+    /// Marks a test that must run on a separate thread.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly, AllowMultiple = false, Inherited=false)]
+    public class RequiresThreadAttribute : PropertyAttribute
+    {
+        /// <summary>
+        /// Construct a RequiresThreadAttribute
+        /// </summary>
+        public RequiresThreadAttribute()
+            : base(true) { }
+
+        /// <summary>
+        /// Construct a RequiresThreadAttribute, specifying the apartment
+        /// </summary>
+        public RequiresThreadAttribute(ApartmentState apartment)
+            : base(true)
+        {
+            this.Properties.Add("APARTMENT_STATE", apartment);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Attributes/ValueSourceAttribute.cs b/src/NUnitFramework/framework/Attributes/ValueSourceAttribute.cs
new file mode 100644
index 0000000..2ca55ec
--- /dev/null
+++ b/src/NUnitFramework/framework/Attributes/ValueSourceAttribute.cs
@@ -0,0 +1,59 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// ValueSourceAttribute indicates the source to be used to
+    /// provide data for one parameter of a test method.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = true, Inherited = false)]
+    public class ValueSourceAttribute : Attribute
+    {
+        private readonly string sourceName;
+        private readonly Type sourceType;
+
+        /// <summary>
+        /// Construct with the name of the factory - for use with languages
+        /// that don't support params arrays.
+        /// </summary>
+        /// <param name="sourceName">The name of the data source to be used</param>
+        public ValueSourceAttribute(string sourceName)
+        {
+            this.sourceName = sourceName;
+        }
+
+        /// <summary>
+        /// Construct with a Type and name - for use with languages
+        /// that don't support params arrays.
+        /// </summary>
+        /// <param name="sourceType">The Type that will provide data</param>
+        /// <param name="sourceName">The name of the method, property or field that will provide data</param>
+        public ValueSourceAttribute(Type sourceType, string sourceName)
+        {
+            this.sourceType = sourceType;
+            this.sourceName = sourceName;
+        }
+
+        /// <summary>
+        /// The name of a the method, property or fiend to be used as a source
+        /// </summary>
+        public string SourceName
+        {
+            get { return sourceName; }
+        }
+
+        /// <summary>
+        /// A Type to be used as a source
+        /// </summary>
+        public Type SourceType
+        {
+            get { return sourceType; }
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Attributes/ValuesAttribute.cs b/src/NUnitFramework/framework/Attributes/ValuesAttribute.cs
new file mode 100644
index 0000000..25ad5e9
--- /dev/null
+++ b/src/NUnitFramework/framework/Attributes/ValuesAttribute.cs
@@ -0,0 +1,130 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Reflection;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// Abstract base class for attributes that apply to parameters 
+    /// and supply data for the parameter.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)]
+    public abstract class ParameterDataAttribute : Attribute
+    {
+        /// <summary>
+        /// Gets the data to be provided to the specified parameter
+        /// </summary>
+        public abstract IEnumerable GetData(ParameterInfo parameter);
+    }
+
+    /// <summary>
+    /// ValuesAttribute is used to provide literal arguments for
+    /// an individual parameter of a test.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)]
+    public class ValuesAttribute : ParameterDataAttribute
+    {
+        /// <summary>
+        /// The collection of data to be returned. Must
+        /// be set by any derived attribute classes.
+        /// We use an object[] so that the individual
+        /// elements may have their type changed in GetData
+        /// if necessary.
+        /// </summary>
+        // TODO: This causes a lot of boxing so we should eliminate it.
+        protected object[] data;
+
+        /// <summary>
+        /// Construct with one argument
+        /// </summary>
+        /// <param name="arg1"></param>
+        public ValuesAttribute(object arg1)
+        {
+            data = new object[] { arg1 };
+        }
+
+        /// <summary>
+        /// Construct with two arguments
+        /// </summary>
+        /// <param name="arg1"></param>
+        /// <param name="arg2"></param>
+        public ValuesAttribute(object arg1, object arg2)
+        {
+            data = new object[] { arg1, arg2 };
+        }
+
+        /// <summary>
+        /// Construct with three arguments
+        /// </summary>
+        /// <param name="arg1"></param>
+        /// <param name="arg2"></param>
+        /// <param name="arg3"></param>
+        public ValuesAttribute(object arg1, object arg2, object arg3)
+        {
+            data = new object[] { arg1, arg2, arg3 };
+        }
+
+        /// <summary>
+        /// Construct with an array of arguments
+        /// </summary>
+        /// <param name="args"></param>
+        public ValuesAttribute(params object[] args)
+        {
+            data = args;
+        }
+
+        /// <summary>
+        /// Get the collection of values to be used as arguments
+        /// </summary>
+        public override IEnumerable GetData(ParameterInfo parameter)
+        {
+            Type targetType = parameter.ParameterType;
+
+            for (int i = 0; i < data.Length; i++)
+            {
+                object arg = data[i];
+
+                if (arg == null) 
+                    continue;
+
+                if (arg.GetType().FullName == "NUnit.Framework.SpecialValue" &&
+                    arg.ToString() == "Null")
+                {
+                    data[i] = null;
+                    continue;
+                }
+
+                if (targetType.IsAssignableFrom(arg.GetType()))
+                    continue;
+
+                if (arg is DBNull)
+                {
+                    data[i] = null;
+                    continue;
+                }
+
+                bool convert = false;
+
+                if (targetType == typeof(short) || targetType == typeof(byte) || targetType == typeof(sbyte))
+                    convert = arg is int;
+                else
+                    if (targetType == typeof(decimal))
+                        convert = arg is double || arg is string || arg is int;
+                    else
+                        if (targetType == typeof(DateTime) || targetType == typeof(TimeSpan))
+                            convert = arg is string;
+
+                if (convert)
+                    data[i] = Convert.ChangeType(arg, targetType, System.Globalization.CultureInfo.InvariantCulture);
+            }
+
+			return data;
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/CategoryAttribute.cs b/src/NUnitFramework/framework/CategoryAttribute.cs
deleted file mode 100644
index 9839d5e..0000000
--- a/src/NUnitFramework/framework/CategoryAttribute.cs
+++ /dev/null
@@ -1,50 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework
-{
-	/// <summary>
-	/// Attribute used to apply a category to a test
-	/// </summary>
-	[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method|AttributeTargets.Assembly, AllowMultiple=true)]
-	public class CategoryAttribute : Attribute
-	{
-		/// <summary>
-		/// The name of the category
-		/// </summary>
-		protected string categoryName;
-
-		/// <summary>
-		/// Construct attribute for a given category
-		/// </summary>
-		/// <param name="name">The name of the category</param>
-		public CategoryAttribute(string name)
-		{
-			this.categoryName = name;
-		}
-
-		/// <summary>
-		/// Protected constructor uses the Type name as the name
-		/// of the category.
-		/// </summary>
-		protected CategoryAttribute()
-		{
-			this.categoryName = this.GetType().Name;
-			if ( categoryName.EndsWith( "Attribute" ) )
-				categoryName = categoryName.Substring( 0, categoryName.Length - 9 );
-		}
-
-		/// <summary>
-		/// The name of the category
-		/// </summary>
-		public string Name 
-		{
-			get { return categoryName; }
-		}
-	}
-}
diff --git a/src/NUnitFramework/framework/CollectionAssert.cs b/src/NUnitFramework/framework/CollectionAssert.cs
index 05d56b7..308ae38 100644
--- a/src/NUnitFramework/framework/CollectionAssert.cs
+++ b/src/NUnitFramework/framework/CollectionAssert.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -228,7 +228,7 @@ namespace NUnit.Framework
 		/// <param name="args">Arguments to be used in formatting the message</param>
 		public static void AreEqual (IEnumerable expected, IEnumerable actual, IComparer comparer, string message, params object[] args) 
 		{
-            Assert.That(actual, new EqualConstraint(expected).Comparer(comparer), message, args);
+            Assert.That(actual, new EqualConstraint(expected).Using(comparer), message, args);
 		}
 		#endregion
 
@@ -300,8 +300,6 @@ namespace NUnit.Framework
 		/// <param name="message">The message that will be displayed on failure</param>
 		public static void AreNotEqual (IEnumerable expected, IEnumerable actual, string message)
 		{
-			//AreNotEqual(expected, actual, null, message, null);
-			//Assert.AreNotEqual( expected, actual, message );
             Assert.That(actual, new NotConstraint(new EqualConstraint(expected)), message);
 		}
 
@@ -343,7 +341,7 @@ namespace NUnit.Framework
 		/// <param name="args">Arguments to be used in formatting the message</param>
 		public static void AreNotEqual (IEnumerable expected, IEnumerable actual, IComparer comparer, string message, params object[] args)
 		{
-			Assert.That(actual, new NotConstraint(new EqualConstraint(expected).Comparer(comparer)), message, args);
+			Assert.That(actual, new NotConstraint(new EqualConstraint(expected).Using(comparer)), message, args);
 		}
 		#endregion
 
@@ -589,6 +587,71 @@ namespace NUnit.Framework
             IsNotEmpty(collection, string.Empty, null);
         }
         #endregion
+ 
+        #region IsOrdered
+        /// <summary>
+        /// Assert that an array, list or other collection is ordered
+        /// </summary>
+        /// <param name="collection">An array, list or other collection implementing IEnumerable</param>
+        /// <param name="message">The message to be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        public static void IsOrdered(IEnumerable collection, string message, params object[] args)
+        {
+            Assert.That(collection, new CollectionOrderedConstraint(), message, args);
+        }
+
+        /// <summary>
+        /// Assert that an array, list or other collection is ordered
+        /// </summary>
+        /// <param name="collection">An array, list or other collection implementing IEnumerable</param>
+        /// <param name="message">The message to be displayed on failure</param>
+        public static void IsOrdered(IEnumerable collection, string message)
+        {
+            IsOrdered(collection, message, null);
+        }
+
+        /// <summary>
+        /// Assert that an array, list or other collection is ordered
+        /// </summary>
+        /// <param name="collection">An array, list or other collection implementing IEnumerable</param>
+        public static void IsOrdered(IEnumerable collection)
+        {
+            IsOrdered(collection, string.Empty, null);
+        }
+
+        /// <summary>
+        /// Assert that an array, list or other collection is ordered
+        /// </summary>
+        /// <param name="collection">An array, list or other collection implementing IEnumerable</param>
+        /// <param name="comparer">A custom comparer to perform the comparisons</param>
+        /// <param name="message">The message to be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        public static void IsOrdered(IEnumerable collection, IComparer comparer, string message, params object[] args)
+        {
+            Assert.That(collection, new CollectionOrderedConstraint().Using(comparer), message, args);
+        }
+
+        /// <summary>
+        /// Assert that an array, list or other collection is ordered
+        /// </summary>
+        /// <param name="collection">An array, list or other collection implementing IEnumerable</param>
+        /// <param name="comparer">A custom comparer to perform the comparisons</param>
+        /// <param name="message">The message to be displayed on failure</param>
+        public static void IsOrdered(IEnumerable collection, IComparer comparer, string message)
+        {
+            IsOrdered(collection, comparer, message, null);
+        }
+
+        /// <summary>
+        /// Assert that an array, list or other collection is ordered
+        /// </summary>
+        /// <param name="collection">An array, list or other collection implementing IEnumerable</param>
+        /// <param name="comparer">A custom comparer to perform the comparisons</param>
+        public static void IsOrdered(IEnumerable collection, IComparer comparer)
+        {
+            IsOrdered(collection, comparer, string.Empty, null);
+        }
+        #endregion
     }
 }
 
diff --git a/src/NUnitFramework/framework/Constraints/AttributeConstraints.cs b/src/NUnitFramework/framework/Constraints/AttributeConstraints.cs
new file mode 100644
index 0000000..f248aa1
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/AttributeConstraints.cs
@@ -0,0 +1,138 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// AttributeExistsConstraint tests for the presence of a
+    /// specified attribute on  a Type.
+    /// </summary>
+    public class AttributeExistsConstraint : Constraint
+    {
+        private Type expectedType;
+
+        /// <summary>
+        /// Constructs an AttributeExistsConstraint for a specific attribute Type
+        /// </summary>
+        /// <param name="type"></param>
+        public AttributeExistsConstraint(Type type)
+            : base(type)
+        {
+            this.expectedType = type;
+
+            if (!typeof(Attribute).IsAssignableFrom(expectedType))
+                throw new ArgumentException(string.Format(
+                    "Type {0} is not an attribute", expectedType), "type");
+        }
+
+        /// <summary>
+        /// Tests whether the object provides the expected attribute.
+        /// </summary>
+        /// <param name="actual">A Type, MethodInfo, or other ICustomAttributeProvider</param>
+        /// <returns>True if the expected attribute is present, otherwise false</returns>
+        public override bool Matches(object actual)
+        {
+            this.actual = actual;
+            System.Reflection.ICustomAttributeProvider attrProvider =
+                actual as System.Reflection.ICustomAttributeProvider;
+
+            if (attrProvider == null)
+                throw new ArgumentException(string.Format("Actual value {0} does not implement ICustomAttributeProvider", actual), "actual");
+
+            return attrProvider.GetCustomAttributes(expectedType, true).Length > 0;
+        }
+
+        /// <summary>
+        /// Writes the description of the constraint to the specified writer
+        /// </summary>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.WritePredicate("type with attribute");
+            writer.WriteExpectedValue(expectedType);
+        }
+    }
+
+    /// <summary>
+    /// AttributeConstraint tests that a specified attribute is present
+    /// on a Type or other provider and that the value of the attribute
+    /// satisfies some other constraint.
+    /// </summary>
+    public class AttributeConstraint : PrefixConstraint
+    {
+        private Type expectedType;
+        private Attribute attrFound;
+
+        /// <summary>
+        /// Constructs an AttributeConstraint for a specified attriute
+        /// Type and base constraint.
+        /// </summary>
+        /// <param name="type"></param>
+        /// <param name="baseConstraint"></param>
+        public AttributeConstraint(Type type, Constraint baseConstraint)
+            : base( baseConstraint )
+        {
+            this.expectedType = type;
+
+            if (!typeof(Attribute).IsAssignableFrom(expectedType))
+                throw new ArgumentException(string.Format(
+                    "Type {0} is not an attribute", expectedType), "type");
+        }
+
+        /// <summary>
+        /// Determines whether the Type or other provider has the 
+        /// expected attribute and if its value matches the
+        /// additional constraint specified.
+        /// </summary>
+        public override bool Matches(object actual)
+        {
+            this.actual = actual;
+            System.Reflection.ICustomAttributeProvider attrProvider =
+                actual as System.Reflection.ICustomAttributeProvider;
+
+            if (attrProvider == null)
+                throw new ArgumentException(string.Format("Actual value {0} does not implement ICustomAttributeProvider", actual), "actual");
+
+            Attribute[] attrs = (Attribute[])attrProvider.GetCustomAttributes(expectedType, true);
+            if (attrs.Length == 0)
+                throw new ArgumentException(string.Format("Attribute {0} was not found", expectedType), "actual");
+
+            this.attrFound = attrs[0];
+            return baseConstraint.Matches(attrFound);
+        }
+
+        /// <summary>
+        /// Writes a description of the attribute to the specified writer.
+        /// </summary>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.WritePredicate("attribute " + expectedType.FullName);
+            if (baseConstraint != null)
+            {
+                if (baseConstraint is EqualConstraint)
+                    writer.WritePredicate("equal to");
+                baseConstraint.WriteDescriptionTo(writer);
+            }
+        }
+
+        /// <summary>
+        /// Writes the actual value supplied to the specified writer.
+        /// </summary>
+        public override void WriteActualValueTo(MessageWriter writer)
+        {
+            writer.WriteActualValue(attrFound);
+        }
+
+        /// <summary>
+        /// Returns a string representation of the constraint.
+        /// </summary>
+        protected override string GetStringRepresentation()
+        {
+            return string.Format("<attribute {0} {1}>", expectedType, baseConstraint);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/BasicConstraints.cs b/src/NUnitFramework/framework/Constraints/BasicConstraints.cs
new file mode 100644
index 0000000..d5a6146
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/BasicConstraints.cs
@@ -0,0 +1,118 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// BasicConstraint is the abstract base for constraints that
+    /// perform a simple comparison to a constant value.
+    /// </summary>
+    public abstract class BasicConstraint : Constraint
+    {
+        private object expected;
+        private string description;
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:BasicConstraint"/> class.
+        /// </summary>
+        /// <param name="expected">The expected.</param>
+        /// <param name="description">The description.</param>
+        public BasicConstraint(object expected, string description)
+        {
+            this.expected = expected;
+            this.description = description;
+        }
+
+        /// <summary>
+        /// Test whether the constraint is satisfied by a given value
+        /// </summary>
+        /// <param name="actual">The value to be tested</param>
+        /// <returns>True for success, false for failure</returns>
+        public override bool Matches(object actual)
+        {
+            this.actual = actual;
+
+            if (actual == null && expected == null)
+                return true;
+
+            if (actual == null || expected == null)
+                return false;
+            
+            return expected.Equals(actual);
+        }
+
+        /// <summary>
+        /// Write the constraint description to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The writer on which the description is displayed</param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.Write(description);
+        }
+    }
+
+    /// <summary>
+    /// NullConstraint tests that the actual value is null
+    /// </summary>
+    public class NullConstraint : BasicConstraint
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:NullConstraint"/> class.
+        /// </summary>
+        public NullConstraint() : base(null, "null") { }
+    }
+
+    /// <summary>
+    /// TrueConstraint tests that the actual value is true
+    /// </summary>
+    public class TrueConstraint : BasicConstraint
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:TrueConstraint"/> class.
+        /// </summary>
+        public TrueConstraint() : base(true, "True") { }
+    }
+
+    /// <summary>
+    /// FalseConstraint tests that the actual value is false
+    /// </summary>
+    public class FalseConstraint : BasicConstraint
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:FalseConstraint"/> class.
+        /// </summary>
+        public FalseConstraint() : base(false, "False") { }
+    }
+
+    /// <summary>
+    /// NaNConstraint tests that the actual value is a double or float NaN
+    /// </summary>
+    public class NaNConstraint : Constraint
+    {
+        /// <summary>
+        /// Test that the actual value is an NaN
+        /// </summary>
+        /// <param name="actual"></param>
+        /// <returns></returns>
+        public override bool Matches(object actual)
+        {
+            this.actual = actual;
+
+            return actual is double && double.IsNaN((double)actual)
+                || actual is float && float.IsNaN((float)actual);
+        }
+
+        /// <summary>
+        /// Write the constraint description to a specified writer
+        /// </summary>
+        /// <param name="writer"></param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.Write("NaN");
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/BinaryOperations.cs b/src/NUnitFramework/framework/Constraints/BinaryOperations.cs
index 6532013..2c2c27a 100644
--- a/src/NUnitFramework/framework/Constraints/BinaryOperations.cs
+++ b/src/NUnitFramework/framework/Constraints/BinaryOperations.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -9,10 +9,10 @@ using System;
 namespace NUnit.Framework.Constraints
 {
 	/// <summary>
-	/// BinaryOperation is the abstract base of all constraints
+	/// BinaryConstraint is the abstract base of all constraints
 	/// that combine two other constraints in some fashion.
 	/// </summary>
-    public abstract class BinaryOperation : Constraint
+    public abstract class BinaryConstraint : Constraint
     {
 		/// <summary>
 		/// The first constraint being combined
@@ -24,11 +24,11 @@ namespace NUnit.Framework.Constraints
 		protected Constraint right;
 
 		/// <summary>
-		/// Construct a BinaryOperation from two other constraints
+		/// Construct a BinaryConstraint from two other constraints
 		/// </summary>
 		/// <param name="left">The first constraint</param>
 		/// <param name="right">The second constraint</param>
-        public BinaryOperation(Constraint left, Constraint right)
+        public BinaryConstraint(Constraint left, Constraint right) : base(left, right)
         {
             this.left = left;
             this.right = right;
@@ -38,8 +38,17 @@ namespace NUnit.Framework.Constraints
     /// <summary>
     /// AndConstraint succeeds only if both members succeed.
     /// </summary>
-	public class AndConstraint : BinaryOperation
+	public class AndConstraint : BinaryConstraint
     {
+        private enum FailurePoint
+        {
+            None,
+            Left,
+            Right
+        };
+
+        private FailurePoint failurePoint;
+
 		/// <summary>
 		/// Create an AndConstraint from two other constraints
 		/// </summary>
@@ -56,7 +65,14 @@ namespace NUnit.Framework.Constraints
 		public override bool Matches(object actual)
         {
             this.actual = actual;
-            return left.Matches(actual) && right.Matches(actual);
+
+            failurePoint = left.Matches(actual)
+                ? right.Matches(actual)
+                    ? FailurePoint.None
+                    : FailurePoint.Right
+                : FailurePoint.Left;
+
+            return failurePoint == FailurePoint.None;
         }
 
 		/// <summary>
@@ -69,12 +85,35 @@ namespace NUnit.Framework.Constraints
             writer.WriteConnector("and");
             right.WriteDescriptionTo(writer);
         }
+
+        /// <summary>
+        /// Write the actual value for a failing constraint test to a
+        /// MessageWriter. The default implementation simply writes
+        /// the raw value of actual, leaving it to the writer to
+        /// perform any formatting.
+        /// </summary>
+        /// <param name="writer">The writer on which the actual value is displayed</param>
+        public override void WriteActualValueTo(MessageWriter writer)
+        {
+            switch (failurePoint)
+            {
+                case FailurePoint.Left:
+                    left.WriteActualValueTo(writer);
+                    break;
+                case FailurePoint.Right:
+                    right.WriteActualValueTo(writer);
+                    break;
+                default:
+                    base.WriteActualValueTo(writer);
+                    break;
+            }
+        }
     }
 
 	/// <summary>
 	/// OrConstraint succeeds if either member succeeds
 	/// </summary>
-    public class OrConstraint : BinaryOperation
+    public class OrConstraint : BinaryConstraint
     {
 		/// <summary>
 		/// Create an OrConstraint from two other constraints
diff --git a/src/NUnitFramework/framework/Constraints/CollectionConstraints.cs b/src/NUnitFramework/framework/Constraints/CollectionConstraints.cs
index 9b8ca6b..1402f34 100644
--- a/src/NUnitFramework/framework/Constraints/CollectionConstraints.cs
+++ b/src/NUnitFramework/framework/Constraints/CollectionConstraints.cs
@@ -1,11 +1,16 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
 using System.Collections;
+using System.Reflection;
+using System.Text;
+#if NET_2_0
+using System.Collections.Generic;
+#endif
 
 namespace NUnit.Framework.Constraints
 {
@@ -16,6 +21,24 @@ namespace NUnit.Framework.Constraints
     /// </summary>
     public abstract class CollectionConstraint : Constraint
     {
+        /// <summary>
+        /// Construct an empty CollectionConstraint
+        /// </summary>
+        public CollectionConstraint() { }
+
+        /// <summary>
+        /// Construct a CollectionConstraint
+        /// </summary>
+        /// <param name="arg"></param>
+        public CollectionConstraint(object arg) : base(arg) { }
+
+        /// <summary>
+        /// Determines whether the specified enumerable is empty.
+        /// </summary>
+        /// <param name="enumerable">The enumerable.</param>
+        /// <returns>
+        /// 	<c>true</c> if the specified enumerable is empty; otherwise, <c>false</c>.
+        /// </returns>
 		protected static bool IsEmpty( IEnumerable enumerable )
 		{
 			ICollection collection = enumerable as ICollection;
@@ -26,86 +49,6 @@ namespace NUnit.Framework.Constraints
 		}
 
 		/// <summary>
-		/// CollectionTally counts (tallies) the number of
-		/// occurences of each object in one or more enuerations.
-		/// </summary>
-		protected internal class CollectionTally
-		{
-			// Internal hash used to count occurences
-			private Hashtable hash = new Hashtable();
-
-			// We use this for any null entries found, since
-			// the key to a hash may not be null.
-			static object NULL = new object();
-
-			private int getTally(object obj)
-			{
-				if ( obj == null ) obj = NULL;
-				object val = hash[obj];
-				return val == null ? 0 : (int)val;
-			}
-
-			private void setTally(object obj, int tally)
-			{
-				if ( obj == null ) obj = NULL;
-				hash[obj] = tally;
-			}
-
-			/// <summary>
-			/// Construct a CollectionTally object from a collection
-			/// </summary>
-			/// <param name="c"></param>
-			public CollectionTally( IEnumerable c )
-			{
-				foreach( object obj in c )
-					setTally( obj, getTally( obj ) + 1 );
-			}
-
-			/// <summary>
-			/// Remove the counts for a collection from the tally,
-			/// so long as their are sufficient items to remove.
-			/// The tallies are not permitted to become negative.
-			/// </summary>
-			/// <param name="c">The collection to remove</param>
-			/// <returns>True if there were enough items to remove, otherwise false</returns>
-			public bool CanRemove( IEnumerable c )
-			{
-				foreach( object obj in c )
-				{
-					int tally = getTally(obj);
-					if( tally > 0 )
-						setTally(obj, tally - 1 );
-					else
-						return false;
-				}
-
-				return true;
-			}
-
-			/// <summary>
-			/// Test whether all the counts are equal to a given value
-			/// </summary>
-			/// <param name="count">The value to be looked for</param>
-			/// <returns>True if all counts are equal to the value, otherwise false</returns>
-			public bool AllCountsEqualTo( int count )
-			{
-				foreach( DictionaryEntry entry in hash )
-					if ( (int)entry.Value != count )
-						return false;
-
-				return true;
-			}
-
-			/// <summary>
-			/// Get the count of the number of times an object is present in the tally
-			/// </summary>
-			public int this[object obj]
-			{
-				get	{ return getTally(obj); }
-			}
-		}
-
-		/// <summary>
 		/// Test whether the constraint is satisfied by a given value
 		/// </summary>
 		/// <param name="actual">The value to be tested</param>
@@ -130,9 +73,122 @@ namespace NUnit.Framework.Constraints
     }
     #endregion
 
-	#region EmptyCollectionConstraint
+    #region CollectionItemsEqualConstraint
+    /// <summary>
+    /// CollectionItemsEqualConstraint is the abstract base class for all
+    /// collection constraints that apply some notion of item equality
+    /// as a part of their operation.
+    /// </summary>
+    public abstract class CollectionItemsEqualConstraint : CollectionConstraint
+    {
+		// This is internal so that ContainsConstraint can set it
+		// TODO: Figure out a way to avoid this indirection
+        internal NUnitEqualityComparer comparer = NUnitEqualityComparer.Default;
+
+        /// <summary>
+        /// Construct an empty CollectionConstraint
+        /// </summary>
+        public CollectionItemsEqualConstraint() { }
+
+        /// <summary>
+        /// Construct a CollectionConstraint
+        /// </summary>
+        /// <param name="arg"></param>
+        public CollectionItemsEqualConstraint(object arg) : base(arg) { }
+
+        #region Modifiers
+        /// <summary>
+        /// Flag the constraint to ignore case and return self.
+        /// </summary>
+        public CollectionItemsEqualConstraint IgnoreCase
+        {
+            get
+            {
+                comparer.IgnoreCase = true;
+                return this;
+            }
+        }
+
+        /// <summary>
+        /// Flag the constraint to use the supplied IComparer object.
+        /// </summary>
+        /// <param name="comparer">The IComparer object to use.</param>
+        /// <returns>Self.</returns>
+        public CollectionItemsEqualConstraint Using(IComparer comparer)
+        {
+            this.comparer.ExternalComparer = EqualityAdapter.For(comparer);
+            return this;
+        }
+
+#if NET_2_0
+        /// <summary>
+        /// Flag the constraint to use the supplied IComparer object.
+        /// </summary>
+        /// <param name="comparer">The IComparer object to use.</param>
+        /// <returns>Self.</returns>
+        public CollectionItemsEqualConstraint Using<T>(IComparer<T> comparer)
+        {
+            this.comparer.ExternalComparer = EqualityAdapter.For(comparer);
+            return this;
+        }
+
+        /// <summary>
+        /// Flag the constraint to use the supplied Comparison object.
+        /// </summary>
+        /// <param name="comparer">The IComparer object to use.</param>
+        /// <returns>Self.</returns>
+        public CollectionItemsEqualConstraint Using<T>(Comparison<T> comparer)
+        {
+            this.comparer.ExternalComparer = EqualityAdapter.For(comparer);
+            return this;
+        }
+
+        /// <summary>
+        /// Flag the constraint to use the supplied IEqualityComparer object.
+        /// </summary>
+        /// <param name="comparer">The IComparer object to use.</param>
+        /// <returns>Self.</returns>
+        public CollectionItemsEqualConstraint Using(IEqualityComparer comparer)
+        {
+            this.comparer.ExternalComparer = EqualityAdapter.For(comparer);
+            return this;
+        }
+
+        /// <summary>
+        /// Flag the constraint to use the supplied IEqualityComparer object.
+        /// </summary>
+        /// <param name="comparer">The IComparer object to use.</param>
+        /// <returns>Self.</returns>
+        public CollectionItemsEqualConstraint Using<T>(IEqualityComparer<T> comparer)
+        {
+            this.comparer.ExternalComparer = EqualityAdapter.For(comparer);
+            return this;
+        }
+#endif
+        #endregion
+
+        /// <summary>
+        /// Compares two collection members for equality
+        /// </summary>
+        protected bool ItemsEqual(object x, object y)
+        {
+            return comparer.ObjectsEqual(x, y);
+        }
+
+        /// <summary>
+        /// Return a new CollectionTally for use in making tests
+        /// </summary>
+        /// <param name="c">The collection to be included in the tally</param>
+        protected CollectionTally Tally(IEnumerable c)
+        {
+            return new CollectionTally(comparer, c);
+        }
+    }
+    #endregion
+
+    #region EmptyCollectionConstraint
     /// <summary>
-    /// EmptyCollectionConstraint tests whether a colletion is empty. 
+    /// EmptyCollectionConstraint tests whether a collection is empty. 
     /// </summary>
     public class EmptyCollectionConstraint : CollectionConstraint
 	{
@@ -162,7 +218,7 @@ namespace NUnit.Framework.Constraints
     /// UniqueItemsConstraint tests whether all the items in a 
     /// collection are unique.
     /// </summary>
-    public class UniqueItemsConstraint : CollectionConstraint
+    public class UniqueItemsConstraint : CollectionItemsEqualConstraint
     {
         /// <summary>
         /// Check that all items are unique.
@@ -171,7 +227,17 @@ namespace NUnit.Framework.Constraints
         /// <returns></returns>
         protected override bool doMatch(IEnumerable actual)
         {
-			return new CollectionTally( actual ).AllCountsEqualTo( 1 );
+            ArrayList list = new ArrayList();
+
+            foreach (object o1 in actual)
+            {
+                foreach( object o2 in list )
+                    if ( ItemsEqual(o1, o2) )
+                        return false;
+                list.Add(o1);
+            }
+
+            return true;
         }
 
         /// <summary>
@@ -190,7 +256,7 @@ namespace NUnit.Framework.Constraints
     /// CollectionContainsConstraint is used to test whether a collection
     /// contains an expected object as a member.
     /// </summary>
-    public class CollectionContainsConstraint : CollectionConstraint
+    public class CollectionContainsConstraint : CollectionItemsEqualConstraint
     {
         private object expected;
 
@@ -199,8 +265,10 @@ namespace NUnit.Framework.Constraints
         /// </summary>
         /// <param name="expected"></param>
         public CollectionContainsConstraint(object expected)
+            : base(expected)
         {
             this.expected = expected;
+            this.DisplayName = "contains";
         }
 
         /// <summary>
@@ -210,12 +278,12 @@ namespace NUnit.Framework.Constraints
         /// <returns></returns>
         protected override bool doMatch(IEnumerable actual)
         {
-			foreach (object obj in actual)
-				if ( Object.Equals( obj, expected ) )
-					return true;
+            foreach (object obj in actual)
+                if (ItemsEqual(obj, expected))
+                    return true;
 
-			return false;
-		}
+            return false;
+        }
 
         /// <summary>
         /// Write a descripton of the constraint to a MessageWriter
@@ -223,7 +291,7 @@ namespace NUnit.Framework.Constraints
         /// <param name="writer"></param>
         public override void WriteDescriptionTo(MessageWriter writer)
         {
-            writer.WritePredicate( "collection containing" );
+            writer.WritePredicate("collection containing");
             writer.WriteExpectedValue(expected);
         }
     }
@@ -234,7 +302,7 @@ namespace NUnit.Framework.Constraints
     /// CollectionEquivalentCOnstraint is used to determine whether two
     /// collections are equivalent.
     /// </summary>
-    public class CollectionEquivalentConstraint : CollectionConstraint
+    public class CollectionEquivalentConstraint : CollectionItemsEqualConstraint
     {
         private IEnumerable expected;
 
@@ -242,9 +310,10 @@ namespace NUnit.Framework.Constraints
         /// Construct a CollectionEquivalentConstraint
         /// </summary>
         /// <param name="expected"></param>
-        public CollectionEquivalentConstraint(IEnumerable expected)
+        public CollectionEquivalentConstraint(IEnumerable expected) : base(expected)
         {
             this.expected = expected;
+            this.DisplayName = "equivalent";
         }
 
         /// <summary>
@@ -259,8 +328,8 @@ namespace NUnit.Framework.Constraints
 				if( ((ICollection)actual).Count != ((ICollection)expected).Count )
 					return false;
 
-			CollectionTally tally = new CollectionTally( expected );
-			return tally.CanRemove( actual ) && tally.AllCountsEqualTo( 0 );
+            CollectionTally tally = Tally(expected);
+            return tally.TryRemove(actual) && tally.Count == 0;
         }
 
         /// <summary>
@@ -280,7 +349,7 @@ namespace NUnit.Framework.Constraints
     /// CollectionSubsetConstraint is used to determine whether
     /// one collection is a subset of another
     /// </summary>
-    public class CollectionSubsetConstraint : CollectionConstraint
+    public class CollectionSubsetConstraint : CollectionItemsEqualConstraint
     {
         private IEnumerable expected;
 
@@ -288,9 +357,10 @@ namespace NUnit.Framework.Constraints
         /// Construct a CollectionSubsetConstraint
         /// </summary>
         /// <param name="expected">The collection that the actual value is expected to be a subset of</param>
-        public CollectionSubsetConstraint(IEnumerable expected)
+        public CollectionSubsetConstraint(IEnumerable expected) : base(expected)
         {
             this.expected = expected;
+            this.DisplayName = "subsetof";
         }
 
         /// <summary>
@@ -301,8 +371,8 @@ namespace NUnit.Framework.Constraints
         /// <returns></returns>
         protected override bool doMatch(IEnumerable actual)
         {
-			return new CollectionTally( expected ).CanRemove( actual );
-		}
+            return Tally(expected).TryRemove( actual );
+        }
         
         /// <summary>
         /// Write a description of this constraint to a MessageWriter
@@ -315,4 +385,159 @@ namespace NUnit.Framework.Constraints
         }
     }
     #endregion
+
+    #region CollectionOrderedConstraint
+
+    /// <summary>
+    /// CollectionOrderedConstraint is used to test whether a collection is ordered.
+    /// </summary>
+    public class CollectionOrderedConstraint : CollectionConstraint
+    {
+        private ComparisonAdapter comparer = ComparisonAdapter.Default;
+        private string comparerName;
+        private string propertyName;
+        private bool descending;
+
+        /// <summary>
+        /// Construct a CollectionOrderedConstraint
+        /// </summary>
+        public CollectionOrderedConstraint() 
+        {
+            this.DisplayName = "ordered";
+        }
+
+        ///<summary>
+        /// If used performs a reverse comparison
+        ///</summary>
+        public CollectionOrderedConstraint Descending
+        {
+            get
+            {
+                descending = true;
+                return this;
+            }
+        }
+
+        /// <summary>
+        /// Modifies the constraint to use an IComparer and returns self.
+        /// </summary>
+        public CollectionOrderedConstraint Using(IComparer comparer)
+        {
+            this.comparer = ComparisonAdapter.For( comparer );
+            this.comparerName = comparer.GetType().FullName;
+            return this;
+        }
+
+#if NET_2_0
+        /// <summary>
+        /// Modifies the constraint to use an IComparer<T> and returns self.
+        /// </summary>
+        public CollectionOrderedConstraint Using<T>(IComparer<T> comparer)
+        {
+            this.comparer = ComparisonAdapter.For(comparer);
+            this.comparerName = comparer.GetType().FullName;
+            return this;
+        }
+
+        /// <summary>
+        /// Modifies the constraint to use a Comparison<T> and returns self.
+        /// </summary>
+        public CollectionOrderedConstraint Using<T>(Comparison<T> comparer)
+        {
+            this.comparer = ComparisonAdapter.For(comparer);
+            this.comparerName = comparer.GetType().FullName;
+            return this;
+        }
+#endif
+
+        /// <summary>
+        /// Modifies the constraint to test ordering by the value of
+        /// a specified property and returns self.
+        /// </summary>
+        public CollectionOrderedConstraint By(string propertyName)
+		{
+			this.propertyName = propertyName;
+			return this;
+		}
+
+        /// <summary>
+        /// Test whether the collection is ordered
+        /// </summary>
+        /// <param name="actual"></param>
+        /// <returns></returns>
+        protected override bool doMatch(IEnumerable actual)
+        {
+            object previous = null;
+            int index = 0;
+            foreach(object obj in actual)
+            {
+                object objToCompare = obj;
+                if (obj == null)
+                    throw new ArgumentNullException("actual", "Null value at index " + index.ToString());
+
+                if (this.propertyName != null)
+                {
+                    PropertyInfo prop = obj.GetType().GetProperty(propertyName);
+                    objToCompare = prop.GetValue(obj, null);
+                    if (objToCompare == null)
+                        throw new ArgumentNullException("actual", "Null property value at index " + index.ToString());
+                }
+
+                if (previous != null)
+                {
+                    //int comparisonResult = comparer.Compare(al[i], al[i + 1]);
+                    int comparisonResult = comparer.Compare(previous, objToCompare);
+
+                    if (descending && comparisonResult < 0)
+                        return false;
+                    if (!descending && comparisonResult > 0)
+                        return false;
+                }
+
+                previous = objToCompare;
+                index++;
+            }
+
+            return true;
+        }
+
+        /// <summary>
+        /// Write a description of the constraint to a MessageWriter
+        /// </summary>
+        /// <param name="writer"></param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            if (propertyName == null)
+                writer.Write("collection ordered");
+            else
+            {
+                writer.WritePredicate("collection ordered by");
+                writer.WriteExpectedValue(propertyName);
+            }
+
+            if (descending)
+                writer.WriteModifier("descending");
+        }
+
+        /// <summary>
+        /// Returns the string representation of the constraint.
+        /// </summary>
+        /// <returns></returns>
+        protected override string GetStringRepresentation()
+        {
+            StringBuilder sb = new StringBuilder("<ordered");
+
+            if (propertyName != null)
+                sb.Append("by " + propertyName);
+            if (descending)
+                sb.Append(" descending");
+            if (comparerName != null)
+                sb.Append(" " + comparerName);
+
+            sb.Append(">");
+
+            return sb.ToString();
+        }
+    }
+    #endregion
 }
diff --git a/src/NUnitFramework/framework/Constraints/CollectionTally.cs b/src/NUnitFramework/framework/Constraints/CollectionTally.cs
new file mode 100644
index 0000000..09247bc
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/CollectionTally.cs
@@ -0,0 +1,78 @@
+// ****************************************************************
+// Copyright 2010, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// CollectionTally counts (tallies) the number of
+    /// occurences of each object in one or more enumerations.
+    /// </summary>
+    public class CollectionTally
+    {
+        // Internal list used to track occurences
+        private ArrayList list = new ArrayList();
+
+        private NUnitEqualityComparer comparer;
+
+        /// <summary>
+        /// Construct a CollectionTally object from a comparer and a collection
+        /// </summary>
+        public CollectionTally(NUnitEqualityComparer comparer, IEnumerable c)
+        {
+            this.comparer = comparer;
+
+            foreach (object o in c)
+                list.Add(o);
+        }
+
+        /// <summary>
+        /// The number of objects remaining in the tally
+        /// </summary>
+        public int Count
+        {
+            get { return list.Count; }
+        }
+
+        private bool ItemsEqual(object expected, object actual)
+        {
+            return comparer.ObjectsEqual(expected, actual);
+        }
+
+        /// <summary>
+        /// Try to remove an object from the tally
+        /// </summary>
+        /// <param name="o">The object to remove</param>
+        /// <returns>True if successful, false if the object was not found</returns>
+        public bool TryRemove(object o)
+        {
+            for (int index = 0; index < list.Count; index++)
+                if (ItemsEqual(list[index], o))
+                {
+                    list.RemoveAt(index);
+                    return true;
+                }
+
+            return false;
+        }
+
+        /// <summary>
+        /// Try to remove a set of objects from the tally
+        /// </summary>
+        /// <param name="c">The objects to remove</param>
+        /// <returns>True if successful, false if any object was not found</returns>
+        public bool TryRemove(IEnumerable c)
+        {
+            foreach (object o in c)
+                if (!TryRemove(o))
+                    return false;
+
+            return true;
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/ComparisonAdapter.cs b/src/NUnitFramework/framework/Constraints/ComparisonAdapter.cs
new file mode 100644
index 0000000..e6fa1c2
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/ComparisonAdapter.cs
@@ -0,0 +1,156 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Reflection;
+#if NET_2_0
+using System.Collections.Generic;
+#endif
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// ComparisonAdapter class centralizes all comparisons of
+    /// values in NUnit, adapting to the use of any provided
+    /// IComparer, IComparer<T> or Comparison<T>
+    /// </summary>
+    public abstract class ComparisonAdapter
+    {
+        /// <summary>
+        /// Gets the default ComparisonAdapter, which wraps an
+        /// NUnitComparer object.
+        /// </summary>
+        public static ComparisonAdapter Default
+        {
+            get { return new DefaultComparisonAdapter(); }
+        }
+
+        /// <summary>
+        /// Returns a ComparisonAdapter that wraps an IComparer
+        /// </summary>
+        public static ComparisonAdapter For(IComparer comparer)
+        {
+            return new ComparerAdapter(comparer);
+        }
+
+#if NET_2_0
+        /// <summary>
+        /// Returns a ComparisonAdapter that wraps an IComparer<T>
+        /// </summary>
+        public static ComparisonAdapter For<T>(IComparer<T> comparer)
+        {
+            return new ComparerAdapter<T>(comparer);
+        }
+
+        /// <summary>
+        /// Returns a ComparisonAdapter that wraps a Comparison<T>
+        /// </summary>
+        public static ComparisonAdapter For<T>(Comparison<T> comparer)
+        {
+            return new ComparisonAdapterForComparison<T>(comparer);
+        }
+#endif
+
+        /// <summary>
+        /// Compares two objects
+        /// </summary>
+        public abstract int Compare(object expected, object actual);
+
+        class DefaultComparisonAdapter : ComparerAdapter
+        {
+            /// <summary>
+            /// Construct a default ComparisonAdapter
+            /// </summary>
+            public DefaultComparisonAdapter() : base( NUnitComparer.Default ) { }
+        }
+
+        class ComparerAdapter : ComparisonAdapter
+        {
+            private IComparer comparer;
+
+            /// <summary>
+            /// Construct a ComparisonAdapter for an IComparer
+            /// </summary>
+            public ComparerAdapter(IComparer comparer)
+            {
+                this.comparer = comparer;
+            }
+
+            /// <summary>
+            /// Compares two objects
+            /// </summary>
+            /// <param name="expected"></param>
+            /// <param name="actual"></param>
+            /// <returns></returns>
+            public override int Compare(object expected, object actual)
+            {
+                return comparer.Compare(expected, actual);
+            }
+        }
+
+#if NET_2_0
+        /// <summary>
+        /// ComparisonAdapter<T> extends ComparisonAdapter and
+        /// allows use of an IComparer<T> or Comparison<T>
+        /// to actually perform the comparison.
+        /// </summary>
+        class ComparerAdapter<T> : ComparisonAdapter
+        {
+            private IComparer<T> comparer;
+
+            /// <summary>
+            /// Construct a ComparisonAdapter for an IComparer<T>
+            /// </summary>
+            public ComparerAdapter(IComparer<T> comparer)
+            {
+                this.comparer = comparer;
+            }
+
+            /// <summary>
+            /// Compare a Type T to an object
+            /// </summary>
+            public override int Compare(object expected, object actual)
+            {
+                if (!typeof(T).IsAssignableFrom(expected.GetType()))
+                    throw new ArgumentException("Cannot compare " + expected.ToString());
+
+                if (!typeof(T).IsAssignableFrom(actual.GetType()))
+                    throw new ArgumentException("Cannot compare to " + actual.ToString());
+
+                return comparer.Compare((T)expected, (T)actual);
+            }
+        }
+
+        class ComparisonAdapterForComparison<T> : ComparisonAdapter
+        {
+            private Comparison<T> comparison;
+
+            /// <summary>
+            /// Construct a ComparisonAdapter for a Comparison<T>
+            /// </summary>
+            public ComparisonAdapterForComparison(Comparison<T> comparer)
+            {
+                this.comparison = comparer;
+            }
+
+            /// <summary>
+            /// Compare a Type T to an object
+            /// </summary>
+            public override int Compare(object expected, object actual)
+            {
+                if (!typeof(T).IsAssignableFrom(expected.GetType()))
+                    throw new ArgumentException("Cannot compare " + expected.ToString());
+
+                if (!typeof(T).IsAssignableFrom(actual.GetType()))
+                    throw new ArgumentException("Cannot compare to " + actual.ToString());
+
+                return comparison.Invoke((T)expected, (T)actual);
+            }
+        }
+#endif
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/ComparisonConstraints.cs b/src/NUnitFramework/framework/Constraints/ComparisonConstraints.cs
index 90ca62e..c50445f 100644
--- a/src/NUnitFramework/framework/Constraints/ComparisonConstraints.cs
+++ b/src/NUnitFramework/framework/Constraints/ComparisonConstraints.cs
@@ -1,10 +1,14 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
+using System.Collections;
+#if NET_2_0
+using System.Collections.Generic;
+#endif
 
 namespace NUnit.Framework.Constraints
 {
@@ -18,7 +22,7 @@ namespace NUnit.Framework.Constraints
         /// <summary>
         /// The value against which a comparison is to be made
         /// </summary>
-        protected IComparable expected;
+        protected object expected;
         /// <summary>
         /// If true, less than returns success
         /// </summary>
@@ -37,6 +41,11 @@ namespace NUnit.Framework.Constraints
         private string predicate;
 
         /// <summary>
+        /// ComparisonAdapter to be used in making the comparison
+        /// </summary>
+        private ComparisonAdapter comparer = ComparisonAdapter.Default;
+
+        /// <summary>
         /// Initializes a new instance of the <see cref="T:ComparisonConstraint"/> class.
         /// </summary>
         /// <param name="value">The value against which to make a comparison.</param>
@@ -44,7 +53,8 @@ namespace NUnit.Framework.Constraints
         /// <param name="eqOK">if set to <c>true</c> equal succeeds.</param>
         /// <param name="gtOK">if set to <c>true</c> greater succeeds.</param>
         /// <param name="predicate">String used in describing the constraint.</param>
-        public ComparisonConstraint(IComparable value, bool ltOK, bool eqOK, bool gtOK, string predicate)
+        public ComparisonConstraint(object value, bool ltOK, bool eqOK, bool gtOK, string predicate)
+            : base(value)
         {
             this.expected = value;
             this.ltOK = ltOK;
@@ -62,7 +72,14 @@ namespace NUnit.Framework.Constraints
         {
             this.actual = actual;
 
-			int icomp = Numerics.Compare( expected, actual );
+            if (expected == null)
+                throw new ArgumentException("Cannot compare using a null reference", "expected");
+
+            if (actual == null)
+                throw new ArgumentException("Cannot compare to null reference", "actual");
+
+            int icomp = comparer.Compare(expected, actual);
+
             return icomp < 0 && gtOK || icomp == 0 && eqOK || icomp > 0 && ltOK;
         }
 
@@ -75,6 +92,35 @@ namespace NUnit.Framework.Constraints
             writer.WritePredicate(predicate);
             writer.WriteExpectedValue(expected);
         }
+
+        /// <summary>
+        /// Modifies the constraint to use an IComparer and returns self
+        /// </summary>
+        public ComparisonConstraint Using(IComparer comparer)
+        {
+            this.comparer = ComparisonAdapter.For(comparer);
+            return this;
+        }
+
+#if NET_2_0
+        /// <summary>
+        /// Modifies the constraint to use an IComparer<T> and returns self
+        /// </summary>
+        public ComparisonConstraint Using<T>(IComparer<T> comparer)
+        {
+            this.comparer = ComparisonAdapter.For(comparer);
+            return this;
+        }
+
+        /// <summary>
+        /// Modifies the constraint to use a Comparison<T> and returns self
+        /// </summary>
+        public ComparisonConstraint Using<T>(Comparison<T> comparer)
+        {
+            this.comparer = ComparisonAdapter.For(comparer);
+            return this;
+        }
+#endif
     }
 
     /// <summary>
@@ -86,7 +132,7 @@ namespace NUnit.Framework.Constraints
         /// Initializes a new instance of the <see cref="T:GreaterThanConstraint"/> class.
         /// </summary>
         /// <param name="expected">The expected value.</param>
-        public GreaterThanConstraint(IComparable expected) : base(expected, false, false, true, "greater than") { }
+        public GreaterThanConstraint(object expected) : base(expected, false, false, true, "greater than") { }
     }
 
     /// <summary>
@@ -98,7 +144,7 @@ namespace NUnit.Framework.Constraints
         /// Initializes a new instance of the <see cref="T:GreaterThanOrEqualConstraint"/> class.
         /// </summary>
         /// <param name="expected">The expected value.</param>
-        public GreaterThanOrEqualConstraint(IComparable expected) : base(expected, false, true, true, "greater than or equal to") { }
+        public GreaterThanOrEqualConstraint(object expected) : base(expected, false, true, true, "greater than or equal to") { }
     }
 
     /// <summary>
@@ -110,7 +156,7 @@ namespace NUnit.Framework.Constraints
         /// Initializes a new instance of the <see cref="T:LessThanConstraint"/> class.
         /// </summary>
         /// <param name="expected">The expected value.</param>
-        public LessThanConstraint(IComparable expected) : base(expected, true, false, false, "less than") { }
+        public LessThanConstraint(object expected) : base(expected, true, false, false, "less than") { }
     }
 
     /// <summary>
@@ -122,6 +168,6 @@ namespace NUnit.Framework.Constraints
         /// Initializes a new instance of the <see cref="T:LessThanOrEqualConstraint"/> class.
         /// </summary>
         /// <param name="expected">The expected value.</param>
-        public LessThanOrEqualConstraint(IComparable expected) : base(expected, true, true, false, "less than or equal to") { }
+        public LessThanOrEqualConstraint(object expected) : base(expected, true, true, false, "less than or equal to") { }
     }
 }
diff --git a/src/NUnitFramework/framework/Constraints/Constraint.cs b/src/NUnitFramework/framework/Constraints/Constraint.cs
index 8e87a46..8c77f5f 100644
--- a/src/NUnitFramework/framework/Constraints/Constraint.cs
+++ b/src/NUnitFramework/framework/Constraints/Constraint.cs
@@ -1,21 +1,25 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
-using System;
-using System.IO;
 using System.Collections;
 
 namespace NUnit.Framework.Constraints
 {
-	/// <summary>
-	/// The Constraint class is the base of all built-in or
-	/// user-defined constraints in NUnit. It provides the operator
-	/// overloads used to combine constraints.
-	/// </summary>
-    public abstract class Constraint
+    /// <summary>
+    /// Delegate used to delay evaluation of the actual value
+    /// to be used in evaluating a constraint
+    /// </summary>
+    public delegate object ActualValueDelegate();
+    
+    /// <summary>
+    /// The Constraint class is the base of all built-in constraints
+    /// within NUnit. It provides the operator overloads used to combine 
+    /// constraints.
+    /// </summary>
+    public abstract class Constraint : IResolveConstraint
     {
         #region UnsetObject Class
         /// <summary>
@@ -40,102 +44,95 @@ namespace NUnit.Framework.Constraints
         protected static object UNSET = new UnsetObject();
 
 		/// <summary>
-		/// If true, all string comparisons will ignore case
-		/// </summary>
-		protected bool caseInsensitive;
+        /// The actual value being tested against a constraint
+        /// </summary>
+        protected object actual = UNSET;
 
         /// <summary>
-        /// If true, strings in error messages will be clipped
+        /// The display name of this Constraint for use by ToString()
         /// </summary>
-        protected bool clipStrings = true;
-
-		/// <summary>
-		/// If true, arrays will be treated as collections, allowing
-		/// those of different dimensions to be compared
-		/// </summary>
-		protected bool compareAsCollection;
-
-		/// <summary>
-		/// If non-zero, equality comparisons within the specified 
-		/// tolerance will succeed.
-		/// </summary>
-		protected object tolerance;
+        private string displayName;
 
         /// <summary>
-        /// IComparer object used in comparisons for some constraints.
+        /// Argument fields used by ToString();
         /// </summary>
-        protected IComparer compareWith;
+        private readonly int argcnt;
+        private readonly object arg1;
+        private readonly object arg2;
 
-		/// <summary>
-        /// The actual value being tested against a constraint
+        /// <summary>
+        /// The builder holding this constraint
         /// </summary>
-        protected object actual = UNSET;
+        private ConstraintBuilder builder;
         #endregion
 
-        #region Properties
+        #region Constructors
         /// <summary>
-		/// Flag the constraint to ignore case and return self.
-		/// </summary>
-		public virtual Constraint IgnoreCase
-		{
-			get
-			{
-				caseInsensitive = true;
-				return this;
-			}
-		}
+        /// Construct a constraint with no arguments
+        /// </summary>
+        public Constraint()
+        {
+            argcnt = 0;
+        }
 
         /// <summary>
-        /// Flag the constraint to suppress string clipping 
-        /// and return self.
+        /// Construct a constraint with one argument
         /// </summary>
-        public Constraint NoClip
+        public Constraint(object arg)
         {
-            get
-            {
-                clipStrings = false;
-                return this;
-            }
+            argcnt = 1;
+            this.arg1 = arg;
         }
 
-		/// <summary>
-		/// Flag the constraint to compare arrays as collections
-		/// and return self.
-		/// </summary>
-		public Constraint AsCollection
-		{
-			get
-			{
-				compareAsCollection = true;
-				return this;
-			}
-		}
+        /// <summary>
+        /// Construct a constraint with two arguments
+        /// </summary>
+        public Constraint(object arg1, object arg2)
+        {
+            argcnt = 2;
+            this.arg1 = arg1;
+            this.arg2 = arg2;
+        }
+        #endregion
 
+        #region Set Containing ConstraintBuilder
         /// <summary>
-        /// Flag the constraint to use a tolerance when determining equality.
-        /// Currently only used for doubles and floats.
+        /// Sets the ConstraintBuilder holding this constraint
         /// </summary>
-        /// <param name="tolerance">Tolerance to be used</param>
-        /// <returns>Self.</returns>
-        public Constraint Within(object tolerance)
-		{
-			this.tolerance = tolerance;
-			return this;
-		}
+        internal void SetBuilder(ConstraintBuilder builder)
+        {
+            this.builder = builder;
+        }
+        #endregion
 
+        #region Properties
         /// <summary>
-        /// Flag the constraint to use the supplied IComparer object.
+        /// The display name of this Constraint for use by ToString().
+        /// The default value is the name of the constraint with
+        /// trailing "Constraint" removed. Derived classes may set
+        /// this to another name in their constructors.
         /// </summary>
-        /// <param name="comparer">The IComparer object to use.</param>
-        /// <returns>Self.</returns>
-        public Constraint Comparer(IComparer comparer)
+        public string DisplayName
         {
-            this.compareWith = comparer;
-            return this;
+            get
+            {
+                if (displayName == null)
+                {
+                    displayName = this.GetType().Name.ToLower();
+                    if (displayName.EndsWith("`1") || displayName.EndsWith("`2"))
+                        displayName = displayName.Substring(0, displayName.Length - 2);
+                    if (displayName.EndsWith("constraint"))
+                        displayName = displayName.Substring(0, displayName.Length - 10);
+                }
+
+                return displayName;
+            }
+
+            set { displayName = value; }
         }
 		#endregion
 
-		#region Public Methods
+		#region Abstract and Virtual Methods
         /// <summary>
         /// Write the failure message to the MessageWriter provided
         /// as an argument. The default implementation simply passes
@@ -159,12 +156,52 @@ namespace NUnit.Framework.Constraints
         public abstract bool Matches(object actual);
 
         /// <summary>
+        /// Test whether the constraint is satisfied by an
+        /// ActualValueDelegate that returns the value to be tested.
+        /// The default implementation simply evaluates the delegate
+        /// but derived classes may override it to provide for delayed 
+        /// processing.
+        /// </summary>
+        /// <param name="del">An ActualValueDelegate</param>
+        /// <returns>True for success, false for failure</returns>
+        public virtual bool Matches(ActualValueDelegate del)
+        {
+            return Matches(del());
+        }
+
+#if NET_2_0
+        /// <summary>
+        /// Test whether the constraint is satisfied by a given reference.
+        /// The default implementation simply dereferences the value but
+        /// derived classes may override it to provide for delayed processing.
+        /// </summary>
+        /// <param name="actual">A reference to the value to be tested</param>
+        /// <returns>True for success, false for failure</returns>
+        public virtual bool Matches<T>(ref T actual)
+        {
+            return Matches(actual);
+        }
+#else
+		/// <summary>
+		/// Test whether the constraint is satisfied by a given bool reference.
+		/// The default implementation simply dereferences the value but
+		/// derived classes may override it to provide for delayed processing.
+		/// </summary>
+		/// <param name="actual">A reference to the value to be tested</param>
+		/// <returns>True for success, false for failure</returns>
+		public virtual bool Matches(ref bool actual)
+		{
+			return Matches(actual);
+		}
+#endif
+
+        /// <summary>
         /// Write the constraint description to a MessageWriter
         /// </summary>
         /// <param name="writer">The writer on which the description is displayed</param>
         public abstract void WriteDescriptionTo(MessageWriter writer);
 
-		/// <summary>
+        /// <summary>
 		/// Write the actual value for a failing constraint test to a
 		/// MessageWriter. The default implementation simply writes
 		/// the raw value of actual, leaving it to the writer to
@@ -177,6 +214,45 @@ namespace NUnit.Framework.Constraints
 		}
 		#endregion
 
+        #region ToString Override
+        /// <summary>
+        /// Default override of ToString returns the constraint DisplayName
+        /// followed by any arguments within angle brackets.
+        /// </summary>
+        /// <returns></returns>
+        public override string ToString()
+        {
+            string rep = GetStringRepresentation();
+
+            return this.builder == null ? rep : string.Format("<unresolved {0}>", rep);
+        }
+
+        /// <summary>
+        /// Returns the string representation of this constraint
+        /// </summary>
+        protected virtual string GetStringRepresentation()
+        {
+            switch (argcnt)
+            {
+                default:
+                case 0:
+                    return string.Format("<{0}>", DisplayName);
+                case 1:
+                    return string.Format("<{0} {1}>", DisplayName, _displayable(arg1));
+                case 2:
+                    return string.Format("<{0} {1} {2}>", DisplayName, _displayable(arg1), _displayable(arg2));
+            }
+        }
+
+        private string _displayable(object o)
+        {
+            if (o == null) return "null";
+
+            string fmt = o is string ? "\"{0}\"" : "{0}";
+            return string.Format(System.Globalization.CultureInfo.InvariantCulture, fmt, o);
+        }
+        #endregion
+
         #region Operator Overloads
         /// <summary>
         /// This operator creates a constraint that is satisfied only if both 
@@ -184,7 +260,9 @@ namespace NUnit.Framework.Constraints
         /// </summary>
         public static Constraint operator &(Constraint left, Constraint right)
         {
-            return new AndConstraint(left, right);
+            IResolveConstraint l = (IResolveConstraint)left;
+            IResolveConstraint r = (IResolveConstraint)right;
+            return new AndConstraint(l.Resolve(), r.Resolve());
         }
 
         /// <summary>
@@ -193,17 +271,109 @@ namespace NUnit.Framework.Constraints
         /// </summary>
         public static Constraint operator |(Constraint left, Constraint right)
         {
-            return new OrConstraint(left, right);
+            IResolveConstraint l = (IResolveConstraint)left;
+            IResolveConstraint r = (IResolveConstraint)right;
+            return new OrConstraint(l.Resolve(), r.Resolve());
         }
 
         /// <summary>
         /// This operator creates a constraint that is satisfied if the 
         /// argument constraint is not satisfied.
         /// </summary>
-        public static Constraint operator !(Constraint m)
+        public static Constraint operator !(Constraint constraint)
+        {
+            IResolveConstraint r = constraint as IResolveConstraint;
+            return new NotConstraint(r == null ? new NullConstraint() : r.Resolve());
+        }
+        #endregion
+
+        #region Binary Operators
+        /// <summary>
+        /// Returns a ConstraintExpression by appending And
+        /// to the current constraint.
+        /// </summary>
+        public ConstraintExpression And
+        {
+            get
+            {
+                ConstraintBuilder builder = this.builder;
+                if (builder == null)
+                {
+                    builder = new ConstraintBuilder();
+                    builder.Append(this);
+                }
+
+                builder.Append(new AndOperator());
+
+                return new ConstraintExpression(builder);
+            }
+        }
+
+        /// <summary>
+        /// Returns a ConstraintExpression by appending And
+        /// to the current constraint.
+        /// </summary>
+        public ConstraintExpression With
+        {
+            get { return this.And; }
+        }
+
+        /// <summary>
+        /// Returns a ConstraintExpression by appending Or
+        /// to the current constraint.
+        /// </summary>
+        public ConstraintExpression Or
+        {
+            get
+            {
+                ConstraintBuilder builder = this.builder;
+                if (builder == null)
+                {
+                    builder = new ConstraintBuilder();
+                    builder.Append(this);
+                }
+
+                builder.Append(new OrOperator());
+
+                return new ConstraintExpression(builder);
+            }
+        }
+        #endregion
+
+        #region After Modifier
+        /// <summary>
+        /// Returns a DelayedConstraint with the specified delay time.
+        /// </summary>
+        /// <param name="delayInMilliseconds">The delay in milliseconds.</param>
+        /// <returns></returns>
+        public DelayedConstraint After(int delayInMilliseconds)
+        {
+            return new DelayedConstraint(
+                builder == null ? this : builder.Resolve(),
+                delayInMilliseconds);
+        }
+
+        /// <summary>
+        /// Returns a DelayedConstraint with the specified delay time
+        /// and polling interval.
+        /// </summary>
+        /// <param name="delayInMilliseconds">The delay in milliseconds.</param>
+        /// <param name="pollingInterval">The interval at which to test the constraint.</param>
+        /// <returns></returns>
+        public DelayedConstraint After(int delayInMilliseconds, int pollingInterval)
+        {
+            return new DelayedConstraint(
+                builder == null ? this : builder.Resolve(),
+                delayInMilliseconds,
+                pollingInterval);
+        }
+        #endregion
+
+        #region IResolveConstraint Members
+        Constraint IResolveConstraint.Resolve()
         {
-            return new NotConstraint(m == null ? new EqualConstraint(null) : m);
+            return builder == null ? this : builder.Resolve();
         }
         #endregion
-	}
+    }
 }
diff --git a/src/NUnitFramework/framework/Constraints/ConstraintBuilder.cs b/src/NUnitFramework/framework/Constraints/ConstraintBuilder.cs
index 242afdf..50c0189 100644
--- a/src/NUnitFramework/framework/Constraints/ConstraintBuilder.cs
+++ b/src/NUnitFramework/framework/Constraints/ConstraintBuilder.cs
@@ -1,436 +1,269 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
 using System.Collections;
+#if NET_2_0
+using System.Collections.Generic;
+#endif
 
 namespace NUnit.Framework.Constraints
 {
     /// <summary>
-    /// ConstraintBuilder is used to resolve the Not and All properties,
-    /// which serve as prefix operators for constraints. With the addition
-    /// of an operand stack, And and Or could be supported, but we have
-    /// left them out in favor of a simpler, more type-safe implementation.
-    /// Use the & and | operator overloads to combine constraints.
+    /// ConstraintBuilder maintains the stacks that are used in
+    /// processing a ConstraintExpression. An OperatorStack
+    /// is used to hold operators that are waiting for their
+    /// operands to be reognized. a ConstraintStack holds 
+    /// input constraints as well as the results of each
+    /// operator applied.
     /// </summary>
     public class ConstraintBuilder
     {
-		private enum Op
-		{
-			Not,
-			All,
-			Some,
-			None,
-			Prop,
-		}
-
-		Stack ops = new Stack();
-
-		Stack opnds = new Stack();
-
-		/// <summary>
-		/// Implicitly convert ConstraintBuilder to an actual Constraint
-        /// at the point where the syntax demands it.
-		/// </summary>
-		/// <param name="builder"></param>
-		/// <returns></returns>
-        public static implicit operator Constraint( ConstraintBuilder builder )
-		{
-			return builder.Resolve();
-		}
-
-        #region Constraints Without Arguments
-        /// <summary>
-        /// Resolves the chain of constraints using
-        /// EqualConstraint(null) as base.
-        /// </summary>
-        public Constraint Null
-        {
-            get { return Resolve(new EqualConstraint(null)); }
-        }
-
-        /// <summary>
-        /// Resolves the chain of constraints using
-        /// EqualConstraint(true) as base.
-        /// </summary>
-        public Constraint True
-        {
-            get { return Resolve(new EqualConstraint(true)); }
-        }
-
+        #region Nested Operator Stack Class
         /// <summary>
-        /// Resolves the chain of constraints using
-        /// EqualConstraint(false) as base.
+        /// OperatorStack is a type-safe stack for holding ConstraintOperators
         /// </summary>
-        public Constraint False
+        public class OperatorStack
         {
-            get { return Resolve(new EqualConstraint(false)); }
-        }
-
-        /// <summary>
-        /// Resolves the chain of constraints using
-        /// Is.NaN as base.
-        /// </summary>
-        public Constraint NaN
-        {
-            get { return Resolve(new EqualConstraint(double.NaN)); }
-        }
-
-        /// <summary>
-        /// Resolves the chain of constraints using
-        /// Is.Empty as base.
-        /// </summary>
-        public Constraint Empty
-        {
-            get { return Resolve(new EmptyConstraint()); }
-        }
+#if NET_2_0
+            private Stack<ConstraintOperator> stack = new Stack<ConstraintOperator>();
+#else
+		    private Stack stack = new Stack();
+#endif
+            /// <summary>
+            /// Initializes a new instance of the <see cref="T:OperatorStack"/> class.
+            /// </summary>
+            /// <param name="builder">The builder.</param>
+            public OperatorStack(ConstraintBuilder builder)
+            {
+            }
 
-        /// <summary>
-        /// Resolves the chain of constraints using
-        /// Is.Unique as base.
-        /// </summary>
-        public Constraint Unique
-        {
-            get { return Resolve(new UniqueItemsConstraint()); }
-        }
-        #endregion
+            /// <summary>
+            /// Gets a value indicating whether this <see cref="T:OpStack"/> is empty.
+            /// </summary>
+            /// <value><c>true</c> if empty; otherwise, <c>false</c>.</value>
+            public bool Empty
+            {
+                get { return stack.Count == 0; }
+            }
 
-        #region Constraints with an expected value
+            /// <summary>
+            /// Gets the topmost operator without modifying the stack.
+            /// </summary>
+            /// <value>The top.</value>
+            public ConstraintOperator Top
+            {
+                get { return (ConstraintOperator)stack.Peek(); }
+            }
 
-        #region Equality and Identity
-        /// <summary>
-        /// Resolves the chain of constraints using an
-        /// EqualConstraint as base.
-        /// </summary>
-        public Constraint EqualTo(object expected)
-        {
-            return Resolve(new EqualConstraint(expected));
-        }
+            /// <summary>
+            /// Pushes the specified operator onto the stack.
+            /// </summary>
+            /// <param name="op">The op.</param>
+            public void Push(ConstraintOperator op)
+            {
+                stack.Push(op);
+            }
 
-        /// <summary>
-        /// Resolves the chain of constraints using a
-        /// SameAsConstraint as base.
-        /// </summary>
-        public Constraint SameAs(object expected)
-        {
-            return Resolve(new SameAsConstraint(expected));
+            /// <summary>
+            /// Pops the topmost operator from the stack.
+            /// </summary>
+            /// <returns></returns>
+            public ConstraintOperator Pop()
+            {
+                return (ConstraintOperator)stack.Pop();
+            }
         }
         #endregion
 
-        #region Comparison Constraints
+        #region Nested Constraint Stack Class
         /// <summary>
-        /// Resolves the chain of constraints using a
-        /// LessThanConstraint as base.
+        /// ConstraintStack is a type-safe stack for holding Constraints
         /// </summary>
-        public Constraint LessThan(IComparable expected)
+        public class ConstraintStack
         {
-            return Resolve(new LessThanConstraint(expected));
-        }
+#if NET_2_0
+            private Stack<Constraint> stack = new Stack<Constraint>();
+#else
+		    private Stack stack = new Stack();
+#endif
+            private ConstraintBuilder builder;
+
+            /// <summary>
+            /// Initializes a new instance of the <see cref="T:ConstraintStack"/> class.
+            /// </summary>
+            /// <param name="builder">The builder.</param>
+            public ConstraintStack(ConstraintBuilder builder)
+            {
+                this.builder = builder;
+            }
 
-        /// <summary>
-        /// Resolves the chain of constraints using a
-        /// GreaterThanConstraint as base.
-        /// </summary>
-        public Constraint GreaterThan(IComparable expected)
-        {
-            return Resolve(new GreaterThanConstraint(expected));
-        }
+            /// <summary>
+            /// Gets a value indicating whether this <see cref="T:ConstraintStack"/> is empty.
+            /// </summary>
+            /// <value><c>true</c> if empty; otherwise, <c>false</c>.</value>
+            public bool Empty
+            {
+                get { return stack.Count == 0; }
+            }
 
-        /// <summary>
-        /// Resolves the chain of constraints using a
-        /// LessThanOrEqualConstraint as base.
-        /// </summary>
-        public Constraint LessThanOrEqualTo(IComparable expected)
-        {
-            return Resolve(new LessThanOrEqualConstraint(expected));
-        }
+            /// <summary>
+            /// Gets the topmost constraint without modifying the stack.
+            /// </summary>
+            /// <value>The topmost constraint</value>
+            public Constraint Top
+            {
+                get { return (Constraint)stack.Peek(); }
+            }
 
-        /// <summary>
-        /// Resolves the chain of constraints using a
-        /// LessThanOrEqualConstraint as base.
-        /// </summary>
-        public Constraint AtMost(IComparable expected)
-        {
-            return Resolve(new LessThanOrEqualConstraint(expected));
-        }
+            /// <summary>
+            /// Pushes the specified constraint. As a side effect,
+            /// the constraint's builder field is set to the 
+            /// ConstraintBuilder owning this stack.
+            /// </summary>
+            /// <param name="constraint">The constraint.</param>
+            public void Push(Constraint constraint)
+            {
+                stack.Push(constraint);
+                constraint.SetBuilder( this.builder );
+            }
 
-        /// <summary>
-        /// Resolves the chain of constraints using a
-        /// GreaterThanOrEqualConstraint as base.
-        /// </summary>
-        public Constraint GreaterThanOrEqualTo(IComparable expected)
-        {
-            return Resolve(new GreaterThanOrEqualConstraint(expected));
-        }
-        /// <summary>
-        /// Resolves the chain of constraints using a
-        /// GreaterThanOrEqualConstraint as base.
-        /// </summary>
-        public Constraint AtLeast(IComparable expected)
-        {
-            return Resolve(new GreaterThanOrEqualConstraint(expected));
+            /// <summary>
+            /// Pops this topmost constrait from the stack.
+            /// As a side effect, the constraint's builder
+            /// field is set to null.
+            /// </summary>
+            /// <returns></returns>
+            public Constraint Pop()
+            {
+                Constraint constraint = (Constraint)stack.Pop();
+                constraint.SetBuilder( null );
+                return constraint;
+            }
         }
         #endregion
 
-        #region Type Constraints
-        /// <summary>
-        /// Resolves the chain of constraints using an
-        /// ExactTypeConstraint as base.
-        /// </summary>
-        public Constraint TypeOf(Type expectedType)
-        {
-            return Resolve(new ExactTypeConstraint(expectedType));
-        }
+        #region Instance Fields
+        private OperatorStack ops;
 
-        /// <summary>
-        /// Resolves the chain of constraints using an
-        /// InstanceOfTypeConstraint as base.
-        /// </summary>
-        public Constraint InstanceOfType(Type expectedType)
-        {
-            return Resolve(new InstanceOfTypeConstraint(expectedType));
-        }
+        private ConstraintStack constraints;
 
-        /// <summary>
-        /// Resolves the chain of constraints using an
-        /// AssignableFromConstraint as base.
-        /// </summary>
-        public Constraint AssignableFrom(Type expectedType)
-        {
-            return Resolve(new AssignableFromConstraint(expectedType));
-        }
+        private object lastPushed;
         #endregion
 
-		#region Containing Constraint
-		/// <summary>
-		/// Resolves the chain of constraints using a
-		/// ContainsConstraint as base. This constraint
-		/// will, in turn, make use of the appropriate
-		/// second-level constraint, depending on the
-		/// type of the actual argument.
-		/// </summary>
-		public Constraint Contains(object expected)
-		{
-			return Resolve( new ContainsConstraint(expected) );
-		}
-
-		/// <summary>
-		/// Resolves the chain of constraints using a 
-		/// CollectionContainsConstraint as base.
-        /// </summary>
-		/// <param name="expected">The expected object</param>
-		public Constraint Member( object expected )
-		{
-			return Resolve( new CollectionContainsConstraint( expected ) );
-		}
-		#endregion
-
-		#region String Constraints
-		/// <summary>
-		/// Resolves the chain of constraints using a
-		/// StartsWithConstraint as base.
-		/// </summary>
-		public Constraint StartsWith(string substring)
-        {
-            return Resolve( new StartsWithConstraint(substring) );
-        }
-
+        #region Constructor
         /// <summary>
-        /// Resolves the chain of constraints using a
-        /// StringEndingConstraint as base.
+        /// Initializes a new instance of the <see cref="T:ConstraintBuilder"/> class.
         /// </summary>
-        public Constraint EndsWith(string substring)
+        public ConstraintBuilder()
         {
-            return Resolve( new EndsWithConstraint(substring) );
+            this.ops = new OperatorStack(this);
+            this.constraints = new ConstraintStack(this);
         }
+        #endregion
 
+        #region Properties
         /// <summary>
-        /// Resolves the chain of constraints using a
-        /// StringMatchingConstraint as base.
+        /// Gets a value indicating whether this instance is resolvable.
         /// </summary>
-        public Constraint Matches(string pattern)
+        /// <value>
+        /// 	<c>true</c> if this instance is resolvable; otherwise, <c>false</c>.
+        /// </value>
+        public bool IsResolvable
         {
-            return Resolve(new RegexConstraint(pattern));
+            get { return lastPushed is Constraint || lastPushed is SelfResolvingOperator; }
         }
         #endregion
 
-        #region Collection Constraints
+        #region Public Methods
         /// <summary>
-        /// Resolves the chain of constraints using a
-        /// CollectionEquivalentConstraint as base.
+        /// Appends the specified operator to the expression by first
+        /// reducing the operator stack and then pushing the new
+        /// operator on the stack.
         /// </summary>
-        public Constraint EquivalentTo(ICollection expected)
+        /// <param name="op">The operator to push.</param>
+        public void Append(ConstraintOperator op)
         {
-            return Resolve( new CollectionEquivalentConstraint(expected) );
+            op.LeftContext = lastPushed;
+            if (lastPushed is ConstraintOperator)
+                SetTopOperatorRightContext(op);
+
+            // Reduce any lower precedence operators
+            ReduceOperatorStack(op.LeftPrecedence);
+            
+            ops.Push(op);
+            lastPushed = op;
         }
 
         /// <summary>
-        /// Resolves the chain of constraints using a
-        /// CollectionContainingConstraint as base.
-        /// </summary>
-        public Constraint CollectionContaining(object expected)
-		{
-			return Resolve( new CollectionContainsConstraint(expected) );
-		}
-
-        /// <summary>
-        /// Resolves the chain of constraints using a
-        /// CollectionSubsetConstraint as base.
+        /// Appends the specified constraint to the expresson by pushing
+        /// it on the constraint stack.
         /// </summary>
-        public Constraint SubsetOf(ICollection expected)
+        /// <param name="constraint">The constraint to push.</param>
+        public void Append(Constraint constraint)
         {
-            return Resolve(new CollectionSubsetConstraint(expected));
-        }
-        #endregion
+            if (lastPushed is ConstraintOperator)
+                SetTopOperatorRightContext(constraint);
 
-		#region Property Constraints
-        /// <summary>
-        /// Resolves the chain of constraints using a 
-        /// PropertyConstraint as base
-        /// </summary>
-		public Constraint Property( string name, object expected )
-		{
-			return Resolve( new PropertyConstraint( name, new EqualConstraint( expected ) ) );
-		}
-
-        /// <summary>
-        /// Resolves the chain of constraints using a
-        /// PropertyCOnstraint on Length as base
-        /// </summary>
-        /// <param name="length"></param>
-        /// <returns></returns>
-        public Constraint Length(int length)
-        {
-            return Property("Length", length);
+            constraints.Push(constraint);
+            lastPushed = constraint;
+            constraint.SetBuilder( this );
         }
 
         /// <summary>
-        /// Resolves the chain of constraints using a
-        /// PropertyCOnstraint on Length as base
+        /// Sets the top operator right context.
         /// </summary>
-        /// <param name="count"></param>
-        /// <returns></returns>
-        public Constraint Count(int count)
+        /// <param name="rightContext">The right context.</param>
+        private void SetTopOperatorRightContext(object rightContext)
         {
-            return Property("Count", count);
-        }
-        #endregion
-
-        #endregion
-
-        #region Prefix Operators
-		/// <summary>
-		/// Modifies the ConstraintBuilder by pushing a Not operator on the stack.
-		/// </summary>
-		public ConstraintBuilder Not
-		{
-			get
-			{
-				ops.Push(Op.Not);
-				return this;
-			}
-		}
+            // Some operators change their precedence based on
+            // the right context - save current precedence.
+            int oldPrecedence = ops.Top.LeftPrecedence;
 
-		/// <summary>
-		/// Modifies the ConstraintBuilder by pushing a Not operator on the stack.
-		/// </summary>
-		public ConstraintBuilder No
-		{
-			get
-			{
-				ops.Push(Op.Not);
-				return this;
-			}
-		}
+            ops.Top.RightContext = rightContext;
 
-		/// <summary>
-        /// Modifies the ConstraintBuilder by pushing an All operator on the stack.
-        /// </summary>
-        public ConstraintBuilder All
-        {
-            get
+            // If the precedence increased, we may be able to
+            // reduce the region of the stack below the operator
+            if (ops.Top.LeftPrecedence > oldPrecedence)
             {
-                ops.Push(Op.All);
-                return this;
+                ConstraintOperator changedOp = ops.Pop();
+                ReduceOperatorStack(changedOp.LeftPrecedence);
+                ops.Push(changedOp);
             }
         }
 
-		/// <summary>
-		/// Modifies the ConstraintBuilder by pushing a Some operator on the stack.
-		/// </summary>
-		public ConstraintBuilder Some
-		{
-			get
-			{
-				ops.Push(Op.Some);
-				return this;
-			}
-		}
-
-		/// <summary>
-        /// Modifies the constraint builder by pushing All and Not operators on the stack
-        /// </summary>
-		public ConstraintBuilder None
-		{
-			get
-			{
-				ops.Push(Op.None);
-				return this;
-			}
-		}
-
         /// <summary>
-        /// Modifies the ConstraintBuilder by pushing a Prop operator on the
-        /// ops stack and the name of the property on the opnds stack.
+        /// Reduces the operator stack until the topmost item
+        /// precedence is greater than or equal to the target precedence.
         /// </summary>
-        /// <param name="name"></param>
-        /// <returns></returns>
-        public ConstraintBuilder Property(string name)
-		{
-			ops.Push( Op.Prop );
-			opnds.Push( name );
-			return this;
-		}
-		#endregion
+        /// <param name="targetPrecedence">The target precedence.</param>
+        private void ReduceOperatorStack(int targetPrecedence)
+        {
+            while (!ops.Empty && ops.Top.RightPrecedence < targetPrecedence)
+                ops.Pop().Reduce(constraints);
+        }
 
-        #region Helper Methods
         /// <summary>
-        /// Resolve a constraint that has been recognized by applying
-        /// any pending operators and returning the resulting Constraint.
+        /// Resolves this instance, returning a Constraint. If the builder
+        /// is not currently in a resolvable state, an exception is thrown.
         /// </summary>
-        /// <returns>A constraint that incorporates all pending operators</returns>
-        private Constraint Resolve(Constraint constraint)
+        /// <returns>The resolved constraint</returns>
+        public Constraint Resolve()
         {
-            while (ops.Count > 0)
-                switch ((Op)ops.Pop())
-                {
-                    case Op.Not:
-                        constraint = new NotConstraint(constraint);
-                        break;
-                    case Op.All:
-                        constraint = new AllItemsConstraint(constraint);
-                        break;
-					case Op.Some:
-						constraint = new SomeItemsConstraint(constraint);
-						break;
-					case Op.None:
-						constraint = new NoItemConstraint(constraint);
-						break;
-					case Op.Prop:
-						constraint = new PropertyConstraint( (string)opnds.Pop(), constraint );
-						break;
-                }
+            if (!IsResolvable)
+                throw new InvalidOperationException("A partial expression may not be resolved");
 
-            return constraint;
-        }
+            while (!ops.Empty)
+            {
+                ConstraintOperator op = ops.Pop();
+                op.Reduce(constraints);
+            }
 
-		private Constraint Resolve()
-		{
-			return Resolve(null);
-		}
+            return constraints.Pop();
+        }
         #endregion
     }
 }
diff --git a/src/NUnitFramework/framework/Constraints/ConstraintExpression.cs b/src/NUnitFramework/framework/Constraints/ConstraintExpression.cs
new file mode 100644
index 0000000..b04f63a
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/ConstraintExpression.cs
@@ -0,0 +1,761 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+// ****************************************************************
+//              Generated by the NUnit Syntax Generator
+//
+// Command Line: GenSyntax.exe SyntaxElements.txt
+// 
+//                  DO NOT MODIFY THIS FILE DIRECTLY
+// ****************************************************************
+
+using System;
+using System.Collections;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// ConstraintExpression represents a compound constraint in the 
+    /// process of being constructed from a series of syntactic elements.
+    /// 
+    /// Individual elements are appended to the expression as they are
+    /// reognized. Once an actual Constraint is appended, the expression
+    /// returns a resolvable Constraint.
+    /// </summary>
+    public class ConstraintExpression : ConstraintExpressionBase
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:ConstraintExpression"/> class.
+        /// </summary>
+        public ConstraintExpression() { }
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:ConstraintExpression"/> 
+        /// class passing in a ConstraintBuilder, which may be pre-populated.
+        /// </summary>
+        /// <param name="builder">The builder.</param>
+        public ConstraintExpression(ConstraintBuilder builder)
+            : base( builder ) { }
+
+        #region Not
+        
+        /// <summary>
+        /// Returns a ConstraintExpression that negates any
+        /// following constraint.
+        /// </summary>
+        public ConstraintExpression Not
+        {
+            get { return this.Append(new NotOperator()); }
+        }
+        
+        /// <summary>
+        /// Returns a ConstraintExpression that negates any
+        /// following constraint.
+        /// </summary>
+        public ConstraintExpression No
+        {
+            get { return this.Append(new NotOperator()); }
+        }
+        
+        #endregion
+        
+        #region All
+        
+        /// <summary>
+        /// Returns a ConstraintExpression, which will apply
+        /// the following constraint to all members of a collection,
+        /// succeeding if all of them succeed.
+        /// </summary>
+        public ConstraintExpression All
+        {
+            get { return this.Append(new AllOperator()); }
+        }
+        
+        #endregion
+        
+        #region Some
+        
+        /// <summary>
+        /// Returns a ConstraintExpression, which will apply
+        /// the following constraint to all members of a collection,
+        /// succeeding if at least one of them succeeds.
+        /// </summary>
+        public ConstraintExpression Some
+        {
+            get { return this.Append(new SomeOperator()); }
+        }
+        
+        #endregion
+        
+        #region None
+        
+        /// <summary>
+        /// Returns a ConstraintExpression, which will apply
+        /// the following constraint to all members of a collection,
+        /// succeeding if all of them fail.
+        /// </summary>
+        public ConstraintExpression None
+        {
+            get { return this.Append(new NoneOperator()); }
+        }
+        
+        #endregion
+        
+        #region Property
+        
+        /// <summary>
+        /// Returns a new PropertyConstraintExpression, which will either
+        /// test for the existence of the named property on the object
+        /// being tested or apply any following constraint to that property.
+        /// </summary>
+        public ResolvableConstraintExpression Property(string name)
+        {
+            return this.Append(new PropOperator(name));
+        }
+        
+        #endregion
+        
+        #region Length
+        
+        /// <summary>
+        /// Returns a new ConstraintExpression, which will apply the following
+        /// constraint to the Length property of the object being tested.
+        /// </summary>
+        public ResolvableConstraintExpression Length
+        {
+            get { return Property("Length"); }
+        }
+        
+        #endregion
+        
+        #region Count
+        
+        /// <summary>
+        /// Returns a new ConstraintExpression, which will apply the following
+        /// constraint to the Count property of the object being tested.
+        /// </summary>
+        public ResolvableConstraintExpression Count
+        {
+            get { return Property("Count"); }
+        }
+        
+        #endregion
+        
+        #region Message
+        
+        /// <summary>
+        /// Returns a new ConstraintExpression, which will apply the following
+        /// constraint to the Message property of the object being tested.
+        /// </summary>
+        public ResolvableConstraintExpression Message
+        {
+            get { return Property("Message"); }
+        }
+        
+        #endregion
+        
+        #region InnerException
+        
+        /// <summary>
+        /// Returns a new ConstraintExpression, which will apply the following
+        /// constraint to the InnerException property of the object being tested.
+        /// </summary>
+        public ResolvableConstraintExpression InnerException
+        {
+            get { return Property("InnerException"); }
+        }
+        
+        #endregion
+        
+        #region Attribute
+        
+        /// <summary>
+        /// Returns a new AttributeConstraint checking for the
+        /// presence of a particular attribute on an object.
+        /// </summary>
+        public ResolvableConstraintExpression Attribute(Type expectedType)
+        {
+            return this.Append(new AttributeOperator(expectedType));
+        }
+        
+#if NET_2_0
+        /// <summary>
+        /// Returns a new AttributeConstraint checking for the
+        /// presence of a particular attribute on an object.
+        /// </summary>
+        public ResolvableConstraintExpression Attribute<T>()
+        {
+            return Attribute(typeof(T));
+        }
+        
+#endif
+        #endregion
+        
+        #region With
+        
+        /// <summary>
+        /// With is currently a NOP - reserved for future use.
+        /// </summary>
+        public ConstraintExpression With
+        {
+            get { return this.Append(new WithOperator()); }
+        }
+        
+        #endregion
+        
+        #region Matches
+        
+        /// <summary>
+        /// Returns the constraint provided as an argument - used to allow custom
+        /// custom constraints to easily participate in the syntax.
+        /// </summary>
+        public Constraint Matches(Constraint constraint)
+        {
+            return this.Append(constraint);
+        }
+        
+#if NET_2_0
+        /// <summary>
+        /// Returns the constraint provided as an argument - used to allow custom
+        /// custom constraints to easily participate in the syntax.
+        /// </summary>
+        public Constraint Matches<T>(Predicate<T> predicate)
+        {
+            return this.Append(new PredicateConstraint<T>(predicate));
+        }
+        
+#endif
+        #endregion
+        
+        #region Null
+        
+        /// <summary>
+        /// Returns a constraint that tests for null
+        /// </summary>
+        public NullConstraint Null
+        {
+            get { return (NullConstraint)this.Append(new NullConstraint()); }
+        }
+        
+        #endregion
+        
+        #region True
+        
+        /// <summary>
+        /// Returns a constraint that tests for True
+        /// </summary>
+        public TrueConstraint True
+        {
+            get { return (TrueConstraint)this.Append(new TrueConstraint()); }
+        }
+        
+        #endregion
+        
+        #region False
+        
+        /// <summary>
+        /// Returns a constraint that tests for False
+        /// </summary>
+        public FalseConstraint False
+        {
+            get { return (FalseConstraint)this.Append(new FalseConstraint()); }
+        }
+        
+        #endregion
+        
+        #region NaN
+        
+        /// <summary>
+        /// Returns a constraint that tests for NaN
+        /// </summary>
+        public NaNConstraint NaN
+        {
+            get { return (NaNConstraint)this.Append(new NaNConstraint()); }
+        }
+        
+        #endregion
+        
+        #region Empty
+        
+        /// <summary>
+        /// Returns a constraint that tests for empty
+        /// </summary>
+        public EmptyConstraint Empty
+        {
+            get { return (EmptyConstraint)this.Append(new EmptyConstraint()); }
+        }
+        
+        #endregion
+        
+        #region Unique
+        
+        /// <summary>
+        /// Returns a constraint that tests whether a collection 
+        /// contains all unique items.
+        /// </summary>
+        public UniqueItemsConstraint Unique
+        {
+            get { return (UniqueItemsConstraint)this.Append(new UniqueItemsConstraint()); }
+        }
+        
+        #endregion
+        
+        #region BinarySerializable
+        
+        /// <summary>
+        /// Returns a constraint that tests whether an object graph is serializable in binary format.
+        /// </summary>
+        public BinarySerializableConstraint BinarySerializable
+        {
+            get { return (BinarySerializableConstraint)this.Append(new BinarySerializableConstraint()); }
+        }
+        
+        #endregion
+        
+        #region XmlSerializable
+        
+        /// <summary>
+        /// Returns a constraint that tests whether an object graph is serializable in xml format.
+        /// </summary>
+        public XmlSerializableConstraint XmlSerializable
+        {
+            get { return (XmlSerializableConstraint)this.Append(new XmlSerializableConstraint()); }
+        }
+        
+        #endregion
+        
+        #region EqualTo
+        
+        /// <summary>
+        /// Returns a constraint that tests two items for equality
+        /// </summary>
+        public EqualConstraint EqualTo(object expected)
+        {
+            return (EqualConstraint)this.Append(new EqualConstraint(expected));
+        }
+        
+        #endregion
+        
+        #region SameAs
+        
+        /// <summary>
+        /// Returns a constraint that tests that two references are the same object
+        /// </summary>
+        public SameAsConstraint SameAs(object expected)
+        {
+            return (SameAsConstraint)this.Append(new SameAsConstraint(expected));
+        }
+        
+        #endregion
+        
+        #region GreaterThan
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the
+        /// actual value is greater than the suppled argument
+        /// </summary>
+        public GreaterThanConstraint GreaterThan(object expected)
+        {
+            return (GreaterThanConstraint)this.Append(new GreaterThanConstraint(expected));
+        }
+        
+        #endregion
+        
+        #region GreaterThanOrEqualTo
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the
+        /// actual value is greater than or equal to the suppled argument
+        /// </summary>
+        public GreaterThanOrEqualConstraint GreaterThanOrEqualTo(object expected)
+        {
+            return (GreaterThanOrEqualConstraint)this.Append(new GreaterThanOrEqualConstraint(expected));
+        }
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the
+        /// actual value is greater than or equal to the suppled argument
+        /// </summary>
+        public GreaterThanOrEqualConstraint AtLeast(object expected)
+        {
+            return (GreaterThanOrEqualConstraint)this.Append(new GreaterThanOrEqualConstraint(expected));
+        }
+        
+        #endregion
+        
+        #region LessThan
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the
+        /// actual value is less than the suppled argument
+        /// </summary>
+        public LessThanConstraint LessThan(object expected)
+        {
+            return (LessThanConstraint)this.Append(new LessThanConstraint(expected));
+        }
+        
+        #endregion
+        
+        #region LessThanOrEqualTo
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the
+        /// actual value is less than or equal to the suppled argument
+        /// </summary>
+        public LessThanOrEqualConstraint LessThanOrEqualTo(object expected)
+        {
+            return (LessThanOrEqualConstraint)this.Append(new LessThanOrEqualConstraint(expected));
+        }
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the
+        /// actual value is less than or equal to the suppled argument
+        /// </summary>
+        public LessThanOrEqualConstraint AtMost(object expected)
+        {
+            return (LessThanOrEqualConstraint)this.Append(new LessThanOrEqualConstraint(expected));
+        }
+        
+        #endregion
+        
+        #region TypeOf
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the actual
+        /// value is of the exact type supplied as an argument.
+        /// </summary>
+        public ExactTypeConstraint TypeOf(Type expectedType)
+        {
+            return (ExactTypeConstraint)this.Append(new ExactTypeConstraint(expectedType));
+        }
+        
+#if NET_2_0
+        /// <summary>
+        /// Returns a constraint that tests whether the actual
+        /// value is of the exact type supplied as an argument.
+        /// </summary>
+        public ExactTypeConstraint TypeOf<T>()
+        {
+            return (ExactTypeConstraint)this.Append(new ExactTypeConstraint(typeof(T)));
+        }
+        
+#endif
+        #endregion
+        
+        #region InstanceOf
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is of the type supplied as an argument or a derived type.
+        /// </summary>
+        public InstanceOfTypeConstraint InstanceOf(Type expectedType)
+        {
+            return (InstanceOfTypeConstraint)this.Append(new InstanceOfTypeConstraint(expectedType));
+        }
+        
+#if NET_2_0
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is of the type supplied as an argument or a derived type.
+        /// </summary>
+        public InstanceOfTypeConstraint InstanceOf<T>()
+        {
+            return (InstanceOfTypeConstraint)this.Append(new InstanceOfTypeConstraint(typeof(T)));
+        }
+        
+#endif
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is of the type supplied as an argument or a derived type.
+        /// </summary>
+        [Obsolete("Use InstanceOf(expectedType)")]
+        public InstanceOfTypeConstraint InstanceOfType(Type expectedType)
+        {
+            return (InstanceOfTypeConstraint)this.Append(new InstanceOfTypeConstraint(expectedType));
+        }
+        
+#if NET_2_0
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is of the type supplied as an argument or a derived type.
+        /// </summary>
+        [Obsolete("Use InstanceOf<T>()")]
+        public InstanceOfTypeConstraint InstanceOfType<T>()
+        {
+            return (InstanceOfTypeConstraint)this.Append(new InstanceOfTypeConstraint(typeof(T)));
+        }
+        
+#endif
+        #endregion
+        
+        #region AssignableFrom
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is assignable from the type supplied as an argument.
+        /// </summary>
+        public AssignableFromConstraint AssignableFrom(Type expectedType)
+        {
+            return (AssignableFromConstraint)this.Append(new AssignableFromConstraint(expectedType));
+        }
+        
+#if NET_2_0
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is assignable from the type supplied as an argument.
+        /// </summary>
+        public AssignableFromConstraint AssignableFrom<T>()
+        {
+            return (AssignableFromConstraint)this.Append(new AssignableFromConstraint(typeof(T)));
+        }
+        
+#endif
+        #endregion
+        
+        #region AssignableTo
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is assignable from the type supplied as an argument.
+        /// </summary>
+        public AssignableToConstraint AssignableTo(Type expectedType)
+        {
+            return (AssignableToConstraint)this.Append(new AssignableToConstraint(expectedType));
+        }
+        
+#if NET_2_0
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is assignable from the type supplied as an argument.
+        /// </summary>
+        public AssignableToConstraint AssignableTo<T>()
+        {
+            return (AssignableToConstraint)this.Append(new AssignableToConstraint(typeof(T)));
+        }
+        
+#endif
+        #endregion
+        
+        #region EquivalentTo
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is a collection containing the same elements as the 
+        /// collection supplied as an argument.
+        /// </summary>
+        public CollectionEquivalentConstraint EquivalentTo(IEnumerable expected)
+        {
+            return (CollectionEquivalentConstraint)this.Append(new CollectionEquivalentConstraint(expected));
+        }
+        
+        #endregion
+        
+        #region SubsetOf
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is a subset of the collection supplied as an argument.
+        /// </summary>
+        public CollectionSubsetConstraint SubsetOf(IEnumerable expected)
+        {
+            return (CollectionSubsetConstraint)this.Append(new CollectionSubsetConstraint(expected));
+        }
+        
+        #endregion
+        
+        #region Ordered
+        
+        /// <summary>
+        /// Returns a constraint that tests whether a collection is ordered
+        /// </summary>
+        public CollectionOrderedConstraint Ordered
+        {
+            get { return (CollectionOrderedConstraint)this.Append(new CollectionOrderedConstraint()); }
+        }
+        
+        #endregion
+        
+        #region Member
+        
+        /// <summary>
+        /// Returns a new CollectionContainsConstraint checking for the
+        /// presence of a particular object in the collection.
+        /// </summary>
+        public CollectionContainsConstraint Member(object expected)
+        {
+            return (CollectionContainsConstraint)this.Append(new CollectionContainsConstraint(expected));
+        }
+        
+        /// <summary>
+        /// Returns a new CollectionContainsConstraint checking for the
+        /// presence of a particular object in the collection.
+        /// </summary>
+        public CollectionContainsConstraint Contains(object expected)
+        {
+            return (CollectionContainsConstraint)this.Append(new CollectionContainsConstraint(expected));
+        }
+        
+        #endregion
+        
+        #region Contains
+        
+        /// <summary>
+        /// Returns a new ContainsConstraint. This constraint
+        /// will, in turn, make use of the appropriate second-level
+        /// constraint, depending on the type of the actual argument. 
+        /// This overload is only used if the item sought is a string,
+        /// since any other type implies that we are looking for a 
+        /// collection member.
+        /// </summary>
+        public ContainsConstraint Contains(string expected)
+        {
+            return (ContainsConstraint)this.Append(new ContainsConstraint(expected));
+        }
+        
+        #endregion
+        
+        #region StringContaining
+        
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value contains the substring supplied as an argument.
+        /// </summary>
+        public SubstringConstraint StringContaining(string expected)
+        {
+            return (SubstringConstraint)this.Append(new SubstringConstraint(expected));
+        }
+        
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value contains the substring supplied as an argument.
+        /// </summary>
+        public SubstringConstraint ContainsSubstring(string expected)
+        {
+            return (SubstringConstraint)this.Append(new SubstringConstraint(expected));
+        }
+        
+        #endregion
+        
+        #region StartsWith
+        
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value starts with the substring supplied as an argument.
+        /// </summary>
+        public StartsWithConstraint StartsWith(string expected)
+        {
+            return (StartsWithConstraint)this.Append(new StartsWithConstraint(expected));
+        }
+        
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value starts with the substring supplied as an argument.
+        /// </summary>
+        public StartsWithConstraint StringStarting(string expected)
+        {
+            return (StartsWithConstraint)this.Append(new StartsWithConstraint(expected));
+        }
+        
+        #endregion
+        
+        #region EndsWith
+        
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value ends with the substring supplied as an argument.
+        /// </summary>
+        public EndsWithConstraint EndsWith(string expected)
+        {
+            return (EndsWithConstraint)this.Append(new EndsWithConstraint(expected));
+        }
+        
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value ends with the substring supplied as an argument.
+        /// </summary>
+        public EndsWithConstraint StringEnding(string expected)
+        {
+            return (EndsWithConstraint)this.Append(new EndsWithConstraint(expected));
+        }
+        
+        #endregion
+        
+        #region Matches
+        
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value matches the Regex pattern supplied as an argument.
+        /// </summary>
+        public RegexConstraint Matches(string pattern)
+        {
+            return (RegexConstraint)this.Append(new RegexConstraint(pattern));
+        }
+        
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value matches the Regex pattern supplied as an argument.
+        /// </summary>
+        public RegexConstraint StringMatching(string pattern)
+        {
+            return (RegexConstraint)this.Append(new RegexConstraint(pattern));
+        }
+        
+        #endregion
+        
+        #region SamePath
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the path provided 
+        /// is the same as an expected path after canonicalization.
+        /// </summary>
+        public SamePathConstraint SamePath(string expected)
+        {
+            return (SamePathConstraint)this.Append(new SamePathConstraint(expected));
+        }
+        
+        #endregion
+        
+        #region SubPath
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the path provided 
+        /// is the same path or under an expected path after canonicalization.
+        /// </summary>
+        public SubPathConstraint SubPath(string expected)
+        {
+            return (SubPathConstraint)this.Append(new SubPathConstraint(expected));
+        }
+        
+        #endregion
+        
+        #region SamePathOrUnder
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the path provided 
+        /// is the same path or under an expected path after canonicalization.
+        /// </summary>
+        public SamePathOrUnderConstraint SamePathOrUnder(string expected)
+        {
+            return (SamePathOrUnderConstraint)this.Append(new SamePathOrUnderConstraint(expected));
+        }
+        
+        #endregion
+        
+        #region InRange
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value falls 
+        /// within a specified range.
+        /// </summary>
+        public RangeConstraint InRange(IComparable from, IComparable to)
+        {
+            return (RangeConstraint)this.Append(new RangeConstraint(from, to));
+        }
+        
+        #endregion
+        
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/ConstraintExpressionBase.cs b/src/NUnitFramework/framework/Constraints/ConstraintExpressionBase.cs
new file mode 100644
index 0000000..ba00b75
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/ConstraintExpressionBase.cs
@@ -0,0 +1,101 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// ConstraintExpressionBase is the abstract base class for the 
+    /// generated ConstraintExpression class, which represents a 
+    /// compound constraint in the process of being constructed 
+    /// from a series of syntactic elements.
+    /// 
+    /// NOTE: ConstraintExpressionBase is aware of some of its
+    /// derived classes, which is an apparent violation of 
+    /// encapsulation. Ideally, these classes would be a 
+    /// single class, but they must be separated in order to
+    /// allow parts to be generated under .NET 1.x and to
+    /// provide proper user feedback in syntactically 
+    /// aware IDEs.
+    /// </summary>
+    public abstract class ConstraintExpressionBase
+    {
+        #region Instance Fields
+        /// <summary>
+        /// The ConstraintBuilder holding the elements recognized so far
+        /// </summary>
+        protected ConstraintBuilder builder;
+        #endregion
+
+        #region Constructors
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:ConstraintExpressionBase"/> class.
+        /// </summary>
+        public ConstraintExpressionBase()
+        {
+            this.builder = new ConstraintBuilder();
+        }
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:ConstraintExpressionBase"/> 
+        /// class passing in a ConstraintBuilder, which may be pre-populated.
+        /// </summary>
+        /// <param name="builder">The builder.</param>
+        public ConstraintExpressionBase(ConstraintBuilder builder)
+        {
+            this.builder = builder;
+        }
+        #endregion
+
+        #region ToString()
+        /// <summary>
+        /// Returns a string representation of the expression as it
+        /// currently stands. This should only be used for testing,
+        /// since it has the side-effect of resolving the expression.
+        /// </summary>
+        /// <returns></returns>
+        public override string ToString()
+        {
+            return builder.Resolve().ToString();
+        }
+        #endregion
+
+        #region Append Methods
+        /// <summary>
+        /// Appends an operator to the expression and returns the
+        /// resulting expression itself.
+        /// </summary>
+        public ConstraintExpression Append(ConstraintOperator op)
+        {
+            builder.Append(op);
+            return (ConstraintExpression)this;
+        }
+
+        /// <summary>
+        /// Appends a self-resolving operator to the expression and
+        /// returns a new ResolvableConstraintExpression.
+        /// </summary>
+        public ResolvableConstraintExpression Append(SelfResolvingOperator op)
+        {
+            builder.Append(op);
+            return new ResolvableConstraintExpression(builder);
+        }
+
+        /// <summary>
+        /// Appends a constraint to the expression and returns that
+        /// constraint, which is associated with the current state
+        /// of the expression being built.
+        /// </summary>
+        public Constraint Append(Constraint constraint)
+        {
+            builder.Append(constraint);
+            return constraint;
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/ConstraintFactory.cs b/src/NUnitFramework/framework/Constraints/ConstraintFactory.cs
new file mode 100644
index 0000000..ece41e0
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/ConstraintFactory.cs
@@ -0,0 +1,760 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+// ****************************************************************
+//              Generated by the NUnit Syntax Generator
+//
+// Command Line: GenSyntax.exe SyntaxElements.txt
+// 
+//                  DO NOT MODIFY THIS FILE DIRECTLY
+// ****************************************************************
+
+using System;
+using System.Collections;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// Helper class with properties and methods that supply
+    /// a number of constraints used in Asserts.
+    /// </summary>
+    public class ConstraintFactory
+    {
+        #region Not
+        
+        /// <summary>
+        /// Returns a ConstraintExpression that negates any
+        /// following constraint.
+        /// </summary>
+        public ConstraintExpression Not
+        {
+            get { return Is.Not; }
+        }
+        
+        /// <summary>
+        /// Returns a ConstraintExpression that negates any
+        /// following constraint.
+        /// </summary>
+        public ConstraintExpression No
+        {
+            get { return Has.No; }
+        }
+        
+        #endregion
+        
+        #region All
+        
+        /// <summary>
+        /// Returns a ConstraintExpression, which will apply
+        /// the following constraint to all members of a collection,
+        /// succeeding if all of them succeed.
+        /// </summary>
+        public ConstraintExpression All
+        {
+            get { return Is.All; }
+        }
+        
+        #endregion
+        
+        #region Some
+        
+        /// <summary>
+        /// Returns a ConstraintExpression, which will apply
+        /// the following constraint to all members of a collection,
+        /// succeeding if at least one of them succeeds.
+        /// </summary>
+        public ConstraintExpression Some
+        {
+            get { return Has.Some; }
+        }
+        
+        #endregion
+        
+        #region None
+        
+        /// <summary>
+        /// Returns a ConstraintExpression, which will apply
+        /// the following constraint to all members of a collection,
+        /// succeeding if all of them fail.
+        /// </summary>
+        public ConstraintExpression None
+        {
+            get { return Has.None; }
+        }
+        
+        #endregion
+        
+        #region Property
+        
+        /// <summary>
+        /// Returns a new PropertyConstraintExpression, which will either
+        /// test for the existence of the named property on the object
+        /// being tested or apply any following constraint to that property.
+        /// </summary>
+        public ResolvableConstraintExpression Property(string name)
+        {
+            return Has.Property(name);
+        }
+        
+        #endregion
+        
+        #region Length
+        
+        /// <summary>
+        /// Returns a new ConstraintExpression, which will apply the following
+        /// constraint to the Length property of the object being tested.
+        /// </summary>
+        public ResolvableConstraintExpression Length
+        {
+            get { return Has.Length; }
+        }
+        
+        #endregion
+        
+        #region Count
+        
+        /// <summary>
+        /// Returns a new ConstraintExpression, which will apply the following
+        /// constraint to the Count property of the object being tested.
+        /// </summary>
+        public ResolvableConstraintExpression Count
+        {
+            get { return Has.Count; }
+        }
+        
+        #endregion
+        
+        #region Message
+        
+        /// <summary>
+        /// Returns a new ConstraintExpression, which will apply the following
+        /// constraint to the Message property of the object being tested.
+        /// </summary>
+        public ResolvableConstraintExpression Message
+        {
+            get { return Has.Message; }
+        }
+        
+        #endregion
+        
+        #region InnerException
+        
+        /// <summary>
+        /// Returns a new ConstraintExpression, which will apply the following
+        /// constraint to the InnerException property of the object being tested.
+        /// </summary>
+        public ResolvableConstraintExpression InnerException
+        {
+            get { return Has.InnerException; }
+        }
+        
+        #endregion
+        
+        #region Attribute
+        
+        /// <summary>
+        /// Returns a new AttributeConstraint checking for the
+        /// presence of a particular attribute on an object.
+        /// </summary>
+        public ResolvableConstraintExpression Attribute(Type expectedType)
+        {
+            return Has.Attribute(expectedType);
+        }
+        
+#if NET_2_0
+        /// <summary>
+        /// Returns a new AttributeConstraint checking for the
+        /// presence of a particular attribute on an object.
+        /// </summary>
+        public ResolvableConstraintExpression Attribute<T>()
+        {
+            return Attribute(typeof(T));
+        }
+        
+#endif
+        #endregion
+        
+        #region Null
+        
+        /// <summary>
+        /// Returns a constraint that tests for null
+        /// </summary>
+        public NullConstraint Null
+        {
+            get { return new NullConstraint(); }
+        }
+        
+        #endregion
+        
+        #region True
+        
+        /// <summary>
+        /// Returns a constraint that tests for True
+        /// </summary>
+        public TrueConstraint True
+        {
+            get { return new TrueConstraint(); }
+        }
+        
+        #endregion
+        
+        #region False
+        
+        /// <summary>
+        /// Returns a constraint that tests for False
+        /// </summary>
+        public FalseConstraint False
+        {
+            get { return new FalseConstraint(); }
+        }
+        
+        #endregion
+        
+        #region NaN
+        
+        /// <summary>
+        /// Returns a constraint that tests for NaN
+        /// </summary>
+        public NaNConstraint NaN
+        {
+            get { return new NaNConstraint(); }
+        }
+        
+        #endregion
+        
+        #region Empty
+        
+        /// <summary>
+        /// Returns a constraint that tests for empty
+        /// </summary>
+        public EmptyConstraint Empty
+        {
+            get { return new EmptyConstraint(); }
+        }
+        
+        #endregion
+        
+        #region Unique
+        
+        /// <summary>
+        /// Returns a constraint that tests whether a collection 
+        /// contains all unique items.
+        /// </summary>
+        public UniqueItemsConstraint Unique
+        {
+            get { return new UniqueItemsConstraint(); }
+        }
+        
+        #endregion
+        
+        #region BinarySerializable
+        
+        /// <summary>
+        /// Returns a constraint that tests whether an object graph is serializable in binary format.
+        /// </summary>
+        public BinarySerializableConstraint BinarySerializable
+        {
+            get { return new BinarySerializableConstraint(); }
+        }
+        
+        #endregion
+        
+        #region XmlSerializable
+        
+        /// <summary>
+        /// Returns a constraint that tests whether an object graph is serializable in xml format.
+        /// </summary>
+        public XmlSerializableConstraint XmlSerializable
+        {
+            get { return new XmlSerializableConstraint(); }
+        }
+        
+        #endregion
+        
+        #region EqualTo
+        
+        /// <summary>
+        /// Returns a constraint that tests two items for equality
+        /// </summary>
+        public EqualConstraint EqualTo(object expected)
+        {
+            return new EqualConstraint(expected);
+        }
+        
+        #endregion
+        
+        #region SameAs
+        
+        /// <summary>
+        /// Returns a constraint that tests that two references are the same object
+        /// </summary>
+        public SameAsConstraint SameAs(object expected)
+        {
+            return new SameAsConstraint(expected);
+        }
+        
+        #endregion
+        
+        #region GreaterThan
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the
+        /// actual value is greater than the suppled argument
+        /// </summary>
+        public GreaterThanConstraint GreaterThan(object expected)
+        {
+            return new GreaterThanConstraint(expected);
+        }
+        
+        #endregion
+        
+        #region GreaterThanOrEqualTo
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the
+        /// actual value is greater than or equal to the suppled argument
+        /// </summary>
+        public GreaterThanOrEqualConstraint GreaterThanOrEqualTo(object expected)
+        {
+            return new GreaterThanOrEqualConstraint(expected);
+        }
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the
+        /// actual value is greater than or equal to the suppled argument
+        /// </summary>
+        public GreaterThanOrEqualConstraint AtLeast(object expected)
+        {
+            return new GreaterThanOrEqualConstraint(expected);
+        }
+        
+        #endregion
+        
+        #region LessThan
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the
+        /// actual value is less than the suppled argument
+        /// </summary>
+        public LessThanConstraint LessThan(object expected)
+        {
+            return new LessThanConstraint(expected);
+        }
+        
+        #endregion
+        
+        #region LessThanOrEqualTo
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the
+        /// actual value is less than or equal to the suppled argument
+        /// </summary>
+        public LessThanOrEqualConstraint LessThanOrEqualTo(object expected)
+        {
+            return new LessThanOrEqualConstraint(expected);
+        }
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the
+        /// actual value is less than or equal to the suppled argument
+        /// </summary>
+        public LessThanOrEqualConstraint AtMost(object expected)
+        {
+            return new LessThanOrEqualConstraint(expected);
+        }
+        
+        #endregion
+        
+        #region TypeOf
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the actual
+        /// value is of the exact type supplied as an argument.
+        /// </summary>
+        public ExactTypeConstraint TypeOf(Type expectedType)
+        {
+            return new ExactTypeConstraint(expectedType);
+        }
+        
+#if NET_2_0
+        /// <summary>
+        /// Returns a constraint that tests whether the actual
+        /// value is of the exact type supplied as an argument.
+        /// </summary>
+        public ExactTypeConstraint TypeOf<T>()
+        {
+            return new ExactTypeConstraint(typeof(T));
+        }
+        
+#endif
+        #endregion
+        
+        #region InstanceOf
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is of the type supplied as an argument or a derived type.
+        /// </summary>
+        public InstanceOfTypeConstraint InstanceOf(Type expectedType)
+        {
+            return new InstanceOfTypeConstraint(expectedType);
+        }
+        
+#if NET_2_0
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is of the type supplied as an argument or a derived type.
+        /// </summary>
+        public InstanceOfTypeConstraint InstanceOf<T>()
+        {
+            return new InstanceOfTypeConstraint(typeof(T));
+        }
+        
+#endif
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is of the type supplied as an argument or a derived type.
+        /// </summary>
+        [Obsolete("Use InstanceOf(expectedType)")]
+        public InstanceOfTypeConstraint InstanceOfType(Type expectedType)
+        {
+            return new InstanceOfTypeConstraint(expectedType);
+        }
+        
+#if NET_2_0
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is of the type supplied as an argument or a derived type.
+        /// </summary>
+        [Obsolete("Use InstanceOf<T>()")]
+        public InstanceOfTypeConstraint InstanceOfType<T>()
+        {
+            return new InstanceOfTypeConstraint(typeof(T));
+        }
+        
+#endif
+        #endregion
+        
+        #region AssignableFrom
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is assignable from the type supplied as an argument.
+        /// </summary>
+        public AssignableFromConstraint AssignableFrom(Type expectedType)
+        {
+            return new AssignableFromConstraint(expectedType);
+        }
+        
+#if NET_2_0
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is assignable from the type supplied as an argument.
+        /// </summary>
+        public AssignableFromConstraint AssignableFrom<T>()
+        {
+            return new AssignableFromConstraint(typeof(T));
+        }
+        
+#endif
+        #endregion
+        
+        #region AssignableTo
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is assignable from the type supplied as an argument.
+        /// </summary>
+        public AssignableToConstraint AssignableTo(Type expectedType)
+        {
+            return new AssignableToConstraint(expectedType);
+        }
+        
+#if NET_2_0
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is assignable from the type supplied as an argument.
+        /// </summary>
+        public AssignableToConstraint AssignableTo<T>()
+        {
+            return new AssignableToConstraint(typeof(T));
+        }
+        
+#endif
+        #endregion
+        
+        #region EquivalentTo
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is a collection containing the same elements as the 
+        /// collection supplied as an argument.
+        /// </summary>
+        public CollectionEquivalentConstraint EquivalentTo(IEnumerable expected)
+        {
+            return new CollectionEquivalentConstraint(expected);
+        }
+        
+        #endregion
+        
+        #region SubsetOf
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is a subset of the collection supplied as an argument.
+        /// </summary>
+        public CollectionSubsetConstraint SubsetOf(IEnumerable expected)
+        {
+            return new CollectionSubsetConstraint(expected);
+        }
+        
+        #endregion
+        
+        #region Ordered
+        
+        /// <summary>
+        /// Returns a constraint that tests whether a collection is ordered
+        /// </summary>
+        public CollectionOrderedConstraint Ordered
+        {
+            get { return new CollectionOrderedConstraint(); }
+        }
+        
+        #endregion
+        
+        #region Member
+        
+        /// <summary>
+        /// Returns a new CollectionContainsConstraint checking for the
+        /// presence of a particular object in the collection.
+        /// </summary>
+        public CollectionContainsConstraint Member(object expected)
+        {
+            return new CollectionContainsConstraint(expected);
+        }
+        
+        /// <summary>
+        /// Returns a new CollectionContainsConstraint checking for the
+        /// presence of a particular object in the collection.
+        /// </summary>
+        public CollectionContainsConstraint Contains(object expected)
+        {
+            return new CollectionContainsConstraint(expected);
+        }
+        
+        #endregion
+        
+        #region Contains
+        
+        /// <summary>
+        /// Returns a new ContainsConstraint. This constraint
+        /// will, in turn, make use of the appropriate second-level
+        /// constraint, depending on the type of the actual argument. 
+        /// This overload is only used if the item sought is a string,
+        /// since any other type implies that we are looking for a 
+        /// collection member.
+        /// </summary>
+        public ContainsConstraint Contains(string expected)
+        {
+            return new ContainsConstraint(expected);
+        }
+        
+        #endregion
+        
+        #region StringContaining
+        
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value contains the substring supplied as an argument.
+        /// </summary>
+        public SubstringConstraint StringContaining(string expected)
+        {
+            return new SubstringConstraint(expected);
+        }
+        
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value contains the substring supplied as an argument.
+        /// </summary>
+        public SubstringConstraint ContainsSubstring(string expected)
+        {
+            return new SubstringConstraint(expected);
+        }
+        
+        #endregion
+        
+        #region DoesNotContain
+        
+        /// <summary>
+        /// Returns a constraint that fails if the actual
+        /// value contains the substring supplied as an argument.
+        /// </summary>
+        public SubstringConstraint DoesNotContain(string expected)
+        {
+            return new ConstraintExpression().Not.ContainsSubstring(expected);
+        }
+        
+        #endregion
+        
+        #region StartsWith
+        
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value starts with the substring supplied as an argument.
+        /// </summary>
+        public StartsWithConstraint StartsWith(string expected)
+        {
+            return new StartsWithConstraint(expected);
+        }
+        
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value starts with the substring supplied as an argument.
+        /// </summary>
+        public StartsWithConstraint StringStarting(string expected)
+        {
+            return new StartsWithConstraint(expected);
+        }
+        
+        #endregion
+        
+        #region DoesNotStartWith
+        
+        /// <summary>
+        /// Returns a constraint that fails if the actual
+        /// value starts with the substring supplied as an argument.
+        /// </summary>
+        public StartsWithConstraint DoesNotStartWith(string expected)
+        {
+            return new ConstraintExpression().Not.StartsWith(expected);
+        }
+        
+        #endregion
+        
+        #region EndsWith
+        
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value ends with the substring supplied as an argument.
+        /// </summary>
+        public EndsWithConstraint EndsWith(string expected)
+        {
+            return new EndsWithConstraint(expected);
+        }
+        
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value ends with the substring supplied as an argument.
+        /// </summary>
+        public EndsWithConstraint StringEnding(string expected)
+        {
+            return new EndsWithConstraint(expected);
+        }
+        
+        #endregion
+        
+        #region DoesNotEndWith
+        
+        /// <summary>
+        /// Returns a constraint that fails if the actual
+        /// value ends with the substring supplied as an argument.
+        /// </summary>
+        public EndsWithConstraint DoesNotEndWith(string expected)
+        {
+            return new ConstraintExpression().Not.EndsWith(expected);
+        }
+        
+        #endregion
+        
+        #region Matches
+        
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value matches the Regex pattern supplied as an argument.
+        /// </summary>
+        public RegexConstraint Matches(string pattern)
+        {
+            return new RegexConstraint(pattern);
+        }
+        
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value matches the Regex pattern supplied as an argument.
+        /// </summary>
+        public RegexConstraint StringMatching(string pattern)
+        {
+            return new RegexConstraint(pattern);
+        }
+        
+        #endregion
+        
+        #region DoesNotMatch
+        
+        /// <summary>
+        /// Returns a constraint that fails if the actual
+        /// value matches the pattern supplied as an argument.
+        /// </summary>
+        public RegexConstraint DoesNotMatch(string pattern)
+        {
+            return new ConstraintExpression().Not.Matches(pattern);
+        }
+        
+        #endregion
+        
+        #region SamePath
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the path provided 
+        /// is the same as an expected path after canonicalization.
+        /// </summary>
+        public SamePathConstraint SamePath(string expected)
+        {
+            return new SamePathConstraint(expected);
+        }
+        
+        #endregion
+        
+        #region SubPath
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the path provided 
+        /// is the same path or under an expected path after canonicalization.
+        /// </summary>
+        public SubPathConstraint SubPath(string expected)
+        {
+            return new SubPathConstraint(expected);
+        }
+        
+        #endregion
+        
+        #region SamePathOrUnder
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the path provided 
+        /// is the same path or under an expected path after canonicalization.
+        /// </summary>
+        public SamePathOrUnderConstraint SamePathOrUnder(string expected)
+        {
+            return new SamePathOrUnderConstraint(expected);
+        }
+        
+        #endregion
+        
+        #region InRange
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value falls 
+        /// within a specified range.
+        /// </summary>
+        public RangeConstraint InRange(IComparable from, IComparable to)
+        {
+            return new RangeConstraint(from, to);
+        }
+        
+        #endregion
+        
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/ConstraintOperators.cs b/src/NUnitFramework/framework/Constraints/ConstraintOperators.cs
new file mode 100644
index 0000000..fbf2d3a
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/ConstraintOperators.cs
@@ -0,0 +1,480 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+#if NET_2_0
+using System.Collections.Generic;
+#endif
+
+namespace NUnit.Framework.Constraints
+{
+    #region ConstraintOperator Base Class
+    /// <summary>
+    /// The ConstraintOperator class is used internally by a
+    /// ConstraintBuilder to represent an operator that 
+    /// modifies or combines constraints. 
+    /// 
+    /// Constraint operators use left and right precedence
+    /// values to determine whether the top operator on the
+    /// stack should be reduced before pushing a new operator.
+    /// </summary>
+    public abstract class ConstraintOperator
+    {
+        private object leftContext;
+        private object rightContext;
+
+		/// <summary>
+		/// The precedence value used when the operator
+		/// is about to be pushed to the stack.
+		/// </summary>
+		protected int left_precedence;
+        
+		/// <summary>
+		/// The precedence value used when the operator
+		/// is on the top of the stack.
+		/// </summary>
+		protected int right_precedence;
+
+		/// <summary>
+		/// The syntax element preceding this operator
+		/// </summary>
+        public object LeftContext
+        {
+            get { return leftContext; }
+            set { leftContext = value; }
+        }
+
+		/// <summary>
+		/// The syntax element folowing this operator
+		/// </summary>
+        public object RightContext
+        {
+            get { return rightContext; }
+            set { rightContext = value; }
+        }
+
+		/// <summary>
+		/// The precedence value used when the operator
+		/// is about to be pushed to the stack.
+		/// </summary>
+		public virtual int LeftPrecedence
+        {
+            get { return left_precedence; }
+        }
+
+		/// <summary>
+		/// The precedence value used when the operator
+		/// is on the top of the stack.
+		/// </summary>
+		public virtual int RightPrecedence
+        {
+            get { return right_precedence; }
+        }
+
+		/// <summary>
+		/// Reduce produces a constraint from the operator and 
+		/// any arguments. It takes the arguments from the constraint 
+		/// stack and pushes the resulting constraint on it.
+		/// </summary>
+		/// <param name="stack"></param>
+		public abstract void Reduce(ConstraintBuilder.ConstraintStack stack);
+    }
+    #endregion
+
+    #region Prefix Operators
+
+    #region PrefixOperator
+    /// <summary>
+	/// PrefixOperator takes a single constraint and modifies
+	/// it's action in some way.
+	/// </summary>
+    public abstract class PrefixOperator : ConstraintOperator
+    {
+		/// <summary>
+		/// Reduce produces a constraint from the operator and 
+		/// any arguments. It takes the arguments from the constraint 
+		/// stack and pushes the resulting constraint on it.
+		/// </summary>
+		/// <param name="stack"></param>
+		public override void Reduce(ConstraintBuilder.ConstraintStack stack)
+        {
+            stack.Push(ApplyPrefix(stack.Pop()));
+        }
+
+        /// <summary>
+        /// Returns the constraint created by applying this
+        /// prefix to another constraint.
+        /// </summary>
+        /// <param name="constraint"></param>
+        /// <returns></returns>
+        public abstract Constraint ApplyPrefix(Constraint constraint);
+    }
+    #endregion
+
+    #region NotOperator
+    /// <summary>
+    /// Negates the test of the constraint it wraps.
+    /// </summary>
+    public class NotOperator : PrefixOperator
+    {
+        /// <summary>
+        /// Constructs a new NotOperator
+        /// </summary>
+        public NotOperator()
+        {
+            // Not stacks on anything and only allows other
+            // prefix ops to stack on top of it.
+            this.left_precedence = this.right_precedence = 1;
+        }
+
+        /// <summary>
+        /// Returns a NotConstraint applied to its argument.
+        /// </summary>
+        public override Constraint ApplyPrefix(Constraint constraint)
+        {
+            return new NotConstraint(constraint);
+        }
+    }
+    #endregion
+
+    #region Collection Operators
+    /// <summary>
+    /// Abstract base for operators that indicate how to
+    /// apply a constraint to items in a collection.
+    /// </summary>
+    public abstract class CollectionOperator : PrefixOperator
+    {
+        /// <summary>
+        /// Constructs a CollectionOperator
+        /// </summary>
+        public CollectionOperator()
+        {
+            // Collection Operators stack on everything
+            // and allow all other ops to stack on them
+            this.left_precedence = 1;
+            this.right_precedence = 10;
+        }
+    }
+
+    /// <summary>
+    /// Represents a constraint that succeeds if all the 
+    /// members of a collection match a base constraint.
+    /// </summary>
+    public class AllOperator : CollectionOperator
+    {
+        /// <summary>
+        /// Returns a constraint that will apply the argument
+        /// to the members of a collection, succeeding if
+        /// they all succeed.
+        /// </summary>
+        public override Constraint ApplyPrefix(Constraint constraint)
+        {
+            return new AllItemsConstraint(constraint);
+        }
+    }
+
+    /// <summary>
+    /// Represents a constraint that succeeds if any of the 
+    /// members of a collection match a base constraint.
+    /// </summary>
+    public class SomeOperator : CollectionOperator
+    {
+        /// <summary>
+        /// Returns a constraint that will apply the argument
+        /// to the members of a collection, succeeding if
+        /// any of them succeed.
+        /// </summary>
+        public override Constraint ApplyPrefix(Constraint constraint)
+        {
+            return new SomeItemsConstraint(constraint);
+        }
+    }
+
+    /// <summary>
+    /// Represents a constraint that succeeds if none of the 
+    /// members of a collection match a base constraint.
+    /// </summary>
+    public class NoneOperator : CollectionOperator
+    {
+        /// <summary>
+        /// Returns a constraint that will apply the argument
+        /// to the members of a collection, succeeding if
+        /// none of them succeed.
+        /// </summary>
+        public override Constraint ApplyPrefix(Constraint constraint)
+        {
+            return new NoItemConstraint(constraint);
+        }
+    }
+    #endregion
+
+    #region WithOperator
+    /// <summary>
+    /// Represents a constraint that simply wraps the
+    /// constraint provided as an argument, without any
+    /// further functionality, but which modifes the
+    /// order of evaluation because of its precedence.
+    /// </summary>
+    public class WithOperator : PrefixOperator
+    {
+        /// <summary>
+        /// Constructor for the WithOperator
+        /// </summary>
+        public WithOperator()
+        {
+            this.left_precedence = 1;
+            this.right_precedence = 4;
+        }
+
+        /// <summary>
+        /// Returns a constraint that wraps its argument
+        /// </summary>
+        public override Constraint ApplyPrefix(Constraint constraint)
+        {
+            return constraint;
+        }
+    }
+    #endregion
+
+    #region SelfResolving Operators
+
+    #region SelfResolvingOperator
+    /// <summary>
+    /// Abstract base class for operators that are able to reduce to a 
+    /// constraint whether or not another syntactic element follows.
+    /// </summary>
+    public abstract class SelfResolvingOperator : ConstraintOperator
+    {
+    }
+    #endregion
+
+    #region PropOperator
+    /// <summary>
+    /// Operator used to test for the presence of a named Property
+    /// on an object and optionally apply further tests to the
+    /// value of that property.
+    /// </summary>
+    public class PropOperator : SelfResolvingOperator
+    {
+        private string name;
+
+        /// <summary>
+        /// Gets the name of the property to which the operator applies
+        /// </summary>
+        public string Name
+        {
+            get { return name; }
+        }
+
+        /// <summary>
+        /// Constructs a PropOperator for a particular named property
+        /// </summary>
+        public PropOperator(string name)
+        {
+            this.name = name;
+
+            // Prop stacks on anything and allows only 
+            // prefix operators to stack on it.
+            this.left_precedence = this.right_precedence = 1;
+        }
+
+        /// <summary>
+        /// Reduce produces a constraint from the operator and 
+        /// any arguments. It takes the arguments from the constraint 
+        /// stack and pushes the resulting constraint on it.
+        /// </summary>
+        /// <param name="stack"></param>
+        public override void Reduce(ConstraintBuilder.ConstraintStack stack)
+        {
+            if (RightContext == null || RightContext is BinaryOperator)
+                stack.Push(new PropertyExistsConstraint(name));
+            else
+                stack.Push(new PropertyConstraint(name, stack.Pop()));
+        }
+    }
+    #endregion
+
+    #region AttributeOperator
+    /// <summary>
+    /// Operator that tests for the presence of a particular attribute
+    /// on a type and optionally applies further tests to the attribute.
+    /// </summary>
+    public class AttributeOperator : SelfResolvingOperator
+    {
+        private Type type;
+
+        /// <summary>
+        /// Construct an AttributeOperator for a particular Type
+        /// </summary>
+        /// <param name="type">The Type of attribute tested</param>
+        public AttributeOperator(Type type)
+        {
+            this.type = type;
+
+            // Attribute stacks on anything and allows only 
+            // prefix operators to stack on it.
+            this.left_precedence = this.right_precedence = 1;
+        }
+
+        /// <summary>
+        /// Reduce produces a constraint from the operator and 
+        /// any arguments. It takes the arguments from the constraint 
+        /// stack and pushes the resulting constraint on it.
+        /// </summary>
+        public override void Reduce(ConstraintBuilder.ConstraintStack stack)
+        {
+            if (RightContext == null || RightContext is BinaryOperator)
+                stack.Push(new AttributeExistsConstraint(type));
+            else
+                stack.Push(new AttributeConstraint(type, stack.Pop()));
+        }
+    }
+    #endregion
+
+    #region ThrowsOperator
+    /// <summary>
+    /// Operator that tests that an exception is thrown and
+    /// optionally applies further tests to the exception.
+    /// </summary>
+    public class ThrowsOperator : SelfResolvingOperator
+    {
+        /// <summary>
+        /// Construct a ThrowsOperator
+        /// </summary>
+        public ThrowsOperator()
+        {
+            // ThrowsOperator stacks on everything but
+            // it's always the first item on the stack
+            // anyway. It is evaluated last of all ops.
+            this.left_precedence = 1;
+            this.right_precedence = 100;
+        }
+
+        /// <summary>
+        /// Reduce produces a constraint from the operator and 
+        /// any arguments. It takes the arguments from the constraint 
+        /// stack and pushes the resulting constraint on it.
+        /// </summary>
+        public override void Reduce(ConstraintBuilder.ConstraintStack stack)
+        {
+            if (RightContext == null || RightContext is BinaryOperator)
+                stack.Push(new ThrowsConstraint(null));
+            else
+                stack.Push(new ThrowsConstraint(stack.Pop()));
+        }
+    }
+    #endregion
+
+    #endregion
+
+    #endregion
+
+    #region Binary Operators
+
+    #region BinaryOperator
+    /// <summary>
+    /// Abstract base class for all binary operators
+    /// </summary>
+    public abstract class BinaryOperator : ConstraintOperator
+    {
+        /// <summary>
+        /// Reduce produces a constraint from the operator and 
+        /// any arguments. It takes the arguments from the constraint 
+        /// stack and pushes the resulting constraint on it.
+        /// </summary>
+        /// <param name="stack"></param>
+        public override void Reduce(ConstraintBuilder.ConstraintStack stack)
+        {
+            Constraint right = stack.Pop();
+            Constraint left = stack.Pop();
+            stack.Push(ApplyOperator(left, right));
+        }
+
+        /// <summary>
+        /// Gets the left precedence of the operator
+        /// </summary>
+        public override int LeftPrecedence
+        {
+            get
+            {
+                return RightContext is CollectionOperator
+                    ? base.LeftPrecedence + 10
+                    : base.LeftPrecedence;
+            }
+        }
+
+        /// <summary>
+        /// Gets the right precedence of the operator
+        /// </summary>
+        public override int RightPrecedence
+        {
+            get
+            {
+                return RightContext is CollectionOperator
+                    ? base.RightPrecedence + 10
+                    : base.RightPrecedence;
+            }
+        }
+
+        /// <summary>
+        /// Abstract method that produces a constraint by applying
+        /// the operator to its left and right constraint arguments.
+        /// </summary>
+        public abstract Constraint ApplyOperator(Constraint left, Constraint right);
+    }
+    #endregion
+
+    #region AndOperator
+    /// <summary>
+    /// Operator that requires both it's arguments to succeed
+    /// </summary>
+    public class AndOperator : BinaryOperator
+    {
+        /// <summary>
+        /// Construct an AndOperator
+        /// </summary>
+        public AndOperator()
+        {
+            this.left_precedence = this.right_precedence = 2;
+        }
+
+        /// <summary>
+        /// Apply the operator to produce an AndConstraint
+        /// </summary>
+        public override Constraint ApplyOperator(Constraint left, Constraint right)
+        {
+            return new AndConstraint(left, right);
+        }
+    }
+    #endregion
+
+    #region OrOperator
+    /// <summary>
+    /// Operator that requires at least one of it's arguments to succeed
+    /// </summary>
+    public class OrOperator : BinaryOperator
+    {
+        /// <summary>
+        /// Construct an OrOperator
+        /// </summary>
+        public OrOperator()
+        {
+            this.left_precedence = this.right_precedence = 3;
+        }
+
+        /// <summary>
+        /// Apply the operator to produce an OrConstraint
+        /// </summary>
+        public override Constraint ApplyOperator(Constraint left, Constraint right)
+        {
+            return new OrConstraint(left, right);
+        }
+    }
+    #endregion
+
+    #endregion
+}
diff --git a/src/NUnitFramework/framework/Constraints/ContainsConstraint.cs b/src/NUnitFramework/framework/Constraints/ContainsConstraint.cs
index 02bde29..09724eb 100644
--- a/src/NUnitFramework/framework/Constraints/ContainsConstraint.cs
+++ b/src/NUnitFramework/framework/Constraints/ContainsConstraint.cs
@@ -1,10 +1,14 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
+using System.Collections;
+#if NET_2_0
+using System.Collections.Generic;
+#endif
 
 namespace NUnit.Framework.Constraints
 {
@@ -20,6 +24,9 @@ namespace NUnit.Framework.Constraints
 	{
 		object expected;
 		Constraint realConstraint;
+        bool ignoreCase;
+
+        private EqualityAdapter adapter = null;
 
 		private Constraint RealConstraint
 		{
@@ -27,12 +34,24 @@ namespace NUnit.Framework.Constraints
 			{
 				if ( realConstraint == null )
 				{
-					if ( actual is string )
-						this.realConstraint = new SubstringConstraint( (string)expected );
-					else
-						this.realConstraint = new CollectionContainsConstraint( expected );
+                    if (actual is string)
+                    {
+                        StringConstraint constraint = new SubstringConstraint((string)expected);
+                        if (this.ignoreCase)
+                            constraint = constraint.IgnoreCase;
+                        this.realConstraint = constraint;
+                    }
+                    else
+					{
+                        CollectionContainsConstraint constraint = new CollectionContainsConstraint(expected);
+						
+						if (this.adapter != null)
+							constraint.comparer.ExternalComparer = adapter;
+							
+						this.realConstraint = constraint;
+					}
 				}
-
+				
 				return realConstraint;
 			}
 			set 
@@ -46,22 +65,27 @@ namespace NUnit.Framework.Constraints
         /// </summary>
         /// <param name="expected">The expected.</param>
 		public ContainsConstraint( object expected )
+			: base(expected)
 		{
 			this.expected = expected;
 		}
 
         /// <summary>
+        /// Flag the constraint to ignore case and return self.
+        /// </summary>
+        public ContainsConstraint IgnoreCase
+        {
+            get { this.ignoreCase = true; return this; }
+        }
+
+        /// <summary>
         /// Test whether the constraint is satisfied by a given value
         /// </summary>
         /// <param name="actual">The value to be tested</param>
         /// <returns>True for success, false for failure</returns>
 		public override bool Matches(object actual)
 		{
-			this.actual = actual;
-
-			if ( this.caseInsensitive )
-				this.RealConstraint = RealConstraint.IgnoreCase;
-
+            this.actual = actual;
 			return this.RealConstraint.Matches( actual );
 		}
 
@@ -73,5 +97,62 @@ namespace NUnit.Framework.Constraints
 		{
 			this.RealConstraint.WriteDescriptionTo(writer);
 		}
+
+        /// <summary>
+        /// Flag the constraint to use the supplied IComparer object.
+        /// </summary>
+        /// <param name="comparer">The IComparer object to use.</param>
+        /// <returns>Self.</returns>
+        public ContainsConstraint Using(IComparer comparer)
+        {
+            this.adapter = EqualityAdapter.For(comparer);
+            return this;
+        }
+
+#if NET_2_0
+        /// <summary>
+        /// Flag the constraint to use the supplied IComparer object.
+        /// </summary>
+        /// <param name="comparer">The IComparer object to use.</param>
+        /// <returns>Self.</returns>
+        public ContainsConstraint Using<T>(IComparer<T> comparer)
+        {
+            this.adapter = EqualityAdapter.For(comparer);
+            return this;
+        }
+
+        /// <summary>
+        /// Flag the constraint to use the supplied Comparison object.
+        /// </summary>
+        /// <param name="comparer">The IComparer object to use.</param>
+        /// <returns>Self.</returns>
+        public ContainsConstraint Using<T>(Comparison<T> comparer)
+        {
+            this.adapter = EqualityAdapter.For(comparer);
+            return this;
+        }
+
+        /// <summary>
+        /// Flag the constraint to use the supplied IEqualityComparer object.
+        /// </summary>
+        /// <param name="comparer">The IComparer object to use.</param>
+        /// <returns>Self.</returns>
+        public ContainsConstraint Using(IEqualityComparer comparer)
+        {
+            this.adapter = EqualityAdapter.For(comparer);
+            return this;
+        }
+
+        /// <summary>
+        /// Flag the constraint to use the supplied IEqualityComparer object.
+        /// </summary>
+        /// <param name="comparer">The IComparer object to use.</param>
+        /// <returns>Self.</returns>
+        public ContainsConstraint Using<T>(IEqualityComparer<T> comparer)
+        {
+            this.adapter = EqualityAdapter.For(comparer);
+            return this;
+        }
+#endif
 	}
 }
diff --git a/src/NUnitFramework/framework/Constraints/DelayedConstraint.cs b/src/NUnitFramework/framework/Constraints/DelayedConstraint.cs
new file mode 100644
index 0000000..00b85ac
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/DelayedConstraint.cs
@@ -0,0 +1,162 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Threading;
+
+namespace NUnit.Framework.Constraints
+{
+    ///<summary>
+    /// Applies a delay to the match so that a match can be evaluated in the future.
+    ///</summary>
+    public class DelayedConstraint : PrefixConstraint
+    {
+        private readonly int delayInMilliseconds;
+        private readonly int pollingInterval;
+
+        ///<summary>
+        /// Creates a new DelayedConstraint
+        ///</summary>
+        ///<param name="baseConstraint">The inner constraint two decorate</param>
+        ///<param name="delayInMilliseconds">The time interval after which the match is performed</param>
+        ///<exception cref="InvalidOperationException">If the value of <paramref name="delayInMilliseconds"/> is less than 0</exception>
+        public DelayedConstraint(Constraint baseConstraint, int delayInMilliseconds)
+            : this(baseConstraint, delayInMilliseconds, 0) { }
+
+        ///<summary>
+        /// Creates a new DelayedConstraint
+        ///</summary>
+        ///<param name="baseConstraint">The inner constraint two decorate</param>
+        ///<param name="delayInMilliseconds">The time interval after which the match is performed</param>
+        ///<param name="pollingInterval">The time interval used for polling</param>
+        ///<exception cref="InvalidOperationException">If the value of <paramref name="delayInMilliseconds"/> is less than 0</exception>
+        public DelayedConstraint(Constraint baseConstraint, int delayInMilliseconds, int pollingInterval)
+            : base(baseConstraint)
+        {
+            if (delayInMilliseconds < 0)
+                throw new ArgumentException("Cannot check a condition in the past", "delayInMilliseconds");
+
+            this.delayInMilliseconds = delayInMilliseconds;
+            this.pollingInterval = pollingInterval;
+        }
+
+        /// <summary>
+        /// Test whether the constraint is satisfied by a given value
+        /// </summary>
+        /// <param name="actual">The value to be tested</param>
+        /// <returns>True for if the base constraint fails, false if it succeeds</returns>
+        public override bool Matches(object actual)
+        {
+            Thread.Sleep(delayInMilliseconds);
+            this.actual = actual;
+            return baseConstraint.Matches(actual);
+        }
+
+        /// <summary>
+        /// Test whether the constraint is satisfied by a delegate
+        /// </summary>
+        /// <param name="del">The delegate whose value is to be tested</param>
+        /// <returns>True for if the base constraint fails, false if it succeeds</returns>
+        public override bool Matches(ActualValueDelegate del)
+        {
+			int remainingDelay = delayInMilliseconds;
+
+			while (pollingInterval > 0 && pollingInterval < remainingDelay)
+			{
+				remainingDelay -= pollingInterval;
+				Thread.Sleep(pollingInterval);
+				this.actual = del();
+				if (baseConstraint.Matches(actual))
+					return true;
+			}
+
+			if ( remainingDelay > 0 )
+				Thread.Sleep(remainingDelay);
+			this.actual = del();
+			return baseConstraint.Matches(actual);
+        }
+
+#if NET_2_0
+        /// <summary>
+        /// Test whether the constraint is satisfied by a given reference.
+        /// Overridden to wait for the specified delay period before
+        /// calling the base constraint with the dereferenced value.
+        /// </summary>
+        /// <param name="actual">A reference to the value to be tested</param>
+        /// <returns>True for success, false for failure</returns>
+        public override bool Matches<T>(ref T actual)
+        {
+            int remainingDelay = delayInMilliseconds;
+
+            while (pollingInterval > 0 && pollingInterval < remainingDelay)
+            {
+                remainingDelay -= pollingInterval;
+                Thread.Sleep(pollingInterval);
+                this.actual = actual;
+                if (baseConstraint.Matches(actual))
+                    return true;
+            }
+
+            if ( remainingDelay > 0 )
+                Thread.Sleep(remainingDelay);
+            this.actual = actual;
+            return baseConstraint.Matches(actual);
+        }
+#else
+		/// <summary>
+		/// Test whether the constraint is satisfied by a given boolean reference.
+		/// Overridden to wait for the specified delay period before
+		/// calling the base constraint with the dereferenced value.
+		/// </summary>
+		/// <param name="actual">A reference to the value to be tested</param>
+		/// <returns>True for success, false for failure</returns>
+		public override bool Matches(ref bool actual)
+		{
+			int remainingDelay = delayInMilliseconds;
+
+			while (pollingInterval > 0 && pollingInterval < remainingDelay)
+			{
+				remainingDelay -= pollingInterval;
+				Thread.Sleep(pollingInterval);
+				this.actual = actual;
+				if (baseConstraint.Matches(actual))
+					return true;
+			}
+
+			if ( remainingDelay > 0 )
+				Thread.Sleep(remainingDelay);
+			this.actual = actual;
+			return baseConstraint.Matches(actual);
+		}
+#endif
+
+        /// <summary>
+        /// Write the constraint description to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The writer on which the description is displayed</param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            baseConstraint.WriteDescriptionTo(writer);
+            writer.Write(string.Format(" after {0} millisecond delay", delayInMilliseconds));
+        }
+
+        /// <summary>
+        /// Write the actual value for a failing constraint test to a MessageWriter.
+        /// </summary>
+        /// <param name="writer">The writer on which the actual value is displayed</param>
+        public override void WriteActualValueTo(MessageWriter writer)
+        {
+            baseConstraint.WriteActualValueTo(writer);
+        }
+
+        /// <summary>
+        /// Returns the string representation of the constraint.
+        /// </summary>
+        protected override string GetStringRepresentation()
+        {
+            return string.Format("<after {0} {1}>", delayInMilliseconds, baseConstraint);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/DirectoryConstraints.cs b/src/NUnitFramework/framework/Constraints/DirectoryConstraints.cs
new file mode 100644
index 0000000..95dd845
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/DirectoryConstraints.cs
@@ -0,0 +1,68 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.IO;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// EmptyDirectoryConstraint is used to test that a directory is empty
+    /// </summary>
+    public class EmptyDirectoryContraint : Constraint
+    {
+        private int files = 0;
+        private int subdirs = 0;
+
+        /// <summary>
+        /// Test whether the constraint is satisfied by a given value
+        /// </summary>
+        /// <param name="actual">The value to be tested</param>
+        /// <returns>True for success, false for failure</returns>
+        public override bool Matches(object actual)
+        {
+            this.actual = actual;
+
+            DirectoryInfo dirInfo = actual as DirectoryInfo;
+            if (dirInfo == null)
+                throw new ArgumentException("The actual value must be a DirectoryInfo", "actual");
+
+            files = dirInfo.GetFiles().Length;
+            subdirs = dirInfo.GetDirectories().Length;
+
+            return files == 0 && subdirs == 0;
+        }
+
+        /// <summary>
+        /// Write the constraint description to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The writer on which the description is displayed</param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.Write( "An empty directory" );
+        }
+
+        /// <summary>
+        /// Write the actual value for a failing constraint test to a
+        /// MessageWriter. The default implementation simply writes
+        /// the raw value of actual, leaving it to the writer to
+        /// perform any formatting.
+        /// </summary>
+        /// <param name="writer">The writer on which the actual value is displayed</param>
+        public override void WriteActualValueTo(MessageWriter writer)
+        {
+            DirectoryInfo dir = actual as DirectoryInfo;
+            if (dir == null)
+                base.WriteActualValueTo(writer);
+            else
+            {
+                writer.WriteActualValue(dir);
+                writer.Write(" with {0} files and {1} directories", files, subdirs);
+            }
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/EmptyConstraint.cs b/src/NUnitFramework/framework/Constraints/EmptyConstraint.cs
index 0b51ec4..2d1c072 100644
--- a/src/NUnitFramework/framework/Constraints/EmptyConstraint.cs
+++ b/src/NUnitFramework/framework/Constraints/EmptyConstraint.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -20,9 +20,11 @@ namespace NUnit.Framework.Constraints
 		{
 			get 
 			{
-				if ( actual is string )
-					return new EmptyStringConstraint();
-				else
+                if (actual is string)
+                    return new EmptyStringConstraint();
+                else if (actual is System.IO.DirectoryInfo)
+                    return new EmptyDirectoryContraint();
+                else
 					return new EmptyCollectionConstraint();
 			}
 		}
diff --git a/src/NUnitFramework/framework/Constraints/EqualConstraint.cs b/src/NUnitFramework/framework/Constraints/EqualConstraint.cs
index 8474719..935f619 100644
--- a/src/NUnitFramework/framework/Constraints/EqualConstraint.cs
+++ b/src/NUnitFramework/framework/Constraints/EqualConstraint.cs
@@ -1,28 +1,42 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
 using System.IO;
 using System.Collections;
+#if NET_2_0
+using System.Collections.Generic;
+#endif
 
 namespace NUnit.Framework.Constraints
 {
     /// <summary>
     /// EqualConstraint is able to compare an actual value with the
-    /// expected value provided in its constructor.
+    /// expected value provided in its constructor. Two objects are 
+    /// considered equal if both are null, or if both have the same 
+    /// value. NUnit has special semantics for some object types.
     /// </summary>
     public class EqualConstraint : Constraint
     {
-        private static IDictionary constraintHelpers = new Hashtable();
+        #region Static and Instance Fields
 
-        private readonly object expected;
+		private readonly object expected;
 
-        private ArrayList failurePoints;
+        /// <summary>
+        /// If true, strings in error messages will be clipped
+        /// </summary>
+        private bool clipStrings = true;
+
+        /// <summary>
+        /// NUnitEqualityComparer used to test equality.
+        /// </summary>
+        private NUnitEqualityComparer comparer = new NUnitEqualityComparer();
 
-		private static readonly string StringsDiffer_1 =
+        #region Message Strings
+        private static readonly string StringsDiffer_1 =
 			"String lengths are both {0}. Strings differ at index {1}.";
 		private static readonly string StringsDiffer_2 =
 			"Expected string length {0} but was {1}. Strings differ at index {2}.";
@@ -38,225 +52,328 @@ namespace NUnit.Framework.Constraints
 			"Values differ at index {0}";
 		private static readonly string ValuesDiffer_2 =
 			"Values differ at expected index {0}, actual index {1}";
-
-		private static readonly int BUFFER_SIZE = 4096;
 		
+        #endregion
+
+        #endregion
+
         #region Constructor
         /// <summary>
         /// Initializes a new instance of the <see cref="EqualConstraint"/> class.
         /// </summary>
         /// <param name="expected">The expected value.</param>
-        public EqualConstraint(object expected)
+        public EqualConstraint(object expected) : base(expected)
         {
             this.expected = expected;
         }
         #endregion
 
-        #region Public Methods
+        #region Constraint Modifiers
         /// <summary>
-        /// Test whether the constraint is satisfied by a given value
+        /// Flag the constraint to ignore case and return self.
         /// </summary>
-        /// <param name="actual">The value to be tested</param>
-        /// <returns>True for success, false for failure</returns>
-        public override bool Matches(object actual)
+        public EqualConstraint IgnoreCase
         {
-            this.actual = actual;
-            this.failurePoints = new ArrayList();
-
-            return ObjectsEqual( expected, actual );
+            get
+            {
+                comparer.IgnoreCase = true;
+                return this;
+            }
         }
 
         /// <summary>
-        /// Write a failure message. Overridden to provide custom 
-        /// failure messages for EqualConstraint.
+        /// Flag the constraint to suppress string clipping 
+        /// and return self.
         /// </summary>
-        /// <param name="writer">The MessageWriter to write to</param>
-        public override void WriteMessageTo(MessageWriter writer)
+        public EqualConstraint NoClip
         {
-            DisplayDifferences(writer, expected, actual, 0);
+            get
+            {
+                clipStrings = false;
+                return this;
+            }
         }
 
-
         /// <summary>
-        /// Write description of this constraint
+        /// Flag the constraint to compare arrays as collections
+        /// and return self.
         /// </summary>
-        /// <param name="writer">The MessageWriter to write to</param>
-        public override void WriteDescriptionTo(MessageWriter writer)
+        public EqualConstraint AsCollection
         {
-			writer.WriteExpectedValue( expected );
+            get
+            {
+                comparer.CompareAsCollection = true;
+                return this;
+            }
+        }
 
-			if ( tolerance != null )
-			{
-				writer.WriteConnector("+/-");
-				writer.WriteExpectedValue(tolerance);
-			}
+        /// <summary>
+        /// Flag the constraint to use a tolerance when determining equality.
+        /// </summary>
+        /// <param name="amount">Tolerance value to be used</param>
+        /// <returns>Self.</returns>
+        public EqualConstraint Within(object amount)
+        {
+            if (!comparer.Tolerance.IsEmpty)
+                throw new InvalidOperationException("Within modifier may appear only once in a constraint expression");
 
-			if ( this.caseInsensitive )
-				writer.WriteModifier("ignoring case");
+            comparer.Tolerance = new Tolerance(amount);
+            return this;
         }
 
-        private void DisplayDifferences(MessageWriter writer, object expected, object actual, int depth)
+        /// <summary>
+        /// Switches the .Within() modifier to interpret its tolerance as
+        /// a distance in representable values (see remarks).
+        /// </summary>
+        /// <returns>Self.</returns>
+        /// <remarks>
+        /// Ulp stands for "unit in the last place" and describes the minimum
+        /// amount a given value can change. For any integers, an ulp is 1 whole
+        /// digit. For floating point values, the accuracy of which is better
+        /// for smaller numbers and worse for larger numbers, an ulp depends
+        /// on the size of the number. Using ulps for comparison of floating
+        /// point results instead of fixed tolerances is safer because it will
+        /// automatically compensate for the added inaccuracy of larger numbers.
+        /// </remarks>
+        public EqualConstraint Ulps
         {
-            if (expected is string && actual is string)
-                DisplayStringDifferences(writer, (string)expected, (string)actual);
-            else if (expected is ICollection && actual is ICollection)
-                DisplayCollectionDifferences(writer, (ICollection)expected, (ICollection)actual, depth);
-			else if (expected is Stream && actual is Stream)
-				DisplayStreamDifferences(writer, (Stream)expected, (Stream)actual, depth);
-			else if ( tolerance != null )
-				writer.DisplayDifferences( expected, actual, tolerance );
-            else
-                writer.DisplayDifferences(expected, actual);
+            get
+            {
+                comparer.Tolerance = comparer.Tolerance.Ulps;
+                return this;
+            }
         }
-        #endregion
 
-        #region ObjectsEqual
-        private bool ObjectsEqual(object expected, object actual)
+        /// <summary>
+        /// Switches the .Within() modifier to interpret its tolerance as
+        /// a percentage that the actual values is allowed to deviate from
+        /// the expected value.
+        /// </summary>
+        /// <returns>Self</returns>
+        public EqualConstraint Percent
         {
-            if (expected == null && actual == null)
-                return true;
-
-            if (expected == null || actual == null)
-                return false;
-
-            Type expectedType = expected.GetType();
-            Type actualType = actual.GetType();
-
-            if (expectedType.IsArray && actualType.IsArray && !compareAsCollection)
-                return ArraysEqual((Array)expected, (Array)actual);
-
-            if (expected is ICollection && actual is ICollection)
-                return CollectionsEqual((ICollection)expected, (ICollection)actual);
-
-			if (expected is Stream && actual is Stream)
-				return StreamsEqual((Stream)expected, (Stream)actual);
+            get
+            {
+                comparer.Tolerance = comparer.Tolerance.Percent;
+                return this;
+            }
+        }
 
-            if (compareWith != null)
-				return compareWith.Compare( expected, actual ) == 0;
+        /// <summary>
+        /// Causes the tolerance to be interpreted as a TimeSpan in days.
+        /// </summary>
+        /// <returns>Self</returns>
+        public EqualConstraint Days
+        {
+            get
+            {
+                comparer.Tolerance = comparer.Tolerance.Days;
+                return this;
+            }
+        }
 
-            if (expected is DirectoryInfo && actual is DirectoryInfo)
-                return DirectoriesEqual((DirectoryInfo)expected, (DirectoryInfo)actual);
+        /// <summary>
+        /// Causes the tolerance to be interpreted as a TimeSpan in hours.
+        /// </summary>
+        /// <returns>Self</returns>
+        public EqualConstraint Hours
+        {
+            get
+            {
+                comparer.Tolerance = comparer.Tolerance.Hours;
+                return this;
+            }
+        }
 
-            if (Numerics.IsNumericType(expected) && Numerics.IsNumericType(actual))
+        /// <summary>
+        /// Causes the tolerance to be interpreted as a TimeSpan in minutes.
+        /// </summary>
+        /// <returns>Self</returns>
+        public EqualConstraint Minutes
+        {
+            get
             {
-                return Numerics.AreEqual(expected, actual, ref tolerance);
+                comparer.Tolerance = comparer.Tolerance.Minutes;
+                return this;
             }
+        }
 
-            if (expected is string && actual is string)
+        /// <summary>
+        /// Causes the tolerance to be interpreted as a TimeSpan in seconds.
+        /// </summary>
+        /// <returns>Self</returns>
+        public EqualConstraint Seconds
+        {
+            get
             {
-				return StringsEqual( (string) expected, (string)actual );
+                comparer.Tolerance = comparer.Tolerance.Seconds;
+                return this;
             }
+        }
 
-			if (expected is DateTime && actual is DateTime && tolerance is TimeSpan)
-			{
-				return ((DateTime)expected - (DateTime)actual).Duration() <= (TimeSpan)tolerance;
-			}
+        /// <summary>
+        /// Causes the tolerance to be interpreted as a TimeSpan in milliseconds.
+        /// </summary>
+        /// <returns>Self</returns>
+        public EqualConstraint Milliseconds
+        {
+            get
+            {
+                comparer.Tolerance = comparer.Tolerance.Milliseconds;
+                return this;
+            }
+        }
 
-            return expected.Equals(actual);
+        /// <summary>
+        /// Causes the tolerance to be interpreted as a TimeSpan in clock ticks.
+        /// </summary>
+        /// <returns>Self</returns>
+        public EqualConstraint Ticks
+        {
+            get
+            {
+                comparer.Tolerance = comparer.Tolerance.Ticks;
+                return this;
+            }
         }
 
         /// <summary>
-        /// Helper method to compare two arrays
+        /// Flag the constraint to use the supplied IComparer object.
         /// </summary>
-        protected virtual bool ArraysEqual(Array expected, Array actual)
+        /// <param name="comparer">The IComparer object to use.</param>
+        /// <returns>Self.</returns>
+        [Obsolete("Replace with 'Using'")]
+        public EqualConstraint Comparer(IComparer comparer)
         {
-            int rank = expected.Rank;
+            return Using(comparer);
+        }
 
-            if (rank != actual.Rank)
-                return false;
+        /// <summary>
+        /// Flag the constraint to use the supplied IComparer object.
+        /// </summary>
+        /// <param name="comparer">The IComparer object to use.</param>
+        /// <returns>Self.</returns>
+        public EqualConstraint Using(IComparer comparer)
+        {
+            this.comparer.ExternalComparer = EqualityAdapter.For(comparer);
+            return this;
+        }
 
-            for (int r = 1; r < rank; r++)
-                if (expected.GetLength(r) != actual.GetLength(r))
-                    return false;
+#if NET_2_0
+        /// <summary>
+        /// Flag the constraint to use the supplied IComparer object.
+        /// </summary>
+        /// <param name="comparer">The IComparer object to use.</param>
+        /// <returns>Self.</returns>
+        public EqualConstraint Using<T>(IComparer<T> comparer)
+        {
+            this.comparer.ExternalComparer = EqualityAdapter.For( comparer );
+            return this;
+        }
 
-            return CollectionsEqual((ICollection)expected, (ICollection)actual);
+                /// <summary>
+        /// Flag the constraint to use the supplied Comparison object.
+        /// </summary>
+        /// <param name="comparer">The IComparer object to use.</param>
+        /// <returns>Self.</returns>
+        public EqualConstraint Using<T>(Comparison<T> comparer)
+        {
+            this.comparer.ExternalComparer = EqualityAdapter.For( comparer );
+            return this;
         }
 
-        private bool CollectionsEqual(ICollection expected, ICollection actual)
+        /// <summary>
+        /// Flag the constraint to use the supplied IEqualityComparer object.
+        /// </summary>
+        /// <param name="comparer">The IComparer object to use.</param>
+        /// <returns>Self.</returns>
+        public EqualConstraint Using(IEqualityComparer comparer)
         {
-            IEnumerator expectedEnum = expected.GetEnumerator();
-            IEnumerator actualEnum = actual.GetEnumerator();
+            this.comparer.ExternalComparer = EqualityAdapter.For(comparer);
+            return this;
+        }
 
-            int count;
-            for (count = 0; expectedEnum.MoveNext() && actualEnum.MoveNext(); count++)
-            {
-                if (!ObjectsEqual(expectedEnum.Current, actualEnum.Current))
-                    break;
-            }
+        /// <summary>
+        /// Flag the constraint to use the supplied IEqualityComparer object.
+        /// </summary>
+        /// <param name="comparer">The IComparer object to use.</param>
+        /// <returns>Self.</returns>
+        public EqualConstraint Using<T>(IEqualityComparer<T> comparer)
+        {
+            this.comparer.ExternalComparer = EqualityAdapter.For(comparer);
+            return this;
+        }
+#endif
+        #endregion
 
-            if (count == expected.Count && count == actual.Count)
-                return true;
+        #region Public Methods
+        /// <summary>
+        /// Test whether the constraint is satisfied by a given value
+        /// </summary>
+        /// <param name="actual">The value to be tested</param>
+        /// <returns>True for success, false for failure</returns>
+        public override bool Matches(object actual)
+        {
+            this.actual = actual;
 
-            failurePoints.Insert(0, count);
-            return false;
+            return comparer.ObjectsEqual(expected, actual);
         }
 
-		private bool StreamsEqual( Stream expected, Stream actual )
-		{
-			if (expected.Length != actual.Length) return false;
-
-			byte[] bufferExpected = new byte[BUFFER_SIZE];
-			byte[] bufferActual = new byte[BUFFER_SIZE];
+        /// <summary>
+        /// Write a failure message. Overridden to provide custom 
+        /// failure messages for EqualConstraint.
+        /// </summary>
+        /// <param name="writer">The MessageWriter to write to</param>
+        public override void WriteMessageTo(MessageWriter writer)
+        {
+            DisplayDifferences(writer, expected, actual, 0);
+        }
 
-			BinaryReader binaryReaderExpected = new BinaryReader(expected);
-			BinaryReader binaryReaderActual = new BinaryReader(actual);
 
-			binaryReaderExpected.BaseStream.Seek(0, SeekOrigin.Begin);
-			binaryReaderActual.BaseStream.Seek(0, SeekOrigin.Begin);
+        /// <summary>
+        /// Write description of this constraint
+        /// </summary>
+        /// <param name="writer">The MessageWriter to write to</param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+			writer.WriteExpectedValue( expected );
 
-			for(long readByte = 0; readByte < expected.Length; readByte += BUFFER_SIZE )
+            if (comparer.Tolerance != null && !comparer.Tolerance.IsEmpty)
 			{
-				binaryReaderExpected.Read(bufferExpected, 0, BUFFER_SIZE);
-				binaryReaderActual.Read(bufferActual, 0, BUFFER_SIZE);
-
-				for (int count=0; count < BUFFER_SIZE; ++count) 
-				{
-					if (bufferExpected[count] != bufferActual[count]) 
-					{
-						failurePoints.Insert( 0, readByte + count );
-						//FailureMessage.WriteLine("\tIndex : {0}", readByte + count);
-						return false;
-					}
-				}
+				writer.WriteConnector("+/-");
+                writer.WriteExpectedValue(comparer.Tolerance.Value);
 			}
 
-			return true;
-		}
-
-		private bool StringsEqual( string expected, string actual )
-		{
-			string s1 = caseInsensitive ? expected.ToLower() : expected;
-			string s2 = caseInsensitive ? actual.ToLower() : actual;
-
-			return s1.Equals( s2 );
-		}
+			if ( comparer.IgnoreCase )
+				writer.WriteModifier("ignoring case");
+        }
 
-        /// <summary>
-        /// Method to compare two DirectoryInfo objects
-        /// </summary>
-        /// <param name="expected">first directory to compare</param>
-        /// <param name="actual">second directory to compare</param>
-        /// <returns>true if equivalent, false if not</returns>
-        private bool DirectoriesEqual(DirectoryInfo expected, DirectoryInfo actual)
+        private void DisplayDifferences(MessageWriter writer, object expected, object actual, int depth)
         {
-            return expected.Attributes == actual.Attributes
-                && expected.CreationTime == actual.CreationTime
-                && expected.FullName == actual.FullName
-                && expected.LastAccessTime == actual.LastAccessTime;
+            if (expected is string && actual is string)
+                DisplayStringDifferences(writer, (string)expected, (string)actual);
+            else if (expected is ICollection && actual is ICollection)
+                DisplayCollectionDifferences(writer, (ICollection)expected, (ICollection)actual, depth);
+			else if (expected is Stream && actual is Stream)
+				DisplayStreamDifferences(writer, (Stream)expected, (Stream)actual, depth);
+            else if (comparer.Tolerance != null)
+                writer.DisplayDifferences(expected, actual, comparer.Tolerance);
+            else
+                writer.DisplayDifferences(expected, actual);
         }
         #endregion
 
         #region DisplayStringDifferences
         private void DisplayStringDifferences(MessageWriter writer, string expected, string actual)
         {
-            int mismatch = MsgUtils.FindMismatchPosition(expected, actual, 0, this.caseInsensitive);
+            int mismatch = MsgUtils.FindMismatchPosition(expected, actual, 0, comparer.IgnoreCase);
 
             if (expected.Length == actual.Length)
 				writer.WriteMessageLine(StringsDiffer_1, expected.Length, mismatch);
 			else
 				writer.WriteMessageLine(StringsDiffer_2, expected.Length, actual.Length, mismatch);
 
-            writer.DisplayStringDifferences(expected, actual, mismatch, caseInsensitive, clipStrings);
+            writer.DisplayStringDifferences(expected, actual, mismatch, comparer.IgnoreCase, clipStrings);
         }
         #endregion
 
@@ -265,7 +382,7 @@ namespace NUnit.Framework.Constraints
 		{
 			if ( expected.Length == actual.Length )
 			{
-				long offset = (long)failurePoints[depth];
+				long offset = (long)comparer.FailurePoints[depth];
 				writer.WriteMessageLine(StreamsDiffer_1, expected.Length, offset);
 			}
 			else
@@ -283,7 +400,7 @@ namespace NUnit.Framework.Constraints
         /// <param name="depth">The depth of this failure in a set of nested collections</param>
         private void DisplayCollectionDifferences(MessageWriter writer, ICollection expected, ICollection actual, int depth)
         {
-            int failurePoint = failurePoints.Count > depth ? (int)failurePoints[depth] : -1;
+            int failurePoint = comparer.FailurePoints.Count > depth ? (int)comparer.FailurePoints[depth] : -1;
 
             DisplayCollectionTypesAndSizes(writer, expected, actual, depth);
 
diff --git a/src/NUnitFramework/framework/Constraints/EqualityAdapter.cs b/src/NUnitFramework/framework/Constraints/EqualityAdapter.cs
new file mode 100644
index 0000000..7094736
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/EqualityAdapter.cs
@@ -0,0 +1,120 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+#if NET_2_0
+using System.Collections.Generic;
+#endif
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// EqualityAdapter class handles all equality comparisons
+    /// that use an IEqualityComparer, IEqualityComparer<T>
+    /// or a ComparisonAdapter.
+    /// </summary>
+    public abstract class EqualityAdapter
+    {
+        /// <summary>
+        /// Compares two objects, returning true if they are equal
+        /// </summary>
+        public abstract bool ObjectsEqual(object x, object y);
+
+        /// <summary>
+        /// Returns an EqualityAdapter that wraps an IComparer.
+        /// </summary>
+        public static EqualityAdapter For(IComparer comparer)
+        {
+            return new ComparisonAdapterAdapter(ComparisonAdapter.For(comparer));
+        }
+
+#if NET_2_0
+        /// <summary>
+        /// Returns an EqualityAdapter that wraps an IEqualityComparer.
+        /// </summary>
+        public static EqualityAdapter For(IEqualityComparer comparer)
+        {
+            return new EqualityComparerAdapter(comparer);
+        }
+
+        /// <summary>
+        /// Returns an EqualityAdapter that wraps an IEqualityComparer<T>.
+        /// </summary>
+        public static EqualityAdapter For<T>(IEqualityComparer<T> comparer)
+        {
+            return new EqualityComparerAdapter<T>(comparer);
+        }
+
+        /// <summary>
+        /// Returns an EqualityAdapter that wraps an IComparer<T>.
+        /// </summary>
+        public static EqualityAdapter For<T>(IComparer<T> comparer)
+        {
+            return new ComparisonAdapterAdapter( ComparisonAdapter.For(comparer) );
+        }
+
+        /// <summary>
+        /// Returns an EqualityAdapter that wraps a Comparison<T>.
+        /// </summary>
+        public static EqualityAdapter For<T>(Comparison<T> comparer)
+        {
+            return new ComparisonAdapterAdapter( ComparisonAdapter.For(comparer) );
+        }
+
+        class EqualityComparerAdapter : EqualityAdapter
+        {
+            private IEqualityComparer comparer;
+
+            public EqualityComparerAdapter(IEqualityComparer comparer)
+            {
+                this.comparer = comparer;
+            }
+
+            public override bool ObjectsEqual(object x, object y)
+            {
+                return comparer.Equals(x, y);
+            }
+        }
+
+        class EqualityComparerAdapter<T> : EqualityAdapter
+        {
+            private IEqualityComparer<T> comparer;
+
+            public EqualityComparerAdapter(IEqualityComparer<T> comparer)
+            {
+                this.comparer = comparer;
+            }
+
+            public override bool ObjectsEqual(object x, object y)
+            {
+                if (!typeof(T).IsAssignableFrom(x.GetType()))
+                    throw new ArgumentException("Cannot compare " + x.ToString());
+
+                if (!typeof(T).IsAssignableFrom(y.GetType()))
+                    throw new ArgumentException("Cannot compare to " + y.ToString());
+
+                return comparer.Equals((T)x, (T)y);
+            }
+        }
+#endif
+
+        class ComparisonAdapterAdapter : EqualityAdapter
+        {
+            private ComparisonAdapter comparer;
+
+            public ComparisonAdapterAdapter(ComparisonAdapter comparer)
+            {
+                this.comparer = comparer;
+            }
+
+            public override bool ObjectsEqual(object x, object y)
+            {
+                return comparer.Compare(x, y) == 0;
+            }
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/FloatingPointNumerics.cs b/src/NUnitFramework/framework/Constraints/FloatingPointNumerics.cs
new file mode 100644
index 0000000..dc173d5
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/FloatingPointNumerics.cs
@@ -0,0 +1,238 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+#if !NETCF_1_0
+
+using System;
+using System.Runtime.InteropServices;
+
+namespace NUnit.Framework.Constraints
+{
+
+    /// <summary>Helper routines for working with floating point numbers</summary>
+    /// <remarks>
+    ///   <para>
+    ///     The floating point comparison code is based on this excellent article:
+    ///     http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm
+    ///   </para>
+    ///   <para>
+    ///     "ULP" means Unit in the Last Place and in the context of this library refers to
+    ///     the distance between two adjacent floating point numbers. IEEE floating point
+    ///     numbers can only represent a finite subset of natural numbers, with greater
+    ///     accuracy for smaller numbers and lower accuracy for very large numbers.
+    ///   </para>
+    ///   <para>
+    ///     If a comparison is allowed "2 ulps" of deviation, that means the values are
+    ///     allowed to deviate by up to 2 adjacent floating point values, which might be
+    ///     as low as 0.0000001 for small numbers or as high as 10.0 for large numbers.
+    ///   </para>
+    /// </remarks>
+    public class FloatingPointNumerics
+    {
+
+        #region struct FloatIntUnion
+
+        /// <summary>Union of a floating point variable and an integer</summary>
+        [StructLayout(LayoutKind.Explicit)]
+        private struct FloatIntUnion
+        {
+            /// <summary>The union's value as a floating point variable</summary>
+            [FieldOffset(0)]
+            public float Float;
+
+            /// <summary>The union's value as an integer</summary>
+            [FieldOffset(0)]
+            public int Int;
+
+            /// <summary>The union's value as an unsigned integer</summary>
+            [FieldOffset(0)]
+            public uint UInt;
+        }
+
+        #endregion // struct FloatIntUnion
+
+        #region struct DoubleLongUnion
+
+        /// <summary>Union of a double precision floating point variable and a long</summary>
+        [StructLayout(LayoutKind.Explicit)]
+        private struct DoubleLongUnion
+        {
+            /// <summary>The union's value as a double precision floating point variable</summary>
+            [FieldOffset(0)]
+            public double Double;
+
+            /// <summary>The union's value as a long</summary>
+            [FieldOffset(0)]
+            public long Long;
+
+            /// <summary>The union's value as an unsigned long</summary>
+            [FieldOffset(0)]
+            public ulong ULong;
+        }
+
+        #endregion // struct DoubleLongUnion
+
+        /// <summary>Compares two floating point values for equality</summary>
+        /// <param name="left">First floating point value to be compared</param>
+        /// <param name="right">Second floating point value t be compared</param>
+        /// <param name="maxUlps">
+        ///   Maximum number of representable floating point values that are allowed to
+        ///   be between the left and the right floating point values
+        /// </param>
+        /// <returns>True if both numbers are equal or close to being equal</returns>
+        /// <remarks>
+        ///   <para>
+        ///     Floating point values can only represent a finite subset of natural numbers.
+        ///     For example, the values 2.00000000 and 2.00000024 can be stored in a float,
+        ///     but nothing inbetween them.
+        ///   </para>
+        ///   <para>
+        ///     This comparison will count how many possible floating point values are between
+        ///     the left and the right number. If the number of possible values between both
+        ///     numbers is less than or equal to maxUlps, then the numbers are considered as
+        ///     being equal.
+        ///   </para>
+        ///   <para>
+        ///     Implementation partially follows the code outlined here:
+        ///     http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/
+        ///   </para>
+        /// </remarks>
+        public static bool AreAlmostEqualUlps(float left, float right, int maxUlps)
+        {
+            FloatIntUnion leftUnion = new FloatIntUnion();
+            FloatIntUnion rightUnion = new FloatIntUnion();
+
+            leftUnion.Float = left;
+            rightUnion.Float = right;
+
+            uint leftSignMask = (leftUnion.UInt >> 31);
+            uint rightSignMask = (rightUnion.UInt >> 31);
+
+            uint leftTemp = ((0x80000000 - leftUnion.UInt) & leftSignMask);
+            leftUnion.UInt = leftTemp | (leftUnion.UInt & ~leftSignMask);
+
+            uint rightTemp = ((0x80000000 - rightUnion.UInt) & rightSignMask);
+            rightUnion.UInt = rightTemp | (rightUnion.UInt & ~rightSignMask);
+
+            return (Math.Abs(leftUnion.Int - rightUnion.Int) <= maxUlps);
+        }
+
+        /// <summary>Compares two double precision floating point values for equality</summary>
+        /// <param name="left">First double precision floating point value to be compared</param>
+        /// <param name="right">Second double precision floating point value t be compared</param>
+        /// <param name="maxUlps">
+        ///   Maximum number of representable double precision floating point values that are
+        ///   allowed to be between the left and the right double precision floating point values
+        /// </param>
+        /// <returns>True if both numbers are equal or close to being equal</returns>
+        /// <remarks>
+        ///   <para>
+        ///     Double precision floating point values can only represent a limited series of
+        ///     natural numbers. For example, the values 2.0000000000000000 and 2.0000000000000004
+        ///     can be stored in a double, but nothing inbetween them.
+        ///   </para>
+        ///   <para>
+        ///     This comparison will count how many possible double precision floating point
+        ///     values are between the left and the right number. If the number of possible
+        ///     values between both numbers is less than or equal to maxUlps, then the numbers
+        ///     are considered as being equal.
+        ///   </para>
+        ///   <para>
+        ///     Implementation partially follows the code outlined here:
+        ///     http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/
+        ///   </para>
+        /// </remarks>
+        public static bool AreAlmostEqualUlps(double left, double right, long maxUlps)
+        {
+            DoubleLongUnion leftUnion = new DoubleLongUnion();
+            DoubleLongUnion rightUnion = new DoubleLongUnion();
+
+            leftUnion.Double = left;
+            rightUnion.Double = right;
+
+            ulong leftSignMask = (leftUnion.ULong >> 63);
+            ulong rightSignMask = (rightUnion.ULong >> 63);
+
+            ulong leftTemp = ((0x8000000000000000 - leftUnion.ULong) & leftSignMask);
+            leftUnion.ULong = leftTemp | (leftUnion.ULong & ~leftSignMask);
+
+            ulong rightTemp = ((0x8000000000000000 - rightUnion.ULong) & rightSignMask);
+            rightUnion.ULong = rightTemp | (rightUnion.ULong & ~rightSignMask);
+
+            return (Math.Abs(leftUnion.Long - rightUnion.Long) <= maxUlps);
+        }
+
+        /// <summary>
+        ///   Reinterprets the memory contents of a floating point value as an integer value
+        /// </summary>
+        /// <param name="value">
+        ///   Floating point value whose memory contents to reinterpret
+        /// </param>
+        /// <returns>
+        ///   The memory contents of the floating point value interpreted as an integer
+        /// </returns>
+        public static int ReinterpretAsInt(float value)
+        {
+            FloatIntUnion union = new FloatIntUnion();
+            union.Float = value;
+            return union.Int;
+        }
+
+        /// <summary>
+        ///   Reinterprets the memory contents of a double precision floating point
+        ///   value as an integer value
+        /// </summary>
+        /// <param name="value">
+        ///   Double precision floating point value whose memory contents to reinterpret
+        /// </param>
+        /// <returns>
+        ///   The memory contents of the double precision floating point value
+        ///   interpreted as an integer
+        /// </returns>
+        public static long ReinterpretAsLong(double value)
+        {
+            DoubleLongUnion union = new DoubleLongUnion();
+            union.Double = value;
+            return union.Long;
+        }
+
+        /// <summary>
+        ///   Reinterprets the memory contents of an integer as a floating point value
+        /// </summary>
+        /// <param name="value">Integer value whose memory contents to reinterpret</param>
+        /// <returns>
+        ///   The memory contents of the integer value interpreted as a floating point value
+        /// </returns>
+        public static float ReinterpretAsFloat(int value)
+        {
+            FloatIntUnion union = new FloatIntUnion();
+            union.Int = value;
+            return union.Float;
+        }
+
+        /// <summary>
+        ///   Reinterprets the memory contents of an integer value as a double precision
+        ///   floating point value
+        /// </summary>
+        /// <param name="value">Integer whose memory contents to reinterpret</param>
+        /// <returns>
+        ///   The memory contents of the integer interpreted as a double precision
+        ///   floating point value
+        /// </returns>
+        public static double ReinterpretAsDouble(long value)
+        {
+            DoubleLongUnion union = new DoubleLongUnion();
+            union.Long = value;
+            return union.Double;
+        }
+
+		private FloatingPointNumerics()
+		{
+		}
+    }
+}
+
+#endif
diff --git a/src/NUnitFramework/framework/Constraints/IResolveConstraint.cs b/src/NUnitFramework/framework/Constraints/IResolveConstraint.cs
new file mode 100644
index 0000000..7e14b33
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/IResolveConstraint.cs
@@ -0,0 +1,21 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// The IConstraintExpression interface is implemented by all
+    /// complete and resolvable constraints and expressions.
+    /// </summary>
+    public interface IResolveConstraint
+    {
+        /// <summary>
+        /// Return the top-level constraint for this expression
+        /// </summary>
+        /// <returns></returns>
+        Constraint Resolve();
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/MessageWriter.cs b/src/NUnitFramework/framework/Constraints/MessageWriter.cs
new file mode 100644
index 0000000..eb27d65
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/MessageWriter.cs
@@ -0,0 +1,137 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System.IO;
+using System.Collections;
+
+namespace NUnit.Framework.Constraints
+{
+	/// <summary>
+	/// MessageWriter is the abstract base for classes that write
+	/// constraint descriptions and messages in some form. The
+	/// class has separate methods for writing various components
+	/// of a message, allowing implementations to tailor the
+	/// presentation as needed.
+	/// </summary>
+    public abstract class MessageWriter : StringWriter
+    {
+
+		/// <summary>
+		/// Construct a MessageWriter given a culture
+		/// </summary>
+        public MessageWriter() : base( System.Globalization.CultureInfo.InvariantCulture ) { }
+
+        /// <summary>
+        /// Abstract method to get the max line length
+        /// </summary>
+        public abstract int MaxLineLength { get; set; }
+
+		/// <summary>
+		/// Method to write single line  message with optional args, usually
+		/// written to precede the general failure message.
+		/// </summary>
+		/// <param name="message">The message to be written</param>
+		/// <param name="args">Any arguments used in formatting the message</param>
+		public void WriteMessageLine(string message, params object[] args)
+        {
+            WriteMessageLine(0, message, args);
+        }
+
+        /// <summary>
+        /// Method to write single line  message with optional args, usually
+        /// written to precede the general failure message, at a givel 
+        /// indentation level.
+        /// </summary>
+        /// <param name="level">The indentation level of the message</param>
+        /// <param name="message">The message to be written</param>
+        /// <param name="args">Any arguments used in formatting the message</param>
+        public abstract void WriteMessageLine(int level, string message, params object[] args);
+
+        /// <summary>
+        /// Display Expected and Actual lines for a constraint. This
+        /// is called by MessageWriter's default implementation of 
+        /// WriteMessageTo and provides the generic two-line display. 
+        /// </summary>
+        /// <param name="constraint">The constraint that failed</param>
+        public abstract void DisplayDifferences(Constraint constraint);
+
+		/// <summary>
+		/// Display Expected and Actual lines for given values. This
+		/// method may be called by constraints that need more control over
+		/// the display of actual and expected values than is provided
+		/// by the default implementation.
+		/// </summary>
+		/// <param name="expected">The expected value</param>
+		/// <param name="actual">The actual value causing the failure</param>
+		public abstract void DisplayDifferences(object expected, object actual);
+
+		/// <summary>
+		/// Display Expected and Actual lines for given values, including
+		/// a tolerance value on the Expected line.
+		/// </summary>
+		/// <param name="expected">The expected value</param>
+		/// <param name="actual">The actual value causing the failure</param>
+		/// <param name="tolerance">The tolerance within which the test was made</param>
+		public abstract void DisplayDifferences(object expected, object actual, Tolerance tolerance);
+
+		/// <summary>
+        /// Display the expected and actual string values on separate lines.
+        /// If the mismatch parameter is >=0, an additional line is displayed
+        /// line containing a caret that points to the mismatch point.
+        /// </summary>
+        /// <param name="expected">The expected string value</param>
+        /// <param name="actual">The actual string value</param>
+        /// <param name="mismatch">The point at which the strings don't match or -1</param>
+        /// <param name="ignoreCase">If true, case is ignored in locating the point where the strings differ</param>
+        /// <param name="clipping">If true, the strings should be clipped to fit the line</param>
+        public abstract void DisplayStringDifferences(string expected, string actual, int mismatch, bool ignoreCase, bool clipping);
+
+        /// <summary>
+        /// Writes the text for a connector.
+        /// </summary>
+        /// <param name="connector">The connector.</param>
+        public abstract void WriteConnector(string connector);
+
+        /// <summary>
+        /// Writes the text for a predicate.
+        /// </summary>
+        /// <param name="predicate">The predicate.</param>
+        public abstract void WritePredicate(string predicate);
+
+		/// <summary>
+		/// Writes the text for an expected value.
+		/// </summary>
+		/// <param name="expected">The expected value.</param>
+		public abstract void WriteExpectedValue(object expected);
+
+		/// <summary>
+		/// Writes the text for a modifier
+		/// </summary>
+		/// <param name="modifier">The modifier.</param>
+		public abstract void WriteModifier(string modifier);
+
+		/// <summary>
+		/// Writes the text for an actual value.
+		/// </summary>
+		/// <param name="actual">The actual value.</param>
+		public abstract void WriteActualValue(object actual);
+
+		/// <summary>
+		/// Writes the text for a generalized value.
+		/// </summary>
+		/// <param name="val">The value.</param>
+		public abstract void WriteValue(object val);
+    
+		/// <summary>
+		/// Writes the text for a collection value,
+		/// starting at a particular point, to a max length
+		/// </summary>
+		/// <param name="collection">The collection containing elements to write.</param>
+        /// <param name="start">The starting point of the elements to write</param>
+        /// <param name="max">The maximum number of elements to write</param>
+		public abstract void WriteCollectionElements(ICollection collection, int start, int max);
+	}
+}
diff --git a/src/NUnitFramework/framework/Constraints/MsgUtils.cs b/src/NUnitFramework/framework/Constraints/MsgUtils.cs
new file mode 100644
index 0000000..0cee3af
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/MsgUtils.cs
@@ -0,0 +1,266 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Text;
+using System.Collections;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// Static methods used in creating messages
+    /// </summary>
+    public class MsgUtils
+    {
+        /// <summary>
+        /// Static string used when strings are clipped
+        /// </summary>
+        private static readonly string ELLIPSIS = "...";
+
+        /// <summary>
+        /// Returns the representation of a type as used in NUnitLite.
+        /// This is the same as Type.ToString() except for arrays,
+        /// which are displayed with their declared sizes.
+        /// </summary>
+        /// <param name="obj"></param>
+        /// <returns></returns>
+        public static string GetTypeRepresentation(object obj)
+        {
+            Array array = obj as Array;
+            if ( array == null )
+                return string.Format( "<{0}>", obj.GetType() );
+
+            StringBuilder sb = new StringBuilder();
+            Type elementType = array.GetType();
+            int nest = 0;
+            while (elementType.IsArray)
+            {
+                elementType = elementType.GetElementType();
+                ++nest;
+            }
+            sb.Append(elementType.ToString());
+            sb.Append('[');
+            for (int r = 0; r < array.Rank; r++)
+            {
+                if (r > 0) sb.Append(',');
+                sb.Append(array.GetLength(r));
+            }
+            sb.Append(']');
+
+            while (--nest > 0)
+                sb.Append("[]");
+
+            return string.Format( "<{0}>", sb.ToString() );
+        }
+        /// <summary>
+        /// Converts any control characters in a string 
+        /// to their escaped representation.
+        /// </summary>
+        /// <param name="s">The string to be converted</param>
+        /// <returns>The converted string</returns>
+        public static string EscapeControlChars(string s)
+        {
+            if (s != null)
+            {
+                StringBuilder sb = new StringBuilder();
+
+                for (int i = 0; i < s.Length; i++)
+                {
+                    char c = s[i];
+
+                    switch (c)
+                    {
+                        //case '\'':
+                        //    sb.Append("\\\'");
+                        //    break;
+                        //case '\"':
+                        //    sb.Append("\\\"");
+                        //    break;
+                        case '\\':
+                            sb.Append("\\\\");
+                            break;
+                        case '\0':
+                            sb.Append("\\0");
+                            break;
+                        case '\a':
+                            sb.Append("\\a");
+                            break;
+                        case '\b':
+                            sb.Append("\\b");
+                            break;
+                        case '\f':
+                            sb.Append("\\f");
+                            break;
+                        case '\n':
+                            sb.Append("\\n");
+                            break;
+                        case '\r':
+                            sb.Append("\\r");
+                            break;
+                        case '\t':
+                            sb.Append("\\t");
+                            break;
+                        case '\v':
+                            sb.Append("\\v");
+                            break;
+
+                        case '\x0085':
+                        case '\x2028':
+                        case '\x2029':
+                            sb.AppendFormat("\\x{0:X4}", (int)c);
+                            break;
+
+                        default:
+                            sb.Append(c);
+                            break;
+                    }
+                }
+
+                s = sb.ToString();
+            }
+
+			return s;
+        }
+
+        /// <summary>
+        /// Return the a string representation for a set of indices into an array
+        /// </summary>
+        /// <param name="indices">Array of indices for which a string is needed</param>
+        public static string GetArrayIndicesAsString(int[] indices)
+        {
+            StringBuilder sb = new StringBuilder();
+            sb.Append('[');
+            for (int r = 0; r < indices.Length; r++)
+            {
+                if (r > 0) sb.Append(',');
+                sb.Append(indices[r].ToString());
+            }
+            sb.Append(']');
+            return sb.ToString();
+        }
+
+        /// <summary>
+        /// Get an array of indices representing the point in a collection or
+        /// array corresponding to a single int index into the collection.
+        /// </summary>
+        /// <param name="collection">The collection to which the indices apply</param>
+        /// <param name="index">Index in the collection</param>
+        /// <returns>Array of indices</returns>
+        public static int[] GetArrayIndicesFromCollectionIndex(ICollection collection, int index)
+        {
+            Array array = collection as Array;
+
+            int rank = array == null ? 1 : array.Rank;
+            int[] result = new int[rank];
+
+            for (int r = rank; --r > 0; )
+            {
+                int l = array.GetLength(r);
+                result[r] = index % l;
+                index /= l;
+            }
+
+            result[0] = index;
+            return result;
+        }
+
+        /// <summary>
+        /// Clip a string to a given length, starting at a particular offset, returning the clipped
+        /// string with ellipses representing the removed parts
+        /// </summary>
+        /// <param name="s">The string to be clipped</param>
+        /// <param name="maxStringLength">The maximum permitted length of the result string</param>
+        /// <param name="clipStart">The point at which to start clipping</param>
+        /// <returns>The clipped string</returns>
+        public static string ClipString(string s, int maxStringLength, int clipStart)
+        {
+            int clipLength = maxStringLength;
+            StringBuilder sb = new StringBuilder();
+
+            if (clipStart > 0)
+            {
+                clipLength -= ELLIPSIS.Length;
+                sb.Append( ELLIPSIS );
+            }
+
+            if (s.Length - clipStart > clipLength)
+            {
+                clipLength -= ELLIPSIS.Length;
+                sb.Append( s.Substring( clipStart, clipLength ));
+                sb.Append(ELLIPSIS);
+            }
+            else if (clipStart > 0)
+                sb.Append( s.Substring(clipStart));
+            else
+                sb.Append( s );
+ 
+            return sb.ToString();
+        }
+
+        /// <summary>
+        /// Clip the expected and actual strings in a coordinated fashion, 
+        /// so that they may be displayed together.
+        /// </summary>
+        /// <param name="expected"></param>
+        /// <param name="actual"></param>
+        /// <param name="maxDisplayLength"></param>
+        /// <param name="mismatch"></param>
+        public static void ClipExpectedAndActual(ref string expected, ref string actual, int maxDisplayLength, int mismatch)
+        {
+            // Case 1: Both strings fit on line
+            int maxStringLength = Math.Max(expected.Length, actual.Length);
+            if (maxStringLength <= maxDisplayLength)
+                return;
+
+            // Case 2: Assume that the tail of each string fits on line
+            int clipLength = maxDisplayLength - ELLIPSIS.Length;
+            int clipStart = maxStringLength - clipLength;
+
+            // Case 3: If it doesn't, center the mismatch position
+            if ( clipStart > mismatch )
+                clipStart = Math.Max( 0, mismatch - clipLength / 2 );
+
+            expected = ClipString(expected, maxDisplayLength, clipStart);
+            actual = ClipString(actual, maxDisplayLength, clipStart);
+        }
+
+        /// <summary>
+        /// Shows the position two strings start to differ.  Comparison 
+        /// starts at the start index.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The actual string</param>
+        /// <param name="istart">The index in the strings at which comparison should start</param>
+        /// <param name="ignoreCase">Boolean indicating whether case should be ignored</param>
+        /// <returns>-1 if no mismatch found, or the index where mismatch found</returns>
+        static public int FindMismatchPosition(string expected, string actual, int istart, bool ignoreCase)
+        {
+            int length = Math.Min(expected.Length, actual.Length);
+
+            string s1 = ignoreCase ? expected.ToLower() : expected;
+            string s2 = ignoreCase ? actual.ToLower() : actual;
+
+            for (int i = istart; i < length; i++)
+            {
+                if (s1[i] != s2[i])
+                    return i;
+            }
+
+            //
+            // Strings have same content up to the length of the shorter string.
+            // Mismatch occurs because string lengths are different, so show
+            // that they start differing where the shortest string ends
+            //
+            if (expected.Length != actual.Length)
+                return length;
+
+            //
+            // Same strings : We shouldn't get here
+            //
+            return -1;
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/NUnitComparer.cs b/src/NUnitFramework/framework/Constraints/NUnitComparer.cs
new file mode 100644
index 0000000..1a41c1c
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/NUnitComparer.cs
@@ -0,0 +1,67 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.IO;
+using System.Reflection;
+using System.Collections;
+#if NET_2_0
+using System.Collections.Generic;
+#endif
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// NUnitComparer encapsulates NUnit's default behavior
+    /// in comparing two objects.
+    /// </summary>
+    public class NUnitComparer : IComparer
+    {
+        /// <summary>
+        /// Returns the default NUnitComparer.
+        /// </summary>
+        public static NUnitComparer Default
+        {
+            get { return new NUnitComparer(); }
+        }
+
+        /// <summary>
+        /// Compares two objects
+        /// </summary>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        /// <returns></returns>
+        public int Compare(object x, object y)
+        {
+            if (x == null)
+                return y == null ? 0 : -1;
+            else if (y == null)
+                return +1;
+
+            if (Numerics.IsNumericType(x) && Numerics.IsNumericType(y))
+                return Numerics.Compare(x, y);
+
+            if (x is IComparable)
+                return ((IComparable)x).CompareTo(y);
+
+            if (y is IComparable)
+                return -((IComparable)y).CompareTo(x);
+
+            Type xType = x.GetType();
+            Type yType = y.GetType();
+
+            MethodInfo method = xType.GetMethod("CompareTo", new Type[] { yType });
+            if (method != null)
+                return (int)method.Invoke(x, new object[] { y });
+
+            method = yType.GetMethod("CompareTo", new Type[] { xType });
+            if (method != null)
+                return -(int)method.Invoke(y, new object[] { x });
+
+            throw new ArgumentException("Neither value implements IComparable or IComparable<T>");
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/NUnitEqualityComparer.cs b/src/NUnitFramework/framework/Constraints/NUnitEqualityComparer.cs
new file mode 100644
index 0000000..fdb0595
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/NUnitEqualityComparer.cs
@@ -0,0 +1,330 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.IO;
+using System.Collections;
+#if NET_2_0
+using System.Collections.Generic;
+#endif
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// NUnitEqualityComparer encapsulates NUnit's handling of
+    /// equality tests between objects.
+    /// </summary>
+    public class NUnitEqualityComparer
+    {
+        #region Static and Instance Fields
+        /// <summary>
+        /// If true, all string comparisons will ignore case
+        /// </summary>
+        private bool caseInsensitive;
+
+        /// <summary>
+        /// If true, arrays will be treated as collections, allowing
+        /// those of different dimensions to be compared
+        /// </summary>
+        private bool compareAsCollection;
+
+        /// <summary>
+        /// If non-zero, equality comparisons within the specified 
+        /// tolerance will succeed.
+        /// </summary>
+        private Tolerance tolerance = Tolerance.Empty;
+
+        /// <summary>
+        /// Comparison object used in comparisons for some constraints.
+        /// </summary>
+        private EqualityAdapter externalComparer;
+
+        private ArrayList failurePoints;
+
+        private static readonly int BUFFER_SIZE = 4096;
+        #endregion
+
+        #region Properties
+
+        /// <summary>
+        /// Returns the default NUnitEqualityComparer
+        /// </summary>
+        public static NUnitEqualityComparer Default
+        {
+            get { return new NUnitEqualityComparer(); }
+        }
+        /// <summary>
+        /// Gets and sets a flag indicating whether case should
+        /// be ignored in determining equality.
+        /// </summary>
+        public bool IgnoreCase
+        {
+            get { return caseInsensitive; }
+            set { caseInsensitive = value; }
+        }
+
+        /// <summary>
+        /// Gets and sets a flag indicating that arrays should be
+        /// compared as collections, without regard to their shape.
+        /// </summary>
+        public bool CompareAsCollection
+        {
+            get { return compareAsCollection; }
+            set { compareAsCollection = value; }
+        }
+
+        /// <summary>
+        /// Gets and sets an external comparer to be used to
+        /// test for equality. It is applied to members of
+        /// collections, in place of NUnit's own logic.
+        /// </summary>
+        public EqualityAdapter ExternalComparer
+        {
+            get { return externalComparer; }
+            set { externalComparer = value; }
+        }
+
+        /// <summary>
+        /// Gets and sets a tolerance used to compare objects of 
+        /// certin types.
+        /// </summary>
+        public Tolerance Tolerance
+        {
+            get { return tolerance; }
+            set { tolerance = value; }
+        }
+
+        /// <summary>
+        /// Gets the list of failure points for the last Match performed.
+        /// </summary>
+        public IList FailurePoints
+        {
+            get { return failurePoints; }
+        }
+        #endregion
+
+        #region Public Methods
+        /// <summary>
+        /// Compares two objects for equality.
+        /// </summary>
+        public bool ObjectsEqual(object x, object y)
+        {
+            this.failurePoints = new ArrayList();
+
+            if (x == null && y == null)
+                return true;
+
+            if (x == null || y == null)
+                return false;
+			
+			if (object.ReferenceEquals(x, y))
+				return true;
+
+            Type xType = x.GetType();
+            Type yType = y.GetType();
+
+            if (xType.IsArray && yType.IsArray && !compareAsCollection)
+                return ArraysEqual((Array)x, (Array)y);
+
+            if (x is IDictionary && y is IDictionary)
+                return DictionariesEqual((IDictionary)x, (IDictionary)y);
+
+            if (x is ICollection && y is ICollection)
+                return CollectionsEqual((ICollection)x, (ICollection)y);
+
+            if (x is IEnumerable && y is IEnumerable && !(x is string && y is string))
+                return EnumerablesEqual((IEnumerable)x, (IEnumerable)y);
+
+            if (externalComparer != null)
+                return externalComparer.ObjectsEqual(x, y);
+
+            if (x is string && y is string)
+                return StringsEqual((string)x, (string)y);
+
+            if (x is Stream && y is Stream)
+                return StreamsEqual((Stream)x, (Stream)y);
+
+            if (x is DirectoryInfo && y is DirectoryInfo)
+                return DirectoriesEqual((DirectoryInfo)x, (DirectoryInfo)y);
+
+            if (Numerics.IsNumericType(x) && Numerics.IsNumericType(y))
+                return Numerics.AreEqual(x, y, ref tolerance);
+
+            if (tolerance != null && tolerance.Value is TimeSpan)
+            {
+                TimeSpan amount = (TimeSpan)tolerance.Value;
+
+                if (x is DateTime && y is DateTime)
+                    return ((DateTime)x - (DateTime)y).Duration() <= amount;
+
+                if (x is TimeSpan && y is TimeSpan)
+                    return ((TimeSpan)x - (TimeSpan)y).Duration() <= amount;
+            }
+
+            return x.Equals(y);
+        }
+        #endregion
+
+        #region Helper Methods
+        /// <summary>
+        /// Helper method to compare two arrays
+        /// </summary>
+        private bool ArraysEqual(Array x, Array y)
+        {
+            int rank = x.Rank;
+
+            if (rank != y.Rank)
+                return false;
+
+            for (int r = 1; r < rank; r++)
+                if (x.GetLength(r) != y.GetLength(r))
+                    return false;
+
+            return CollectionsEqual((ICollection)x, (ICollection)y);
+        }
+
+        private bool DictionariesEqual(IDictionary x, IDictionary y)
+        {
+            if (x.Count != y.Count)
+                return false;
+
+            CollectionTally tally = new CollectionTally(this, x.Keys);
+            if (!tally.TryRemove(y.Keys) || tally.Count > 0)
+                return false;
+
+            foreach (object key in x.Keys)
+                if (!ObjectsEqual(x[key], y[key]))
+                    return false;
+
+            return true;
+        }
+
+        private bool CollectionsEqual(ICollection x, ICollection y)
+        {
+            IEnumerator expectedEnum = x.GetEnumerator();
+            IEnumerator actualEnum = y.GetEnumerator();
+
+            int count;
+            for (count = 0; expectedEnum.MoveNext() && actualEnum.MoveNext(); count++)
+            {
+                if (!ObjectsEqual(expectedEnum.Current, actualEnum.Current))
+                    break;
+            }
+
+            if (count == x.Count && count == y.Count)
+                return true;
+
+            failurePoints.Insert(0, count);
+            return false;
+        }
+
+        private bool StringsEqual(string x, string y)
+        {
+            string s1 = caseInsensitive ? x.ToLower() : x;
+            string s2 = caseInsensitive ? y.ToLower() : y;
+
+            return s1.Equals(s2);
+        }
+
+        private bool EnumerablesEqual(IEnumerable x, IEnumerable y)
+        {
+            IEnumerator expectedEnum = x.GetEnumerator();
+            IEnumerator actualEnum = y.GetEnumerator();
+
+            int count = 0;
+            for (; ; )
+            {
+                bool expectedHasData = expectedEnum.MoveNext();
+                bool actualHasData = actualEnum.MoveNext();
+
+                if (!expectedHasData && !actualHasData)
+                    return true;
+
+                if (expectedHasData != actualHasData ||
+                    !ObjectsEqual(expectedEnum.Current, actualEnum.Current))
+                {
+                    failurePoints.Insert(0, count);
+                    return false;
+                }
+            }
+        }
+
+        /// <summary>
+        /// Method to compare two DirectoryInfo objects
+        /// </summary>
+        /// <param name="x">first directory to compare</param>
+        /// <param name="y">second directory to compare</param>
+        /// <returns>true if equivalent, false if not</returns>
+        private bool DirectoriesEqual(DirectoryInfo x, DirectoryInfo y)
+        {
+            // Do quick compares first
+            if (x.Attributes != y.Attributes ||
+                x.CreationTime != y.CreationTime ||
+                x.LastAccessTime != y.LastAccessTime)
+            {
+                return false;
+            }
+
+            // TODO: Find a cleaner way to do this
+            return new SamePathConstraint(x.FullName).Matches(y.FullName);
+        }
+
+        private bool StreamsEqual(Stream x, Stream y)
+        {
+            if (x == y) return true;
+
+            if (!x.CanRead)
+                throw new ArgumentException("Stream is not readable", "expected");
+            if (!y.CanRead)
+                throw new ArgumentException("Stream is not readable", "actual");
+            if (!x.CanSeek)
+                throw new ArgumentException("Stream is not seekable", "expected");
+            if (!y.CanSeek)
+                throw new ArgumentException("Stream is not seekable", "actual");
+
+            if (x.Length != y.Length) return false;
+
+            byte[] bufferExpected = new byte[BUFFER_SIZE];
+            byte[] bufferActual = new byte[BUFFER_SIZE];
+
+            BinaryReader binaryReaderExpected = new BinaryReader(x);
+            BinaryReader binaryReaderActual = new BinaryReader(y);
+
+            long expectedPosition = x.Position;
+            long actualPosition = y.Position;
+
+            try
+            {
+                binaryReaderExpected.BaseStream.Seek(0, SeekOrigin.Begin);
+                binaryReaderActual.BaseStream.Seek(0, SeekOrigin.Begin);
+
+                for (long readByte = 0; readByte < x.Length; readByte += BUFFER_SIZE)
+                {
+                    binaryReaderExpected.Read(bufferExpected, 0, BUFFER_SIZE);
+                    binaryReaderActual.Read(bufferActual, 0, BUFFER_SIZE);
+
+                    for (int count = 0; count < BUFFER_SIZE; ++count)
+                    {
+                        if (bufferExpected[count] != bufferActual[count])
+                        {
+                            failurePoints.Insert(0, readByte + count);
+                            //FailureMessage.WriteLine("\tIndex : {0}", readByte + count);
+                            return false;
+                        }
+                    }
+                }
+            }
+            finally
+            {
+                x.Position = expectedPosition;
+                y.Position = actualPosition;
+            }
+
+            return true;
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/Numerics.cs b/src/NUnitFramework/framework/Constraints/Numerics.cs
index 63fbaed..6a9ee45 100644
--- a/src/NUnitFramework/framework/Constraints/Numerics.cs
+++ b/src/NUnitFramework/framework/Constraints/Numerics.cs
@@ -1,3 +1,9 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
 using System;
 
 namespace NUnit.Framework.Constraints
@@ -29,9 +35,6 @@ namespace NUnit.Framework.Constraints
 		{
 			if (null != obj)
 			{
-				if (obj is double) return true;
-				if (obj is float) return true;
-
 				if (obj is System.Double) return true;
 				if (obj is System.Single) return true;
 			}
@@ -47,15 +50,6 @@ namespace NUnit.Framework.Constraints
 		{
 			if (null != obj)
 			{
-				if (obj is byte) return true;
-				if (obj is sbyte) return true;
-				if (obj is decimal) return true;
-				if (obj is int) return true;
-				if (obj is uint) return true;
-				if (obj is long) return true;
-				if (obj is short) return true;
-				if (obj is ushort) return true;
-
 				if (obj is System.Byte) return true;
 				if (obj is System.SByte) return true;
 				if (obj is System.Decimal) return true;
@@ -73,100 +67,261 @@ namespace NUnit.Framework.Constraints
 		#region Numeric Equality
         /// <summary>
         /// Test two numeric values for equality, performing the usual numeric 
-        /// conversions and using a provided or default tolerance. If the value 
-        /// referred to by tolerance is null, this method may set it to a default.
+        /// conversions and using a provided or default tolerance. If the tolerance 
+        /// provided is Empty, this method may set it to a default tolerance.
         /// </summary>
         /// <param name="expected">The expected value</param>
         /// <param name="actual">The actual value</param>
-        /// <param name="tolerance">A reference to the numeric tolerance in effect</param>
+        /// <param name="tolerance">A reference to the tolerance in effect</param>
         /// <returns>True if the values are equal</returns>
-		public static bool AreEqual( object expected, object actual, ref object tolerance )
+		public static bool AreEqual( object expected, object actual, ref Tolerance tolerance )
 		{
-            if (IsFloatingPointNumeric(expected) || IsFloatingPointNumeric(actual))
-                return AreEqual(Convert.ToDouble(expected), Convert.ToDouble(actual), ref tolerance);
+            if ( expected is double || actual is double )
+                return AreEqual( Convert.ToDouble(expected), Convert.ToDouble(actual), ref tolerance );
+
+            if ( expected is float || actual is float )
+                return AreEqual( Convert.ToSingle(expected), Convert.ToSingle(actual), ref tolerance );
+
+            if (tolerance.Mode == ToleranceMode.Ulps)
+                throw new InvalidOperationException("Ulps may only be specified for floating point arguments");
 
 			if ( expected is decimal || actual is decimal )
-				return AreEqual( Convert.ToDecimal(expected), Convert.ToDecimal(actual), Convert.ToDecimal(tolerance) );
-			
-			if ( expected is ulong || actual is ulong )
-				return AreEqual( Convert.ToUInt64(expected), Convert.ToUInt64(actual), Convert.ToUInt64(tolerance) );
+				return AreEqual( Convert.ToDecimal(expected), Convert.ToDecimal(actual), tolerance );
+
+            if (expected is ulong || actual is ulong)
+                return AreEqual(Convert.ToUInt64(expected), Convert.ToUInt64(actual), tolerance );
 		
 			if ( expected is long || actual is long )
-				return AreEqual( Convert.ToInt64(expected), Convert.ToInt64(actual), Convert.ToInt64(tolerance) );
+				return AreEqual( Convert.ToInt64(expected), Convert.ToInt64(actual), tolerance );
 			
 			if ( expected is uint || actual is uint )
-				return AreEqual( Convert.ToUInt32(expected), Convert.ToUInt32(actual), Convert.ToUInt32(tolerance) );
+				return AreEqual( Convert.ToUInt32(expected), Convert.ToUInt32(actual), tolerance );
 
-			return AreEqual( Convert.ToInt32(expected), Convert.ToInt32(actual), Convert.ToInt32(tolerance) );
+			return AreEqual( Convert.ToInt32(expected), Convert.ToInt32(actual), tolerance );
 		}
 
-		private static bool AreEqual( double expected, double actual, ref object tolerance )
+        private static bool AreEqual( double expected, double actual, ref Tolerance tolerance )
 		{
             if (double.IsNaN(expected) && double.IsNaN(actual))
                 return true;
-            // handle infinity specially since subtracting two infinite values gives 
+
+            // Handle infinity specially since subtracting two infinite values gives 
             // NaN and the following test fails. mono also needs NaN to be handled
-            // specially although ms.net could use either method.
+            // specially although ms.net could use either method. Also, handle
+            // situation where no tolerance is used.
             if (double.IsInfinity(expected) || double.IsNaN(expected) || double.IsNaN(actual))
+            {
                 return expected.Equals(actual);
+            }
+
+            if (tolerance.IsEmpty && GlobalSettings.DefaultFloatingPointTolerance > 0.0d)
+                tolerance = new Tolerance(GlobalSettings.DefaultFloatingPointTolerance);
+
+            switch (tolerance.Mode)
+            {
+                case ToleranceMode.None:
+                    return expected.Equals(actual);
+
+                case ToleranceMode.Linear:
+                    return Math.Abs(expected - actual) <= Convert.ToDouble(tolerance.Value);
 
-            if (tolerance != null)
-                return Math.Abs(expected - actual) <= Convert.ToDouble(tolerance);
+                case ToleranceMode.Percent:
+                    if (expected == 0.0)
+                        return expected.Equals(actual);
+                    
+                    double relativeError = Math.Abs((expected - actual) / expected);
+                    return (relativeError <= Convert.ToDouble(tolerance.Value) / 100.0);
+#if !NETCF_1_0
+                case ToleranceMode.Ulps:
+                    return FloatingPointNumerics.AreAlmostEqualUlps(
+                        expected, actual, Convert.ToInt64(tolerance.Value));
+#endif
+                default:
+                    throw new ArgumentException("Unknown tolerance mode specified", "mode");
+            }
+        }
+
+        private static bool AreEqual( float expected, float actual, ref Tolerance tolerance )
+		{
+            if ( float.IsNaN(expected) && float.IsNaN(actual) )
+                return true;
 
-            if (GlobalSettings.DefaultFloatingPointTolerance > 0.0d
-                && !double.IsNaN(expected) && !double.IsInfinity(expected))
+            // handle infinity specially since subtracting two infinite values gives 
+            // NaN and the following test fails. mono also needs NaN to be handled
+            // specially although ms.net could use either method.
+            if (float.IsInfinity(expected) || float.IsNaN(expected) || float.IsNaN(actual))
             {
-                tolerance = GlobalSettings.DefaultFloatingPointTolerance;
-                return Math.Abs(expected - actual) <= GlobalSettings.DefaultFloatingPointTolerance;
+                return expected.Equals(actual);
             }
 
-			return expected.Equals( actual );
+            if (tolerance.IsEmpty && GlobalSettings.DefaultFloatingPointTolerance > 0.0d)
+                tolerance = new Tolerance(GlobalSettings.DefaultFloatingPointTolerance);
+
+            switch (tolerance.Mode)
+            {
+                case ToleranceMode.None:
+                    return expected.Equals(actual);
+
+                case ToleranceMode.Linear:
+                    return Math.Abs(expected - actual) <= Convert.ToDouble(tolerance.Value);
+
+                case ToleranceMode.Percent:
+                    if (expected == 0.0f)
+                        return expected.Equals(actual);
+                    float relativeError = Math.Abs((expected - actual) / expected);
+                    return (relativeError <= Convert.ToSingle(tolerance.Value) / 100.0f);
+#if !NETCF_1_0
+                case ToleranceMode.Ulps:
+                    return FloatingPointNumerics.AreAlmostEqualUlps(
+                        expected, actual, Convert.ToInt32(tolerance.Value));
+#endif
+                default:
+                    throw new ArgumentException("Unknown tolerance mode specified", "mode");
+            }
 		}
 
-		private static bool AreEqual( decimal expected, decimal actual, decimal tolerance )
-		{
-			if ( tolerance > 0m )
-				return Math.Abs(expected - actual) <= tolerance;
+
+        private static bool AreEqual( decimal expected, decimal actual, Tolerance tolerance )
+        {
+            switch (tolerance.Mode)
+            {
+                case ToleranceMode.None:
+                    return expected.Equals(actual);
+
+                case ToleranceMode.Linear:
+                    decimal decimalTolerance = Convert.ToDecimal(tolerance.Value);
+                    if(decimalTolerance > 0m)
+                      return Math.Abs(expected - actual) <= decimalTolerance;
 				
-			return expected.Equals( actual );
-		}
+			        return expected.Equals( actual );
 
-		private static bool AreEqual( ulong expected, ulong actual, ulong tolerance )
+                case ToleranceMode.Percent:
+                    if(expected == 0m)
+                        return expected.Equals(actual);
+
+                    double relativeError = Math.Abs(
+                        (double)(expected - actual) / (double)expected);
+                    return (relativeError <= Convert.ToDouble(tolerance.Value) / 100.0);
+
+                default:
+                    throw new ArgumentException("Unknown tolerance mode specified", "mode");
+            }
+        }
+
+		private static bool AreEqual( ulong expected, ulong actual, Tolerance tolerance )
 		{
-			if ( tolerance > 0ul )
-			{
-				ulong diff = expected >= actual ? expected - actual : actual - expected;
-				return diff <= tolerance;
-			}
+            switch (tolerance.Mode)
+            {
+                case ToleranceMode.None:
+                    return expected.Equals(actual);
+
+                case ToleranceMode.Linear:
+                    ulong ulongTolerance = Convert.ToUInt64(tolerance.Value);
+                    if(ulongTolerance > 0ul)
+			        {
+				        ulong diff = expected >= actual ? expected - actual : actual - expected;
+                        return diff <= ulongTolerance;
+			        }
+
+			        return expected.Equals( actual );
+
+                case ToleranceMode.Percent:
+                    if (expected == 0ul)
+                        return expected.Equals(actual);
 
-			return expected.Equals( actual );
+                    // Can't do a simple Math.Abs() here since it's unsigned
+                    ulong difference = Math.Max(expected, actual) - Math.Min(expected, actual);
+                    double relativeError = Math.Abs( (double)difference / (double)expected );
+                    return (relativeError <= Convert.ToDouble(tolerance.Value) / 100.0);
+
+                default:
+                    throw new ArgumentException("Unknown tolerance mode specified", "mode");
+            }
 		}
 
-		private static bool AreEqual( long expected, long actual, long tolerance )
+		private static bool AreEqual( long expected, long actual, Tolerance tolerance )
 		{
-			if ( tolerance > 0L )
-				return Math.Abs(expected - actual) <= tolerance;
+            switch (tolerance.Mode)
+            {
+                case ToleranceMode.None:
+                    return expected.Equals(actual);
+
+                case ToleranceMode.Linear:
+                    long longTolerance = Convert.ToInt64(tolerance.Value);
+                    if(longTolerance > 0L)
+				        return Math.Abs(expected - actual) <= longTolerance;
+
+			        return expected.Equals( actual );
 
-			return expected.Equals( actual );
+                case ToleranceMode.Percent:
+                    if(expected == 0L)
+                        return expected.Equals(actual);
+
+                    double relativeError = Math.Abs(
+                        (double)(expected - actual) / (double)expected);
+                    return (relativeError <= Convert.ToDouble(tolerance.Value) / 100.0);
+
+                default:
+                    throw new ArgumentException("Unknown tolerance mode specified", "mode");
+            }
 		}
 
-		private static bool AreEqual( uint expected, uint actual, uint tolerance )
+		private static bool AreEqual( uint expected, uint actual, Tolerance tolerance )
 		{
-			if ( tolerance > 0 )
-			{
-				uint diff = expected >= actual ? expected - actual : actual - expected;
-				return diff <= tolerance;
-			}
+            switch (tolerance.Mode)
+            {
+                case ToleranceMode.None:
+                    return expected.Equals(actual);
+
+                case ToleranceMode.Linear:
+                    uint uintTolerance = Convert.ToUInt32(tolerance.Value);
+                    if(uintTolerance > 0)
+			        {
+				        uint diff = expected >= actual ? expected - actual : actual - expected;
+                        return diff <= uintTolerance;
+			        }
 				
-			return expected.Equals( actual );
+			        return expected.Equals( actual );
+
+                case ToleranceMode.Percent:
+                    if(expected == 0u)
+                        return expected.Equals(actual);
+
+                    // Can't do a simple Math.Abs() here since it's unsigned
+                    uint difference = Math.Max(expected, actual) - Math.Min(expected, actual);
+                    double relativeError = Math.Abs((double)difference / (double)expected );
+                    return (relativeError <= Convert.ToDouble(tolerance.Value) / 100.0);
+
+                default:
+                    throw new ArgumentException("Unknown tolerance mode specified", "mode");
+            }
 		}
 
-		private static bool AreEqual( int expected, int actual, int tolerance )
+		private static bool AreEqual( int expected, int actual, Tolerance tolerance )
 		{
-			if ( tolerance > 0 )
-				return Math.Abs(expected - actual) <= tolerance;
-				
-			return expected.Equals( actual );
+            switch (tolerance.Mode)
+            {
+                case ToleranceMode.None:
+                    return expected.Equals(actual);
+
+                case ToleranceMode.Linear:
+                    int intTolerance = Convert.ToInt32(tolerance.Value);
+                    if (intTolerance > 0)
+                        return Math.Abs(expected - actual) <= intTolerance;
+
+                    return expected.Equals(actual);
+
+                case ToleranceMode.Percent:
+                    if (expected == 0)
+                        return expected.Equals(actual);
+
+                    double relativeError = Math.Abs(
+                        (double)(expected - actual) / (double)expected);
+                    return (relativeError <= Convert.ToDouble(tolerance.Value) / 100.0);
+
+                default:
+                    throw new ArgumentException("Unknown tolerance mode specified", "mode");
+            }
 		}
 		#endregion
 
@@ -176,37 +331,29 @@ namespace NUnit.Framework.Constraints
         /// </summary>
         /// <param name="expected">The expected value</param>
         /// <param name="actual">The actual value</param>
-        /// <returns></returns>
-		public static int Compare( IComparable expected, object actual )
+        /// <returns>The relationship of the values to each other</returns>
+		public static int Compare( object expected, object actual )
 		{
-			if ( expected == null )
-				throw new ArgumentException( "Cannot compare using a null reference", "expected" );
-
-			if ( actual == null )
-				throw new ArgumentException( "Cannot compare to null reference", "actual" );
+			if( !IsNumericType( expected ) || !IsNumericType( actual ) )
+				throw new ArgumentException( "Both arguments must be numeric");
 
-			if( IsNumericType( expected ) && IsNumericType( actual ) )
-			{
-				if ( IsFloatingPointNumeric(expected) || IsFloatingPointNumeric(actual) )
-					return Convert.ToDouble(expected).CompareTo(Convert.ToDouble(actual));
+			if ( IsFloatingPointNumeric(expected) || IsFloatingPointNumeric(actual) )
+				return Convert.ToDouble(expected).CompareTo(Convert.ToDouble(actual));
 
-				if ( expected is decimal || actual is decimal )
-					return Convert.ToDecimal(expected).CompareTo(Convert.ToDecimal(actual));
-			
-				if ( expected is ulong || actual is ulong )
-					return Convert.ToUInt64(expected).CompareTo(Convert.ToUInt64(actual));
+			if ( expected is decimal || actual is decimal )
+				return Convert.ToDecimal(expected).CompareTo(Convert.ToDecimal(actual));
 		
-				if ( expected is long || actual is long )
-					return Convert.ToInt64(expected).CompareTo(Convert.ToInt64(actual));
-			
-				if ( expected is uint || actual is uint )
-					return Convert.ToUInt32(expected).CompareTo(Convert.ToUInt32(actual));
+			if ( expected is ulong || actual is ulong )
+				return Convert.ToUInt64(expected).CompareTo(Convert.ToUInt64(actual));
+	
+			if ( expected is long || actual is long )
+				return Convert.ToInt64(expected).CompareTo(Convert.ToInt64(actual));
+		
+			if ( expected is uint || actual is uint )
+				return Convert.ToUInt32(expected).CompareTo(Convert.ToUInt32(actual));
 
-				return Convert.ToInt32(expected).CompareTo(Convert.ToInt32(actual));
-			}
-			else
-				return expected.CompareTo(actual);
-		}
+			return Convert.ToInt32(expected).CompareTo(Convert.ToInt32(actual));
+        }
 		#endregion
 
 		private Numerics()
diff --git a/src/NUnitFramework/framework/Constraints/PathConstraints.cs b/src/NUnitFramework/framework/Constraints/PathConstraints.cs
new file mode 100644
index 0000000..38a768b
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/PathConstraints.cs
@@ -0,0 +1,321 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.IO;
+using System.Collections;
+
+namespace NUnit.Framework.Constraints
+{
+    #region PathConstraint
+    /// <summary>
+	/// PathConstraint serves as the abstract base of constraints
+	/// that operate on paths and provides several helper methods.
+	/// </summary>
+	public abstract class PathConstraint : Constraint
+	{
+        private static readonly char[] DirectorySeparatorChars = new char[] { '\\', '/' };
+
+		/// <summary>
+		/// The expected path used in the constraint
+		/// </summary>
+		protected string expectedPath;
+		
+		/// <summary>
+		/// The actual path being tested
+		/// </summary>
+		protected string actualPath;
+
+        /// <summary>
+        /// Flag indicating whether a caseInsensitive comparison should be made
+        /// </summary>
+        protected bool caseInsensitive = Path.DirectorySeparatorChar == '\\';
+
+        /// <summary>
+		/// Construct a PathConstraint for a give expected path
+		/// </summary>
+		/// <param name="expected">The expected path</param>
+		protected PathConstraint( string expected ) : base(expected)
+		{
+			this.expectedPath = expected;
+        }
+
+        /// <summary>
+        /// Modifies the current instance to be case-insensitve
+        /// and returns it.
+        /// </summary>
+        public PathConstraint IgnoreCase
+        {
+            get { caseInsensitive = true; return this; }
+        }
+
+        /// <summary>
+        /// Modifies the current instance to be case-sensitve
+        /// and returns it.
+        /// </summary>
+        public PathConstraint RespectCase
+        {
+            get { caseInsensitive = false; return this; }
+        }
+
+        /// <summary>
+        /// Test whether the constraint is satisfied by a given value
+        /// </summary>
+        /// <param name="actual">The value to be tested</param>
+        /// <returns>True for success, false for failure</returns>
+		public override bool Matches (object actual)
+		{
+			this.actual = actual;
+			this.actualPath = actual as string;
+
+			if (actualPath == null)
+                return false;
+			
+			return IsMatch(expectedPath, actualPath);
+		}
+		
+        /// <summary>
+        /// Returns true if the expected path and actual path match
+        /// </summary>
+		protected abstract bool IsMatch(string expectedPath, string actualPath);
+		
+        /// <summary>
+        /// Returns the string representation of this constraint
+        /// </summary>
+        protected override string GetStringRepresentation()
+        {
+            return string.Format( "<{0} \"{1}\" {2}>", DisplayName, expectedPath, caseInsensitive ? "ignorecase" : "respectcase" );
+        }
+
+        #region Helper Methods
+        /// <summary>
+		/// Canonicalize the provided path
+		/// </summary>
+		/// <param name="path"></param>
+		/// <returns>The path in standardized form</returns>
+		protected static string Canonicalize( string path )
+		{
+			bool initialSeparator = false;
+			
+			if (path.Length > 0)
+				foreach(char c in DirectorySeparatorChars)
+					if (path[0] == c)
+						initialSeparator = true;
+			
+			ArrayList parts = new ArrayList( path.Split( DirectorySeparatorChars ) );
+
+			for( int index = 0; index < parts.Count; )
+			{
+				string part = (string)parts[index];
+		
+				switch( part )
+				{
+					case ".":
+						parts.RemoveAt( index );
+						break;
+				
+					case "..":
+						parts.RemoveAt( index );
+						if ( index > 0 )
+							parts.RemoveAt( --index );
+						break;
+					default:
+						index++;
+						break;
+				}
+			}
+
+            // Trailing separator removal
+            if ((string)parts[parts.Count - 1] == "")
+                parts.RemoveAt(parts.Count - 1);
+
+            string result = String.Join(Path.DirectorySeparatorChar.ToString(), 
+				(string[])parts.ToArray( typeof( string ) ) );
+			
+			if (initialSeparator)
+				result = Path.DirectorySeparatorChar.ToString() + result;
+			
+			return result;
+		}
+
+		/// <summary>
+		/// Test whether two paths are the same
+		/// </summary>
+		/// <param name="path1">The first path</param>
+		/// <param name="path2">The second path</param>
+        /// <param name="ignoreCase">Indicates whether case should be ignored</param>
+		/// <returns></returns>
+		protected static bool IsSamePath( string path1, string path2, bool ignoreCase )
+		{
+			return string.Compare( path1, path2, ignoreCase ) == 0;
+		}
+
+		/// <summary>
+		/// Test whether one path is under another path
+		/// </summary>
+		/// <param name="path1">The first path - supposed to be the parent path</param>
+		/// <param name="path2">The second path - supposed to be the child path</param>
+        /// <param name="ignoreCase">Indicates whether case should be ignored</param>
+		/// <returns></returns>
+		protected static bool IsSubPath( string path1, string path2, bool ignoreCase )
+		{
+			int length1 = path1.Length;
+			int length2 = path2.Length;
+
+			// if path1 is longer or equal, then path2 can't be under it
+			if ( length1 >= length2 )
+				return false;
+
+			// path 2 is longer than path 1: see if initial parts match
+			if ( string.Compare( path1, path2.Substring( 0, length1 ), ignoreCase ) != 0 )
+				return false;
+			
+			// must match through or up to a directory separator boundary
+			return	path2[length1-1] == Path.DirectorySeparatorChar ||
+				length2 > length1 && path2[length1] == Path.DirectorySeparatorChar;
+        }
+
+		/// <summary>
+		/// Test whether one path is the same as or under another path
+		/// </summary>
+		/// <param name="path1">The first path - supposed to be the parent path</param>
+		/// <param name="path2">The second path - supposed to be the child path</param>
+		/// <returns></returns>
+		protected bool IsSamePathOrUnder( string path1, string path2 )
+		{
+			int length1 = path1.Length;
+			int length2 = path2.Length;
+
+			// if path1 is longer, then path2 can't be under it
+			if ( length1 > length2 )
+				return false;
+
+			// if lengths are the same, check for equality
+			if ( length1 == length2 )
+				return string.Compare( path1, path2, caseInsensitive ) == 0;
+
+			// path 2 is longer than path 1: see if initial parts match
+			if ( string.Compare( path1, path2.Substring( 0, length1 ), caseInsensitive ) != 0 )
+				return false;
+			
+			// must match through or up to a directory separator boundary
+			return	path2[length1-1] == Path.DirectorySeparatorChar ||
+				path2[length1] == Path.DirectorySeparatorChar;
+        }
+#endregion
+    }
+    #endregion
+
+    #region SamePathConstraint
+    /// <summary>
+	/// Summary description for SamePathConstraint.
+	/// </summary>
+	public class SamePathConstraint : PathConstraint
+	{
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:SamePathConstraint"/> class.
+        /// </summary>
+        /// <param name="expected">The expected path</param>
+		public SamePathConstraint( string expected ) : base( expected ) { }
+
+        /// <summary>
+        /// Test whether the constraint is satisfied by a given value
+        /// </summary>
+        /// <param name="expectedPath">The expected path</param>
+        /// <param name="actualPath">The actual path</param>
+        /// <returns>True for success, false for failure</returns>
+		protected override bool IsMatch(string expectedPath, string actualPath)
+		{
+			return IsSamePath( Canonicalize(expectedPath), Canonicalize(actualPath), caseInsensitive );
+		}
+
+        /// <summary>
+        /// Write the constraint description to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The writer on which the description is displayed</param>
+		public override void WriteDescriptionTo(MessageWriter writer)
+		{
+			writer.WritePredicate( "Path matching" );
+			writer.WriteExpectedValue( expectedPath );
+		}
+    }
+    #endregion
+	
+	#region SubPathConstraint
+    /// <summary>
+    /// SubPathConstraint tests that the actual path is under the expected path
+    /// </summary>
+	public class SubPathConstraint : PathConstraint
+	{
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:SubPathConstraint"/> class.
+        /// </summary>
+        /// <param name="expected">The expected path</param>
+		public SubPathConstraint( string expected ) : base( expected ) { }
+
+        /// <summary>
+        /// Test whether the constraint is satisfied by a given value
+        /// </summary>
+        /// <param name="expectedPath">The expected path</param>
+        /// <param name="actualPath">The actual path</param>
+        /// <returns>True for success, false for failure</returns>
+		protected override bool IsMatch(string expectedPath, string actualPath)
+		{
+			if (actualPath == null)
+                throw new ArgumentException("The actual value may not be null", "actual");
+
+			return IsSubPath( Canonicalize(expectedPath), Canonicalize(actualPath), caseInsensitive );
+		}
+
+        /// <summary>
+        /// Write the constraint description to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The writer on which the description is displayed</param>
+		public override void WriteDescriptionTo(MessageWriter writer)
+		{
+			writer.WritePredicate( "Path under" );
+			writer.WriteExpectedValue( expectedPath );
+		}
+    }
+	#endregion
+
+    #region SamePathOrUnderConstraint
+    /// <summary>
+    /// SamePathOrUnderConstraint tests that one path is under another
+    /// </summary>
+	public class SamePathOrUnderConstraint : PathConstraint
+	{
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:SamePathOrUnderConstraint"/> class.
+        /// </summary>
+        /// <param name="expected">The expected path</param>
+		public SamePathOrUnderConstraint( string expected ) : base( expected ) { }
+
+        /// <summary>
+        /// Test whether the constraint is satisfied by a given value
+        /// </summary>
+        /// <param name="expectedPath">The expected path</param>
+        /// <param name="actualPath">The actual path</param>
+        /// <returns>True for success, false for failure</returns>
+		protected override bool IsMatch(string expectedPath, string actualPath)
+		{
+			string path1 = Canonicalize(expectedPath);
+			string path2 = Canonicalize(actualPath);
+			return IsSamePath(path1, path2, caseInsensitive) || IsSubPath(path1, path2, caseInsensitive);
+		}
+
+        /// <summary>
+        /// Write the constraint description to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The writer on which the description is displayed</param>
+		public override void WriteDescriptionTo(MessageWriter writer)
+		{
+			writer.WritePredicate( "Path under or matching" );
+			writer.WriteExpectedValue( expectedPath );
+		}
+    }
+    #endregion
+}
diff --git a/src/NUnitFramework/framework/Constraints/PredicateConstraint.cs b/src/NUnitFramework/framework/Constraints/PredicateConstraint.cs
new file mode 100644
index 0000000..7e89bcb
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/PredicateConstraint.cs
@@ -0,0 +1,55 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+#if NET_2_0
+using System;
+using System.Collections.Generic;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// Predicate constraint wraps a Predicate in a constraint,
+    /// returning success if the predicate is true.
+    /// </summary>
+    public class PredicateConstraint<T> : Constraint
+    {
+        Predicate<T> predicate;
+
+        /// <summary>
+        /// Construct a PredicateConstraint from a predicate
+        /// </summary>
+        public PredicateConstraint(Predicate<T> predicate)
+        {
+            this.predicate = predicate;
+        }
+
+        /// <summary>
+        /// Determines whether the predicate succeeds when applied
+        /// to the actual value.
+        /// </summary>
+        public override bool Matches(object actual)
+        {
+            this.actual = actual;
+
+            if (!(actual is T))
+                throw new ArgumentException("The actual value is not of type " + typeof(T).Name, "actual");
+
+            return predicate((T)actual);
+        }
+
+        /// <summary>
+        /// Writes the description to a MessageWriter
+        /// </summary>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.WritePredicate("value matching");
+            writer.Write(predicate.Method.Name.StartsWith("<")
+                ? "lambda expression"
+                : predicate.Method.Name);
+        }
+    }
+}
+#endif
diff --git a/src/NUnitFramework/framework/Constraints/PrefixConstraints.cs b/src/NUnitFramework/framework/Constraints/PrefixConstraints.cs
index 184bf2d..d08abb2 100644
--- a/src/NUnitFramework/framework/Constraints/PrefixConstraints.cs
+++ b/src/NUnitFramework/framework/Constraints/PrefixConstraints.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -13,40 +13,23 @@ namespace NUnit.Framework.Constraints
 	/// <summary>
 	/// Abstract base class used for prefixes
 	/// </summary>
-	public abstract class PrefixConstraint : Constraint
-	{
-		/// <summary>
-		/// The base constraint
-		/// </summary>
-		protected Constraint baseConstraint;
-
-		/// <summary>
-		/// Construct given a base constraint
-		/// </summary>
-		/// <param name="baseConstraint"></param>
-		protected PrefixConstraint( Constraint baseConstraint )
-		{
-			this.baseConstraint = baseConstraint;
-		}
-
-		/// <summary>
-		/// Set all modifiers applied to the prefix into
-		/// the base constraint before matching
-		/// </summary>
-		protected void PassModifiersToBase()
-		{
-			if ( this.caseInsensitive )
-				baseConstraint = baseConstraint.IgnoreCase;
-            if (!this.clipStrings)
-                baseConstraint = baseConstraint.NoClip;
-			if ( this.tolerance != null )
-				baseConstraint = baseConstraint.Within( tolerance );
-			if ( this.compareAsCollection )
-				baseConstraint = baseConstraint.AsCollection;
-			if ( this.compareWith != null )
-				baseConstraint = baseConstraint.Comparer( compareWith );
-		}
-	}
+    public abstract class PrefixConstraint : Constraint
+    {
+        /// <summary>
+        /// The base constraint
+        /// </summary>
+        protected Constraint baseConstraint;
+
+        /// <summary>
+        /// Construct given a base constraint
+        /// </summary>
+        /// <param name="resolvable"></param>
+        protected PrefixConstraint(IResolveConstraint resolvable) : base(resolvable)
+        {
+            if ( resolvable != null )
+                this.baseConstraint = resolvable.Resolve();
+        }
+    }
 	#endregion
 
 	#region NotConstraint
@@ -70,7 +53,6 @@ namespace NUnit.Framework.Constraints
 		public override bool Matches(object actual)
 		{
 			this.actual = actual;
-			this.PassModifiersToBase();
 			return !baseConstraint.Matches(actual);
 		}
 
@@ -107,7 +89,10 @@ namespace NUnit.Framework.Constraints
 		/// </summary>
 		/// <param name="itemConstraint"></param>
 		public AllItemsConstraint(Constraint itemConstraint)
-			: base( itemConstraint ) { }
+			: base( itemConstraint )
+        {
+            this.DisplayName = "all";
+        }
 
 		/// <summary>
 		/// Apply the item constraint to each item in the collection,
@@ -119,12 +104,10 @@ namespace NUnit.Framework.Constraints
 		{
 			this.actual = actual;
 
-			PassModifiersToBase();
-
-			if ( !(actual is ICollection) )
-				throw new ArgumentException( "The actual value must be a collection", "actual" );
+			if ( !(actual is IEnumerable) )
+				throw new ArgumentException( "The actual value must be an IEnumerable", "actual" );
 
-			foreach(object item in (ICollection)actual)
+			foreach(object item in (IEnumerable)actual)
 				if (!baseConstraint.Matches(item))
 					return false;
 
@@ -155,11 +138,14 @@ namespace NUnit.Framework.Constraints
 		/// </summary>
 		/// <param name="itemConstraint"></param>
 		public SomeItemsConstraint(Constraint itemConstraint)
-			: base( itemConstraint ) { }
+			: base( itemConstraint ) 
+        {
+            this.DisplayName = "some";
+        }
 
 		/// <summary>
 		/// Apply the item constraint to each item in the collection,
-		/// failing if any item fails.
+		/// succeeding if any item succeeds.
 		/// </summary>
 		/// <param name="actual"></param>
 		/// <returns></returns>
@@ -167,12 +153,10 @@ namespace NUnit.Framework.Constraints
 		{
 			this.actual = actual;
 
-			PassModifiersToBase();
-
-			if ( !(actual is ICollection) )
-				throw new ArgumentException( "The actual value must be a collection", "actual" );
+			if ( !(actual is IEnumerable) )
+				throw new ArgumentException( "The actual value must be an IEnumerable", "actual" );
 
-			foreach(object item in (ICollection)actual)
+			foreach(object item in (IEnumerable)actual)
 				if (baseConstraint.Matches(item))
 					return true;
 
@@ -192,18 +176,21 @@ namespace NUnit.Framework.Constraints
 	#endregion
 
 	#region NoItemConstraint
-	/// <summary>
-	/// SomeItemsConstraint applies another constraint to each
-	/// item in a collection, succeeding if any of them succeeds.
-	/// </summary>
-	public class NoItemConstraint : PrefixConstraint
+    /// <summary>
+    /// NoItemConstraint applies another constraint to each
+    /// item in a collection, failing if any of them succeeds.
+    /// </summary>
+    public class NoItemConstraint : PrefixConstraint
 	{
 		/// <summary>
 		/// Construct a SomeItemsConstraint on top of an existing constraint
 		/// </summary>
 		/// <param name="itemConstraint"></param>
 		public NoItemConstraint(Constraint itemConstraint)
-			: base( itemConstraint ) { }
+			: base( itemConstraint ) 
+        {
+            this.DisplayName = "none";
+        }
 
 		/// <summary>
 		/// Apply the item constraint to each item in the collection,
@@ -215,12 +202,10 @@ namespace NUnit.Framework.Constraints
 		{
 			this.actual = actual;
 
-			PassModifiersToBase();
-
-			if ( !(actual is ICollection) )
-				throw new ArgumentException( "The actual value must be a collection", "actual" );
+			if ( !(actual is IEnumerable) )
+				throw new ArgumentException( "The actual value must be an IEnumerable", "actual" );
 
-			foreach(object item in (ICollection)actual)
+			foreach(object item in (IEnumerable)actual)
 				if (baseConstraint.Matches(item))
 					return false;
 
diff --git a/src/NUnitFramework/framework/Constraints/PropertyConstraint.cs b/src/NUnitFramework/framework/Constraints/PropertyConstraint.cs
index 218ea7b..32fccf9 100644
--- a/src/NUnitFramework/framework/Constraints/PropertyConstraint.cs
+++ b/src/NUnitFramework/framework/Constraints/PropertyConstraint.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -10,45 +10,120 @@ using System.Reflection;
 
 namespace NUnit.Framework.Constraints
 {
+    /// <summary>
+    /// PropertyExistsConstraint tests that a named property
+    /// exists on the object provided through Match.
+    /// 
+    /// Originally, PropertyConstraint provided this feature
+    /// in addition to making optional tests on the vaue
+    /// of the property. The two constraints are now separate.
+    /// </summary>
+    public class PropertyExistsConstraint : Constraint
+    {
+        private string name;
+
+        Type actualType;
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:PropertyExistConstraint"/> class.
+        /// </summary>
+        /// <param name="name">The name of the property.</param>
+        public PropertyExistsConstraint(string name) : base(name)
+        {
+            this.name = name;
+        }
+
+        /// <summary>
+        /// Test whether the property exists for a given object
+        /// </summary>
+        /// <param name="actual">The object to be tested</param>
+        /// <returns>True for success, false for failure</returns>
+        public override bool Matches(object actual)
+        {
+            this.actual = actual;
+            
+            if (actual == null)
+                throw new ArgumentNullException("actual");
+
+            this.actualType = actual as Type;
+            if (actualType == null)
+                actualType = actual.GetType();
+
+            PropertyInfo property = actualType.GetProperty(name,
+                BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetProperty);
+
+            return property != null;
+        }
+
+        /// <summary>
+        /// Write the constraint description to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The writer on which the description is displayed</param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.Write("property " + name);
+        }
+
+        /// <summary>
+        /// Write the actual value for a failing constraint test to a
+        /// MessageWriter.
+        /// </summary>
+        /// <param name="writer">The writer on which the actual value is displayed</param>
+        public override void WriteActualValueTo(MessageWriter writer)
+        {
+            writer.WriteActualValue(actualType);
+        }
+
+        /// <summary>
+        /// Returns the string representation of the constraint.
+        /// </summary>
+        /// <returns></returns>
+        protected override string GetStringRepresentation()
+        {
+            return string.Format("<propertyexists {0}>", name);
+        }
+    }
+
 	/// <summary>
-	/// Summary description for PropertyConstraint.
+	/// PropertyConstraint extracts a named property and uses
+    /// its value as the actual value for a chained constraint.
 	/// </summary>
 	public class PropertyConstraint : PrefixConstraint
 	{
 		private string name;
 		private object propValue;
 
-		private bool propertyExists;
-
         /// <summary>
         /// Initializes a new instance of the <see cref="T:PropertyConstraint"/> class.
         /// </summary>
         /// <param name="name">The name.</param>
         /// <param name="baseConstraint">The constraint to apply to the property.</param>
-		public PropertyConstraint( string name, Constraint baseConstraint )
+        public PropertyConstraint(string name, Constraint baseConstraint)
 			: base( baseConstraint ) 
 		{ 
 			this.name = name;
 		}
 
-		/// <summary>
-		/// Test whether the constraint is satisfied by a given value
-		/// </summary>
-		/// <param name="actual">The value to be tested</param>
-		/// <returns>True for success, false for failure</returns>
-		public override bool Matches(object actual)
+        /// <summary>
+        /// Test whether the constraint is satisfied by a given value
+        /// </summary>
+        /// <param name="actual">The value to be tested</param>
+        /// <returns>True for success, false for failure</returns>
+        public override bool Matches(object actual)
 		{
-			this.actual = actual;
+            this.actual = actual;
+            if (actual == null) 
+                throw new ArgumentNullException("actual");
 
-			// TODO: Should be argument exception?
-			if ( actual == null ) return false;
+            Type actualType = actual as Type;
+            if ( actualType == null )
+                actualType = actual.GetType();
 
-			PropertyInfo property = actual.GetType().GetProperty( name, 
-				BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance );
-			this.propertyExists = property != null;
-			if ( !propertyExists ) return false;
+            PropertyInfo property = actualType.GetProperty(name,
+                BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetProperty);
 
-			if ( baseConstraint == null ) return true;
+            if (property == null)
+                throw new ArgumentException(string.Format("Property {0} was not found",name), "name");
 
 			propValue = property.GetValue( actual, null );
 			return baseConstraint.Matches( propValue );
@@ -60,10 +135,14 @@ namespace NUnit.Framework.Constraints
 		/// <param name="writer">The writer on which the description is displayed</param>
 		public override void WriteDescriptionTo(MessageWriter writer)
 		{
-			writer.WritePredicate( "Property \"" + name + "\"" );
-			if ( baseConstraint != null )
-				baseConstraint.WriteDescriptionTo( writer );
-		}
+			writer.WritePredicate( "property " + name );
+            if (baseConstraint != null)
+            {
+                if (baseConstraint is EqualConstraint)
+                    writer.WritePredicate("equal to");
+                baseConstraint.WriteDescriptionTo(writer);
+            }
+        }
 
 		/// <summary>
 		/// Write the actual value for a failing constraint test to a
@@ -74,10 +153,16 @@ namespace NUnit.Framework.Constraints
 		/// <param name="writer">The writer on which the actual value is displayed</param>
 		public override void WriteActualValueTo(MessageWriter writer)
 		{
-			if ( propertyExists )
-				writer.WriteActualValue( propValue );
-			else
-				writer.WriteActualValue( actual.GetType() );
+            writer.WriteActualValue(propValue);
 		}
+
+        /// <summary>
+        /// Returns the string representation of the constraint.
+        /// </summary>
+        /// <returns></returns>
+        protected override string GetStringRepresentation()
+        {
+            return string.Format("<property {0} {1}>", name, baseConstraint);
+        }
 	}
 }
diff --git a/src/NUnitFramework/framework/Constraints/RangeConstraint.cs b/src/NUnitFramework/framework/Constraints/RangeConstraint.cs
new file mode 100644
index 0000000..425fd11
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/RangeConstraint.cs
@@ -0,0 +1,92 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+#if NET_2_0
+using System.Collections.Generic;
+#endif
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// RangeConstraint tests whethe two values are within a 
+    /// specified range.
+    /// </summary>
+    public class RangeConstraint : Constraint
+    {
+        private IComparable from;
+        private IComparable to;
+
+        private ComparisonAdapter comparer = ComparisonAdapter.Default;
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:RangeConstraint"/> class.
+        /// </summary>
+        /// <param name="from">From.</param>
+        /// <param name="to">To.</param>
+        public RangeConstraint(IComparable from, IComparable to) : base( from, to )
+        {
+            this.from = from;
+            this.to = to;
+        }
+
+        /// <summary>
+        /// Test whether the constraint is satisfied by a given value
+        /// </summary>
+        /// <param name="actual">The value to be tested</param>
+        /// <returns>True for success, false for failure</returns>
+        public override bool Matches(object actual)
+        {
+            this.actual = actual;
+
+            if ( from == null || to == null || actual == null)
+                throw new ArgumentException( "Cannot compare using a null reference", "expected" );
+
+            return comparer.Compare(from, actual) <= 0 &&
+                   comparer.Compare(to, actual) >= 0;
+        }
+
+        /// <summary>
+        /// Write the constraint description to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The writer on which the description is displayed</param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+
+            writer.Write("in range ({0},{1})", from, to);
+        }
+
+        /// <summary>
+        /// Modifies the constraint to use an IComparer and returns self.
+        /// </summary>
+        public RangeConstraint Using(IComparer comparer)
+        {
+            this.comparer = ComparisonAdapter.For(comparer);
+            return this;
+        }
+
+#if NET_2_0
+        /// <summary>
+        /// Modifies the constraint to use an IComparer<T> and returns self.
+        /// </summary>
+        public RangeConstraint Using<T>(IComparer<T> comparer)
+        {
+            this.comparer = ComparisonAdapter.For(comparer);
+            return this;
+        }
+
+        /// <summary>
+        /// Modifies the constraint to use a Comparison<T> and returns self.
+        /// </summary>
+        public RangeConstraint Using<T>(Comparison<T> comparer)
+        {
+            this.comparer = ComparisonAdapter.For(comparer);
+            return this;
+        }
+#endif
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/ResolvableConstraintExpression.cs b/src/NUnitFramework/framework/Constraints/ResolvableConstraintExpression.cs
new file mode 100644
index 0000000..59373bb
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/ResolvableConstraintExpression.cs
@@ -0,0 +1,62 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// ResolvableConstraintExpression is used to represent a compound
+    /// constraint being constructed at a point where the last operator
+    /// may either terminate the expression or may have additional 
+    /// qualifying constraints added to it. 
+    /// 
+    /// It is used, for example, for a Property element or for
+    /// an Exception element, either of which may be optionally
+    /// followed by constraints that apply to the property or 
+    /// exception.
+    /// </summary>
+    public class ResolvableConstraintExpression : ConstraintExpression, IResolveConstraint
+    {
+        /// <summary>
+        /// Create a new instance of ResolvableConstraintExpression
+        /// </summary>
+        public ResolvableConstraintExpression() { }
+
+        /// <summary>
+        /// Create a new instance of ResolvableConstraintExpression,
+        /// passing in a pre-populated ConstraintBuilder.
+        /// </summary>
+        public ResolvableConstraintExpression(ConstraintBuilder builder)
+            : base(builder) { }
+
+        /// <summary>
+        /// Appends an And Operator to the expression
+        /// </summary>
+        public ConstraintExpression And
+        {
+            get { return this.Append(new AndOperator()); }
+        }
+
+        /// <summary>
+        /// Appends an Or operator to the expression.
+        /// </summary>
+        public ConstraintExpression Or
+        {
+            get { return this.Append(new OrOperator()); }
+        }
+
+        #region IResolveConstraint Members
+        /// <summary>
+        /// Resolve the current expression to a Constraint
+        /// </summary>
+        Constraint IResolveConstraint.Resolve()
+        {
+            return builder.Resolve();
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/ReusableConstraint.cs b/src/NUnitFramework/framework/Constraints/ReusableConstraint.cs
new file mode 100644
index 0000000..dad4eea
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/ReusableConstraint.cs
@@ -0,0 +1,55 @@
+using System;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// ReusableConstraint wraps a resolved constraint so that it
+    /// may be saved and reused as needed.
+    /// </summary>
+    public class ReusableConstraint : IResolveConstraint
+    {
+        private Constraint constraint;
+
+        /// <summary>
+        /// Construct a ReusableConstraint
+        /// </summary>
+        /// <param name="c">The constraint or expression to be reused</param>
+        public ReusableConstraint(IResolveConstraint c)
+        {
+            this.constraint = c.Resolve();
+        }
+
+        /// <summary>
+        /// Conversion operator from a normal constraint to a ReusableConstraint.
+        /// </summary>
+        /// <param name="c">The original constraint to be wrapped as a ReusableConstraint</param>
+        /// <returns></returns>
+        public static implicit operator ReusableConstraint(Constraint c)
+        {
+            return new ReusableConstraint(c);
+        }
+
+        /// <summary>
+        /// Returns the string representation of the constraint.
+        /// </summary>
+        /// <returns>A string representing the constraint</returns>
+        public override string ToString()
+        {
+            return constraint.ToString();
+        }
+
+        #region IResolveConstraint Members
+
+        /// <summary>
+        /// Resolves the ReusableConstraint by returning the constraint
+        /// that it originally wrapped.
+        /// </summary>
+        /// <returns>A resolved constraint</returns>
+        public Constraint Resolve()
+        {
+            return constraint;
+        }
+
+        #endregion
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/SameAsConstraint.cs b/src/NUnitFramework/framework/Constraints/SameAsConstraint.cs
index f1aaab7..4b8230b 100644
--- a/src/NUnitFramework/framework/Constraints/SameAsConstraint.cs
+++ b/src/NUnitFramework/framework/Constraints/SameAsConstraint.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -20,7 +20,7 @@ namespace NUnit.Framework.Constraints
         /// Initializes a new instance of the <see cref="T:SameAsConstraint"/> class.
         /// </summary>
         /// <param name="expected">The expected object.</param>
-        public SameAsConstraint(object expected)
+        public SameAsConstraint(object expected) : base(expected)
         {
             this.expected = expected;
         }
@@ -34,7 +34,12 @@ namespace NUnit.Framework.Constraints
         {
             this.actual = actual;
 
-            return Object.ReferenceEquals(expected,actual);
+#if NETCF_1_0
+            // TODO: THis makes it compile, now make it work.
+            return expected.Equals(actual);
+#else
+            return Object.ReferenceEquals(expected, actual);
+#endif
         }
 
         /// <summary>
diff --git a/src/NUnitFramework/framework/Constraints/SerializableConstraints.cs b/src/NUnitFramework/framework/Constraints/SerializableConstraints.cs
new file mode 100644
index 0000000..503042e
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/SerializableConstraints.cs
@@ -0,0 +1,170 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.IO;
+#if !NETCF
+using System.Runtime.Serialization;
+using System.Runtime.Serialization.Formatters.Binary;
+#endif
+using System.Xml.Serialization;
+
+namespace NUnit.Framework.Constraints
+{
+#if !NETCF
+    #region BinarySerializableConstraint
+
+    /// <summary>
+    /// BinarySerializableConstraint tests whether 
+    /// an object is serializable in binary format.
+    /// </summary>
+    public class BinarySerializableConstraint : Constraint
+    {
+        readonly BinaryFormatter serializer = new BinaryFormatter();
+
+        /// <summary>
+        /// Test whether the constraint is satisfied by a given value
+        /// </summary>
+        /// <param name="actual">The value to be tested</param>
+        /// <returns>True for success, false for failure</returns>
+        public override bool Matches(object actual)
+        {
+            this.actual = actual;
+
+            if(actual == null)
+                throw new ArgumentException();
+
+            MemoryStream stream = new MemoryStream();
+
+            try
+            {
+                serializer.Serialize(stream, actual);
+
+                stream.Seek(0, SeekOrigin.Begin);
+
+                object value = serializer.Deserialize(stream);
+
+                return value != null;
+            }
+            catch (SerializationException)
+            {
+                return false;
+            }
+        }
+
+        /// <summary>
+        /// Write the constraint description to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The writer on which the description is displayed</param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.Write("binary serializable");
+        }
+
+        /// <summary>
+        /// Write the actual value for a failing constraint test to a
+        /// MessageWriter. The default implementation simply writes
+        /// the raw value of actual, leaving it to the writer to
+        /// perform any formatting.
+        /// </summary>
+        /// <param name="writer">The writer on which the actual value is displayed</param>
+        public override void WriteActualValueTo(MessageWriter writer)
+        {
+            writer.Write("<{0}>", actual.GetType().Name);
+        }
+
+        /// <summary>
+        /// Returns the string representation
+        /// </summary>
+        protected override string GetStringRepresentation()
+        {
+            return "<binaryserializable>";
+        }
+    }
+
+    #endregion
+#endif
+
+#if !NETCF_1_0
+    #region XmlSerializableConstraint
+
+    /// <summary>
+    /// BinarySerializableConstraint tests whether 
+    /// an object is serializable in binary format.
+    /// </summary>
+    public class XmlSerializableConstraint : Constraint
+    {
+        private XmlSerializer serializer;
+
+        /// <summary>
+        /// Test whether the constraint is satisfied by a given value
+        /// </summary>
+        /// <param name="actual">The value to be tested</param>
+        /// <returns>True for success, false for failure</returns>
+        public override bool Matches(object actual)
+        {
+            this.actual = actual;
+
+            if(actual == null)
+                throw new ArgumentException();
+
+            MemoryStream stream = new MemoryStream();
+
+            try
+            {
+                serializer = new XmlSerializer(actual.GetType());
+
+                serializer.Serialize(stream, actual);
+
+                stream.Seek(0, SeekOrigin.Begin);
+
+                object value = serializer.Deserialize(stream);
+
+                return value != null;
+            }
+            catch (NotSupportedException)
+            {
+                return false;
+            }
+            catch (InvalidOperationException)
+            {
+                return false;
+            }
+        }
+
+        /// <summary>
+        /// Write the constraint description to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The writer on which the description is displayed</param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.Write("xml serializable");
+        }
+
+        /// <summary>
+        /// Write the actual value for a failing constraint test to a
+        /// MessageWriter. The default implementation simply writes
+        /// the raw value of actual, leaving it to the writer to
+        /// perform any formatting.
+        /// </summary>
+        /// <param name="writer">The writer on which the actual value is displayed</param>
+        public override void WriteActualValueTo(MessageWriter writer)
+        {
+            writer.Write("<{0}>", actual.GetType().Name);
+        }
+
+        /// <summary>
+        /// Returns the string representation of this constraint
+        /// </summary>
+        protected override string GetStringRepresentation()
+        {
+            return "<xmlserializable>";
+        }
+    }
+
+    #endregion
+#endif
+}
diff --git a/src/NUnitFramework/framework/Constraints/StringConstraints.cs b/src/NUnitFramework/framework/Constraints/StringConstraints.cs
index 94f6e0d..88c2450 100644
--- a/src/NUnitFramework/framework/Constraints/StringConstraints.cs
+++ b/src/NUnitFramework/framework/Constraints/StringConstraints.cs
@@ -1,60 +1,141 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
+#if !NETCF
 using System.Text.RegularExpressions;
+#endif
 
 namespace NUnit.Framework.Constraints
 {
-	/// <summary>
-	/// EmptyStringConstraint tests whether a string is empty.
-	/// </summary>
-	public class EmptyStringConstraint : EmptyConstraint
-	{
+    #region StringConstraint
+    /// <summary>
+    /// StringConstraint is the abstract base for constraints
+    /// that operate on strings. It supports the IgnoreCase
+    /// modifier for string operations.
+    /// </summary>
+    public abstract class StringConstraint : Constraint
+    {
+        /// <summary>
+        /// The expected value
+        /// </summary>
+        protected string expected;
+
+        /// <summary>
+        /// Indicates whether tests should be case-insensitive
+        /// </summary>
+        protected bool caseInsensitive;
+
+        /// <summary>
+        /// Constructs a StringConstraint given an expected value
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        public StringConstraint(string expected)
+            : base(expected)
+        {
+            this.expected = expected;
+        }
+
+        /// <summary>
+        /// Modify the constraint to ignore case in matching.
+        /// </summary>
+        public StringConstraint IgnoreCase
+        {
+            get { caseInsensitive = true; return this; }
+        }
+    }
+    #endregion
+
+    #region EmptyStringConstraint
+    /// <summary>
+    /// EmptyStringConstraint tests whether a string is empty.
+    /// </summary>
+    public class EmptyStringConstraint : Constraint
+    {
         /// <summary>
         /// Test whether the constraint is satisfied by a given value
         /// </summary>
         /// <param name="actual">The value to be tested</param>
         /// <returns>True for success, false for failure</returns>
         public override bool Matches(object actual)
-		{
-			this.actual = actual;
+        {
+            this.actual = actual;
 
-			if ( !(actual is string) )
-				return false;
+            if (!(actual is string))
+                return false;
 
-			return (string)actual == string.Empty;
-		}
+            return (string)actual == string.Empty;
+        }
 
         /// <summary>
         /// Write the constraint description to a MessageWriter
         /// </summary>
         /// <param name="writer">The writer on which the description is displayed</param>
         public override void WriteDescriptionTo(MessageWriter writer)
-		{
-			writer.Write( "<empty>" );
-		}
-	}
+        {
+            writer.Write("<empty>");
+        }
+    }
+    #endregion
+
+    #region NullOrEmptyStringConstraint
+    /// <summary>
+    /// NullEmptyStringConstraint tests whether a string is either null or empty.
+    /// </summary>
+    public class NullOrEmptyStringConstraint : Constraint
+    {
+        /// <summary>
+        /// Constructs a new NullOrEmptyStringConstraint
+        /// </summary>
+        public NullOrEmptyStringConstraint()
+        {
+            this.DisplayName = "nullorempty";
+        }
+
+        /// <summary>
+        /// Test whether the constraint is satisfied by a given value
+        /// </summary>
+        /// <param name="actual">The value to be tested</param>
+        /// <returns>True for success, false for failure</returns>
+        public override bool Matches(object actual)
+        {
+            this.actual = actual;
 
-	/// <summary>
+            if (actual == null)
+                return true;
+
+            if (!(actual is string))
+                throw new ArgumentException("Actual value must be a string", "actual");
+
+            return (string)actual == string.Empty;
+        }
+
+        /// <summary>
+        /// Write the constraint description to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The writer on which the description is displayed</param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.Write("null or empty string");
+        }
+    }
+    #endregion
+
+    #region Substring Constraint
+    /// <summary>
 	/// SubstringConstraint can test whether a string contains
 	/// the expected substring.
 	/// </summary>
-    public class SubstringConstraint : Constraint
+    public class SubstringConstraint : StringConstraint
     {
-        string expected;
-
         /// <summary>
         /// Initializes a new instance of the <see cref="T:SubstringConstraint"/> class.
         /// </summary>
         /// <param name="expected">The expected.</param>
-        public SubstringConstraint(string expected)
-        {
-            this.expected = expected;
-        }
+        public SubstringConstraint(string expected) : base(expected) { }
 
         /// <summary>
         /// Test whether the constraint is satisfied by a given value
@@ -86,23 +167,20 @@ namespace NUnit.Framework.Constraints
 				writer.WriteModifier( "ignoring case" );
 		}
     }
+    #endregion
 
-	/// <summary>
+    #region StartsWithConstraint
+    /// <summary>
 	/// StartsWithConstraint can test whether a string starts
 	/// with an expected substring.
 	/// </summary>
-    public class StartsWithConstraint : Constraint
+    public class StartsWithConstraint : StringConstraint
     {
-        private string expected;
-
         /// <summary>
         /// Initializes a new instance of the <see cref="T:StartsWithConstraint"/> class.
         /// </summary>
         /// <param name="expected">The expected string</param>
-        public StartsWithConstraint(string expected)
-        {
-            this.expected = expected;
-        }
+        public StartsWithConstraint(string expected) : base(expected) { }
 
         /// <summary>
         /// Test whether the constraint is matched by the actual value.
@@ -136,22 +214,20 @@ namespace NUnit.Framework.Constraints
 				writer.WriteModifier( "ignoring case" );
 		}
     }
+    #endregion
 
+    #region EndsWithConstraint
     /// <summary>
     /// EndsWithConstraint can test whether a string ends
     /// with an expected substring.
     /// </summary>
-    public class EndsWithConstraint : Constraint
+    public class EndsWithConstraint : StringConstraint
     {
-        private string expected;
         /// <summary>
         /// Initializes a new instance of the <see cref="T:EndsWithConstraint"/> class.
         /// </summary>
         /// <param name="expected">The expected string</param>
-        public EndsWithConstraint(string expected)
-        {
-            this.expected = expected;
-        }
+        public EndsWithConstraint(string expected) : base(expected) { }
 
         /// <summary>
         /// Test whether the constraint is matched by the actual value.
@@ -185,23 +261,21 @@ namespace NUnit.Framework.Constraints
 				writer.WriteModifier( "ignoring case" );
 		}
     }
+    #endregion
 
+    #region RegexConstraint
+#if !NETCF
     /// <summary>
     /// RegexConstraint can test whether a string matches
     /// the pattern provided.
     /// </summary>
-    public class RegexConstraint : Constraint
+    public class RegexConstraint : StringConstraint
     {
-        string pattern;
-
         /// <summary>
         /// Initializes a new instance of the <see cref="T:RegexConstraint"/> class.
         /// </summary>
         /// <param name="pattern">The pattern.</param>
-        public RegexConstraint(string pattern)
-        {
-            this.pattern = pattern;
-        }
+        public RegexConstraint(string pattern) : base(pattern) { }
 
         /// <summary>
         /// Test whether the constraint is satisfied by a given value
@@ -215,7 +289,7 @@ namespace NUnit.Framework.Constraints
             return actual is string && 
                 Regex.IsMatch( 
                     (string)actual, 
-                    this.pattern,
+                    this.expected,
                     this.caseInsensitive ? RegexOptions.IgnoreCase : RegexOptions.None );
         }
 
@@ -226,9 +300,11 @@ namespace NUnit.Framework.Constraints
         public override void WriteDescriptionTo(MessageWriter writer)
         {
             writer.WritePredicate("String matching");
-            writer.WriteExpectedValue(this.pattern);
+            writer.WriteExpectedValue(this.expected);
 			if ( this.caseInsensitive )
 				writer.WriteModifier( "ignoring case" );
 		}
     }
+#endif
+    #endregion
 }
diff --git a/src/NUnitFramework/framework/Constraints/ThrowsConstraint.cs b/src/NUnitFramework/framework/Constraints/ThrowsConstraint.cs
new file mode 100644
index 0000000..2c11e27
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/ThrowsConstraint.cs
@@ -0,0 +1,195 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Constraints
+{
+    #region ThrowsConstraint
+    /// <summary>
+    /// ThrowsConstraint is used to test the exception thrown by 
+    /// a delegate by applying a constraint to it.
+    /// </summary>
+    public class ThrowsConstraint : PrefixConstraint
+    {
+        private Exception caughtException;
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:ThrowsConstraint"/> class,
+        /// using a constraint to be applied to the exception.
+        /// </summary>
+        /// <param name="baseConstraint">A constraint to apply to the caught exception.</param>
+        public ThrowsConstraint(Constraint baseConstraint)
+            : base(baseConstraint) { }
+
+        /// <summary>
+        /// Get the actual exception thrown - used by Assert.Throws.
+        /// </summary>
+        public Exception ActualException
+        {
+            get { return caughtException; }
+        }
+
+        #region Constraint Overrides
+        /// <summary>
+        /// Executes the code of the delegate and captures any exception.
+        /// If a non-null base constraint was provided, it applies that
+        /// constraint to the exception.
+        /// </summary>
+        /// <param name="actual">A delegate representing the code to be tested</param>
+        /// <returns>True if an exception is thrown and the constraint succeeds, otherwise false</returns>
+        public override bool Matches(object actual)
+        {
+            TestDelegate code = actual as TestDelegate;
+            if (code == null)
+                throw new ArgumentException(
+                    string.Format("The actual value must be a TestDelegate but was {0}",actual.GetType().Name), "actual");
+
+            this.caughtException = null;
+
+            try
+            {
+                code();
+            }
+            catch (Exception ex)
+            {
+                this.caughtException = ex;
+            }
+
+            if (this.caughtException == null)
+                return false;
+
+            return baseConstraint == null || baseConstraint.Matches(caughtException);
+        }
+
+#if NET_2_0
+        /// <summary>
+        /// Converts an ActualValueDelegate to a TestDelegate
+        /// before calling the primary overload.
+        /// </summary>
+        /// <param name="del"></param>
+        /// <returns></returns>
+        public override bool Matches(ActualValueDelegate del)
+        {
+            TestDelegate testDelegate = new TestDelegate(delegate { del(); });
+            return Matches((object)testDelegate);
+        }
+#endif
+
+        /// <summary>
+        /// Write the constraint description to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The writer on which the description is displayed</param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            if (baseConstraint == null)
+                writer.WritePredicate("an exception");
+            else
+                baseConstraint.WriteDescriptionTo(writer);
+        }
+
+        /// <summary>
+        /// Write the actual value for a failing constraint test to a
+        /// MessageWriter. The default implementation simply writes
+        /// the raw value of actual, leaving it to the writer to
+        /// perform any formatting.
+        /// </summary>
+        /// <param name="writer">The writer on which the actual value is displayed</param>
+        public override void WriteActualValueTo(MessageWriter writer)
+        {
+            if (caughtException == null)
+                writer.Write("no exception thrown");
+            else if (baseConstraint != null)
+                baseConstraint.WriteActualValueTo(writer);
+            else
+                writer.WriteActualValue(caughtException);
+        }
+        #endregion
+
+        /// <summary>
+        /// Returns the string representation of this constraint
+        /// </summary>
+        protected override string GetStringRepresentation()
+        {
+            if (baseConstraint == null)
+                return "<throws>";
+            
+            return base.GetStringRepresentation();
+        }
+    }
+    #endregion
+
+    #region ThrowsNothingConstraint
+    /// <summary>
+    /// ThrowsNothingConstraint tests that a delegate does not
+    /// throw an exception.
+    /// </summary>
+	public class ThrowsNothingConstraint : Constraint
+	{
+		private Exception caughtException;
+
+        /// <summary>
+        /// Test whether the constraint is satisfied by a given value
+        /// </summary>
+        /// <param name="actual">The value to be tested</param>
+        /// <returns>True if no exception is thrown, otherwise false</returns>
+		public override bool Matches(object actual)
+		{
+			TestDelegate code = actual as TestDelegate;
+			if (code == null)
+				throw new ArgumentException("The actual value must be a TestDelegate", "actual");
+
+            this.caughtException = null;
+
+            try
+            {
+                code();
+            }
+            catch (Exception ex)
+            {
+                this.caughtException = ex;
+            }
+
+			return this.caughtException == null;
+		}
+
+#if NET_2_0
+        /// <summary>
+        /// Converts an ActualValueDelegate to a TestDelegate
+        /// before calling the primary overload.
+        /// </summary>
+        /// <param name="del"></param>
+        /// <returns></returns>
+        public override bool Matches(ActualValueDelegate del)
+        {
+            TestDelegate testDelegate = new TestDelegate(delegate { del(); });
+            return Matches((object)testDelegate);
+        }
+#endif
+
+        /// <summary>
+        /// Write the constraint description to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The writer on which the description is displayed</param>
+		public override void WriteDescriptionTo(MessageWriter writer)
+		{
+			writer.Write(string.Format("No Exception to be thrown"));
+		}
+
+        /// <summary>
+        /// Write the actual value for a failing constraint test to a
+        /// MessageWriter. The default implementation simply writes
+        /// the raw value of actual, leaving it to the writer to
+        /// perform any formatting.
+        /// </summary>
+        /// <param name="writer">The writer on which the actual value is displayed</param>
+		public override void WriteActualValueTo(MessageWriter writer)
+		{
+			writer.WriteActualValue( this.caughtException.GetType() );
+		}
+    }
+    #endregion
+}
diff --git a/src/NUnitFramework/framework/Constraints/Tolerance.cs b/src/NUnitFramework/framework/Constraints/Tolerance.cs
new file mode 100644
index 0000000..a068396
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/Tolerance.cs
@@ -0,0 +1,225 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org/
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// Modes in which the tolerance value for a comparison can
+    /// be interpreted.
+    /// </summary>
+    public enum ToleranceMode
+    {
+        /// <summary>
+        /// The tolerance was created with a value, without specifying 
+        /// how the value would be used. This is used to prevent setting
+        /// the mode more than once and is generally changed to Linear
+        /// upon execution of the test.
+        /// </summary>
+        None,
+        /// <summary>
+        /// The tolerance is used as a numeric range within which
+        /// two compared values are considered to be equal.
+        /// </summary>
+        Linear,
+        /// <summary>
+        /// Interprets the tolerance as the percentage by which
+        /// the two compared values my deviate from each other.
+        /// </summary>
+        Percent,
+        /// <summary>
+        /// Compares two values based in their distance in
+        /// representable numbers.
+        /// </summary>
+        Ulps
+    }
+
+    /// <summary>
+    /// The Tolerance class generalizes the notion of a tolerance
+    /// within which an equality test succeeds. Normally, it is
+    /// used with numeric types, but it can be used with any
+    /// type that supports taking a difference between two 
+    /// objects and comparing that difference to a value.
+    /// </summary>
+    public class Tolerance
+    {
+        private ToleranceMode mode;
+        private object amount;
+
+        private static readonly string ModeMustFollowTolerance =
+            "Tolerance amount must be specified before setting mode";
+        private static readonly string MultipleToleranceModes =
+            "Tried to use multiple tolerance modes at the same time";
+        private static readonly string NumericToleranceRequired =
+            "A numeric tolerance is required";
+
+        /// <summary>
+        /// Returns an empty Tolerance object, equivalent to 
+        /// specifying an exact match.
+        /// </summary>
+        public static Tolerance Empty
+        {
+            get { return new Tolerance(0, ToleranceMode.None); }
+        }
+
+        /// <summary>
+        /// Constructs a linear tolerance of a specdified amount
+        /// </summary>
+        public Tolerance(object amount) : this(amount, ToleranceMode.Linear) { }
+
+        /// <summary>
+        /// Constructs a tolerance given an amount and ToleranceMode
+        /// </summary>
+        private Tolerance(object amount, ToleranceMode mode)
+        {
+            this.amount = amount;
+            this.mode = mode;
+        }
+
+        /// <summary>
+        /// Gets the ToleranceMode for the current Tolerance
+        /// </summary>
+        public ToleranceMode Mode
+        {
+            get { return this.mode; }
+        }
+        
+
+        /// <summary>
+        /// Tests that the current Tolerance is linear with a 
+        /// numeric value, throwing an exception if it is not.
+        /// </summary>
+        private void CheckLinearAndNumeric()
+        {
+            if (mode != ToleranceMode.Linear)
+                throw new InvalidOperationException(mode == ToleranceMode.None
+                    ? ModeMustFollowTolerance
+                    : MultipleToleranceModes);
+
+            if (!Numerics.IsNumericType(amount))
+                throw new InvalidOperationException(NumericToleranceRequired);
+        }
+
+        /// <summary>
+        /// Gets the value of the current Tolerance instance.
+        /// </summary>
+        public object Value
+        {
+            get { return this.amount; }
+        }
+
+        /// <summary>
+        /// Returns a new tolerance, using the current amount as a percentage.
+        /// </summary>
+        public Tolerance Percent
+        {
+            get
+            {
+                CheckLinearAndNumeric();
+                return new Tolerance(this.amount, ToleranceMode.Percent);
+            }
+        }
+
+        /// <summary>
+        /// Returns a new tolerance, using the current amount in Ulps.
+        /// </summary>
+        public Tolerance Ulps
+        {
+            get
+            {
+                CheckLinearAndNumeric();
+                return new Tolerance(this.amount, ToleranceMode.Ulps);
+            }
+        }
+
+        /// <summary>
+        /// Returns a new tolerance with a TimeSpan as the amount, using 
+        /// the current amount as a number of days.
+        /// </summary>
+        public Tolerance Days
+        {
+            get
+            {
+                CheckLinearAndNumeric();
+                return new Tolerance(TimeSpan.FromDays(Convert.ToDouble(amount)));
+            }
+        }
+
+        /// <summary>
+        /// Returns a new tolerance with a TimeSpan as the amount, using 
+        /// the current amount as a number of hours.
+        /// </summary>
+        public Tolerance Hours
+        {
+            get
+            {
+                CheckLinearAndNumeric();
+                return new Tolerance(TimeSpan.FromHours(Convert.ToDouble(amount)));
+            }
+        }
+
+        /// <summary>
+        /// Returns a new tolerance with a TimeSpan as the amount, using 
+        /// the current amount as a number of minutes.
+        /// </summary>
+        public Tolerance Minutes
+        {
+            get
+            {
+                CheckLinearAndNumeric();
+                return new Tolerance(TimeSpan.FromMinutes(Convert.ToDouble(amount)));
+            }
+        }
+
+        /// <summary>
+        /// Returns a new tolerance with a TimeSpan as the amount, using 
+        /// the current amount as a number of seconds.
+        /// </summary>
+        public Tolerance Seconds
+        {
+            get
+            {
+                CheckLinearAndNumeric();
+                return new Tolerance(TimeSpan.FromSeconds(Convert.ToDouble(amount)));
+            }
+        }
+
+        /// <summary>
+        /// Returns a new tolerance with a TimeSpan as the amount, using 
+        /// the current amount as a number of milliseconds.
+        /// </summary>
+        public Tolerance Milliseconds
+        {
+            get
+            {
+                CheckLinearAndNumeric();
+                return new Tolerance(TimeSpan.FromMilliseconds(Convert.ToDouble(amount)));
+            }
+        }
+
+        /// <summary>
+        /// Returns a new tolerance with a TimeSpan as the amount, using 
+        /// the current amount as a number of clock ticks.
+        /// </summary>
+        public Tolerance Ticks
+        {
+            get
+            {
+                CheckLinearAndNumeric();
+                return new Tolerance(TimeSpan.FromTicks(Convert.ToInt64(amount)));
+            }
+        }
+
+        /// <summary>
+        /// Returns true if the current tolerance is empty.
+        /// </summary>
+        public bool IsEmpty
+        {
+            get { return mode == ToleranceMode.None; }
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/TypeConstraints.cs b/src/NUnitFramework/framework/Constraints/TypeConstraints.cs
index 2141b74..b94d7e5 100644
--- a/src/NUnitFramework/framework/Constraints/TypeConstraints.cs
+++ b/src/NUnitFramework/framework/Constraints/TypeConstraints.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -23,14 +23,14 @@ namespace NUnit.Framework.Constraints
         /// Construct a TypeConstraint for a given Type
         /// </summary>
         /// <param name="type"></param>
-        public TypeConstraint(Type type)
+        public TypeConstraint(Type type) : base(type)
         {
             this.expectedType = type;
         }
 
         /// <summary>
         /// Write the actual value for a failing constraint test to a
-        /// MessageWriter. TypeCOnstraints override this method to write
+        /// MessageWriter. TypeConstraints override this method to write
         /// the name of the type.
         /// </summary>
         /// <param name="writer">The writer on which the actual value is displayed</param>
@@ -49,14 +49,17 @@ namespace NUnit.Framework.Constraints
         /// <summary>
         /// Construct an ExactTypeConstraint for a given Type
         /// </summary>
-        /// <param name="type"></param>
-        public ExactTypeConstraint(Type type) : base( type ) { }
+        /// <param name="type">The expected Type.</param>
+        public ExactTypeConstraint(Type type) : base( type ) 
+        {
+            this.DisplayName = "typeof";
+        }
 
         /// <summary>
         /// Test that an object is of the exact type specified
         /// </summary>
-        /// <param name="actual"></param>
-        /// <returns></returns>
+        /// <param name="actual">The actual value.</param>
+        /// <returns>True if the tested object is of the exact type provided, otherwise false.</returns>
         public override bool Matches(object actual)
         {
             this.actual = actual;
@@ -66,7 +69,7 @@ namespace NUnit.Framework.Constraints
         /// <summary>
         /// Write the description of this constraint to a MessageWriter
         /// </summary>
-        /// <param name="writer"></param>
+        /// <param name="writer">The MessageWriter to use</param>
         public override void WriteDescriptionTo(MessageWriter writer)
         {
             writer.WriteExpectedValue(expectedType);
@@ -82,14 +85,17 @@ namespace NUnit.Framework.Constraints
         /// <summary>
         /// Construct an InstanceOfTypeConstraint for the type provided
         /// </summary>
-        /// <param name="type"></param>
-        public InstanceOfTypeConstraint(Type type) : base(type) { }
+        /// <param name="type">The expected Type</param>
+        public InstanceOfTypeConstraint(Type type) : base(type) 
+        {
+            this.DisplayName = "instanceof";
+        }
 
         /// <summary>
         /// Test whether an object is of the specified type or a derived type
         /// </summary>
-        /// <param name="actual"></param>
-        /// <returns></returns>
+        /// <param name="actual">The object to be tested</param>
+        /// <returns>True if the object is of the provided type or derives from it, otherwise false.</returns>
         public override bool Matches(object actual)
         {
             this.actual = actual;
@@ -99,7 +105,7 @@ namespace NUnit.Framework.Constraints
         /// <summary>
         /// Write a description of this constraint to a MessageWriter
         /// </summary>
-        /// <param name="writer"></param>
+        /// <param name="writer">The MessageWriter to use</param>
         public override void WriteDescriptionTo(MessageWriter writer)
         {
             writer.WritePredicate("instance of");
@@ -122,21 +128,55 @@ namespace NUnit.Framework.Constraints
         /// <summary>
         /// Test whether an object can be assigned from the specified type
         /// </summary>
-        /// <param name="actual"></param>
-        /// <returns></returns>
+        /// <param name="actual">The object to be tested</param>
+        /// <returns>True if the object can be assigned a value of the expected Type, otherwise false.</returns>
+        public override bool Matches(object actual)
+        {
+            this.actual = actual;
+            return actual != null && actual.GetType().IsAssignableFrom(expectedType);
+        }
+
+        /// <summary>
+        /// Write a description of this constraint to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The MessageWriter to use</param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.WritePredicate("assignable from");
+            writer.WriteExpectedValue(expectedType);
+        }
+    }
+
+    /// <summary>
+    /// AssignableToConstraint is used to test that an object
+    /// can be assigned to a given Type.
+    /// </summary>
+    public class AssignableToConstraint : TypeConstraint
+    {
+        /// <summary>
+        /// Construct an AssignableToConstraint for the type provided
+        /// </summary>
+        /// <param name="type"></param>
+        public AssignableToConstraint(Type type) : base(type) { }
+
+        /// <summary>
+        /// Test whether an object can be assigned to the specified type
+        /// </summary>
+        /// <param name="actual">The object to be tested</param>
+        /// <returns>True if the object can be assigned a value of the expected Type, otherwise false.</returns>
         public override bool Matches(object actual)
         {
-			this.actual = actual;
-            return actual != null && actual.GetType().IsAssignableFrom( expectedType );
+            this.actual = actual;
+            return actual != null && expectedType.IsAssignableFrom(actual.GetType());
         }
 
         /// <summary>
         /// Write a description of this constraint to a MessageWriter
         /// </summary>
-        /// <param name="writer"></param>
+        /// <param name="writer">The MessageWriter to use</param>
         public override void WriteDescriptionTo(MessageWriter writer)
         {
-            writer.WritePredicate("Type assignable from");
+            writer.WritePredicate("assignable to");
             writer.WriteExpectedValue(expectedType);
         }
     }
diff --git a/src/NUnitFramework/framework/Contains.cs b/src/NUnitFramework/framework/Contains.cs
new file mode 100644
index 0000000..c838fd2
--- /dev/null
+++ b/src/NUnitFramework/framework/Contains.cs
@@ -0,0 +1,55 @@
+// ***********************************************************************
+// Copyright (c) 2009 Charlie Poole
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+// ***********************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// Static helper class used in the constraint-based syntax
+    /// </summary>
+    public class Contains
+    {
+        /// <summary>
+        /// Creates a new SubstringConstraint
+        /// </summary>
+        /// <param name="substring">The value of the substring</param>
+        /// <returns>A SubstringConstraint</returns>
+        public static SubstringConstraint Substring(string substring)
+        {
+            return new SubstringConstraint(substring);
+        }
+
+        /// <summary>
+        /// Creates a new CollectionContainsConstraint.
+        /// </summary>
+        /// <param name="item">The item that should be found.</param>
+        /// <returns>A new CollectionContainsConstraint</returns>
+        public static CollectionContainsConstraint Item(object item)
+        {
+            return new CollectionContainsConstraint(item);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/DescriptionAttribute.cs b/src/NUnitFramework/framework/DescriptionAttribute.cs
deleted file mode 100644
index 0400a32..0000000
--- a/src/NUnitFramework/framework/DescriptionAttribute.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-using System;
-
-namespace NUnit.Framework
-{
-	/// <summary>
-	/// Attribute used to provide descriptive text about a 
-	/// test case or fixture.
-	/// </summary>
-	[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method|AttributeTargets.Assembly, AllowMultiple=false)]
-	public class DescriptionAttribute : Attribute
-	{
-		string description;
-
-		/// <summary>
-		/// Construct the attribute
-		/// </summary>
-		/// <param name="description">Text describing the test</param>
-		public DescriptionAttribute(string description)
-		{
-			this.description=description;
-		}
-
-		/// <summary>
-		/// Gets the test description
-		/// </summary>
-		public string Description
-		{
-			get { return description; }
-		}
-	}
-}
diff --git a/src/NUnitFramework/framework/DirectoryAssert.cs b/src/NUnitFramework/framework/DirectoryAssert.cs
new file mode 100644
index 0000000..dbe9386
--- /dev/null
+++ b/src/NUnitFramework/framework/DirectoryAssert.cs
@@ -0,0 +1,553 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.IO;
+using System.ComponentModel;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// Summary description for DirectoryAssert
+    /// </summary>
+    [Obsolete("Use Assert with constraint-based syntax")]
+    public class DirectoryAssert
+    {
+        #region Equals and ReferenceEquals
+
+        /// <summary>
+        /// The Equals method throws an AssertionException. This is done 
+        /// to make sure there is no mistake by calling this function.
+        /// </summary>
+        /// <param name="a"></param>
+        /// <param name="b"></param>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public static new bool Equals(object a, object b)
+        {
+            throw new AssertionException("Assert.Equals should not be used for Assertions");
+        }
+
+        /// <summary>
+        /// override the default ReferenceEquals to throw an AssertionException. This 
+        /// implementation makes sure there is no mistake in calling this function 
+        /// as part of Assert. 
+        /// </summary>
+        /// <param name="a"></param>
+        /// <param name="b"></param>
+        public static new void ReferenceEquals(object a, object b)
+        {
+            throw new AssertionException("Assert.ReferenceEquals should not be used for Assertions");
+        }
+
+        #endregion
+
+        #region Constructor
+
+        /// <summary>
+        /// We don't actually want any instances of this object, but some people
+        /// like to inherit from it to add other static methods. Hence, the
+        /// protected constructor disallows any instances of this object. 
+        /// </summary>
+        protected DirectoryAssert() { }
+
+        #endregion
+
+        #region AreEqual
+
+        /// <summary>
+        /// Verifies that two directories are equal.  Two directories are considered
+        /// equal if both are null, or if both have the same value byte for byte.
+        /// If they are not equal an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">A directory containing the value that is expected</param>
+        /// <param name="actual">A directory containing the actual value</param>
+        /// <param name="message">The message to display if directories are not equal</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void AreEqual(DirectoryInfo expected, DirectoryInfo actual, string message, params object[] args)
+        {
+            Assert.That(actual, new EqualConstraint(expected), message, args);
+        }
+
+        /// <summary>
+        /// Verifies that two directories are equal.  Two directories are considered
+        /// equal if both are null, or if both have the same value byte for byte.
+        /// If they are not equal an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">A directory containing the value that is expected</param>
+        /// <param name="actual">A directory containing the actual value</param>
+        /// <param name="message">The message to display if directories are not equal</param>
+        static public void AreEqual(DirectoryInfo expected, DirectoryInfo actual, string message)
+        {
+            AreEqual(actual, expected, message, null);
+        }
+
+        /// <summary>
+        /// Verifies that two directories are equal.  Two directories are considered
+        /// equal if both are null, or if both have the same value byte for byte.
+        /// If they are not equal an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">A directory containing the value that is expected</param>
+        /// <param name="actual">A directory containing the actual value</param>
+        static public void AreEqual(DirectoryInfo expected, DirectoryInfo actual)
+        {
+            AreEqual(actual, expected, string.Empty, null);
+        }
+
+        /// <summary>
+        /// Verifies that two directories are equal.  Two directories are considered
+        /// equal if both are null, or if both have the same value byte for byte.
+        /// If they are not equal an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">A directory path string containing the value that is expected</param>
+        /// <param name="actual">A directory path string containing the actual value</param>
+        /// <param name="message">The message to display if directories are not equal</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void AreEqual(string expected, string actual, string message, params object[] args)
+        {
+            // create a directory info object for the expected path
+            DirectoryInfo diExpected = new DirectoryInfo(expected);
+
+            // create a directory info object for the actual path
+            DirectoryInfo diActual = new DirectoryInfo(actual);
+
+            AreEqual(diExpected, diActual, message, args);
+        }
+
+        /// <summary>
+        /// Verifies that two directories are equal.  Two directories are considered
+        /// equal if both are null, or if both have the same value byte for byte.
+        /// If they are not equal an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">A directory path string containing the value that is expected</param>
+        /// <param name="actual">A directory path string containing the actual value</param>
+        /// <param name="message">The message to display if directories are not equal</param>
+        static public void AreEqual(string expected, string actual, string message)
+        {
+            AreEqual(expected, actual, message, null);
+        }
+
+        /// <summary>
+        /// Verifies that two directories are equal.  Two directories are considered
+        /// equal if both are null, or if both have the same value byte for byte.
+        /// If they are not equal an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">A directory path string containing the value that is expected</param>
+        /// <param name="actual">A directory path string containing the actual value</param>
+        static public void AreEqual(string expected, string actual)
+        {
+            AreEqual(expected, actual, string.Empty, null);
+        }
+
+        #endregion
+
+        #region AreNotEqual
+
+        /// <summary>
+        /// Asserts that two directories are not equal. If they are equal
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">A directory containing the value that is expected</param>
+        /// <param name="actual">A directory containing the actual value</param>
+        /// <param name="message">The message to display if directories are not equal</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void AreNotEqual(DirectoryInfo expected, DirectoryInfo actual, string message, params object[] args)
+        {
+            Assert.That(actual, new NotConstraint(new EqualConstraint(expected)), message, args);
+        }
+
+        /// <summary>
+        /// Asserts that two directories are not equal. If they are equal
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">A directory containing the value that is expected</param>
+        /// <param name="actual">A directory containing the actual value</param>
+        /// <param name="message">The message to display if directories are not equal</param>
+        static public void AreNotEqual(DirectoryInfo expected, DirectoryInfo actual, string message)
+        {
+            AreNotEqual(actual, expected, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that two directories are not equal. If they are equal
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">A directory containing the value that is expected</param>
+        /// <param name="actual">A directory containing the actual value</param>
+        static public void AreNotEqual(DirectoryInfo expected, DirectoryInfo actual)
+        {
+            AreNotEqual(actual, expected, string.Empty, null);
+        }
+
+        /// <summary>
+        /// Asserts that two directories are not equal. If they are equal
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">A directory path string containing the value that is expected</param>
+        /// <param name="actual">A directory path string containing the actual value</param>
+        /// <param name="message">The message to display if directories are equal</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void AreNotEqual(string expected, string actual, string message, params object[] args)
+        {
+            // create a directory info object for the expected path
+            DirectoryInfo diExpected = new DirectoryInfo(expected);
+
+            // create a directory info object for the actual path
+            DirectoryInfo diActual = new DirectoryInfo(actual);
+
+            AreNotEqual(diExpected, diActual, message, args);
+        }
+
+        /// <summary>
+        /// Asserts that two directories are not equal. If they are equal
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">A directory path string containing the value that is expected</param>
+        /// <param name="actual">A directory path string containing the actual value</param>
+        /// <param name="message">The message to display if directories are equal</param>
+        static public void AreNotEqual(string expected, string actual, string message)
+        {
+            AreNotEqual(expected, actual, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that two directories are not equal. If they are equal
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">A directory path string containing the value that is expected</param>
+        /// <param name="actual">A directory path string containing the actual value</param>
+        static public void AreNotEqual(string expected, string actual)
+        {
+            AreNotEqual(expected, actual, string.Empty, null);
+        }
+
+        #endregion
+
+        #region IsEmpty
+
+        /// <summary>
+        /// Asserts that the directory is empty. If it is not empty
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="message">The message to display if directories are not equal</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void IsEmpty(DirectoryInfo directory, string message, params object[] args)
+        {
+            Assert.That( directory, new EmptyDirectoryContraint(), message, args);
+        }
+
+        /// <summary>
+        /// Asserts that the directory is empty. If it is not empty
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="message">The message to display if directories are not equal</param>
+        static public void IsEmpty(DirectoryInfo directory, string message)
+        {
+            IsEmpty(directory, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that the directory is empty. If it is not empty
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        static public void IsEmpty(DirectoryInfo directory)
+        {
+            IsEmpty(directory, string.Empty, null);
+        }
+
+        /// <summary>
+        /// Asserts that the directory is empty. If it is not empty
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="message">The message to display if directories are not equal</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void IsEmpty(string directory, string message, params object[] args)
+        {
+            IsEmpty(new DirectoryInfo(directory), message, args);
+        }
+
+        /// <summary>
+        /// Asserts that the directory is empty. If it is not empty
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="message">The message to display if directories are not equal</param>
+        static public void IsEmpty(string directory, string message)
+        {
+            IsEmpty(directory, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that the directory is empty. If it is not empty
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        static public void IsEmpty(string directory)
+        {
+            IsEmpty(directory, string.Empty, null);
+        }
+
+        #endregion
+
+        #region IsNotEmpty
+
+        /// <summary>
+        /// Asserts that the directory is not empty. If it is empty
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="message">The message to display if directories are not equal</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void IsNotEmpty(DirectoryInfo directory, string message, params object[] args)
+        {
+            Assert.That( directory, new NotConstraint(new EmptyDirectoryContraint()), message, args);
+        }
+
+        /// <summary>
+        /// Asserts that the directory is not empty. If it is empty
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="message">The message to display if directories are not equal</param>
+        static public void IsNotEmpty(DirectoryInfo directory, string message)
+        {
+            IsNotEmpty(directory, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that the directory is not empty. If it is empty
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        static public void IsNotEmpty(DirectoryInfo directory)
+        {
+            IsNotEmpty(directory, string.Empty, null);
+        }
+
+        /// <summary>
+        /// Asserts that the directory is not empty. If it is empty
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="message">The message to display if directories are not equal</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void IsNotEmpty(string directory, string message, params object[] args)
+        {
+            DirectoryInfo diActual = new DirectoryInfo(directory);
+            IsNotEmpty(diActual, message, args);
+        }
+
+        /// <summary>
+        /// Asserts that the directory is not empty. If it is empty
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="message">The message to display if directories are not equal</param>
+        static public void IsNotEmpty(string directory, string message)
+        {
+            IsNotEmpty(directory, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that the directory is not empty. If it is empty
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        static public void IsNotEmpty(string directory)
+        {
+            IsNotEmpty(directory, string.Empty, null);
+        }
+
+        #endregion
+
+        #region IsWithin
+
+        /// <summary>
+        /// Asserts that path contains actual as a subdirectory or
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="actual">sub-directory asserted to exist under directory</param>
+        /// <param name="message">The message to display if directory is not within the path</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        public static void IsWithin(DirectoryInfo directory, DirectoryInfo actual, string message, params object[] args)
+        {
+			if (directory == null)
+                throw new ArgumentException("The directory may not be null", "directory");
+			if (directory == null)
+                throw new ArgumentException("The actual value may not be null", "actual");
+
+			IsWithin(directory.FullName, actual.FullName, message, args);
+        }
+
+        /// <summary>
+        /// Asserts that path contains actual as a subdirectory or
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="actual">sub-directory asserted to exist under directory</param>
+        /// <param name="message">The message to display if directory is not within the path</param>
+        static public void IsWithin(DirectoryInfo directory, DirectoryInfo actual, string message)
+        {
+			if (directory == null)
+                throw new ArgumentException("The directory may not be null", "directory");
+			if (directory == null)
+                throw new ArgumentException("The actual value may not be null", "actual");
+
+            IsWithin(directory.FullName, actual.FullName, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that path contains actual as a subdirectory or
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="actual">sub-directory asserted to exist under directory</param>
+        static public void IsWithin(DirectoryInfo directory, DirectoryInfo actual)
+        {
+			if (directory == null)
+                throw new ArgumentException("The directory may not be null", "directory");
+			if (directory == null)
+                throw new ArgumentException("The actual value may not be null", "actual");
+
+            IsWithin(directory.FullName, actual.FullName, string.Empty, null);
+        }
+
+        /// <summary>
+        /// Asserts that path contains actual as a subdirectory or
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="actual">sub-directory asserted to exist under directory</param>
+        /// <param name="message">The message to display if directory is not within the path</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void IsWithin(string directory, string actual, string message, params object[] args)
+        {
+			Assert.That(actual, new SubPathConstraint(directory), message, args);
+        }
+
+        /// <summary>
+        /// Asserts that path contains actual as a subdirectory or
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="actual">sub-directory asserted to exist under directory</param>
+        /// <param name="message">The message to display if directory is not within the path</param>
+        static public void IsWithin(string directory, string actual, string message)
+        {
+            IsWithin(directory, actual, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that path contains actual as a subdirectory or
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="actual">sub-directory asserted to exist under directory</param>
+        static public void IsWithin(string directory, string actual)
+        {
+            IsWithin(directory, actual, string.Empty, null);
+        }
+
+        #endregion
+
+        #region IsNotWithin
+
+        /// <summary>
+        /// Asserts that path does not contain actual as a subdirectory or
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="actual">sub-directory asserted to exist under directory</param>
+        /// <param name="message">The message to display if directory is not within the path</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void IsNotWithin(DirectoryInfo directory, DirectoryInfo actual, string message, params object[] args)
+        {
+			if (directory == null)
+                throw new ArgumentException("The directory may not be null", "directory");
+			if (directory == null)
+                throw new ArgumentException("The actual value may not be null", "actual");
+
+			IsNotWithin(directory.FullName, actual.FullName, message, args);
+        }
+
+        /// <summary>
+        /// Asserts that path does not contain actual as a subdirectory or
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="actual">sub-directory asserted to exist under directory</param>
+        /// <param name="message">The message to display if directory is not within the path</param>
+        static public void IsNotWithin(DirectoryInfo directory, DirectoryInfo actual, string message)
+        {
+			if (directory == null)
+                throw new ArgumentException("The directory may not be null", "directory");
+			if (directory == null)
+                throw new ArgumentException("The actual value may not be null", "actual");
+
+            IsNotWithin(directory.FullName, actual.FullName, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that path does not contain actual as a subdirectory or
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="actual">sub-directory asserted to exist under directory</param>
+        static public void IsNotWithin(DirectoryInfo directory, DirectoryInfo actual)
+        {
+			if (directory == null)
+                throw new ArgumentException("The directory may not be null", "directory");
+			if (directory == null)
+                throw new ArgumentException("The actual value may not be null", "actual");
+
+            IsNotWithin(directory.FullName, actual.FullName, string.Empty, null);
+        }
+
+        /// <summary>
+        /// Asserts that path does not contain actual as a subdirectory or
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="actual">sub-directory asserted to exist under directory</param>
+        /// <param name="message">The message to display if directory is not within the path</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void IsNotWithin(string directory, string actual, string message, params object[] args)
+        {
+			Assert.That(actual, new NotConstraint(new SubPathConstraint(directory)), message, args);
+        }
+
+        /// <summary>
+        /// Asserts that path does not contain actual as a subdirectory or
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="actual">sub-directory asserted to exist under directory</param>
+        /// <param name="message">The message to display if directory is not within the path</param>
+        static public void IsNotWithin(string directory, string actual, string message)
+        {
+            IsNotWithin(directory, actual, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that path does not contain actual as a subdirectory or
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="actual">sub-directory asserted to exist under directory</param>
+        static public void IsNotWithin(string directory, string actual)
+        {
+            IsNotWithin(directory, actual, string.Empty, null);
+        }
+
+        #endregion
+    }
+}
\ No newline at end of file
diff --git a/src/NUnitFramework/framework/Exceptions/AssertionException.cs b/src/NUnitFramework/framework/Exceptions/AssertionException.cs
new file mode 100644
index 0000000..0c0c6e3
--- /dev/null
+++ b/src/NUnitFramework/framework/Exceptions/AssertionException.cs
@@ -0,0 +1,40 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Framework 
+{
+	using System;
+	using System.Runtime.Serialization;
+	
+	/// <summary>
+	/// Thrown when an assertion failed.
+	/// </summary>
+	/// 
+	[Serializable]
+	public class AssertionException : System.Exception
+	{
+		/// <param name="message">The error message that explains 
+		/// the reason for the exception</param>
+		public AssertionException (string message) : base(message) 
+		{}
+
+		/// <param name="message">The error message that explains 
+		/// the reason for the exception</param>
+		/// <param name="inner">The exception that caused the 
+		/// current exception</param>
+		public AssertionException(string message, Exception inner) :
+			base(message, inner) 
+		{}
+
+		/// <summary>
+		/// Serialization Constructor
+		/// </summary>
+		protected AssertionException(SerializationInfo info, 
+			StreamingContext context) : base(info,context)
+		{}
+
+	}
+}
diff --git a/src/NUnitFramework/framework/Exceptions/IgnoreException.cs b/src/NUnitFramework/framework/Exceptions/IgnoreException.cs
new file mode 100644
index 0000000..956733e
--- /dev/null
+++ b/src/NUnitFramework/framework/Exceptions/IgnoreException.cs
@@ -0,0 +1,38 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Framework 
+{
+	using System;
+	using System.Runtime.Serialization;
+	
+	/// <summary>
+	/// Thrown when an assertion failed.
+	/// </summary>
+	[Serializable]
+	public class IgnoreException : System.Exception
+	{
+		/// <param name="message"></param>
+		public IgnoreException (string message) : base(message) 
+		{}
+
+		/// <param name="message">The error message that explains 
+		/// the reason for the exception</param>
+		/// <param name="inner">The exception that caused the 
+		/// current exception</param>
+		public IgnoreException(string message, Exception inner) :
+			base(message, inner) 
+		{}
+
+		/// <summary>
+		/// Serialization Constructor
+		/// </summary>
+		protected IgnoreException(SerializationInfo info, 
+			StreamingContext context) : base(info,context)
+		{}
+
+	}
+}
diff --git a/src/NUnitFramework/framework/Exceptions/InconclusiveException.cs b/src/NUnitFramework/framework/Exceptions/InconclusiveException.cs
new file mode 100644
index 0000000..0c108e5
--- /dev/null
+++ b/src/NUnitFramework/framework/Exceptions/InconclusiveException.cs
@@ -0,0 +1,43 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Framework
+{
+    using System;
+    using System.Runtime.Serialization;
+
+    /// <summary>
+    /// Thrown when a test executes inconclusively.
+    /// </summary>
+    /// 
+    [Serializable]
+    public class InconclusiveException : System.Exception
+    {
+        /// <param name="message">The error message that explains 
+        /// the reason for the exception</param>
+        public InconclusiveException(string message)
+            : base(message)
+        { }
+
+        /// <param name="message">The error message that explains 
+        /// the reason for the exception</param>
+        /// <param name="inner">The exception that caused the 
+        /// current exception</param>
+        public InconclusiveException(string message, Exception inner)
+            :
+            base(message, inner)
+        { }
+
+        /// <summary>
+        /// Serialization Constructor
+        /// </summary>
+        protected InconclusiveException(SerializationInfo info,
+            StreamingContext context)
+            : base(info, context)
+        { }
+
+    }
+}
diff --git a/src/NUnitFramework/framework/Exceptions/SuccessException.cs b/src/NUnitFramework/framework/Exceptions/SuccessException.cs
new file mode 100644
index 0000000..ee3397b
--- /dev/null
+++ b/src/NUnitFramework/framework/Exceptions/SuccessException.cs
@@ -0,0 +1,41 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Framework
+{
+    using System;
+    using System.Runtime.Serialization;
+
+    /// <summary>
+    /// Thrown when an assertion failed.
+    /// </summary>
+    [Serializable]
+    public class SuccessException : System.Exception
+    {
+        /// <param name="message"></param>
+        public SuccessException(string message)
+            : base(message)
+        { }
+
+        /// <param name="message">The error message that explains 
+        /// the reason for the exception</param>
+        /// <param name="inner">The exception that caused the 
+        /// current exception</param>
+        public SuccessException(string message, Exception inner)
+            :
+            base(message, inner)
+        { }
+
+        /// <summary>
+        /// Serialization Constructor
+        /// </summary>
+        protected SuccessException(SerializationInfo info,
+            StreamingContext context)
+            : base(info, context)
+        { }
+
+    }
+}
diff --git a/src/NUnitFramework/framework/ExpectedExceptionAttribute.cs b/src/NUnitFramework/framework/ExpectedExceptionAttribute.cs
deleted file mode 100644
index 9a75e01..0000000
--- a/src/NUnitFramework/framework/ExpectedExceptionAttribute.cs
+++ /dev/null
@@ -1,144 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-namespace NUnit.Framework
-{
-	using System;
-
-	/// <summary>
-	/// Enumeration indicating how the expected message parameter is to be used
-	/// </summary>
-	public enum MessageMatch
-	{
-		/// Expect an exact match
-		Exact,	
-		/// Expect a message containing the parameter string
-		Contains,
-		/// Match the regular expression provided as a parameter
-		Regex
-	}
-
-	/// <summary>
-	/// ExpectedExceptionAttribute
-	/// </summary>
-	/// 
-	[AttributeUsage(AttributeTargets.Method, AllowMultiple=false)]
-	public class ExpectedExceptionAttribute : Attribute
-	{
-		private Type expectedException;
-		private string expectedExceptionName;
-		private string expectedMessage;
-		private MessageMatch matchType;
-		private string userMessage;
-		private string handler;
-
-		/// <summary>
-		/// Constructor for a non-specific exception
-		/// </summary>
-		public ExpectedExceptionAttribute()
-		{
-		}
-
-		/// <summary>
-		/// Constructor for a given type of exception
-		/// </summary>
-		/// <param name="exceptionType">The type of the expected exception</param>
-		public ExpectedExceptionAttribute(Type exceptionType)
-		{
-			this.expectedException = exceptionType;
-			this.expectedExceptionName = exceptionType.FullName;
-		}
-
-		/// <summary>
-		/// Constructor for a given exception name
-		/// </summary>
-		/// <param name="exceptionName">The full name of the expected exception</param>
-		public ExpectedExceptionAttribute(string exceptionName)
-		{
-			this.expectedExceptionName = exceptionName;
-		}
-
-		/// <summary>
-		/// Constructor for a given type of exception and expected message text
-		/// </summary>
-		/// <param name="exceptionType">The type of the expected exception</param>
-		/// <param name="expectedMessage">The expected message text</param>
-        [Obsolete("Use named parameter format 'ExpectedMessage=...'", false)]
-        public ExpectedExceptionAttribute(Type exceptionType, string expectedMessage)
-            : this(exceptionType)
-        {
-            this.expectedMessage = expectedMessage;
-            this.matchType = MessageMatch.Exact;
-        }
-
-		/// <summary>
-		/// Constructor for a given exception name and expected message text
-		/// </summary>
-		/// <param name="exceptionName">The full name of the expected exception</param>
-		/// <param name="expectedMessage">The expected messge text</param>
-        [Obsolete("Use named parameter format 'ExpectedMessage=...'", false)]
-        public ExpectedExceptionAttribute(string exceptionName, string expectedMessage)
-            : this(exceptionName)
-        {
-            this.expectedMessage = expectedMessage;
-            this.matchType = MessageMatch.Exact;
-        }
-
-		/// <summary>
-		/// Gets or sets the expected exception type
-		/// </summary>
-		public Type ExceptionType 
-		{
-			get{ return expectedException; }
-			set{ expectedException = value; }
-		}
-
-		/// <summary>
-		/// Gets or sets the full Type name of the expected exception
-		/// </summary>
-		public string ExceptionName
-		{
-			get{ return expectedExceptionName; }
-			set{ expectedExceptionName = value; }
-		}
-
-		/// <summary>
-		/// Gets or sets the expected message text
-		/// </summary>
-		public string ExpectedMessage 
-		{
-			get { return expectedMessage; }
-			set { expectedMessage = value; }
-		}
-
-		/// <summary>
-		/// Gets or sets the user message displayed in case of failure
-		/// </summary>
-		public string UserMessage
-		{
-			get { return userMessage; }
-			set { userMessage = value; }
-		}
-
-		/// <summary>
-		///  Gets or sets the type of match to be performed on the expected message
-		/// </summary>
-		public MessageMatch MatchType
-		{
-			get { return matchType; }
-			set { matchType = value; }
-		}
-
-		/// <summary>
-		///  Gets the name of a method to be used as an exception handler
-		/// </summary>
-		public string Handler
-		{
-			get { return handler; }
-			set { handler = value; }
-		}
-	}
-}
diff --git a/src/NUnitFramework/framework/ExplicitAttribute.cs b/src/NUnitFramework/framework/ExplicitAttribute.cs
deleted file mode 100644
index ad43c12..0000000
--- a/src/NUnitFramework/framework/ExplicitAttribute.cs
+++ /dev/null
@@ -1,47 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework
-{
-	/// <summary>
-	/// ExplicitAttribute marks a test or test fixture so that it will
-	/// only be run if explicitly executed from the gui or command line
-	/// or if it is included by use of a filter. The test will not be
-	/// run simply because an enclosing suite is run.
-	/// </summary>
-	[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method|AttributeTargets.Assembly, AllowMultiple=false)]
-	public class ExplicitAttribute : Attribute
-	{
-        private string reason;
-
-        /// <summary>
-		/// Default constructor
-		/// </summary>
-		public ExplicitAttribute()
-		{
-            this.reason = "";
-        }
-
-        /// <summary>
-        /// Constructor with a reason
-        /// </summary>
-        /// <param name="reason">The reason test is marked explicit</param>
-        public ExplicitAttribute(string reason)
-        {
-            this.reason = reason;
-        }
-
-        /// <summary>
-        /// The reason test is marked explicit
-        /// </summary>
-        public string Reason
-        {
-            get { return reason; }
-        }
-    }
-}
diff --git a/src/NUnitFramework/framework/FileAssert.cs b/src/NUnitFramework/framework/FileAssert.cs
index 9415d0e..42e9bf2 100644
--- a/src/NUnitFramework/framework/FileAssert.cs
+++ b/src/NUnitFramework/framework/FileAssert.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitFramework/framework/GlobalSettings.cs b/src/NUnitFramework/framework/GlobalSettings.cs
index 2e8b720..17a040d 100644
--- a/src/NUnitFramework/framework/GlobalSettings.cs
+++ b/src/NUnitFramework/framework/GlobalSettings.cs
@@ -1,3 +1,9 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
 using System;
 
 namespace NUnit.Framework
diff --git a/src/NUnitFramework/framework/Has.cs b/src/NUnitFramework/framework/Has.cs
new file mode 100644
index 0000000..b361cf5
--- /dev/null
+++ b/src/NUnitFramework/framework/Has.cs
@@ -0,0 +1,186 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+// ****************************************************************
+//              Generated by the NUnit Syntax Generator
+//
+// Command Line: GenSyntax.exe SyntaxElements.txt
+// 
+//                  DO NOT MODIFY THIS FILE DIRECTLY
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// Helper class with properties and methods that supply
+    /// a number of constraints used in Asserts.
+    /// </summary>
+    public class Has
+    {
+        #region No
+        
+        /// <summary>
+        /// Returns a ConstraintExpression that negates any
+        /// following constraint.
+        /// </summary>
+        public static ConstraintExpression No
+        {
+            get { return new ConstraintExpression().Not; }
+        }
+        
+        #endregion
+        
+        #region All
+        
+        /// <summary>
+        /// Returns a ConstraintExpression, which will apply
+        /// the following constraint to all members of a collection,
+        /// succeeding if all of them succeed.
+        /// </summary>
+        public static ConstraintExpression All
+        {
+            get { return new ConstraintExpression().All; }
+        }
+        
+        #endregion
+        
+        #region Some
+        
+        /// <summary>
+        /// Returns a ConstraintExpression, which will apply
+        /// the following constraint to all members of a collection,
+        /// succeeding if at least one of them succeeds.
+        /// </summary>
+        public static ConstraintExpression Some
+        {
+            get { return new ConstraintExpression().Some; }
+        }
+        
+        #endregion
+        
+        #region None
+        
+        /// <summary>
+        /// Returns a ConstraintExpression, which will apply
+        /// the following constraint to all members of a collection,
+        /// succeeding if all of them fail.
+        /// </summary>
+        public static ConstraintExpression None
+        {
+            get { return new ConstraintExpression().None; }
+        }
+        
+        #endregion
+        
+        #region Property
+        
+        /// <summary>
+        /// Returns a new PropertyConstraintExpression, which will either
+        /// test for the existence of the named property on the object
+        /// being tested or apply any following constraint to that property.
+        /// </summary>
+        public static ResolvableConstraintExpression Property(string name)
+        {
+            return new ConstraintExpression().Property(name);
+        }
+        
+        #endregion
+        
+        #region Length
+        
+        /// <summary>
+        /// Returns a new ConstraintExpression, which will apply the following
+        /// constraint to the Length property of the object being tested.
+        /// </summary>
+        public static ResolvableConstraintExpression Length
+        {
+            get { return Property("Length"); }
+        }
+        
+        #endregion
+        
+        #region Count
+        
+        /// <summary>
+        /// Returns a new ConstraintExpression, which will apply the following
+        /// constraint to the Count property of the object being tested.
+        /// </summary>
+        public static ResolvableConstraintExpression Count
+        {
+            get { return Property("Count"); }
+        }
+        
+        #endregion
+        
+        #region Message
+        
+        /// <summary>
+        /// Returns a new ConstraintExpression, which will apply the following
+        /// constraint to the Message property of the object being tested.
+        /// </summary>
+        public static ResolvableConstraintExpression Message
+        {
+            get { return Property("Message"); }
+        }
+        
+        #endregion
+        
+        #region InnerException
+        
+        /// <summary>
+        /// Returns a new ConstraintExpression, which will apply the following
+        /// constraint to the InnerException property of the object being tested.
+        /// </summary>
+        public static ResolvableConstraintExpression InnerException
+        {
+            get { return Property("InnerException"); }
+        }
+        
+        #endregion
+        
+        #region Attribute
+        
+        /// <summary>
+        /// Returns a new AttributeConstraint checking for the
+        /// presence of a particular attribute on an object.
+        /// </summary>
+        public static ResolvableConstraintExpression Attribute(Type expectedType)
+        {
+            return new ConstraintExpression().Attribute(expectedType);
+        }
+        
+#if NET_2_0
+        /// <summary>
+        /// Returns a new AttributeConstraint checking for the
+        /// presence of a particular attribute on an object.
+        /// </summary>
+        public static ResolvableConstraintExpression Attribute<T>()
+        {
+            return Attribute(typeof(T));
+        }
+        
+#endif
+        #endregion
+        
+        #region Member
+        
+        /// <summary>
+        /// Returns a new CollectionContainsConstraint checking for the
+        /// presence of a particular object in the collection.
+        /// </summary>
+        public static CollectionContainsConstraint Member(object expected)
+        {
+            return new CollectionContainsConstraint(expected);
+        }
+        
+        #endregion
+        
+    }
+}
diff --git a/src/NUnitFramework/framework/IAsserter.cs b/src/NUnitFramework/framework/IAsserter.cs
deleted file mode 100644
index 9aa818f..0000000
--- a/src/NUnitFramework/framework/IAsserter.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework
-{
-	/// <summary>
-	/// NOTE: The use of asserters for extending NUnit has
-	/// now been replaced by the use of constraints. This
-	/// interface is marked obsolete.
-	/// 
-	/// The interface implemented by an asserter. Asserters
-	/// encapsulate a condition test and generation of an
-	/// AssertionException with a tailored message. They
-	/// are used by the Assert class as helper objects.
-	/// 
-	/// User-defined asserters may be passed to the
-	/// Assert.DoAssert method in order to implement
-	/// extended asserts.
-	/// </summary>
-	[Obsolete("Use Constraints rather than Asserters for new work")]
-	public interface IAsserter
-	{
-		/// <summary>
-		/// Test the condition for the assertion.
-		/// </summary>
-		/// <returns>True if the test succeeds</returns>
-		bool Test();
-
-		/// <summary>
-		/// Return the message giving the failure reason.
-		/// The return value is unspecified if no failure
-		/// has occured.
-		/// </summary>
-		string Message { get; }
-	}
-}
diff --git a/src/NUnitFramework/framework/IExpectException.cs b/src/NUnitFramework/framework/IExpectException.cs
index 88a3b81..2bb4f23 100644
--- a/src/NUnitFramework/framework/IExpectException.cs
+++ b/src/NUnitFramework/framework/IExpectException.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitFramework/framework/ITestCaseData.cs b/src/NUnitFramework/framework/ITestCaseData.cs
new file mode 100644
index 0000000..10203dc
--- /dev/null
+++ b/src/NUnitFramework/framework/ITestCaseData.cs
@@ -0,0 +1,67 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// The ITestCaseData interface is implemented by a class
+    /// that is able to return complete testcases for use by
+    /// a parameterized test method.
+    /// 
+    /// NOTE: This interface is used in both the framework
+    /// and the core, even though that results in two different
+    /// types. However, sharing the source code guarantees that
+    /// the various implementations will be compatible and that
+    /// the core is able to reflect successfully over the
+    /// framework implementations of ITestCaseData.
+    /// </summary>
+    public interface ITestCaseData
+    {
+        /// <summary>
+        /// Gets the argument list to be provided to the test
+        /// </summary>
+        object[] Arguments { get; }
+
+        /// <summary>
+        /// Gets the expected result
+        /// </summary>
+        object Result { get; }
+
+        /// <summary>
+        ///  Gets the expected exception Type
+        /// </summary>
+        Type ExpectedException { get; }
+
+        /// <summary>
+        /// Gets the FullName of the expected exception
+        /// </summary>
+        string ExpectedExceptionName { get; }
+
+        /// <summary>
+        /// Gets the name to be used for the test
+        /// </summary>
+        string TestName { get; }
+
+        /// <summary>
+        /// Gets the description of the test
+        /// </summary>
+        string Description { get; }
+
+        /// <summary>
+        /// Gets a value indicating whether this <see cref="ITestCaseData"/> is ignored.
+        /// </summary>
+        /// <value><c>true</c> if ignored; otherwise, <c>false</c>.</value>
+        bool Ignored { get; }
+
+        /// <summary>
+        /// Gets the ignore reason.
+        /// </summary>
+        /// <value>The ignore reason.</value>
+        string IgnoreReason { get; }
+    }
+}
diff --git a/src/NUnitFramework/framework/IgnoreAttribute.cs b/src/NUnitFramework/framework/IgnoreAttribute.cs
deleted file mode 100644
index 779ec11..0000000
--- a/src/NUnitFramework/framework/IgnoreAttribute.cs
+++ /dev/null
@@ -1,47 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-namespace NUnit.Framework
-{
-	using System;
-
-	/// <summary>
-	/// Attribute used to mark a test that is to be ignored.
-	/// Ignored tests result in a warning message when the
-	/// tests are run.
-	/// </summary>
-	[AttributeUsage(AttributeTargets.Method|AttributeTargets.Class|AttributeTargets.Assembly, AllowMultiple=false)]
-	public class IgnoreAttribute : Attribute
-	{
-		private string reason;
-
-		/// <summary>
-		/// Constructs the attribute without giving a reason 
-		/// for ignoring the test.
-		/// </summary>
-		public IgnoreAttribute()
-		{
-			this.reason = "";
-		}
-
-		/// <summary>
-		/// Constructs the attribute giving a reason for ignoring the test
-		/// </summary>
-		/// <param name="reason">The reason for ignoring the test</param>
-		public IgnoreAttribute(string reason)
-		{
-			this.reason = reason;
-		}
-
-		/// <summary>
-		/// The reason for ignoring a test
-		/// </summary>
-		public string Reason
-		{
-			get { return reason; }
-		}
-	}
-}
diff --git a/src/NUnitFramework/framework/IgnoreException.cs b/src/NUnitFramework/framework/IgnoreException.cs
deleted file mode 100644
index 8b62f7a..0000000
--- a/src/NUnitFramework/framework/IgnoreException.cs
+++ /dev/null
@@ -1,38 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-namespace NUnit.Framework 
-{
-	using System;
-	using System.Runtime.Serialization;
-	
-	/// <summary>
-	/// Thrown when an assertion failed.
-	/// </summary>
-	[Serializable]
-	public class IgnoreException : System.Exception
-	{
-		/// <param name="message"></param>
-		public IgnoreException (string message) : base(message) 
-		{}
-
-		/// <param name="message">The error message that explains 
-		/// the reason for the exception</param>
-		/// <param name="inner">The exception that caused the 
-		/// current exception</param>
-		public IgnoreException(string message, Exception inner) :
-			base(message, inner) 
-		{}
-
-		/// <summary>
-		/// Serialization Constructor
-		/// </summary>
-		protected IgnoreException(SerializationInfo info, 
-			StreamingContext context) : base(info,context)
-		{}
-
-	}
-}
diff --git a/src/NUnitFramework/framework/IncludeExcludeAttributes.cs b/src/NUnitFramework/framework/IncludeExcludeAttributes.cs
deleted file mode 100644
index 24f35a0..0000000
--- a/src/NUnitFramework/framework/IncludeExcludeAttributes.cs
+++ /dev/null
@@ -1,106 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework
-{
-	/// <summary>
-	/// Abstract base for Attributes that are used to include tests
-	/// in the test run based on environmental settings.
-	/// </summary>
-	public abstract class IncludeExcludeAttribute : Attribute
-	{
-		private string include;
-		private string exclude;
-		private string reason;
-
-		/// <summary>
-		/// Constructor with no included items specified, for use
-		/// with named property syntax.
-		/// </summary>
-		public IncludeExcludeAttribute() { }
-
-		/// <summary>
-		/// Constructor taking one or more included items
-		/// </summary>
-		/// <param name="include">Comma-delimited list of included items</param>
-		public IncludeExcludeAttribute( string include )
-		{
-			this.include = include;
-		}
-
-		/// <summary>
-		/// Name of the item that is needed in order for
-		/// a test to run. Multiple itemss may be given,
-		/// separated by a comma.
-		/// </summary>
-		public string Include
-		{
-			get { return this.include; }
-			set { include = value; }
-		}
-
-		/// <summary>
-		/// Name of the item to be excluded. Multiple items
-		/// may be given, separated by a comma.
-		/// </summary>
-		public string Exclude
-		{
-			get { return this.exclude; }
-			set { this.exclude = value; }
-		}
-
-		/// <summary>
-		/// The reason for including or excluding the test
-		/// </summary>
-		public string Reason
-		{
-			get { return reason; }
-			set { reason = value; }
-		}
-	}
-
-	/// <summary>
-	/// PlatformAttribute is used to mark a test fixture or an
-	/// individual method as applying to a particular platform only.
-	/// </summary>
-	[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method|AttributeTargets.Assembly, AllowMultiple=true)]
-	public class PlatformAttribute : IncludeExcludeAttribute
-	{
-		/// <summary>
-		/// Constructor with no platforms specified, for use
-		/// with named property syntax.
-		/// </summary>
-		public PlatformAttribute() { }
-
-		/// <summary>
-		/// Constructor taking one or more platforms
-		/// </summary>
-		/// <param name="platforms">Comma-deliminted list of platforms</param>
-		public PlatformAttribute( string platforms ) : base( platforms ) { }
-	}
-
-	/// <summary>
-	/// CultureAttribute is used to mark a test fixture or an
-	/// individual method as applying to a particular Culture only.
-	/// </summary>
-	[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method|AttributeTargets.Assembly, AllowMultiple=false)]
-	public class CultureAttribute : IncludeExcludeAttribute
-	{
-		/// <summary>
-		/// Constructor with no cultures specified, for use
-		/// with named property syntax.
-		/// </summary>
-		public CultureAttribute() { }
-
-		/// <summary>
-		/// Constructor taking one or more cultures
-		/// </summary>
-		/// <param name="cultures">Comma-deliminted list of cultures</param>
-		public CultureAttribute( string cultures ) : base( cultures ) { }
-	}
-}
diff --git a/src/NUnitFramework/framework/Is.cs b/src/NUnitFramework/framework/Is.cs
new file mode 100644
index 0000000..bcb1ce8
--- /dev/null
+++ b/src/NUnitFramework/framework/Is.cs
@@ -0,0 +1,507 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+// ****************************************************************
+//              Generated by the NUnit Syntax Generator
+//
+// Command Line: GenSyntax.exe SyntaxElements.txt
+// 
+//                  DO NOT MODIFY THIS FILE DIRECTLY
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// Helper class with properties and methods that supply
+    /// a number of constraints used in Asserts.
+    /// </summary>
+    public class Is
+    {
+        #region Not
+        
+        /// <summary>
+        /// Returns a ConstraintExpression that negates any
+        /// following constraint.
+        /// </summary>
+        public static ConstraintExpression Not
+        {
+            get { return new ConstraintExpression().Not; }
+        }
+        
+        #endregion
+        
+        #region All
+        
+        /// <summary>
+        /// Returns a ConstraintExpression, which will apply
+        /// the following constraint to all members of a collection,
+        /// succeeding if all of them succeed.
+        /// </summary>
+        public static ConstraintExpression All
+        {
+            get { return new ConstraintExpression().All; }
+        }
+        
+        #endregion
+        
+        #region Null
+        
+        /// <summary>
+        /// Returns a constraint that tests for null
+        /// </summary>
+        public static NullConstraint Null
+        {
+            get { return new NullConstraint(); }
+        }
+        
+        #endregion
+        
+        #region True
+        
+        /// <summary>
+        /// Returns a constraint that tests for True
+        /// </summary>
+        public static TrueConstraint True
+        {
+            get { return new TrueConstraint(); }
+        }
+        
+        #endregion
+        
+        #region False
+        
+        /// <summary>
+        /// Returns a constraint that tests for False
+        /// </summary>
+        public static FalseConstraint False
+        {
+            get { return new FalseConstraint(); }
+        }
+        
+        #endregion
+        
+        #region NaN
+        
+        /// <summary>
+        /// Returns a constraint that tests for NaN
+        /// </summary>
+        public static NaNConstraint NaN
+        {
+            get { return new NaNConstraint(); }
+        }
+        
+        #endregion
+        
+        #region Empty
+        
+        /// <summary>
+        /// Returns a constraint that tests for empty
+        /// </summary>
+        public static EmptyConstraint Empty
+        {
+            get { return new EmptyConstraint(); }
+        }
+        
+        #endregion
+        
+        #region Unique
+        
+        /// <summary>
+        /// Returns a constraint that tests whether a collection 
+        /// contains all unique items.
+        /// </summary>
+        public static UniqueItemsConstraint Unique
+        {
+            get { return new UniqueItemsConstraint(); }
+        }
+        
+        #endregion
+        
+        #region BinarySerializable
+        
+        /// <summary>
+        /// Returns a constraint that tests whether an object graph is serializable in binary format.
+        /// </summary>
+        public static BinarySerializableConstraint BinarySerializable
+        {
+            get { return new BinarySerializableConstraint(); }
+        }
+        
+        #endregion
+        
+        #region XmlSerializable
+        
+        /// <summary>
+        /// Returns a constraint that tests whether an object graph is serializable in xml format.
+        /// </summary>
+        public static XmlSerializableConstraint XmlSerializable
+        {
+            get { return new XmlSerializableConstraint(); }
+        }
+        
+        #endregion
+        
+        #region EqualTo
+        
+        /// <summary>
+        /// Returns a constraint that tests two items for equality
+        /// </summary>
+        public static EqualConstraint EqualTo(object expected)
+        {
+            return new EqualConstraint(expected);
+        }
+        
+        #endregion
+        
+        #region SameAs
+        
+        /// <summary>
+        /// Returns a constraint that tests that two references are the same object
+        /// </summary>
+        public static SameAsConstraint SameAs(object expected)
+        {
+            return new SameAsConstraint(expected);
+        }
+        
+        #endregion
+        
+        #region GreaterThan
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the
+        /// actual value is greater than the suppled argument
+        /// </summary>
+        public static GreaterThanConstraint GreaterThan(object expected)
+        {
+            return new GreaterThanConstraint(expected);
+        }
+        
+        #endregion
+        
+        #region GreaterThanOrEqualTo
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the
+        /// actual value is greater than or equal to the suppled argument
+        /// </summary>
+        public static GreaterThanOrEqualConstraint GreaterThanOrEqualTo(object expected)
+        {
+            return new GreaterThanOrEqualConstraint(expected);
+        }
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the
+        /// actual value is greater than or equal to the suppled argument
+        /// </summary>
+        public static GreaterThanOrEqualConstraint AtLeast(object expected)
+        {
+            return new GreaterThanOrEqualConstraint(expected);
+        }
+        
+        #endregion
+        
+        #region LessThan
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the
+        /// actual value is less than the suppled argument
+        /// </summary>
+        public static LessThanConstraint LessThan(object expected)
+        {
+            return new LessThanConstraint(expected);
+        }
+        
+        #endregion
+        
+        #region LessThanOrEqualTo
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the
+        /// actual value is less than or equal to the suppled argument
+        /// </summary>
+        public static LessThanOrEqualConstraint LessThanOrEqualTo(object expected)
+        {
+            return new LessThanOrEqualConstraint(expected);
+        }
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the
+        /// actual value is less than or equal to the suppled argument
+        /// </summary>
+        public static LessThanOrEqualConstraint AtMost(object expected)
+        {
+            return new LessThanOrEqualConstraint(expected);
+        }
+        
+        #endregion
+        
+        #region TypeOf
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the actual
+        /// value is of the exact type supplied as an argument.
+        /// </summary>
+        public static ExactTypeConstraint TypeOf(Type expectedType)
+        {
+            return new ExactTypeConstraint(expectedType);
+        }
+        
+#if NET_2_0
+        /// <summary>
+        /// Returns a constraint that tests whether the actual
+        /// value is of the exact type supplied as an argument.
+        /// </summary>
+        public static ExactTypeConstraint TypeOf<T>()
+        {
+            return new ExactTypeConstraint(typeof(T));
+        }
+        
+#endif
+        #endregion
+        
+        #region InstanceOf
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is of the type supplied as an argument or a derived type.
+        /// </summary>
+        public static InstanceOfTypeConstraint InstanceOf(Type expectedType)
+        {
+            return new InstanceOfTypeConstraint(expectedType);
+        }
+        
+#if NET_2_0
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is of the type supplied as an argument or a derived type.
+        /// </summary>
+        public static InstanceOfTypeConstraint InstanceOf<T>()
+        {
+            return new InstanceOfTypeConstraint(typeof(T));
+        }
+        
+#endif
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is of the type supplied as an argument or a derived type.
+        /// </summary>
+        [Obsolete("Use InstanceOf(expectedType)")]
+        public static InstanceOfTypeConstraint InstanceOfType(Type expectedType)
+        {
+            return new InstanceOfTypeConstraint(expectedType);
+        }
+        
+#if NET_2_0
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is of the type supplied as an argument or a derived type.
+        /// </summary>
+        [Obsolete("Use InstanceOf<T>()")]
+        public static InstanceOfTypeConstraint InstanceOfType<T>()
+        {
+            return new InstanceOfTypeConstraint(typeof(T));
+        }
+        
+#endif
+        #endregion
+        
+        #region AssignableFrom
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is assignable from the type supplied as an argument.
+        /// </summary>
+        public static AssignableFromConstraint AssignableFrom(Type expectedType)
+        {
+            return new AssignableFromConstraint(expectedType);
+        }
+        
+#if NET_2_0
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is assignable from the type supplied as an argument.
+        /// </summary>
+        public static AssignableFromConstraint AssignableFrom<T>()
+        {
+            return new AssignableFromConstraint(typeof(T));
+        }
+        
+#endif
+        #endregion
+        
+        #region AssignableTo
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is assignable from the type supplied as an argument.
+        /// </summary>
+        public static AssignableToConstraint AssignableTo(Type expectedType)
+        {
+            return new AssignableToConstraint(expectedType);
+        }
+        
+#if NET_2_0
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is assignable from the type supplied as an argument.
+        /// </summary>
+        public static AssignableToConstraint AssignableTo<T>()
+        {
+            return new AssignableToConstraint(typeof(T));
+        }
+        
+#endif
+        #endregion
+        
+        #region EquivalentTo
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is a collection containing the same elements as the 
+        /// collection supplied as an argument.
+        /// </summary>
+        public static CollectionEquivalentConstraint EquivalentTo(IEnumerable expected)
+        {
+            return new CollectionEquivalentConstraint(expected);
+        }
+        
+        #endregion
+        
+        #region SubsetOf
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is a subset of the collection supplied as an argument.
+        /// </summary>
+        public static CollectionSubsetConstraint SubsetOf(IEnumerable expected)
+        {
+            return new CollectionSubsetConstraint(expected);
+        }
+        
+        #endregion
+        
+        #region Ordered
+        
+        /// <summary>
+        /// Returns a constraint that tests whether a collection is ordered
+        /// </summary>
+        public static CollectionOrderedConstraint Ordered
+        {
+            get { return new CollectionOrderedConstraint(); }
+        }
+        
+        #endregion
+        
+        #region StringContaining
+        
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value contains the substring supplied as an argument.
+        /// </summary>
+        public static SubstringConstraint StringContaining(string expected)
+        {
+            return new SubstringConstraint(expected);
+        }
+        
+        #endregion
+        
+        #region StringStarting
+        
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value starts with the substring supplied as an argument.
+        /// </summary>
+        public static StartsWithConstraint StringStarting(string expected)
+        {
+            return new StartsWithConstraint(expected);
+        }
+        
+        #endregion
+        
+        #region StringEnding
+        
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value ends with the substring supplied as an argument.
+        /// </summary>
+        public static EndsWithConstraint StringEnding(string expected)
+        {
+            return new EndsWithConstraint(expected);
+        }
+        
+        #endregion
+        
+        #region StringMatching
+        
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value matches the Regex pattern supplied as an argument.
+        /// </summary>
+        public static RegexConstraint StringMatching(string pattern)
+        {
+            return new RegexConstraint(pattern);
+        }
+        
+        #endregion
+        
+        #region SamePath
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the path provided 
+        /// is the same as an expected path after canonicalization.
+        /// </summary>
+        public static SamePathConstraint SamePath(string expected)
+        {
+            return new SamePathConstraint(expected);
+        }
+        
+        #endregion
+        
+        #region SubPath
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the path provided 
+        /// is the same path or under an expected path after canonicalization.
+        /// </summary>
+        public static SubPathConstraint SubPath(string expected)
+        {
+            return new SubPathConstraint(expected);
+        }
+        
+        #endregion
+        
+        #region SamePathOrUnder
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the path provided 
+        /// is the same path or under an expected path after canonicalization.
+        /// </summary>
+        public static SamePathOrUnderConstraint SamePathOrUnder(string expected)
+        {
+            return new SamePathOrUnderConstraint(expected);
+        }
+        
+        #endregion
+        
+        #region InRange
+        
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value falls 
+        /// within a specified range.
+        /// </summary>
+        public static RangeConstraint InRange(IComparable from, IComparable to)
+        {
+            return new RangeConstraint(from, to);
+        }
+        
+        #endregion
+        
+    }
+}
diff --git a/src/NUnitFramework/framework/Iz.cs b/src/NUnitFramework/framework/Iz.cs
new file mode 100644
index 0000000..8769d95
--- /dev/null
+++ b/src/NUnitFramework/framework/Iz.cs
@@ -0,0 +1,17 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// The Iz class is a synonym for Is intended for use in VB,
+    /// which regards Is as a keyword.
+    /// </summary>
+    public class Iz : Is
+    {
+    }
+}
diff --git a/src/NUnitFramework/framework/List.cs b/src/NUnitFramework/framework/List.cs
new file mode 100644
index 0000000..360794f
--- /dev/null
+++ b/src/NUnitFramework/framework/List.cs
@@ -0,0 +1,30 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework
+{
+	/// <summary>
+	/// The List class is a helper class with properties and methods
+	/// that supply a number of constraints used with lists and collections.
+	/// </summary>
+	public class List
+	{
+		/// <summary>
+		/// List.Map returns a ListMapper, which can be used to map
+		/// the original collection to another collection.
+		/// </summary>
+		/// <param name="actual"></param>
+		/// <returns></returns>
+		public static ListMapper Map( ICollection actual )
+		{
+			return new ListMapper( actual );
+		}
+	}
+}
diff --git a/src/NUnitFramework/framework/ListMapper.cs b/src/NUnitFramework/framework/ListMapper.cs
new file mode 100644
index 0000000..65708aa
--- /dev/null
+++ b/src/NUnitFramework/framework/ListMapper.cs
@@ -0,0 +1,52 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Reflection;
+
+namespace NUnit.Framework
+{
+	/// <summary>
+	/// ListMapper is used to transform a collection used as an actual argument
+	/// producing another collection to be used in the assertion.
+	/// </summary>
+	public class ListMapper
+	{
+		ICollection original;
+
+		/// <summary>
+		/// Construct a ListMapper based on a collection
+		/// </summary>
+		/// <param name="original">The collection to be transformed</param>
+ 		public ListMapper( ICollection original )
+		{
+			this.original = original;
+		}
+
+		/// <summary>
+		/// Produces a collection containing all the values of a property
+		/// </summary>
+		/// <param name="name">The collection of property values</param>
+		/// <returns></returns>
+		public ICollection Property( string name )
+		{
+			ArrayList propList = new ArrayList();
+			foreach( object item in original )
+			{
+				PropertyInfo property = item.GetType().GetProperty( name, 
+					BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance );
+				if ( property == null )
+					throw new ArgumentException( string.Format(
+						"{0} does not have a {1} property", item, name ) );
+
+				propList.Add( property.GetValue( item, null ) );
+			}
+
+			return propList;
+		}
+	}
+}
diff --git a/src/NUnitFramework/framework/MessageWriter.cs b/src/NUnitFramework/framework/MessageWriter.cs
deleted file mode 100644
index bcdd59e..0000000
--- a/src/NUnitFramework/framework/MessageWriter.cs
+++ /dev/null
@@ -1,139 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-using System.IO;
-using System.Collections;
-using NUnit.Framework.Constraints;
-
-namespace NUnit.Framework
-{
-	/// <summary>
-	/// MessageWriter is the abstract base for classes that write
-	/// constraint descriptions and messages in some form. The
-	/// class has separate methods for writing various components
-	/// of a message, allowing implementations to tailor the
-	/// presentation as needed.
-	/// </summary>
-    public abstract class MessageWriter : StringWriter
-    {
-
-		/// <summary>
-		/// Construct a MessageWriter given a culture
-		/// </summary>
-        public MessageWriter() : base( System.Globalization.CultureInfo.InvariantCulture ) { }
-
-        /// <summary>
-        /// Abstract method to get the max line length
-        /// </summary>
-        public abstract int MaxLineLength { get; set; }
-
-		/// <summary>
-		/// Method to write single line  message with optional args, usually
-		/// written to precede the general failure message.
-		/// </summary>
-		/// <param name="message">The message to be written</param>
-		/// <param name="args">Any arguments used in formatting the message</param>
-		public void WriteMessageLine(string message, params object[] args)
-        {
-            WriteMessageLine(0, message, args);
-        }
-
-        /// <summary>
-        /// Method to write single line  message with optional args, usually
-        /// written to precede the general failure message, at a givel 
-        /// indentation level.
-        /// </summary>
-        /// <param name="level">The indentation level of the message</param>
-        /// <param name="message">The message to be written</param>
-        /// <param name="args">Any arguments used in formatting the message</param>
-        public abstract void WriteMessageLine(int level, string message, params object[] args);
-
-        /// <summary>
-        /// Display Expected and Actual lines for a constraint. This
-        /// is called by MessageWriter's default implementation of 
-        /// WriteMessageTo and provides the generic two-line display. 
-        /// </summary>
-        /// <param name="constraint">The constraint that failed</param>
-        public abstract void DisplayDifferences(Constraint constraint);
-
-		/// <summary>
-		/// Display Expected and Actual lines for given values. This
-		/// method may be called by constraints that need more control over
-		/// the display of actual and expected values than is provided
-		/// by the default implementation.
-		/// </summary>
-		/// <param name="expected">The expected value</param>
-		/// <param name="actual">The actual value causing the failure</param>
-		public abstract void DisplayDifferences(object expected, object actual);
-
-		/// <summary>
-		/// Display Expected and Actual lines for given values, including
-		/// a tolerance value on the Expected line.
-		/// </summary>
-		/// <param name="expected">The expected value</param>
-		/// <param name="actual">The actual value causing the failure</param>
-		/// <param name="tolerance">The tolerance within which the test was made</param>
-		public abstract void DisplayDifferences(object expected, object actual, object tolerance);
-
-		/// <summary>
-        /// Display the expected and actual string values on separate lines.
-        /// If the mismatch parameter is >=0, an additional line is displayed
-        /// line containing a caret that points to the mismatch point.
-        /// </summary>
-        /// <param name="expected">The expected string value</param>
-        /// <param name="actual">The actual string value</param>
-        /// <param name="mismatch">The point at which the strings don't match or -1</param>
-        /// <param name="ignoreCase">If true, case is ignored in locating the point where the strings differ</param>
-        /// <param name="clipping">If true, the strings should be clipped to fit the line</param>
-        public abstract void DisplayStringDifferences(string expected, string actual, int mismatch, bool ignoreCase, bool clipping);
-
-        /// <summary>
-        /// Writes the text for a connector.
-        /// </summary>
-        /// <param name="connector">The connector.</param>
-        public abstract void WriteConnector(string connector);
-
-        /// <summary>
-        /// Writes the text for a predicate.
-        /// </summary>
-        /// <param name="predicate">The predicate.</param>
-        public abstract void WritePredicate(string predicate);
-
-		/// <summary>
-		/// Writes the text for an expected value.
-		/// </summary>
-		/// <param name="expected">The expected value.</param>
-		public abstract void WriteExpectedValue(object expected);
-
-		/// <summary>
-		/// Writes the text for a modifier
-		/// </summary>
-		/// <param name="modifier">The modifier.</param>
-		public abstract void WriteModifier(string modifier);
-
-		/// <summary>
-		/// Writes the text for an actual value.
-		/// </summary>
-		/// <param name="actual">The actual value.</param>
-		public abstract void WriteActualValue(object actual);
-
-		/// <summary>
-		/// Writes the text for a generalized value.
-		/// </summary>
-		/// <param name="val">The value.</param>
-		public abstract void WriteValue(object val);
-    
-		/// <summary>
-		/// Writes the text for a collection value,
-		/// starting at a particular point, to a max length
-		/// </summary>
-		/// <param name="collection">The collection containing elements to write.</param>
-        /// <param name="start">The starting point of the elements to write</param>
-        /// <param name="max">The maximum number of elements to write</param>
-		public abstract void WriteCollectionElements(ICollection collection, int start, int max);
-	}
-}
diff --git a/src/NUnitFramework/framework/MsgUtils.cs b/src/NUnitFramework/framework/MsgUtils.cs
deleted file mode 100644
index dd2e06d..0000000
--- a/src/NUnitFramework/framework/MsgUtils.cs
+++ /dev/null
@@ -1,217 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-using System.Text;
-using System.Collections;
-
-namespace NUnit.Framework
-{
-    /// <summary>
-    /// Static methods used in creating messages
-    /// </summary>
-    public class MsgUtils
-    {
-        /// <summary>
-        /// Static string used when strings are clipped
-        /// </summary>
-        public static readonly string ELLIPSIS = "...";
-
-        /// <summary>
-        /// Returns the representation of a type as used in NUnitLite.
-        /// This is the same as Type.ToString() except for arrays,
-        /// which are displayed with their declared sizes.
-        /// </summary>
-        /// <param name="obj"></param>
-        /// <returns></returns>
-        public static string GetTypeRepresentation(object obj)
-        {
-            Array array = obj as Array;
-            if ( array == null )
-                return string.Format( "<{0}>", obj.GetType() );
-
-            StringBuilder sb = new StringBuilder();
-            Type elementType = array.GetType();
-            int nest = 0;
-            while (elementType.IsArray)
-            {
-                elementType = elementType.GetElementType();
-                ++nest;
-            }
-            sb.Append(elementType.ToString());
-            sb.Append('[');
-            for (int r = 0; r < array.Rank; r++)
-            {
-                if (r > 0) sb.Append(',');
-                sb.Append(array.GetLength(r));
-            }
-            sb.Append(']');
-
-            while (--nest > 0)
-                sb.Append("[]");
-
-            return string.Format( "<{0}>", sb.ToString() );
-        }
-        /// <summary>
-        /// Converts any control characters in a string 
-        /// to their escaped representation.
-        /// </summary>
-        /// <param name="s">The string to be converted</param>
-        /// <returns>The converted string</returns>
-        public static string ConvertWhitespace(string s)
-        {
-			if( s != null )
-			{
-				s = s.Replace( "\\", "\\\\" );
-				s = s.Replace( "\r", "\\r" );
-				s = s.Replace( "\n", "\\n" );
-				s = s.Replace( "\t", "\\t" );
-			}
-			return s;
-        }
-
-        /// <summary>
-        /// Return the a string representation for a set of indices into an array
-        /// </summary>
-        /// <param name="indices">Array of indices for which a string is needed</param>
-        public static string GetArrayIndicesAsString(int[] indices)
-        {
-            StringBuilder sb = new StringBuilder();
-            sb.Append('[');
-            for (int r = 0; r < indices.Length; r++)
-            {
-                if (r > 0) sb.Append(',');
-                sb.Append(indices[r].ToString());
-            }
-            sb.Append(']');
-            return sb.ToString();
-        }
-
-        /// <summary>
-        /// Get an array of indices representing the point in a collection or
-        /// array corresponding to a single int index into the collection.
-        /// </summary>
-        /// <param name="collection">The collection to which the indices apply</param>
-        /// <param name="index">Index in the collection</param>
-        /// <returns>Array of indices</returns>
-        public static int[] GetArrayIndicesFromCollectionIndex(ICollection collection, int index)
-        {
-            Array array = collection as Array;
-
-            if ( array == null || array.Rank == 1)
-                return new int[] { index };
-
-            int[] result = new int[array.Rank];
-
-            for (int r = array.Rank; --r > 0; )
-            {
-                int l = array.GetLength(r);
-                result[r] = index % l;
-                index /= l;
-            }
-
-            result[0] = index;
-            return result;
-        }
-
-        /// <summary>
-        /// Clip a string to a given length, starting at a particular offset, returning the clipped
-        /// string with ellipses representing the removed parts
-        /// </summary>
-        /// <param name="s">The string to be clipped</param>
-        /// <param name="maxStringLength">The maximum permitted length of the result string</param>
-        /// <param name="clipStart">The point at which to start clipping</param>
-        /// <returns>The clipped string</returns>
-        public static string ClipString(string s, int maxStringLength, int clipStart)
-        {
-            int clipLength = maxStringLength;
-            StringBuilder sb = new StringBuilder();
-
-            if (clipStart > 0)
-            {
-                clipLength -= ELLIPSIS.Length;
-                sb.Append( ELLIPSIS );
-            }
-
-            if (s.Length - clipStart > clipLength)
-            {
-                clipLength -= ELLIPSIS.Length;
-                sb.Append( s.Substring( clipStart, clipLength ));
-                sb.Append(ELLIPSIS);
-            }
-            else if (clipStart > 0)
-                sb.Append( s.Substring(clipStart));
-            else
-                sb.Append( s );
- 
-            return sb.ToString();
-        }
-
-        /// <summary>
-        /// Clip the expected and actual strings in a coordinated fashion, 
-        /// so that they may be displayed together.
-        /// </summary>
-        /// <param name="expected"></param>
-        /// <param name="actual"></param>
-        /// <param name="maxDisplayLength"></param>
-        /// <param name="mismatch"></param>
-        public static void ClipExpectedAndActual(ref string expected, ref string actual, int maxDisplayLength, int mismatch)
-        {
-            // Case 1: Both strings fit on line
-            int maxStringLength = Math.Max(expected.Length, actual.Length);
-            if (maxStringLength <= maxDisplayLength)
-                return;
-
-            // Case 2: Assume that the tail of each string fits on line
-            int clipLength = maxDisplayLength - ELLIPSIS.Length;
-            int tailLength = clipLength - mismatch;
-            int clipStart = maxStringLength - clipLength;
-
-            // Case 3: If it doesn't, center the mismatch position
-            if ( clipStart > mismatch )
-                clipStart = Math.Max( 0, mismatch - clipLength / 2 );
-
-            expected = ClipString(expected, maxDisplayLength, clipStart);
-            actual = ClipString(actual, maxDisplayLength, clipStart);
-        }
-
-        /// <summary>
-        /// Shows the position two strings start to differ.  Comparison 
-        /// starts at the start index.
-        /// </summary>
-        /// <param name="expected">The expected string</param>
-        /// <param name="actual">The actual string</param>
-        /// <param name="istart">The index in the strings at which comparison should start</param>
-        /// <param name="ignoreCase">Boolean indicating whether case should be ignored</param>
-        /// <returns>-1 if no mismatch found, or the index where mismatch found</returns>
-        static public int FindMismatchPosition(string expected, string actual, int istart, bool ignoreCase)
-        {
-            int length = Math.Min(expected.Length, actual.Length);
-
-            string s1 = ignoreCase ? expected.ToLower() : expected;
-            string s2 = ignoreCase ? actual.ToLower() : actual;
-
-            for (int i = istart; i < length; i++)
-            {
-                if (s1[i] != s2[i])
-                    return i;
-            }
-
-            //
-            // Strings have same content up to the length of the shorter string.
-            // Mismatch occurs because string lengths are different, so show
-            // that they start differing where the shortest string ends
-            //
-            if (expected.Length != actual.Length)
-                return length;
-
-            //
-            // Same strings : We shouldn't get here
-            //
-            return -1;
-        }
-    }
-}
diff --git a/src/NUnitFramework/framework/OldTestCase.cs b/src/NUnitFramework/framework/OldTestCase.cs
deleted file mode 100644
index 66a0662..0000000
--- a/src/NUnitFramework/framework/OldTestCase.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-namespace NUnit.Framework
-{
-	using System;
-
-	/// <summary>
-	/// Obsolete class, formerly used to identify tests through
-	/// inheritance. Avoid using this class for new tests.
-	/// </summary>
-	[TestFixture]
-	[Obsolete("use TestFixture attribute instead of inheritance",false)]
-	public class TestCase : Assertion
-	{
-		/// <summary>
-		/// Method called immediately before running the test.
-		/// </summary>
-		[SetUp]
-		[Obsolete("use SetUp attribute instead of naming convention",false)]
-		protected virtual void SetUp()
-		{}
-
-		/// <summary>
-		/// Method Called immediately after running the test. It is
-		/// guaranteed to be called, even if an exception is thrown. 
-		/// </summary>
-		[TearDown]
-		[Obsolete("use TearDown attribute instead of naming convention",false)]
-		protected virtual void TearDown()
-		{}
-	}
-}
diff --git a/src/NUnitFramework/framework/PropertyAttribute.cs b/src/NUnitFramework/framework/PropertyAttribute.cs
deleted file mode 100644
index 7accb1e..0000000
--- a/src/NUnitFramework/framework/PropertyAttribute.cs
+++ /dev/null
@@ -1,66 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework
-{
-	/// <summary>
-	/// PropertyAttribute is used to attach information to a test as a name/value pair..
-	/// </summary>
-	[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method|AttributeTargets.Assembly, AllowMultiple=true)]
-	public class PropertyAttribute : Attribute
-	{
-		/// <summary>
-		/// The property name
-		/// </summary>
-		protected string propertyName;
-
-		/// <summary>
-		/// The property value
-		/// </summary>
-		protected object propertyValue;
-
-		/// <summary>
-		/// Construct a PropertyAttribute with a name and value
-		/// </summary>
-		/// <param name="propertyName">The name of the property</param>
-		/// <param name="propertyValue">The property value</param>
-		public PropertyAttribute( string propertyName, object propertyValue )
-		{
-			this.propertyName = propertyName;
-			this.propertyValue = propertyValue;
-		}
-
-		/// <summary>
-		/// Constructor for use by inherited classes that use the
-		/// name of the type as the property name.
-		/// </summary>
-		protected PropertyAttribute( object propertyValue )
-		{
-			this.propertyName = this.GetType().Name;
-			if ( propertyName.EndsWith( "Attribute" ) )
-				propertyName = propertyName.Substring( 0, propertyName.Length - 9 );
-			this.propertyValue = propertyValue;
-		}
-
-		/// <summary>
-		/// Gets the property name
-		/// </summary>
-		public string Name
-		{
-			get { return propertyName; }
-		}
-
-		/// <summary>
-		/// Gets the property value
-		/// </summary>
-		public object Value
-		{
-			get { return propertyValue; }
-		}
-	}
-}
diff --git a/src/NUnitFramework/framework/Randomizer.cs b/src/NUnitFramework/framework/Randomizer.cs
new file mode 100644
index 0000000..1dc3253
--- /dev/null
+++ b/src/NUnitFramework/framework/Randomizer.cs
@@ -0,0 +1,117 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Reflection;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// Randomizer returns a set of random values in a repeatable
+    /// way, to allow re-running of tests if necessary.
+    /// </summary>
+    public class Randomizer : Random
+    {
+        #region Static Members
+        private static Random seedGenerator = new Random();
+
+        private static Hashtable randomizers = new Hashtable();
+
+        /// <summary>
+        /// Get a random seed for use in creating a randomizer.
+        /// </summary>
+        public static int RandomSeed
+        {
+            get { return seedGenerator.Next(); }
+        }
+
+        /// <summary>
+        /// Get a randomizer for a particular member, returning
+        /// one that has already been created if it exists.
+        /// This ensures that the same values are generated
+        /// each time the tests are reloaded.
+        /// </summary>
+        public static Randomizer GetRandomizer(MemberInfo member)
+        {
+            Randomizer r = (Randomizer)randomizers[member];
+
+            if ( r == null )
+                randomizers[member] = r = new Randomizer();
+
+            return r;
+        }
+
+
+        /// <summary>
+        /// Get a randomizer for a particular parameter, returning
+        /// one that has already been created if it exists.
+        /// This ensures that the same values are generated
+        /// each time the tests are reloaded.
+        /// </summary>
+        public static Randomizer GetRandomizer(ParameterInfo parameter)
+        {
+            return GetRandomizer(parameter.Member);
+        }
+        #endregion
+
+        #region Constructors
+        /// <summary>
+        /// Construct a randomizer using a random seed
+        /// </summary>
+        public Randomizer() : base(RandomSeed) { }
+
+        /// <summary>
+        /// Construct a randomizer using a specified seed
+        /// </summary>
+        public Randomizer(int seed) : base(seed) { }
+        #endregion
+
+        #region Public Methods
+        /// <summary>
+        /// Return an array of random doubles between 0.0 and 1.0.
+        /// </summary>
+        /// <param name="count"></param>
+        /// <returns></returns>
+        public double[] GetDoubles(int count)
+        {
+            double[] rvals = new double[count];
+
+            for (int index = 0; index < count; index++)
+                rvals[index] = NextDouble();
+
+            return rvals;
+        }
+
+        /// <summary>
+        /// Return an array of random doubles with values in a specified range.
+        /// </summary>
+        public double[] GetDoubles(double min, double max, int count)
+        {
+            double range = max - min;
+            double[] rvals = new double[count];
+
+            for (int index = 0; index < count; index++)
+                rvals[index] = NextDouble() * range + min;
+
+            return rvals;
+        }
+
+        /// <summary>
+        /// Return an array of random ints with values in a specified range.
+        /// </summary>
+        public int[] GetInts(int min, int max, int count)
+        {
+            int[] ivals = new int[count];
+
+            for (int index = 0; index < count; index++)
+                ivals[index] = Next(min, max);
+
+            return ivals;
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitFramework/framework/SetCultureAttribute.cs b/src/NUnitFramework/framework/SetCultureAttribute.cs
deleted file mode 100644
index 45dfb65..0000000
--- a/src/NUnitFramework/framework/SetCultureAttribute.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-using System;
-
-namespace NUnit.Framework
-{
-	/// <summary>
-	/// Summary description for SetCultureAttribute.
-	/// </summary>
-	[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method|AttributeTargets.Assembly, AllowMultiple=true)]
-	public class SetCultureAttribute : PropertyAttribute
-	{
-		/// <summary>
-		/// Construct given the name of a culture
-		/// </summary>
-		/// <param name="culture"></param>
-		public SetCultureAttribute( string culture ) : base( "_SETCULTURE", culture ) { }
-	}
-}
diff --git a/src/NUnitFramework/framework/SetUpAttribute.cs b/src/NUnitFramework/framework/SetUpAttribute.cs
deleted file mode 100644
index 34e46ec..0000000
--- a/src/NUnitFramework/framework/SetUpAttribute.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-namespace NUnit.Framework
-{
-	using System;
-
-	/// <summary>
-	/// Attribute used to mark a class that contains one-time SetUp 
-	/// and/or TearDown methods that apply to all the tests in a
-	/// namespace or an assembly.
-	/// </summary>
-	[AttributeUsage(AttributeTargets.Method, AllowMultiple=false)]
-	public class SetUpAttribute : Attribute
-	{}
-}
diff --git a/src/NUnitFramework/framework/SetUpFixtureAttribute.cs b/src/NUnitFramework/framework/SetUpFixtureAttribute.cs
deleted file mode 100644
index 40c0655..0000000
--- a/src/NUnitFramework/framework/SetUpFixtureAttribute.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework
-{
-	/// <summary>
-	/// SetUpFixtureAttribute is used to identify a SetUpFixture
-	/// </summary>
-	[AttributeUsage(AttributeTargets.Class, AllowMultiple=false)]
-	public class SetUpFixtureAttribute : Attribute
-	{
-	}
-}
diff --git a/src/NUnitFramework/framework/SpecialValue.cs b/src/NUnitFramework/framework/SpecialValue.cs
new file mode 100644
index 0000000..eb85614
--- /dev/null
+++ b/src/NUnitFramework/framework/SpecialValue.cs
@@ -0,0 +1,23 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// The SpecialValue enum is used to represent TestCase arguments
+    /// that cannot be used as arguments to an Attribute.
+    /// </summary>
+	public enum SpecialValue
+	{
+        /// <summary>
+        /// Null represents a null value, which cannot be used as an 
+        /// argument to an attriute under .NET 1.x
+        /// </summary>
+        Null
+	}
+}
diff --git a/src/NUnitFramework/framework/StringAssert.cs b/src/NUnitFramework/framework/StringAssert.cs
index c2510b8..2140b70 100644
--- a/src/NUnitFramework/framework/StringAssert.cs
+++ b/src/NUnitFramework/framework/StringAssert.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System.ComponentModel;
@@ -41,187 +41,367 @@ namespace NUnit.Framework
 		}
 
 		#endregion
-				
-		#region Contains
 
-		/// <summary>
-		/// Asserts that a string is found within another string.
-		/// </summary>
-		/// <param name="expected">The expected string</param>
-		/// <param name="actual">The string to be examined</param>
-		/// <param name="message">The message to display in case of failure</param>
-		/// <param name="args">Arguments used in formatting the message</param>
-		static public void Contains( string expected, string actual, string message, params object[] args )
-		{
+        #region Contains
+
+        /// <summary>
+        /// Asserts that a string is found within another string.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The string to be examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Arguments used in formatting the message</param>
+        static public void Contains(string expected, string actual, string message, params object[] args)
+        {
             Assert.That(actual, new SubstringConstraint(expected), message, args);
-		}
+        }
 
-		/// <summary>
-		/// Asserts that a string is found within another string.
-		/// </summary>
-		/// <param name="expected">The expected string</param>
-		/// <param name="actual">The string to be examined</param>
-		/// <param name="message">The message to display in case of failure</param>
-		static public void Contains( string expected, string actual, string message )
-		{
-			Contains( expected, actual, message, null );
-		}
+        /// <summary>
+        /// Asserts that a string is found within another string.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The string to be examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        static public void Contains(string expected, string actual, string message)
+        {
+            Contains(expected, actual, message, null);
+        }
 
-		/// <summary>
-		/// Asserts that a string is found within another string.
-		/// </summary>
-		/// <param name="expected">The expected string</param>
-		/// <param name="actual">The string to be examined</param>
-		static public void Contains( string expected, string actual )
-		{
-			Contains( expected, actual, string.Empty, null );
-		}
+        /// <summary>
+        /// Asserts that a string is found within another string.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The string to be examined</param>
+        static public void Contains(string expected, string actual)
+        {
+            Contains(expected, actual, string.Empty, null);
+        }
 
-		#endregion
+        #endregion
 
-		#region StartsWith
+        #region DoesNotContain
 
-		/// <summary>
-		/// Asserts that a string starts with another string.
-		/// </summary>
-		/// <param name="expected">The expected string</param>
-		/// <param name="actual">The string to be examined</param>
-		/// <param name="message">The message to display in case of failure</param>
-		/// <param name="args">Arguments used in formatting the message</param>
-		static public void StartsWith( string expected, string actual, string message, params object[] args )
-		{
+        /// <summary>
+        /// Asserts that a string is not found within another string.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The string to be examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Arguments used in formatting the message</param>
+        static public void DoesNotContain(string expected, string actual, string message, params object[] args)
+        {
+            Assert.That(actual, new NotConstraint( new SubstringConstraint(expected) ), message, args );
+        }
+
+        /// <summary>
+        /// Asserts that a string is found within another string.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The string to be examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        static public void DoesNotContain(string expected, string actual, string message)
+        {
+            DoesNotContain(expected, actual, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that a string is found within another string.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The string to be examined</param>
+        static public void DoesNotContain(string expected, string actual)
+        {
+            DoesNotContain(expected, actual, string.Empty, null);
+        }
+
+        #endregion
+
+        #region StartsWith
+
+        /// <summary>
+        /// Asserts that a string starts with another string.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The string to be examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Arguments used in formatting the message</param>
+        static public void StartsWith(string expected, string actual, string message, params object[] args)
+        {
             Assert.That(actual, new StartsWithConstraint(expected), message, args);
-		}
+        }
 
-		/// <summary>
-		/// Asserts that a string starts with another string.
-		/// </summary>
-		/// <param name="expected">The expected string</param>
-		/// <param name="actual">The string to be examined</param>
-		/// <param name="message">The message to display in case of failure</param>
-		static public void StartsWith( string expected, string actual, string message )
-		{
-			StartsWith( expected, actual, message, null );
-		}
+        /// <summary>
+        /// Asserts that a string starts with another string.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The string to be examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        static public void StartsWith(string expected, string actual, string message)
+        {
+            StartsWith(expected, actual, message, null);
+        }
 
-		/// <summary>
-		/// Asserts that a string starts with another string.
-		/// </summary>
-		/// <param name="expected">The expected string</param>
-		/// <param name="actual">The string to be examined</param>
-		static public void StartsWith( string expected, string actual )
-		{
-			StartsWith( expected, actual, string.Empty, null );
-		}
+        /// <summary>
+        /// Asserts that a string starts with another string.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The string to be examined</param>
+        static public void StartsWith(string expected, string actual)
+        {
+            StartsWith(expected, actual, string.Empty, null);
+        }
 
-		#endregion
+        #endregion
 
-		#region EndsWith
+        #region DoesNotStartWith
 
-		/// <summary>
-		/// Asserts that a string ends with another string.
-		/// </summary>
-		/// <param name="expected">The expected string</param>
-		/// <param name="actual">The string to be examined</param>
-		/// <param name="message">The message to display in case of failure</param>
-		/// <param name="args">Arguments used in formatting the message</param>
-		static public void EndsWith( string expected, string actual, string message, params object[] args )
-		{
+        /// <summary>
+        /// Asserts that a string does not start with another string.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The string to be examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Arguments used in formatting the message</param>
+        static public void DoesNotStartWith(string expected, string actual, string message, params object[] args)
+        {
+            Assert.That(actual, new NotConstraint( new StartsWithConstraint(expected) ), message, args);
+        }
+
+        /// <summary>
+        /// Asserts that a string does not start with another string.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The string to be examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        static public void DoesNotStartWith(string expected, string actual, string message)
+        {
+            DoesNotStartWith(expected, actual, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that a string does not start with another string.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The string to be examined</param>
+        static public void DoesNotStartWith(string expected, string actual)
+        {
+            DoesNotStartWith(expected, actual, string.Empty, null);
+        }
+
+        #endregion
+
+        #region EndsWith
+
+        /// <summary>
+        /// Asserts that a string ends with another string.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The string to be examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Arguments used in formatting the message</param>
+        static public void EndsWith(string expected, string actual, string message, params object[] args)
+        {
             Assert.That(actual, new EndsWithConstraint(expected), message, args);
-		}
+        }
 
-		/// <summary>
-		/// Asserts that a string ends with another string.
-		/// </summary>
-		/// <param name="expected">The expected string</param>
-		/// <param name="actual">The string to be examined</param>
-		/// <param name="message">The message to display in case of failure</param>
-		static public void EndsWith( string expected, string actual, string message )
-		{
-			EndsWith( expected, actual, message, null );
-		}
+        /// <summary>
+        /// Asserts that a string ends with another string.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The string to be examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        static public void EndsWith(string expected, string actual, string message)
+        {
+            EndsWith(expected, actual, message, null);
+        }
 
-		/// <summary>
-		/// Asserts that a string ends with another string.
-		/// </summary>
-		/// <param name="expected">The expected string</param>
-		/// <param name="actual">The string to be examined</param>
-		static public void EndsWith( string expected, string actual )
-		{
-			EndsWith( expected, actual, string.Empty, null );
-		}
+        /// <summary>
+        /// Asserts that a string ends with another string.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The string to be examined</param>
+        static public void EndsWith(string expected, string actual)
+        {
+            EndsWith(expected, actual, string.Empty, null);
+        }
 
-		#endregion
+        #endregion
 
-		#region AreEqualIgnoringCase
-		/// <summary>
-		/// Asserts that two strings are equal, without regard to case.
-		/// </summary>
-		/// <param name="expected">The expected string</param>
-		/// <param name="actual">The actual string</param>
-		/// <param name="message">The message to display in case of failure</param>
-		/// <param name="args">Arguments used in formatting the message</param>
-		static public void AreEqualIgnoringCase( string expected, string actual, string message, params object[] args )
-		{
+        #region DoesNotEndWith
+
+        /// <summary>
+        /// Asserts that a string does not end with another string.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The string to be examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Arguments used in formatting the message</param>
+        static public void DoesNotEndWith(string expected, string actual, string message, params object[] args)
+        {
+            Assert.That(actual, new NotConstraint( new EndsWithConstraint(expected) ), message, args);
+        }
+
+        /// <summary>
+        /// Asserts that a string does not end with another string.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The string to be examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        static public void DoesNotEndWith(string expected, string actual, string message)
+        {
+            DoesNotEndWith(expected, actual, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that a string does not end with another string.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The string to be examined</param>
+        static public void DoesNotEndWith(string expected, string actual)
+        {
+            DoesNotEndWith(expected, actual, string.Empty, null);
+        }
+
+        #endregion
+
+        #region AreEqualIgnoringCase
+        /// <summary>
+        /// Asserts that two strings are equal, without regard to case.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The actual string</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Arguments used in formatting the message</param>
+        static public void AreEqualIgnoringCase(string expected, string actual, string message, params object[] args)
+        {
             Assert.That(actual, new EqualConstraint(expected).IgnoreCase, message, args);
-		}
+        }
 
-		/// <summary>
-		/// Asserts that two strings are equal, without regard to case.
-		/// </summary>
-		/// <param name="expected">The expected string</param>
-		/// <param name="actual">The actual string</param>
-		/// <param name="message">The message to display in case of failure</param>
-		static public void AreEqualIgnoringCase( string expected, string actual, string message )
-		{
-			AreEqualIgnoringCase( expected, actual, message, null );
-		}
+        /// <summary>
+        /// Asserts that two strings are equal, without regard to case.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The actual string</param>
+        /// <param name="message">The message to display in case of failure</param>
+        static public void AreEqualIgnoringCase(string expected, string actual, string message)
+        {
+            AreEqualIgnoringCase(expected, actual, message, null);
+        }
 
-		/// <summary>
-		/// Asserts that two strings are equal, without regard to case.
-		/// </summary>
-		/// <param name="expected">The expected string</param>
-		/// <param name="actual">The actual string</param>
-		static public void AreEqualIgnoringCase( string expected, string actual )
-		{
-			AreEqualIgnoringCase( expected, actual, string.Empty, null );
-		}
+        /// <summary>
+        /// Asserts that two strings are equal, without regard to case.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The actual string</param>
+        static public void AreEqualIgnoringCase(string expected, string actual)
+        {
+            AreEqualIgnoringCase(expected, actual, string.Empty, null);
+        }
+        #endregion
 
-		#endregion
+        #region AreNotEqualIgnoringCase
+        /// <summary>
+        /// Asserts that two strings are not equal, without regard to case.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The actual string</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Arguments used in formatting the message</param>
+        static public void AreNotEqualIgnoringCase(string expected, string actual, string message, params object[] args)
+        {
+            Assert.That(actual, new NotConstraint( new EqualConstraint(expected).IgnoreCase ), message, args);
+        }
 
-		#region IsMatch
-		/// <summary>
-		/// Asserts that a string matches an expected regular expression pattern.
-		/// </summary>
-		/// <param name="expected">The expected expression</param>
-		/// <param name="actual">The actual string</param>
-		/// <param name="message">The message to display in case of failure</param>
-		/// <param name="args">Arguments used in formatting the message</param>
-		static public void IsMatch( string expected, string actual, string message, params object[] args )
-		{
-            Assert.That(actual, new RegexConstraint(expected), message, args);
-		}
+        /// <summary>
+        /// Asserts that two strings are Notequal, without regard to case.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The actual string</param>
+        /// <param name="message">The message to display in case of failure</param>
+        static public void AreNotEqualIgnoringCase(string expected, string actual, string message)
+        {
+            AreNotEqualIgnoringCase(expected, actual, message, null);
+        }
 
-		/// <summary>
-		/// Asserts that a string matches an expected regular expression pattern.
-		/// </summary>
-		/// <param name="expected">The expected expression</param>
-		/// <param name="actual">The actual string</param>
-		/// <param name="message">The message to display in case of failure</param>
-		static public void IsMatch( string expected, string actual, string message )
-		{
-			IsMatch( expected, actual, message, null );
-		}
+        /// <summary>
+        /// Asserts that two strings are not equal, without regard to case.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The actual string</param>
+        static public void AreNotEqualIgnoringCase(string expected, string actual)
+        {
+            AreNotEqualIgnoringCase(expected, actual, string.Empty, null);
+        }
+        #endregion
 
-		/// <summary>
-		/// Asserts that a string matches an expected regular expression pattern.
-		/// </summary>
-		/// <param name="expected">The expected expression</param>
-		/// <param name="actual">The actual string</param>
-		static public void IsMatch( string expected, string actual )
-		{
-			IsMatch( expected, actual, string.Empty, null );
-		}
-		#endregion
-	}
+        #region IsMatch
+        /// <summary>
+        /// Asserts that a string matches an expected regular expression pattern.
+        /// </summary>
+        /// <param name="pattern">The regex pattern to be matched</param>
+        /// <param name="actual">The actual string</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Arguments used in formatting the message</param>
+        static public void IsMatch(string pattern, string actual, string message, params object[] args)
+        {
+            Assert.That(actual, new RegexConstraint(pattern), message, args);
+        }
+
+        /// <summary>
+        /// Asserts that a string matches an expected regular expression pattern.
+        /// </summary>
+        /// <param name="pattern">The regex pattern to be matched</param>
+        /// <param name="actual">The actual string</param>
+        /// <param name="message">The message to display in case of failure</param>
+        static public void IsMatch(string pattern, string actual, string message)
+        {
+            IsMatch(pattern, actual, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that a string matches an expected regular expression pattern.
+        /// </summary>
+        /// <param name="pattern">The regex pattern to be matched</param>
+        /// <param name="actual">The actual string</param>
+        static public void IsMatch(string pattern, string actual)
+        {
+            IsMatch(pattern, actual, string.Empty, null);
+        }
+        #endregion
+
+        #region DoesNotMatch
+        /// <summary>
+        /// Asserts that a string does not match an expected regular expression pattern.
+        /// </summary>
+        /// <param name="pattern">The regex pattern to be used</param>
+        /// <param name="actual">The actual string</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Arguments used in formatting the message</param>
+        static public void DoesNotMatch(string pattern, string actual, string message, params object[] args)
+        {
+            Assert.That(actual, new NotConstraint( new RegexConstraint(pattern) ), message, args);
+        }
+
+        /// <summary>
+        /// Asserts that a string does not match an expected regular expression pattern.
+        /// </summary>
+        /// <param name="pattern">The regex pattern to be used</param>
+        /// <param name="actual">The actual string</param>
+        /// <param name="message">The message to display in case of failure</param>
+        static public void DoesNotMatch(string pattern, string actual, string message)
+        {
+            DoesNotMatch(pattern, actual, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that a string does not match an expected regular expression pattern.
+        /// </summary>
+        /// <param name="pattern">The regex pattern to be used</param>
+        /// <param name="actual">The actual string</param>
+        static public void DoesNotMatch(string pattern, string actual)
+        {
+            DoesNotMatch(pattern, actual, string.Empty, null);
+        }
+        #endregion
+    }
 }
diff --git a/src/NUnitFramework/framework/SuiteAttribute.cs b/src/NUnitFramework/framework/SuiteAttribute.cs
deleted file mode 100644
index a2bb671..0000000
--- a/src/NUnitFramework/framework/SuiteAttribute.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-namespace NUnit.Framework
-{
-	using System;
-
-	/// <summary>
-	/// Attribute used to mark a static (shared in VB) property
-	/// that returns a list of tests.
-	/// </summary>
-	[AttributeUsage(AttributeTargets.Property, AllowMultiple=false)]
-	public class SuiteAttribute : Attribute
-	{}
-}
diff --git a/src/NUnitFramework/framework/SyntaxElements.txt b/src/NUnitFramework/framework/SyntaxElements.txt
new file mode 100644
index 0000000..faf2bd7
--- /dev/null
+++ b/src/NUnitFramework/framework/SyntaxElements.txt
@@ -0,0 +1,786 @@
+# SyntaxElements.txt
+#
+# This file is used to control generation of certain source files
+# in the NUnit framework, so that all overloads are defined
+# consistently.
+#
+# The file is organized in stanzas, seperated by a line containing
+# only a percent sign (%) in the first column. By convention, the
+# first stanza consists only of defaults, while the remaining
+# stanzas generate code for one or more classes.
+#
+# Within a stanza, individual lines are recognized by a prefix
+# and lines not starting with a recognized prefix will cause an 
+# exception. With the exception of # and /// all prefixes are
+# terminated by a colon.
+#
+# NOTE: Lines beginning with whitespace are treated as a
+# continuation of the preceding line.
+# 
+# Prefix '#' introduces a comment. Use an otherwise blank line 
+#   starting with '#' for spacing, if desired.
+#
+# Prefix 'Default:' indicates a default option using the same
+#   format as the -gen option on the commandline. Defaults are
+#   only used if no -gen options are provided.
+#
+# Prefix '///' introduces a comment to be included in the
+#   generated source code. Each stanza contains a single block
+#   of comments, conventionally placed at the beginning of
+#   the stanza. All methods generated from a stanza use
+#   the same comment. 
+#
+# Prefix 'Type:' may appear once in each stanza and indicates
+#   the return type of the methods defined in the stanza. If
+#   it is not specified, all methods default to 'void'.
+#
+# Prefix 'Gen:' introduces a method or property definition.
+#   The format of the line is as follows:
+#     'Gen:' [attributes]...signature=>definition
+#   where 
+#     [attributes] represents any attributes to be placed on the
+#        method. It is optional and may be repeated.
+#      signature is the method signature, including the class
+#        name and arguments.
+#      definition is the code for the method
+#
+#   The code generator distinguishes methods from properties
+#   and generates the necessary get {...} sequence in the 
+#   latter case. Note that only getters are generated. If
+#   the method signature uses generics, the entire definition
+#   is enclosed in an #if NET_2_0 ... #endif sequence.
+#
+#   If the class name in a method signature is 'Assert' the
+#   code generator creates multiple overloads of the method,
+#   allowing for provision of an optional message and args.
+#
+# Prefix 'Gen3' causes the code generator to create code
+#   in three classes: a static helper class specified in
+#   the signature, the ConstraintFactory class and the
+#   ConstraintExpression class. These three classes are
+#   used by the NUnit fluent syntax. The code after the
+#   arrow (=>) is used in all three definitions.
+#
+# You may browse the remainder of this file for examples
+# of use of each prefix.
+#
+#
+#
+# Define default classes to be generated:
+#
+Default: Is
+Default: Has
+Default: Text
+Default: Throws
+Default: ConstraintFactory=Constraints/ConstraintFactory.cs
+Default: ConstraintExpression=Constraints/ConstraintExpression.cs
+Default: Assert
+%
+#
+# Prefix Operators
+#
+/// <summary>
+/// Returns a ConstraintExpression that negates any
+/// following constraint.
+/// </summary>
+Type: ConstraintExpression
+Gen: Is.Not=>new ConstraintExpression().Not
+Gen: Has.No=>new ConstraintExpression().Not
+Gen: ConstraintFactory.Not=>Is.Not
+Gen: ConstraintFactory.No=>Has.No
+Gen: ConstraintExpression.Not=>this.Append(new NotOperator())
+Gen: ConstraintExpression.No=>this.Append(new NotOperator())
+%
+/// <summary>
+/// Returns a ConstraintExpression, which will apply
+/// the following constraint to all members of a collection,
+/// succeeding if all of them succeed.
+/// </summary>
+Type: ConstraintExpression
+Gen: Is.All=>new ConstraintExpression().All
+Gen: Has.All=>new ConstraintExpression().All
+Gen: [Obsolete("Use Is.All")]Text.All=>new ConstraintExpression().All
+Gen: ConstraintFactory.All=>Is.All
+Gen: ConstraintExpression.All=>this.Append(new AllOperator())
+%
+/// <summary>
+/// Returns a ConstraintExpression, which will apply
+/// the following constraint to all members of a collection,
+/// succeeding if at least one of them succeeds.
+/// </summary>
+Type: ConstraintExpression
+Gen: Has.Some=>new ConstraintExpression().Some
+Gen: ConstraintFactory.Some=>Has.Some
+Gen: ConstraintExpression.Some=>this.Append(new SomeOperator())
+%
+/// <summary>
+/// Returns a ConstraintExpression, which will apply
+/// the following constraint to all members of a collection,
+/// succeeding if all of them fail.
+/// </summary>
+Type: ConstraintExpression
+Gen: Has.None=>new ConstraintExpression().None
+Gen: ConstraintFactory.None=>Has.None
+Gen: ConstraintExpression.None=>this.Append(new NoneOperator())
+%
+/// <summary>
+/// Returns a new PropertyConstraintExpression, which will either
+/// test for the existence of the named property on the object
+/// being tested or apply any following constraint to that property.
+/// </summary>
+Type: ResolvableConstraintExpression
+Gen: Has.Property(string name)=>new ConstraintExpression().Property(name)
+Gen: ConstraintFactory.Property(string name)=>Has.Property(name)
+Gen: ConstraintExpression.Property(string name)=>this.Append(new PropOperator(name))
+%
+/// <summary>
+/// Returns a new ConstraintExpression, which will apply the following
+/// constraint to the Length property of the object being tested.
+/// </summary>
+Type: ResolvableConstraintExpression
+Gen: Has.Length=>Property("Length")
+Gen: ConstraintFactory.Length=>Has.Length
+Gen: ConstraintExpression.Length=>Property("Length")
+%
+/// <summary>
+/// Returns a new ConstraintExpression, which will apply the following
+/// constraint to the Count property of the object being tested.
+/// </summary>
+Type: ResolvableConstraintExpression
+Gen: Has.Count=>Property("Count")
+Gen: ConstraintFactory.Count=>Has.Count
+Gen: ConstraintExpression.Count=>Property("Count")
+%
+/// <summary>
+/// Returns a new ConstraintExpression, which will apply the following
+/// constraint to the Message property of the object being tested.
+/// </summary>
+Type: ResolvableConstraintExpression
+Gen: Has.Message=>Property("Message")
+Gen: ConstraintFactory.Message=>Has.Message
+Gen: ConstraintExpression.Message=>Property("Message")
+%
+/// <summary>
+/// Returns a new ConstraintExpression, which will apply the following
+/// constraint to the InnerException property of the object being tested.
+/// </summary>
+Type: ResolvableConstraintExpression
+Gen: Has.InnerException=>Property("InnerException")
+Gen: ConstraintFactory.InnerException=>Has.InnerException
+Gen: ConstraintExpression.InnerException=>Property("InnerException")
+%
+/// <summary>
+/// Returns a new AttributeConstraint checking for the
+/// presence of a particular attribute on an object.
+/// </summary>
+Type: ResolvableConstraintExpression
+Gen: Has.Attribute(Type expectedType)=>new ConstraintExpression().Attribute(expectedType)
+Gen: Has.Attribute<T>()=>Attribute(typeof(T))
+Gen: ConstraintFactory.Attribute(Type expectedType)=>Has.Attribute(expectedType)
+Gen: ConstraintFactory.Attribute<T>()=>Attribute(typeof(T))
+Gen: ConstraintExpression.Attribute(Type expectedType)=>this.Append(new AttributeOperator(expectedType))
+Gen: ConstraintExpression.Attribute<T>()=>Attribute(typeof(T))
+%
+/// <summary>
+/// Creates a constraint specifying an expected exception
+/// </summary>
+Type: ResolvableConstraintExpression
+Gen: Throws.Exception=>new ConstraintExpression().Append(new ThrowsOperator())
+%
+/// <summary>
+/// Creates a constraint specifying an exception with a given InnerException
+/// </summary>
+Type: ResolvableConstraintExpression
+Gen: Throws.InnerException=> Exception.InnerException
+%
+/// <summary>
+/// Creates a constraint specifying an expected TargetInvocationException
+/// </summary>
+Type: ExactTypeConstraint
+Gen: Throws.TargetInvocationException=>TypeOf(typeof(System.Reflection.TargetInvocationException))
+%
+/// <summary>
+/// Creates a constraint specifying an expected TargetInvocationException
+/// </summary>
+Type: ExactTypeConstraint
+Gen: Throws.ArgumentException=>TypeOf(typeof(System.ArgumentException))
+%
+/// <summary>
+/// Creates a constraint specifying an expected TargetInvocationException
+/// </summary>
+Type: ExactTypeConstraint
+Gen: Throws.InvalidOperationException=>TypeOf(typeof(System.InvalidOperationException))
+%
+/// <summary>
+/// Creates a constraint specifying that no exception is thrown
+/// </summary>
+Type: ThrowsNothingConstraint
+Gen: Throws.Nothing=>new ThrowsNothingConstraint()
+%
+/// <summary>
+/// Creates a constraint specifying the exact type of exception expected
+/// </summary>
+Type: ExactTypeConstraint
+Gen: Throws.TypeOf(Type expectedType)=>Exception.TypeOf(expectedType)
+Gen: Throws.TypeOf<T>()=>TypeOf(typeof(T))
+%
+/// <summary>
+/// Creates a constraint specifying the type of exception expected
+/// </summary>
+Type: InstanceOfTypeConstraint
+Gen: Throws.InstanceOf(Type expectedType)=>Exception.InstanceOf(expectedType)
+Gen: Throws.InstanceOf<T>()=>InstanceOf(typeof(T))
+%
+/// <summary>
+/// With is currently a NOP - reserved for future use.
+/// </summary>
+Type: ConstraintExpression
+Gen: ConstraintExpression.With=>this.Append(new WithOperator())
+%
+/// <summary>
+/// Returns the constraint provided as an argument - used to allow custom
+/// custom constraints to easily participate in the syntax.
+/// </summary>
+Type: Constraint
+Gen: ConstraintExpression.Matches(Constraint constraint)=>this.Append(constraint)
+Gen: ConstraintExpression.Matches<T>(Predicate<T> predicate)=>this.Append(new PredicateConstraint<T>(predicate))
+%
+#
+# Constraints Without Arguments
+#
+/// <summary>
+/// Returns a constraint that tests for null
+/// </summary>
+Gen3: Is.Null=>new NullConstraint()
+%
+/// <summary>
+/// Returns a constraint that tests for True
+/// </summary>
+Gen3: Is.True=>new TrueConstraint()
+%
+/// <summary>
+/// Returns a constraint that tests for False
+/// </summary>
+Gen3: Is.False=>new FalseConstraint()
+%
+/// <summary>
+/// Returns a constraint that tests for NaN
+/// </summary>
+Gen3: Is.NaN=>new NaNConstraint()
+%
+/// <summary>
+/// Returns a constraint that tests for empty
+/// </summary>
+Gen3: Is.Empty=>new EmptyConstraint()
+%
+/// <summary>
+/// Returns a constraint that tests whether a collection 
+/// contains all unique items.
+/// </summary>
+Gen3: Is.Unique=>new UniqueItemsConstraint()
+%
+/// <summary>
+/// Returns a constraint that tests whether an object graph is serializable in binary format.
+/// </summary>
+Gen3: Is.BinarySerializable=>new BinarySerializableConstraint()
+%
+/// <summary>
+/// Returns a constraint that tests whether an object graph is serializable in xml format.
+/// </summary>
+Gen3: Is.XmlSerializable=>new XmlSerializableConstraint()
+%
+#
+# Constraints Taking an Expected Value 
+#
+/// <summary>
+/// Returns a constraint that tests two items for equality
+/// </summary>
+Gen3: Is.EqualTo(object expected)=>new EqualConstraint(expected)
+%
+/// <summary>
+/// Returns a constraint that tests that two references are the same object
+/// </summary>
+Gen3: Is.SameAs(object expected)=>new SameAsConstraint(expected)
+%
+/// <summary>
+/// Returns a constraint that tests whether the
+/// actual value is greater than the suppled argument
+/// </summary>
+Gen3: Is.GreaterThan(object expected)=>new GreaterThanConstraint(expected)
+%
+/// <summary>
+/// Returns a constraint that tests whether the
+/// actual value is greater than or equal to the suppled argument
+/// </summary>
+Gen3: Is.GreaterThanOrEqualTo(object expected)=>new GreaterThanOrEqualConstraint(expected)
+Gen3: Is.AtLeast(object expected)=>new GreaterThanOrEqualConstraint(expected)
+%
+/// <summary>
+/// Returns a constraint that tests whether the
+/// actual value is less than the suppled argument
+/// </summary>
+Gen3: Is.LessThan(object expected)=>new LessThanConstraint(expected)
+%
+/// <summary>
+/// Returns a constraint that tests whether the
+/// actual value is less than or equal to the suppled argument
+/// </summary>
+Gen3: Is.LessThanOrEqualTo(object expected)=>new LessThanOrEqualConstraint(expected)
+Gen3: Is.AtMost(object expected)=>new LessThanOrEqualConstraint(expected)
+%
+/// <summary>
+/// Returns a constraint that tests whether the actual
+/// value is of the exact type supplied as an argument.
+/// </summary>
+Gen3: Is.TypeOf(Type expectedType)=>new ExactTypeConstraint(expectedType)
+Gen3: Is.TypeOf<T>()=>new ExactTypeConstraint(typeof(T))
+%
+/// <summary>
+/// Returns a constraint that tests whether the actual value
+/// is of the type supplied as an argument or a derived type.
+/// </summary>
+Gen3: Is.InstanceOf(Type expectedType)=>new InstanceOfTypeConstraint(expectedType)
+Gen3: Is.InstanceOf<T>()=>new InstanceOfTypeConstraint(typeof(T))
+Gen3: [Obsolete("Use InstanceOf(expectedType)")]Is.InstanceOfType(Type expectedType)=>new InstanceOfTypeConstraint(expectedType)
+Gen3: [Obsolete("Use InstanceOf<T>()")]Is.InstanceOfType<T>()=>new InstanceOfTypeConstraint(typeof(T))
+%
+/// <summary>
+/// Returns a constraint that tests whether the actual value
+/// is assignable from the type supplied as an argument.
+/// </summary>
+Gen3: Is.AssignableFrom(Type expectedType)=>new AssignableFromConstraint(expectedType)
+Gen3: Is.AssignableFrom<T>()=>new AssignableFromConstraint(typeof(T))
+%
+/// <summary>
+/// Returns a constraint that tests whether the actual value
+/// is assignable from the type supplied as an argument.
+/// </summary>
+Gen3: Is.AssignableTo(Type expectedType)=>new AssignableToConstraint(expectedType)
+Gen3: Is.AssignableTo<T>()=>new AssignableToConstraint(typeof(T))
+%
+/// <summary>
+/// Returns a constraint that tests whether the actual value
+/// is a collection containing the same elements as the 
+/// collection supplied as an argument.
+/// </summary>
+Gen3: Is.EquivalentTo(IEnumerable expected)=>new CollectionEquivalentConstraint(expected)
+%
+/// <summary>
+/// Returns a constraint that tests whether the actual value
+/// is a subset of the collection supplied as an argument.
+/// </summary>
+Gen3: Is.SubsetOf(IEnumerable expected)=>new CollectionSubsetConstraint(expected)
+%
+/// <summary>
+/// Returns a constraint that tests whether a collection is ordered
+/// </summary>
+Gen3: Is.Ordered=>new CollectionOrderedConstraint()
+%
+/// <summary>
+/// Returns a new CollectionContainsConstraint checking for the
+/// presence of a particular object in the collection.
+/// </summary>
+Gen3: Has.Member(object expected)=>new CollectionContainsConstraint(expected)
+Gen: ConstraintFactory.Contains(object expected)=>new CollectionContainsConstraint(expected)
+Gen: ConstraintExpression.Contains(object expected)=>(CollectionContainsConstraint)this.Append(new CollectionContainsConstraint(expected))
+%
+/// <summary>
+/// Returns a new ContainsConstraint. This constraint
+/// will, in turn, make use of the appropriate second-level
+/// constraint, depending on the type of the actual argument. 
+/// This overload is only used if the item sought is a string,
+/// since any other type implies that we are looking for a 
+/// collection member.
+/// </summary>
+Type: ContainsConstraint
+Gen: ConstraintFactory.Contains(string expected)=>new ContainsConstraint(expected)
+Gen: ConstraintExpression.Contains(string expected)=>(ContainsConstraint)this.Append(new ContainsConstraint(expected))
+%
+/// <summary>
+/// Returns a constraint that succeeds if the actual
+/// value contains the substring supplied as an argument.
+/// </summary>
+Type: SubstringConstraint
+Gen3: Is.StringContaining(string expected)=>new SubstringConstraint(expected)
+Gen: [Obsolete("Use Is.StringContaining")]Text.Contains(string expected)=>new SubstringConstraint(expected)
+Gen: ConstraintFactory.ContainsSubstring(string expected)=>new SubstringConstraint(expected)
+Gen: ConstraintExpression.ContainsSubstring(string expected)=>(SubstringConstraint)this.Append(new SubstringConstraint(expected))
+%
+/// <summary>
+/// Returns a constraint that fails if the actual
+/// value contains the substring supplied as an argument.
+/// </summary>
+Type: SubstringConstraint
+Gen: [Obsolete("Use Is.Not.StringContaining")]Text.DoesNotContain(string expected)=>new ConstraintExpression().Not.ContainsSubstring(expected)
+Gen: ConstraintFactory.DoesNotContain(string expected)=>new ConstraintExpression().Not.ContainsSubstring(expected)
+%
+/// <summary>
+/// Returns a constraint that succeeds if the actual
+/// value starts with the substring supplied as an argument.
+/// </summary>
+Gen: [Obsolete("Use Is.StringStarting")]Text.StartsWith(string expected)=>new StartsWithConstraint(expected)
+Gen: ConstraintFactory.StartsWith(string expected)=>new StartsWithConstraint(expected)
+Gen: ConstraintExpression.StartsWith(string expected)=>(StartsWithConstraint)this.Append(new StartsWithConstraint(expected))
+Gen3: Is.StringStarting(string expected)=>new StartsWithConstraint(expected)
+%
+/// <summary>
+/// Returns a constraint that fails if the actual
+/// value starts with the substring supplied as an argument.
+/// </summary>
+Type: StartsWithConstraint
+Gen: Text.DoesNotStartWith(string expected)=>new ConstraintExpression().Not.StartsWith(expected)
+Gen: ConstraintFactory.DoesNotStartWith(string expected)=>new ConstraintExpression().Not.StartsWith(expected)
+%
+/// <summary>
+/// Returns a constraint that succeeds if the actual
+/// value ends with the substring supplied as an argument.
+/// </summary>
+Gen: [Obsolete("Use Is.StringEnding")]Text.EndsWith(string expected)=>new EndsWithConstraint(expected)
+Gen: ConstraintFactory.EndsWith(string expected)=>new EndsWithConstraint(expected)
+Gen: ConstraintExpression.EndsWith(string expected)=>(EndsWithConstraint)this.Append(new EndsWithConstraint(expected))
+Gen3: Is.StringEnding(string expected)=>new EndsWithConstraint(expected)
+%
+/// <summary>
+/// Returns a constraint that fails if the actual
+/// value ends with the substring supplied as an argument.
+/// </summary>
+Type: EndsWithConstraint
+Gen: Text.DoesNotEndWith(string expected)=>new ConstraintExpression().Not.EndsWith(expected)
+Gen: ConstraintFactory.DoesNotEndWith(string expected)=>new ConstraintExpression().Not.EndsWith(expected)
+%
+/// <summary>
+/// Returns a constraint that succeeds if the actual
+/// value matches the Regex pattern supplied as an argument.
+/// </summary>
+Gen: [Obsolete("Use Is.StringMatching")]Text.Matches(string pattern)=>new RegexConstraint(pattern)
+Gen: ConstraintFactory.Matches(string pattern)=>new RegexConstraint(pattern)
+Gen: ConstraintExpression.Matches(string pattern)=>(RegexConstraint)this.Append(new RegexConstraint(pattern))
+Gen3: Is.StringMatching(string pattern)=>new RegexConstraint(pattern)
+%
+/// <summary>
+/// Returns a constraint that fails if the actual
+/// value matches the pattern supplied as an argument.
+/// </summary>
+Type: RegexConstraint
+Gen: [Obsolete]Text.DoesNotMatch(string pattern)=>new ConstraintExpression().Not.Matches(pattern)
+Gen: ConstraintFactory.DoesNotMatch(string pattern)=>new ConstraintExpression().Not.Matches(pattern)
+%
+/// <summary>
+/// Returns a constraint that tests whether the path provided 
+/// is the same as an expected path after canonicalization.
+/// </summary>
+Gen3: Is.SamePath(string expected)=>new SamePathConstraint(expected)
+%
+/// <summary>
+/// Returns a constraint that tests whether the path provided 
+/// is the same path or under an expected path after canonicalization.
+/// </summary>
+Gen3: Is.SubPath(string expected)=>new SubPathConstraint(expected)
+%
+/// <summary>
+/// Returns a constraint that tests whether the path provided 
+/// is the same path or under an expected path after canonicalization.
+/// </summary>
+Gen3: Is.SamePathOrUnder(string expected)=>new SamePathOrUnderConstraint(expected)
+%
+#
+# Constraints with Two Arguments
+#
+/// <summary>
+/// Returns a constraint that tests whether the actual value falls 
+/// within a specified range.
+/// </summary>
+Gen3: Is.InRange(IComparable from, IComparable to)=>new RangeConstraint(from, to)
+%
+/// <summary>
+/// Returns a constraint that tests whether the actual value falls 
+/// within a specified range.
+/// </summary>
+#Gen3: Is.InRange<T>(T from, T to) where T : IComparable=>new RangeConstraint<T>(from, to)
+%
+#
+# Asserts
+#
+/// <summary>
+/// Asserts that a condition is true. If the condition is false the method throws
+/// an <see cref="AssertionException"/>.
+/// </summary>
+/// <param name="condition">The evaluated condition</param>
+Gen: Assert.True(bool condition)=>Assert.That(condition, Is.True)
+Gen: Assert.IsTrue(bool condition)=>Assert.That(condition, Is.True)
+%
+/// <summary>
+/// Asserts that a condition is false. If the condition is true the method throws
+/// an <see cref="AssertionException"/>.
+/// </summary> 
+/// <param name="condition">The evaluated condition</param>
+Gen: Assert.False(bool condition)=>Assert.That(condition, Is.False)
+Gen: Assert.IsFalse(bool condition)=>Assert.That(condition, Is.False)
+%
+/// <summary>
+/// Verifies that the object that is passed in is not equal to <code>null</code>
+/// If the object is <code>null</code> then an <see cref="AssertionException"/>
+/// is thrown.
+/// </summary>
+/// <param name="anObject">The object that is to be tested</param>
+Gen: Assert.NotNull(object anObject)=>Assert.That(anObject, Is.Not.Null)
+Gen: Assert.IsNotNull(object anObject)=>Assert.That(anObject, Is.Not.Null)
+%
+/// <summary>
+/// Verifies that the object that is passed in is equal to <code>null</code>
+/// If the object is not <code>null</code> then an <see cref="AssertionException"/>
+/// is thrown.
+/// </summary>
+/// <param name="anObject">The object that is to be tested</param>
+Gen: Assert.Null(object anObject)=>Assert.That(anObject, Is.Null)
+Gen: Assert.IsNull(object anObject)=>Assert.That(anObject, Is.Null)
+%
+/// <summary>
+/// Verifies that the double that is passed in is an <code>NaN</code> value.
+/// If the object is not <code>NaN</code> then an <see cref="AssertionException"/>
+/// is thrown.
+/// </summary>
+/// <param name="aDouble">The value that is to be tested</param>
+Gen: Assert.IsNaN(double aDouble)=>Assert.That(aDouble, Is.NaN)
+Gen: Assert.IsNaN(double? aDouble)=>Assert.That(aDouble, Is.NaN)
+%
+/// <summary>
+/// Assert that a string is empty - that is equal to string.Empty
+/// </summary>
+/// <param name="aString">The string to be tested</param>
+Gen: Assert.IsEmpty(string aString)=>Assert.That(aString, new EmptyStringConstraint())
+%
+/// <summary>
+/// Assert that an array, list or other collection is empty
+/// </summary>
+/// <param name="collection">An array, list or other collection implementing ICollection</param>
+Gen: Assert.IsEmpty(ICollection collection)=>Assert.That(collection, new EmptyCollectionConstraint())
+%
+/// <summary>
+/// Assert that a string is not empty - that is not equal to string.Empty
+/// </summary>
+/// <param name="aString">The string to be tested</param>
+Gen: Assert.IsNotEmpty(string aString)=>Assert.That(aString, Is.Not.Empty)
+%
+/// <summary>
+/// Assert that an array, list or other collection is not empty
+/// </summary>
+/// <param name="collection">An array, list or other collection implementing ICollection</param>
+Gen: Assert.IsNotEmpty(ICollection collection)=>Assert.That(collection, Is.Not.Empty)
+%
+/// <summary>
+/// Assert that a string is either null or equal to string.Empty
+/// </summary>
+/// <param name="aString">The string to be tested</param>
+Gen: Assert.IsNullOrEmpty(string aString)=>Assert.That(aString, new NullOrEmptyStringConstraint())
+%
+/// <summary>
+/// Assert that a string is not null or empty
+/// </summary>
+/// <param name="aString">The string to be tested</param>
+Gen: Assert.IsNotNullOrEmpty(string aString)=>Assert.That(aString, new NotConstraint( new NullOrEmptyStringConstraint()))
+%
+/// <summary>
+/// Asserts that an object may be assigned a  value of a given Type.
+/// </summary>
+/// <param name="expected">The expected Type.</param>
+/// <param name="actual">The object under examination</param>
+Gen: Assert.IsAssignableFrom(Type expected, object actual)=>Assert.That(actual, Is.AssignableFrom(expected))
+%
+/// <summary>
+/// Asserts that an object may be assigned a  value of a given Type.
+/// </summary>
+/// <typeparam name="T">The expected Type.</typeparam>
+/// <param name="actual">The object under examination</param>
+Gen: Assert.IsAssignableFrom<T>(object actual)=>Assert.That(actual, Is.AssignableFrom(typeof(T)))
+%
+/// <summary>
+/// Asserts that an object may not be assigned a  value of a given Type.
+/// </summary>
+/// <param name="expected">The expected Type.</param>
+/// <param name="actual">The object under examination</param>
+Gen: Assert.IsNotAssignableFrom(Type expected, object actual)=>Assert.That(actual, Is.Not.AssignableFrom(expected))
+%
+/// <summary>
+/// Asserts that an object may not be assigned a  value of a given Type.
+/// </summary>
+/// <typeparam name="T">The expected Type.</typeparam>
+/// <param name="actual">The object under examination</param>
+Gen: Assert.IsNotAssignableFrom<T>(object actual)=>Assert.That(actual, Is.Not.AssignableFrom(typeof(T)))
+%
+/// <summary>
+/// Asserts that an object is an instance of a given type.
+/// </summary>
+/// <param name="expected">The expected Type</param>
+/// <param name="actual">The object being examined</param>
+Gen: Assert.IsInstanceOf(Type expected, object actual)=>Assert.That(actual, Is.InstanceOf(expected))
+Gen: [Obsolete]Assert.IsInstanceOfType(Type expected, object actual)=>Assert.That(actual, Is.InstanceOf(expected))
+%
+/// <summary>
+/// Asserts that an object is an instance of a given type.
+/// </summary>
+/// <typeparam name="T">The expected Type</typeparam>
+/// <param name="actual">The object being examined</param>
+Gen: Assert.IsInstanceOf<T>(object actual)=>Assert.That(actual, Is.InstanceOf(typeof(T)))
+%
+/// <summary>
+/// Asserts that an object is not an instance of a given type.
+/// </summary>
+/// <param name="expected">The expected Type</param>
+/// <param name="actual">The object being examined</param>
+Gen: Assert.IsNotInstanceOf(Type expected, object actual)=>Assert.That(actual, Is.Not.InstanceOf(expected))
+Gen: [Obsolete]Assert.IsNotInstanceOfType(Type expected, object actual)=>Assert.That(actual, Is.Not.InstanceOf(expected))
+%
+/// <summary>
+/// Asserts that an object is not an instance of a given type.
+/// </summary>
+/// <typeparam name="T">The expected Type</typeparam>
+/// <param name="actual">The object being examined</param>
+Gen: Assert.IsNotInstanceOf<T>(object actual)=>Assert.That(actual, Is.Not.InstanceOf(typeof(T)))
+%
+/// <summary>
+/// Verifies that two values are equal. If they are not, then an 
+/// <see cref="AssertionException"/> is thrown.
+/// </summary>
+/// <param name="expected">The expected value</param>
+/// <param name="actual">The actual value</param>
+Gen: Assert.AreEqual(int expected, int actual)=>Assert.That(actual, Is.EqualTo(expected))
+Gen: Assert.AreEqual(long expected, long actual)=>Assert.That(actual, Is.EqualTo(expected))
+Gen: [CLSCompliant(false)]Assert.AreEqual(uint expected, uint actual)=>Assert.That(actual, Is.EqualTo(expected))
+Gen: [CLSCompliant(false)]Assert.AreEqual(ulong expected, ulong actual)=>Assert.That(actual, Is.EqualTo(expected))
+Gen: Assert.AreEqual(decimal expected, decimal actual)=>Assert.That(actual, Is.EqualTo(expected))
+%
+/// <summary>
+/// Verifies that two doubles are equal considering a delta. If the
+/// expected value is infinity then the delta value is ignored. If 
+/// they are not equal then an <see cref="AssertionException"/> is
+/// thrown.
+/// </summary>
+/// <param name="expected">The expected value</param>
+/// <param name="actual">The actual value</param>
+/// <param name="delta">The maximum acceptable difference between the
+/// the expected and the actual</param>
+Gen: Assert.AreEqual(double expected, double actual, double delta)=>AssertDoublesAreEqual(expected, actual, delta)
+Gen: Assert.AreEqual(double expected, double? actual, double delta)=>AssertDoublesAreEqual(expected, (double)actual, delta)
+%
+/// <summary>
+/// Verifies that two objects are equal.  Two objects are considered
+/// equal if both are null, or if both have the same value. NUnit
+/// has special semantics for some object types.
+/// If they are not equal an <see cref="AssertionException"/> is thrown.
+/// </summary>
+/// <param name="expected">The value that is expected</param>
+/// <param name="actual">The actual value</param>
+Gen: Assert.AreEqual(object expected, object actual)=>Assert.That(actual, Is.EqualTo(expected))
+%
+/// <summary>
+/// Verifies that two values are not equal. If they are equal, then an 
+/// <see cref="AssertionException"/> is thrown.
+/// </summary>
+/// <param name="expected">The expected value</param>
+/// <param name="actual">The actual value</param>
+Gen: Assert.AreNotEqual(int expected, int actual)=>Assert.That(actual, Is.Not.EqualTo(expected))
+Gen: Assert.AreNotEqual(long expected, long actual)=>Assert.That(actual, Is.Not.EqualTo(expected))
+Gen: [CLSCompliant(false)]Assert.AreNotEqual(uint expected, uint actual)=>Assert.That(actual, Is.Not.EqualTo(expected))
+Gen: [CLSCompliant(false)]Assert.AreNotEqual(ulong expected, ulong actual)=>Assert.That(actual, Is.Not.EqualTo(expected))
+Gen: Assert.AreNotEqual(decimal expected, decimal actual)=>Assert.That(actual, Is.Not.EqualTo(expected))
+Gen: Assert.AreNotEqual(float expected, float actual)=>Assert.That(actual, Is.Not.EqualTo(expected))
+Gen: Assert.AreNotEqual(double expected, double actual)=>Assert.That(actual, Is.Not.EqualTo(expected))
+%
+/// <summary>
+/// Verifies that two objects are not equal.  Two objects are considered
+/// equal if both are null, or if both have the same value. NUnit
+/// has special semantics for some object types.
+/// If they are equal an <see cref="AssertionException"/> is thrown.
+/// </summary>
+/// <param name="expected">The value that is expected</param>
+/// <param name="actual">The actual value</param>
+Gen: Assert.AreNotEqual(object expected, object actual)=>Assert.That(actual, Is.Not.EqualTo(expected))
+%
+/// <summary>
+/// Asserts that two objects refer to the same object. If they
+/// are not the same an <see cref="AssertionException"/> is thrown.
+/// </summary>
+/// <param name="expected">The expected object</param>
+/// <param name="actual">The actual object</param>
+Gen: Assert.AreSame(object expected, object actual)=>Assert.That(actual, Is.SameAs(expected))
+%
+/// <summary>
+/// Asserts that two objects do not refer to the same object. If they
+/// are the same an <see cref="AssertionException"/> is thrown.
+/// </summary>
+/// <param name="expected">The expected object</param>
+/// <param name="actual">The actual object</param>
+Gen: Assert.AreNotSame(object expected, object actual)=>Assert.That(actual, Is.Not.SameAs(expected))
+%
+/// <summary>
+/// Verifies that the first value is greater than the second
+/// value. If it is not, then an
+/// <see cref="AssertionException"/> is thrown. 
+/// </summary>
+/// <param name="arg1">The first value, expected to be greater</param>
+/// <param name="arg2">The second value, expected to be less</param>
+Gen: Assert.Greater(int arg1, int arg2)=>Assert.That(arg1, Is.GreaterThan(arg2))
+Gen: [CLSCompliant(false)]Assert.Greater(uint arg1, uint arg2)=>Assert.That(arg1, Is.GreaterThan(arg2))
+Gen: Assert.Greater(long arg1, long arg2)=>Assert.That(arg1, Is.GreaterThan(arg2))
+Gen: [CLSCompliant(false)]Assert.Greater(ulong arg1, ulong arg2)=>Assert.That(arg1, Is.GreaterThan(arg2))
+Gen: Assert.Greater(decimal arg1, decimal arg2)=>Assert.That(arg1, Is.GreaterThan(arg2))
+Gen: Assert.Greater(double arg1, double arg2)=>Assert.That(arg1, Is.GreaterThan(arg2))
+Gen: Assert.Greater(float arg1, float arg2)=>Assert.That(arg1, Is.GreaterThan(arg2))
+Gen: Assert.Greater(IComparable arg1, IComparable arg2)=>Assert.That(arg1, Is.GreaterThan(arg2))
+%
+/// <summary>
+/// Verifies that the first value is less than the second
+/// value. If it is not, then an
+/// <see cref="AssertionException"/> is thrown. 
+/// </summary>
+/// <param name="arg1">The first value, expected to be less</param>
+/// <param name="arg2">The second value, expected to be greater</param>
+Gen: Assert.Less(int arg1, int arg2)=>Assert.That(arg1, Is.LessThan(arg2))
+Gen: [CLSCompliant(false)]Assert.Less(uint arg1, uint arg2)=>Assert.That(arg1, Is.LessThan(arg2))
+Gen: Assert.Less(long arg1, long arg2)=>Assert.That(arg1, Is.LessThan(arg2))
+Gen: [CLSCompliant(false)]Assert.Less(ulong arg1, ulong arg2)=>Assert.That(arg1, Is.LessThan(arg2))
+Gen: Assert.Less(decimal arg1, decimal arg2)=>Assert.That(arg1, Is.LessThan(arg2))
+Gen: Assert.Less(double arg1, double arg2)=>Assert.That(arg1, Is.LessThan(arg2))
+Gen: Assert.Less(float arg1, float arg2)=>Assert.That(arg1, Is.LessThan(arg2))
+Gen: Assert.Less(IComparable arg1, IComparable arg2)=>Assert.That(arg1, Is.LessThan(arg2))
+%
+/// <summary>
+/// Verifies that the first value is greater than or equal tothe second
+/// value. If it is not, then an
+/// <see cref="AssertionException"/> is thrown. 
+/// </summary>
+/// <param name="arg1">The first value, expected to be greater</param>
+/// <param name="arg2">The second value, expected to be less</param>
+Gen: Assert.GreaterOrEqual(int arg1, int arg2)=>Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2))
+Gen: [CLSCompliant(false)]Assert.GreaterOrEqual(uint arg1, uint arg2)=>Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2))
+Gen: Assert.GreaterOrEqual(long arg1, long arg2)=>Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2))
+Gen: [CLSCompliant(false)]Assert.GreaterOrEqual(ulong arg1, ulong arg2)=>Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2))
+Gen: Assert.GreaterOrEqual(decimal arg1, decimal arg2)=>Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2))
+Gen: Assert.GreaterOrEqual(double arg1, double arg2)=>Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2))
+Gen: Assert.GreaterOrEqual(float arg1, float arg2)=>Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2))
+Gen: Assert.GreaterOrEqual(IComparable arg1, IComparable arg2)=>Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2))
+%
+/// <summary>
+/// Verifies that the first value is less than or equal to the second
+/// value. If it is not, then an
+/// <see cref="AssertionException"/> is thrown. 
+/// </summary>
+/// <param name="arg1">The first value, expected to be less</param>
+/// <param name="arg2">The second value, expected to be greater</param>
+Gen: Assert.LessOrEqual(int arg1, int arg2)=>Assert.That(arg1, Is.LessThanOrEqualTo(arg2))
+Gen: [CLSCompliant(false)]Assert.LessOrEqual(uint arg1, uint arg2)=>Assert.That(arg1, Is.LessThanOrEqualTo(arg2))
+Gen: Assert.LessOrEqual(long arg1, long arg2)=>Assert.That(arg1, Is.LessThanOrEqualTo(arg2))
+Gen: [CLSCompliant(false)]Assert.LessOrEqual(ulong arg1, ulong arg2)=>Assert.That(arg1, Is.LessThanOrEqualTo(arg2))
+Gen: Assert.LessOrEqual(decimal arg1, decimal arg2)=>Assert.That(arg1, Is.LessThanOrEqualTo(arg2))
+Gen: Assert.LessOrEqual(double arg1, double arg2)=>Assert.That(arg1, Is.LessThanOrEqualTo(arg2))
+Gen: Assert.LessOrEqual(float arg1, float arg2)=>Assert.That(arg1, Is.LessThanOrEqualTo(arg2))
+Gen: Assert.LessOrEqual(IComparable arg1, IComparable arg2)=>Assert.That(arg1, Is.LessThanOrEqualTo(arg2))
+%
+/// <summary>
+/// Asserts that an object is contained in a list.
+/// </summary>
+/// <param name="expected">The expected object</param>
+/// <param name="actual">The list to be examined</param>
+Gen: Assert.Contains(object expected, ICollection actual)=>Assert.That(actual, new CollectionContainsConstraint(expected))
+%
diff --git a/src/NUnitFramework/framework/SyntaxHelpers/Has.cs b/src/NUnitFramework/framework/SyntaxHelpers/Has.cs
deleted file mode 100644
index 147c7f4..0000000
--- a/src/NUnitFramework/framework/SyntaxHelpers/Has.cs
+++ /dev/null
@@ -1,144 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-using NUnit.Framework.Constraints;
-
-namespace NUnit.Framework.SyntaxHelpers
-{
-	/// <summary>
-	/// Summary description for HasNoPrefixB.
-	/// </summary>
-	public class Has
-	{
-        /// <summary>
-        /// Nested class that allows us to restrict the number
-        /// of key words that may appear after Has.No.
-        /// </summary>
-		public class HasNoPrefixBuilder
-		{
-            /// <summary>
-            /// Return a ConstraintBuilder conditioned to apply
-            /// the following constraint to a property.
-            /// </summary>
-            /// <param name="name">The property name</param>
-            /// <returns>A ConstraintBuilder</returns>
-			public ConstraintBuilder Property(string name)
-			{
-				return new ConstraintBuilder().Not.Property(name);
-			}
-
-            /// <summary>
-            /// Return a Constraint that succeeds if the expected object is
-            /// not contained in a collection.
-            /// </summary>
-            /// <param name="expected">The expected object</param>
-            /// <returns>A Constraint</returns>
-            public Constraint Member(object expected)
-			{
-				return new NotConstraint( new CollectionContainsConstraint(expected) ) ;
-			}
-		}
-
-		#region Prefix Operators
-		/// <summary>
-		/// Has.No returns a ConstraintBuilder that negates
-		/// the constraint that follows it.
-		/// </summary>
-		public static HasNoPrefixBuilder No
-		{
-			get { return new HasNoPrefixBuilder(); }
-		}
-
-		/// <summary>
-		/// Has.AllItems returns a ConstraintBuilder, which will apply
-		/// the following constraint to all members of a collection,
-		/// succeeding if all of them succeed.
-		/// </summary>
-		public static ConstraintBuilder All
-		{
-			get { return new ConstraintBuilder().All; }
-		}
-
-		/// <summary>
-		/// Has.Some returns a ConstraintBuilder, which will apply
-		/// the following constraint to all members of a collection,
-		/// succeeding if any of them succeed. It is a synonym
-		/// for Has.Item.
-		/// </summary>
-		public static ConstraintBuilder Some
-		{
-			get { return new ConstraintBuilder().Some; }
-		}
-
-		/// <summary>
-		/// Has.None returns a ConstraintBuilder, which will apply
-		/// the following constraint to all members of a collection,
-		/// succeeding only if none of them succeed.
-		/// </summary>
-		public static ConstraintBuilder None
-		{
-			get { return new ConstraintBuilder().None; }
-		}
-
-		/// <summary>
-		/// Returns a new ConstraintBuilder, which will apply the
-		/// following constraint to a named property of the object
-		/// being tested.
-		/// </summary>
-		/// <param name="name">The name of the property</param>
-		public static ConstraintBuilder Property( string name )
-		{
-			return new ConstraintBuilder().Property(name);
-		}
-		#endregion
-
-		#region Property Constraints
-		/// <summary>
-		/// Returns a new PropertyConstraint checking for the
-		/// existence of a particular property value.
-		/// </summary>
-		/// <param name="name">The name of the property to look for</param>
-		/// <param name="expected">The expected value of the property</param>
-		public static Constraint Property( string name, object expected )
-		{
-			return new PropertyConstraint( name, new EqualConstraint( expected ) );
-		}
-
-        /// <summary>
-        /// Returns a new PropertyConstraint for the Length property
-        /// </summary>
-        /// <param name="length"></param>
-        /// <returns></returns>
-		public static Constraint Length( int length )
-		{
-			return Property( "Length", length );
-		}
-
-		/// <summary>
-		/// Returns a new PropertyConstraint or the Count property
-		/// </summary>
-		/// <param name="count"></param>
-		/// <returns></returns>
-		public static Constraint Count( int count )
-		{
-			return Property( "Count", count );
-		}
-		#endregion
-
-		#region Member Constraint
-		/// <summary>
-		/// Returns a new CollectionContainsConstraint checking for the
-		/// presence of a particular object in the collection.
-		/// </summary>
-		/// <param name="expected">The expected object</param>
-		public static Constraint Member( object expected )
-		{
-			return new CollectionContainsConstraint( expected );
-		}
-		#endregion
-	}
-}
diff --git a/src/NUnitFramework/framework/SyntaxHelpers/Is.cs b/src/NUnitFramework/framework/SyntaxHelpers/Is.cs
deleted file mode 100644
index 90f3bb4..0000000
--- a/src/NUnitFramework/framework/SyntaxHelpers/Is.cs
+++ /dev/null
@@ -1,212 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-using System.Collections;
-using NUnit.Framework.Constraints;
-
-namespace NUnit.Framework.SyntaxHelpers
-{
-	/// <summary>
-	/// The Is class is a helper class with properties and methods
-	/// that supply a number of constraints used in Asserts.
-	/// </summary>
-	public class Is
-	{
-		#region Prefix Operators
-		/// <summary>
-		/// Is.Not returns a ConstraintBuilder that negates
-		/// the constraint that follows it.
-		/// </summary>
-		public static ConstraintBuilder Not
-		{
-			get { return new ConstraintBuilder().Not; }
-		}
-
-		/// <summary>
-		/// Is.All returns a ConstraintBuilder, which will apply
-		/// the following constraint to all members of a collection,
-		/// succeeding if all of them succeed. This property is
-		/// a synonym for Has.AllItems.
-		/// </summary>
-		public static ConstraintBuilder All
-		{
-			get { return new ConstraintBuilder().All; }
-		}
-		#endregion
-
-		#region Constraints Without Arguments
-		/// <summary>
-		/// Is.Null returns a static constraint that tests for null
-		/// </summary>
-        public static readonly Constraint Null = new EqualConstraint( null );
-		/// <summary>
-		/// Is.True returns a static constraint that tests whether a value is true
-		/// </summary>
-		public static readonly Constraint True = new EqualConstraint(true);
-		/// <summary>
-		/// Is.False returns a static constraint that tests whether a value is false
-		/// </summary>
-		public static readonly Constraint False = new EqualConstraint(false);
-		/// <summary>
-		/// Is.NaN returns a static constraint that tests whether a value is an NaN
-		/// </summary>
-		public static readonly Constraint NaN = new EqualConstraint(double.NaN);
-		/// <summary>
-		/// Is.Empty returns a static constraint that tests whether a string or collection is empty
-		/// </summary>
-		public static readonly Constraint Empty = new EmptyConstraint();
-        /// <summary>
-        /// Is.Unique returns a static constraint that tests whether a collection contains all unque items.
-        /// </summary>
-        public static readonly Constraint Unique = new UniqueItemsConstraint();
-        #endregion
-
-        #region Constraints with an expected value
-
-        #region Equality and Identity
-        /// <summary>
-        /// Is.EqualTo returns a constraint that tests whether the
-        /// actual value equals the supplied argument
-        /// </summary>
-        /// <param name="expected"></param>
-        /// <returns></returns>
-        public static EqualConstraint EqualTo(object expected)
-        {
-            return new EqualConstraint(expected);
-        }
-		/// <summary>
-		/// Is.SameAs returns a constraint that tests whether the
-		/// actual value is the same object as the supplied argument.
-		/// </summary>
-		/// <param name="expected"></param>
-		/// <returns></returns>
-        public static Constraint SameAs(object expected)
-        {
-            return new SameAsConstraint(expected);
-        }
-        #endregion
-
-        #region Comparison Constraints
-		/// <summary>
-		/// Is.GreaterThan returns a constraint that tests whether the
-		/// actual value is greater than the suppled argument
-		/// </summary>
-		public static Constraint GreaterThan(IComparable expected)
-        {
-            return new GreaterThanConstraint(expected);
-        }
-		/// <summary>
-		/// Is.GreaterThanOrEqualTo returns a constraint that tests whether the
-		/// actual value is greater than or equal to the suppled argument
-		/// </summary>
-		public static Constraint GreaterThanOrEqualTo(IComparable expected)
-        {
-            return new GreaterThanOrEqualConstraint(expected);
-        }
-
-		/// <summary>
-		/// Is.AtLeast is a synonym for Is.GreaterThanOrEqualTo
-		/// </summary>
-		public static Constraint AtLeast(IComparable expected)
-        {
-            return GreaterThanOrEqualTo(expected);
-        }
-
-		/// <summary>
-		/// Is.LessThan returns a constraint that tests whether the
-		/// actual value is less than the suppled argument
-		/// </summary>
-		public static Constraint LessThan(IComparable expected)
-        {
-            return new LessThanConstraint(expected);
-        }
-
-		/// <summary>
-		/// Is.LessThanOrEqualTo returns a constraint that tests whether the
-		/// actual value is less than or equal to the suppled argument
-		/// </summary>
-		public static Constraint LessThanOrEqualTo(IComparable expected)
-        {
-            return new LessThanOrEqualConstraint(expected);
-        }
-
-		/// <summary>
-		/// Is.AtMost is a synonym for Is.LessThanOrEqualTo
-		/// </summary>
-		public static Constraint AtMost(IComparable expected)
-        {
-            return LessThanOrEqualTo(expected);
-        }
-        #endregion
-
-		#region Type Constraints
-		/// <summary>
-		/// Is.TypeOf returns a constraint that tests whether the actual
-		/// value is of the exact type supplied as an argument.
-		/// </summary>
-		public static Constraint TypeOf(Type expectedType)
-        {
-            return new ExactTypeConstraint(expectedType);
-        }
-
-		/// <summary>
-		/// Is.InstanceOfType returns a constraint that tests whether 
-		/// the actual value is of the type supplied as an argument
-		/// or a derived type.
-		/// </summary>
-		public static Constraint InstanceOfType(Type expectedType)
-        {
-            return new InstanceOfTypeConstraint(expectedType);
-        }
-
-        /// <summary>
-        /// Is.AssignableFrom returns a constraint that tests whether
-        /// the actual value is assignable from the type supplied as
-        /// an argument.
-        /// </summary>
-        /// <param name="expectedType"></param>
-        /// <returns></returns>
-        public static Constraint AssignableFrom(Type expectedType)
-        {
-            return new AssignableFromConstraint(expectedType);
-        }
-        #endregion
-
-		#region Collection Constraints
-		/// <summary>
-		/// Is.EquivalentTo returns a constraint that tests whether
-		/// the actual value is a collection containing the same
-		/// elements as the collection supplied as an arument
-		/// </summary>
-		public static Constraint EquivalentTo(ICollection expected)
-        {
-            return new CollectionEquivalentConstraint(expected);
-        }
-
-		/// <summary>
-		/// Is.SubsetOf returns a constraint that tests whether
-		/// the actual value is a subset of the collection 
-		/// supplied as an arument
-		/// </summary>
-		public static Constraint SubsetOf(ICollection expected)
-        {
-            return new CollectionSubsetConstraint(expected);
-        }
-        #endregion
-
-        #endregion
-    }
-
-
-	/// <summary>
-	/// The Iz class is a synonym for Is intended for use in VB,
-	/// which regards Is as a keyword.
-	/// </summary>
-	public class Iz : Is
-	{
-	}
-}
diff --git a/src/NUnitFramework/framework/SyntaxHelpers/List.cs b/src/NUnitFramework/framework/SyntaxHelpers/List.cs
deleted file mode 100644
index 91c9d31..0000000
--- a/src/NUnitFramework/framework/SyntaxHelpers/List.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-using System.Collections;
-using NUnit.Framework.Constraints;
-
-namespace NUnit.Framework.SyntaxHelpers
-{
-	/// <summary>
-	/// The List class is a helper class with properties and methods
-	/// that supply a number of constraints used with lists and collections.
-	/// </summary>
-	public class List
-	{
-		/// <summary>
-		/// List.Map returns a ListMapper, which can be used to map
-		/// the original collection to another collection.
-		/// </summary>
-		/// <param name="actual"></param>
-		/// <returns></returns>
-		public static ListMapper Map( ICollection actual )
-		{
-			return new ListMapper( actual );
-		}
-	}
-}
diff --git a/src/NUnitFramework/framework/SyntaxHelpers/ListMapper.cs b/src/NUnitFramework/framework/SyntaxHelpers/ListMapper.cs
deleted file mode 100644
index 9577469..0000000
--- a/src/NUnitFramework/framework/SyntaxHelpers/ListMapper.cs
+++ /dev/null
@@ -1,46 +0,0 @@
-using System;
-using System.Collections;
-using System.Reflection;
-
-namespace NUnit.Framework.SyntaxHelpers
-{
-	/// <summary>
-	/// ListMapper is used to transform a collection used as an actual argument
-	/// producing another collection to be used in the assertion.
-	/// </summary>
-	public class ListMapper
-	{
-		ICollection original;
-
-		/// <summary>
-		/// Construct a ListMapper based on a collection
-		/// </summary>
-		/// <param name="original">The collection to be transformed</param>
- 		public ListMapper( ICollection original )
-		{
-			this.original = original;
-		}
-
-		/// <summary>
-		/// Produces a collection containing all the values of a property
-		/// </summary>
-		/// <param name="name">The collection of property values</param>
-		/// <returns></returns>
-		public ICollection Property( string name )
-		{
-			ArrayList propList = new ArrayList();
-			foreach( object item in original )
-			{
-				PropertyInfo property = item.GetType().GetProperty( name, 
-					BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance );
-				if ( property == null )
-					throw new ArgumentException( string.Format(
-						"{0} does not have a {1} property", item, name ) );
-
-				propList.Add( property.GetValue( item, null ) );
-			}
-
-			return propList;
-		}
-	}
-}
diff --git a/src/NUnitFramework/framework/SyntaxHelpers/Text.cs b/src/NUnitFramework/framework/SyntaxHelpers/Text.cs
deleted file mode 100644
index 8a53eb2..0000000
--- a/src/NUnitFramework/framework/SyntaxHelpers/Text.cs
+++ /dev/null
@@ -1,104 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-using NUnit.Framework.Constraints;
-
-namespace NUnit.Framework.SyntaxHelpers
-{
-	/// <summary>
-	/// The Text class is a helper class with properties and methods
-	/// that supply a number of constraints used with strings.
-	/// </summary>
-	public class Text
-	{
-		/// <summary>
-		/// Text.All returns a ConstraintBuilder, which will apply
-		/// the following constraint to all members of a collection,
-		/// succeeding if all of them succeed.
-		/// </summary>
-		public static ConstraintBuilder All
-		{
-			get { return new ConstraintBuilder().All; }
-		}
-
-		/// <summary>
-		/// Contains returns a constraint that succeeds if the actual
-		/// value contains the substring supplied as an argument.
-		/// </summary>
-		public static Constraint Contains(string substring)
-		{
-			return new SubstringConstraint(substring);
-		}
-
-		/// <summary>
-		/// DoesNotContain returns a constraint that fails if the actual
-		/// value contains the substring supplied as an argument.
-		/// </summary>
-		public static Constraint DoesNotContain(string substring)
-		{
-			return new NotConstraint( Contains(substring) );
-		}
-
-		/// <summary>
-		/// StartsWith returns a constraint that succeeds if the actual
-		/// value starts with the substring supplied as an argument.
-		/// </summary>
-		public static Constraint StartsWith(string substring)
-		{
-			return new StartsWithConstraint(substring);
-		}
-
-		/// <summary>
-		/// DoesNotStartWith returns a constraint that fails if the actual
-		/// value starts with the substring supplied as an argument.
-		/// </summary>
-		public static Constraint DoesNotStartWith(string substring)
-		{
-			return new NotConstraint( StartsWith(substring) );
-		}
-
-		/// <summary>
-		/// EndsWith returns a constraint that succeeds if the actual
-		/// value ends with the substring supplied as an argument.
-		/// </summary>
-		public static Constraint EndsWith(string substring)
-		{
-			return new EndsWithConstraint(substring);
-		}
-
-		/// <summary>
-		/// DoesNotEndWith returns a constraint that fails if the actual
-		/// value ends with the substring supplied as an argument.
-		/// </summary>
-		public static Constraint DoesNotEndWith(string substring)
-		{
-			return new NotConstraint( EndsWith(substring) );
-		}
-
-		/// <summary>
-		/// Matches returns a constraint that succeeds if the actual
-		/// value matches the pattern supplied as an argument.
-		/// </summary>
-		/// <param name="pattern"></param>
-		/// <returns></returns>
-		public static Constraint Matches(string pattern)
-		{
-			return new RegexConstraint(pattern);
-		}
-
-		/// <summary>
-		/// DoesNotMatch returns a constraint that failss if the actual
-		/// value matches the pattern supplied as an argument.
-		/// </summary>
-		/// <param name="pattern"></param>
-		/// <returns></returns>
-		public static Constraint DoesNotMatch(string pattern)
-		{
-			return new NotConstraint( Matches(pattern) );
-		}
-	}
-}
diff --git a/src/NUnitFramework/framework/TearDownAttribute.cs b/src/NUnitFramework/framework/TearDownAttribute.cs
deleted file mode 100644
index a08f491..0000000
--- a/src/NUnitFramework/framework/TearDownAttribute.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-namespace NUnit.Framework
-{
-	using System;
-
-	/// <summary>
-	/// Attribute used to identify a method that is called 
-	/// immediately after each test is run. The method is 
-	/// guaranteed to be called, even if an exception is thrown.
-	/// </summary>
-	[AttributeUsage(AttributeTargets.Method, AllowMultiple=false)]
-	public class TearDownAttribute : Attribute
-	{}
-}
diff --git a/src/NUnitFramework/framework/TestAttribute.cs b/src/NUnitFramework/framework/TestAttribute.cs
deleted file mode 100644
index be455d6..0000000
--- a/src/NUnitFramework/framework/TestAttribute.cs
+++ /dev/null
@@ -1,46 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-namespace NUnit.Framework
-{
-	using System;
-
-	/// <summary>
-	/// Adding this attribute to a method within a <seealso cref="TestFixtureAttribute"/> 
-	/// class makes the method callable from the NUnit test runner. There is a property 
-	/// called Description which is optional which you can provide a more detailed test
-	/// description. This class cannot be inherited.
-	/// </summary>
-	/// 
-	/// <example>
-	/// [TestFixture]
-	/// public class Fixture
-	/// {
-	///   [Test]
-	///   public void MethodToTest()
-	///   {}
-	///   
-	///   [Test(Description = "more detailed description")]
-	///   publc void TestDescriptionMethod()
-	///   {}
-	/// }
-	/// </example>
-	/// 
-	[AttributeUsage(AttributeTargets.Method, AllowMultiple=false)]
-	public class TestAttribute : Attribute
-	{
-		private string description;
-
-		/// <summary>
-		/// Descriptive text for this test
-		/// </summary>
-		public string Description
-		{
-			get { return description; }
-			set { description = value; }
-		}
-	}
-}
diff --git a/src/NUnitFramework/framework/TestCaseData.cs b/src/NUnitFramework/framework/TestCaseData.cs
new file mode 100644
index 0000000..632b5c3
--- /dev/null
+++ b/src/NUnitFramework/framework/TestCaseData.cs
@@ -0,0 +1,348 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Collections.Specialized;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// The TestCaseData class represents a set of arguments
+    /// and other parameter info to be used for a parameterized
+    /// test case. It provides a number of instance modifiers
+    /// for use in initializing the test case.
+    /// 
+    /// Note: Instance modifiers are getters that return
+    /// the same instance after modifying it's state.
+    /// </summary>
+    public class TestCaseData : ITestCaseData
+    {
+        #region Constants
+        //private static readonly string DESCRIPTION = "_DESCRIPTION";
+        //private static readonly string IGNOREREASON = "_IGNOREREASON";
+        private static readonly string CATEGORIES = "_CATEGORIES";
+        #endregion
+
+        #region Instance Fields
+        /// <summary>
+        /// The argument list to be provided to the test
+        /// </summary>
+        private object[] arguments;
+
+        /// <summary>
+        /// The expected result to be returned
+        /// </summary>
+        private object result;
+
+        /// <summary>
+        ///  The expected exception Type
+        /// </summary>
+        private Type expectedExceptionType;
+
+        /// <summary>
+        /// The FullName of the expected exception
+        /// </summary>
+        private string expectedExceptionName;
+
+        /// <summary>
+        /// The name to be used for the test
+        /// </summary>
+        private string testName;
+
+        /// <summary>
+        /// The description of the test
+        /// </summary>
+        private string description;
+
+        /// <summary>
+        /// A dictionary of properties, used to add information
+        /// to tests without requiring the class to change.
+        /// </summary>
+        private IDictionary properties;
+
+        /// <summary>
+        /// If true, indicates that the test case is to be ignored
+        /// </summary>
+        bool isIgnored;
+
+        /// <summary>
+        /// The reason for ignoring a test case
+        /// </summary>
+        string ignoreReason;
+
+        #endregion
+
+        #region Constructors
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:TestCaseData"/> class.
+        /// </summary>
+        /// <param name="args">The arguments.</param>
+        public TestCaseData(params object[] args)
+        {
+            if (args == null)
+                this.arguments = new object[] { null };
+            else
+                this.arguments = args;
+        }
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:TestCaseData"/> class.
+        /// </summary>
+        /// <param name="arg">The argument.</param>
+        public TestCaseData(object arg)
+        {
+            this.arguments = new object[] { arg };
+        }
+
+    /// <summary>
+    /// Initializes a new instance of the <see cref="T:TestCaseData"/> class.
+    /// </summary>
+    /// <param name="arg1">The first argument.</param>
+    /// <param name="arg2">The second argument.</param>
+    public TestCaseData(object arg1, object arg2)
+    {
+        this.arguments = new object[] { arg1, arg2 };
+    }
+
+    /// <summary>
+    /// Initializes a new instance of the <see cref="T:TestCaseData"/> class.
+    /// </summary>
+    /// <param name="arg1">The first argument.</param>
+    /// <param name="arg2">The second argument.</param>
+    /// <param name="arg3">The third argument.</param>
+    public TestCaseData(object arg1, object arg2, object arg3)
+    {
+        this.arguments = new object[] { arg1, arg2, arg3 };
+    }
+        #endregion
+
+        #region ITestCaseData Members
+        /// <summary>
+        /// Gets the argument list to be provided to the test
+        /// </summary>
+        public object[] Arguments
+        {
+            get { return arguments; }
+        }
+
+        /// <summary>
+        /// Gets the expected result
+        /// </summary>
+        public object Result
+        {
+            get { return result; }
+        }
+
+        /// <summary>
+        ///  Gets the expected exception Type
+        /// </summary>
+        public Type ExpectedException
+        {
+            get { return expectedExceptionType; }
+        }
+
+        /// <summary>
+        /// Gets the FullName of the expected exception
+        /// </summary>
+        public string ExpectedExceptionName
+        {
+            get { return expectedExceptionName; }
+        }
+
+        /// <summary>
+        /// Gets the name to be used for the test
+        /// </summary>
+        public string TestName
+        {
+            get { return testName; }
+        }
+
+        /// <summary>
+        /// Gets the description of the test
+        /// </summary>
+        public string Description
+        {
+            get { return description; }
+        }
+
+        /// <summary>
+        /// Gets a value indicating whether this <see cref="ITestCaseData"/> is ignored.
+        /// </summary>
+        /// <value><c>true</c> if ignored; otherwise, <c>false</c>.</value>
+        public bool Ignored
+        {
+            get { return isIgnored; }
+        }
+
+        /// <summary>
+        /// Gets the ignore reason.
+        /// </summary>
+        /// <value>The ignore reason.</value>
+        public string IgnoreReason
+        {
+            get { return ignoreReason; }
+        }
+        #endregion
+
+        #region Additional Public Properties
+        /// <summary>
+        /// Gets a list of categories associated with this test.
+        /// </summary>
+        public IList Categories
+        {
+            get
+            {
+                if (Properties[CATEGORIES] == null)
+                    Properties[CATEGORIES] = new ArrayList();
+
+                return (IList)Properties[CATEGORIES];
+            }
+        }
+
+        /// <summary>
+        /// Gets the property dictionary for this test
+        /// </summary>
+        public IDictionary Properties
+        {
+            get
+            {
+                if (properties == null)
+                    properties = new ListDictionary();
+
+                return properties;
+            }
+        }
+        #endregion
+
+        #region Fluent Instance Modifiers
+        /// <summary>
+        /// Sets the expected result for the test
+        /// </summary>
+        /// <param name="result">The expected result</param>
+        /// <returns>A modified TestCaseData</returns>
+        public TestCaseData Returns(object result)
+        {
+            this.result = result;
+            return this;
+        }
+
+        /// <summary>
+        /// Sets the expected exception type for the test
+        /// </summary>
+        /// <param name="exceptionType">Type of the expected exception.</param>
+        /// <returns>The modified TestCaseData instance</returns>
+        public TestCaseData Throws(Type exceptionType)
+        {
+            this.expectedExceptionType = exceptionType;
+            this.expectedExceptionName = exceptionType.FullName;
+            return this;
+        }
+
+        /// <summary>
+        /// Sets the expected exception type for the test
+        /// </summary>
+        /// <param name="exceptionName">FullName of the expected exception.</param>
+        /// <returns>The modified TestCaseData instance</returns>
+        public TestCaseData Throws(string exceptionName)
+        {
+            this.expectedExceptionName = exceptionName;
+            return this;
+        }
+
+        /// <summary>
+        /// Sets the name of the test case
+        /// </summary>
+        /// <returns>The modified TestCaseData instance</returns>
+        public TestCaseData SetName(string name)
+        {
+            this.testName = name;
+            return this;
+        }
+
+        /// <summary>
+        /// Sets the description for the test case
+        /// being constructed.
+        /// </summary>
+        /// <param name="description">The description.</param>
+        /// <returns>The modified TestCaseData instance.</returns>
+        public TestCaseData SetDescription(string description)
+        {
+            this.description = description;
+            return this;
+        }
+
+        /// <summary>
+        /// Applies a category to the test
+        /// </summary>
+        /// <param name="category"></param>
+        /// <returns></returns>
+        public TestCaseData SetCategory(string category)
+        {
+            this.Categories.Add(category);
+            return this;
+        }
+
+        /// <summary>
+        /// Applies a named property to the test
+        /// </summary>
+        /// <param name="propName"></param>
+        /// <param name="propValue"></param>
+        /// <returns></returns>
+        public TestCaseData SetProperty(string propName, string propValue)
+        {
+            this.Properties.Add(propName, propValue);
+            return this;
+        }
+
+        /// <summary>
+        /// Applies a named property to the test
+        /// </summary>
+        /// <param name="propName"></param>
+        /// <param name="propValue"></param>
+        /// <returns></returns>
+        public TestCaseData SetProperty(string propName, int propValue)
+        {
+            this.Properties.Add(propName, propValue);
+            return this;
+        }
+
+        /// <summary>
+        /// Applies a named property to the test
+        /// </summary>
+        /// <param name="propName"></param>
+        /// <param name="propValue"></param>
+        /// <returns></returns>
+        public TestCaseData SetProperty(string propName, double propValue)
+        {
+            this.Properties.Add(propName, propValue);
+            return this;
+        }
+
+        /// <summary>
+        /// Ignores this TestCase.
+        /// </summary>
+        /// <returns></returns>
+        public TestCaseData Ignore()
+        {
+            isIgnored = true;
+            return this;
+        }
+
+        /// <summary>
+        /// Ignores this TestCase, specifying the reason.
+        /// </summary>
+        /// <param name="reason">The reason.</param>
+        /// <returns></returns>
+        public TestCaseData Ignore(string reason)
+        {
+            isIgnored = true;
+            ignoreReason = reason;
+            return this;
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitFramework/framework/TestContext.cs b/src/NUnitFramework/framework/TestContext.cs
new file mode 100644
index 0000000..b108ca6
--- /dev/null
+++ b/src/NUnitFramework/framework/TestContext.cs
@@ -0,0 +1,230 @@
+// ****************************************************************
+// Copyright 2010, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Collections;
+using System.Runtime.Remoting.Messaging;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// Provide the context information of the current test
+    /// </summary>
+    public class TestContext
+    {
+        private const string contextKey = "NUnit.Framework.TestContext";
+        private const string stateKey = "Result.State";
+
+        private IDictionary _context;
+
+        private TestAdapter _test;
+        private ResultAdapter _result;
+
+        #region Constructor
+
+        /// <summary>
+        /// Constructs a TestContext using the provided context dictionary
+        /// </summary>
+        /// <param name="context">A context dictionary</param>
+        public TestContext(IDictionary context)
+        {
+            _context = context;
+        }
+
+        #endregion
+
+        #region Properties
+
+        /// <summary>
+        /// Get the current test context. This is created
+        /// as needed. The user may save the context for
+        /// use within a test, but it should not be used
+        /// outside the test for which it is created.
+        /// </summary>
+        public static TestContext CurrentContext
+        {
+            get
+            {
+                return new TestContext((IDictionary)CallContext.GetData(contextKey));
+            }
+        }
+
+        /// <summary>
+        /// Gets a TestAdapter representing the currently executing test in this context.
+        /// </summary>
+        public TestAdapter Test
+        {
+            get
+            {
+                if (_test == null)
+                    _test = new TestAdapter(_context);
+
+                return _test;
+            }
+        }
+
+        /// <summary>
+        /// Gets a ResultAdapter representing the current result for the test 
+        /// executing in this context.
+        /// </summary>
+        public ResultAdapter Result
+        {
+            get
+            {
+                if (_result == null)
+                    _result = new ResultAdapter(_context);
+
+                return _result;
+            }
+        }
+
+        /// <summary>
+        /// Gets the current directory for this TestContext
+        /// </summary>
+        public string TestDirectory
+        {
+            get
+            {
+                return (string)_context["TestDirectory"];
+            }
+        }
+
+        #endregion
+
+        #region Nested TestAdapter Class
+
+        /// <summary>
+        /// TestAdapter adapts a Test for consumption by
+        /// the user test code.
+        /// </summary>
+        public class TestAdapter
+        {
+            private IDictionary _context;
+
+            #region Constructor
+
+            /// <summary>
+            /// Constructs a TestAdapter for this context
+            /// </summary>
+            /// <param name="context">The context dictionary</param>
+            public TestAdapter(IDictionary context)
+            {
+                _context = context;
+            }
+
+            #endregion
+
+            #region Properties
+
+            /// <summary>
+            /// The name of the test.
+            /// </summary>
+            public string Name
+            {
+                get
+                {
+                    return _context["Test.Name"] as string;
+                }
+            }
+
+            /// <summary>
+            /// The FullName of the test
+            /// </summary>
+            public string FullName
+            {
+                get
+                {
+                    return _context["Test.FullName"] as string;
+                }
+            }
+
+            /// <summary>
+            /// The properties of the test.
+            /// </summary>
+            public IDictionary Properties
+            {
+                get
+                {
+                    return _context["Test.Properties"] as IDictionary;
+                }
+            }
+
+            #endregion
+        }
+
+        #endregion
+
+        #region Nested ResultAdapter Class
+
+        /// <summary>
+        /// ResultAdapter adapts a TestResult for consumption by
+        /// the user test code.
+        /// </summary>
+        public class ResultAdapter
+        {
+            private IDictionary _context;
+
+            #region Constructor
+
+            /// <summary>
+            /// Construct a ResultAdapter for a context
+            /// </summary>
+            /// <param name="context">The context holding the result</param>
+            public ResultAdapter(IDictionary context)
+            {
+                this._context = context;
+            }
+
+            #endregion
+
+            #region Properties
+
+            /// <summary>
+            /// The TestState of current test. This maps to the ResultState
+            /// used in nunit.core and is subject to change in the future.
+            /// </summary>
+            public TestState State
+            {
+                get
+                {
+                    return (TestState)_context["Result.State"];
+                }
+            }
+
+            /// <summary>
+            /// The TestStatus of current test. This enum will be used
+            /// in future versions of NUnit and so is to be preferred
+            /// to the TestState value.
+            /// </summary>
+            public TestStatus Status
+            {
+                get
+                {
+                    switch (State)
+                    {
+                        default:
+                        case TestState.Inconclusive:
+                            return TestStatus.Inconclusive;
+                        case TestState.Skipped:
+                        case TestState.Ignored:
+                        case TestState.NotRunnable:
+                            return TestStatus.Skipped;
+                        case TestState.Success:
+                            return TestStatus.Passed;
+                        case TestState.Failure:
+                        case TestState.Error:
+                        case TestState.Cancelled:
+                            return TestStatus.Failed;
+                    }
+                }
+            }
+
+
+            #endregion
+        }
+
+        #endregion
+    }
+}
diff --git a/src/NUnitFramework/framework/TestFixtureAttribute.cs b/src/NUnitFramework/framework/TestFixtureAttribute.cs
deleted file mode 100644
index 06794aa..0000000
--- a/src/NUnitFramework/framework/TestFixtureAttribute.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-namespace NUnit.Framework
-{
-	using System;
-
-	/// <example>
-	/// [TestFixture]
-	/// public class ExampleClass 
-	/// {}
-	/// </example>
-	[AttributeUsage(AttributeTargets.Class, AllowMultiple=false, Inherited=true)]
-	public class TestFixtureAttribute : Attribute
-	{
-		private string description;
-
-		/// <summary>
-		/// Descriptive text for this fixture
-		/// </summary>
-		public string Description
-		{
-			get { return description; }
-			set { description = value; }
-		}
-	}
-}
diff --git a/src/NUnitFramework/framework/TestFixtureSetUpAttribute.cs b/src/NUnitFramework/framework/TestFixtureSetUpAttribute.cs
deleted file mode 100644
index 628ca01..0000000
--- a/src/NUnitFramework/framework/TestFixtureSetUpAttribute.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-namespace NUnit.Framework
-{
-	using System;
-
-	/// <summary>
-	/// Attribute used to identify a method that is 
-	/// called before any tests in a fixture are run.
-	/// </summary>
-	[AttributeUsage(AttributeTargets.Method, AllowMultiple=false)]
-	public class TestFixtureSetUpAttribute : Attribute
-	{
-	}
-}
diff --git a/src/NUnitFramework/framework/TestFixtureTearDownAttribute.cs b/src/NUnitFramework/framework/TestFixtureTearDownAttribute.cs
deleted file mode 100644
index 1797876..0000000
--- a/src/NUnitFramework/framework/TestFixtureTearDownAttribute.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-namespace NUnit.Framework
-{
-	using System;
-
-	/// <summary>
-	/// Attribute used to identify a method that is called after
-	/// all the tests in a fixture have run. The method is 
-	/// guaranteed to be called, even if an exception is thrown.
-	/// </summary>
-	[AttributeUsage(AttributeTargets.Method, AllowMultiple=false)]
-	public class TestFixtureTearDownAttribute : Attribute
-	{
-	}
-}
-
diff --git a/src/NUnitFramework/framework/TestState.cs b/src/NUnitFramework/framework/TestState.cs
new file mode 100644
index 0000000..2f70d4b
--- /dev/null
+++ b/src/NUnitFramework/framework/TestState.cs
@@ -0,0 +1,55 @@
+// ****************************************************************
+// Copyright 2010, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+
+namespace NUnit.Framework
+{
+	/// <summary>
+	/// The ResultState enum indicates the result of running a test
+	/// </summary>
+	public enum TestState
+	{
+        /// <summary>
+        /// The result is inconclusive
+        /// </summary>
+        Inconclusive = 0,
+
+        /// <summary>
+        /// The test was not runnable.
+        /// </summary>
+		NotRunnable = 1, 
+
+        /// <summary>
+        /// The test has been skipped. 
+        /// </summary>
+		Skipped = 2,
+
+        /// <summary>
+        /// The test has been ignored.
+        /// </summary>
+		Ignored = 3,
+
+        /// <summary>
+        /// The test succeeded
+        /// </summary>
+		Success = 4,
+
+        /// <summary>
+        /// The test failed
+        /// </summary>
+		Failure = 5,
+
+        /// <summary>
+        /// The test encountered an unexpected exception
+        /// </summary>
+		Error = 6,
+
+        /// <summary>
+        /// The test was cancelled by the user
+        /// </summary>
+        Cancelled =7
+	}
+}
diff --git a/src/NUnitFramework/framework/TestStatus.cs b/src/NUnitFramework/framework/TestStatus.cs
new file mode 100644
index 0000000..940b87e
--- /dev/null
+++ b/src/NUnitFramework/framework/TestStatus.cs
@@ -0,0 +1,51 @@
+// ***********************************************************************
+// Copyright (c) 2010 Charlie Poole
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+// ***********************************************************************
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// The TestStatus enum indicates the result of running a test
+    /// </summary>
+    public enum TestStatus
+    {
+        /// <summary>
+        /// The test was inconclusive
+        /// </summary>
+        Inconclusive = 0,
+
+        /// <summary>
+        /// The test has skipped 
+        /// </summary>
+        Skipped = 1,
+
+        /// <summary>
+        /// The test succeeded
+        /// </summary>
+        Passed = 2,
+
+        /// <summary>
+        /// The test failed
+        /// </summary>
+        Failed = 3
+    }
+}
diff --git a/src/NUnitFramework/framework/Text.cs b/src/NUnitFramework/framework/Text.cs
new file mode 100644
index 0000000..533c2ca
--- /dev/null
+++ b/src/NUnitFramework/framework/Text.cs
@@ -0,0 +1,154 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+// ****************************************************************
+//              Generated by the NUnit Syntax Generator
+//
+// Command Line: GenSyntax.exe SyntaxElements.txt
+// 
+//                  DO NOT MODIFY THIS FILE DIRECTLY
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// Helper class with static methods used to supply constraints
+    /// that operate on strings.
+    /// </summary>
+    [Obsolete("Use Is class for string constraints")]
+    public class Text
+    {
+        #region All
+        
+        /// <summary>
+        /// Returns a ConstraintExpression, which will apply
+        /// the following constraint to all members of a collection,
+        /// succeeding if all of them succeed.
+        /// </summary>
+        [Obsolete("Use Is.All")]
+        public static ConstraintExpression All
+        {
+            get { return new ConstraintExpression().All; }
+        }
+        
+        #endregion
+        
+        #region Contains
+        
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value contains the substring supplied as an argument.
+        /// </summary>
+        [Obsolete("Use Is.StringContaining")]
+        public static SubstringConstraint Contains(string expected)
+        {
+            return new SubstringConstraint(expected);
+        }
+        
+        #endregion
+        
+        #region DoesNotContain
+        
+        /// <summary>
+        /// Returns a constraint that fails if the actual
+        /// value contains the substring supplied as an argument.
+        /// </summary>
+        [Obsolete("Use Is.Not.StringContaining")]
+        public static SubstringConstraint DoesNotContain(string expected)
+        {
+            return new ConstraintExpression().Not.ContainsSubstring(expected);
+        }
+        
+        #endregion
+        
+        #region StartsWith
+        
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value starts with the substring supplied as an argument.
+        /// </summary>
+        [Obsolete("Use Is.StringStarting")]
+        public static StartsWithConstraint StartsWith(string expected)
+        {
+            return new StartsWithConstraint(expected);
+        }
+        
+        #endregion
+        
+        #region DoesNotStartWith
+        
+        /// <summary>
+        /// Returns a constraint that fails if the actual
+        /// value starts with the substring supplied as an argument.
+        /// </summary>
+        public static StartsWithConstraint DoesNotStartWith(string expected)
+        {
+            return new ConstraintExpression().Not.StartsWith(expected);
+        }
+        
+        #endregion
+        
+        #region EndsWith
+        
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value ends with the substring supplied as an argument.
+        /// </summary>
+        [Obsolete("Use Is.StringEnding")]
+        public static EndsWithConstraint EndsWith(string expected)
+        {
+            return new EndsWithConstraint(expected);
+        }
+        
+        #endregion
+        
+        #region DoesNotEndWith
+        
+        /// <summary>
+        /// Returns a constraint that fails if the actual
+        /// value ends with the substring supplied as an argument.
+        /// </summary>
+        public static EndsWithConstraint DoesNotEndWith(string expected)
+        {
+            return new ConstraintExpression().Not.EndsWith(expected);
+        }
+        
+        #endregion
+        
+        #region Matches
+        
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value matches the Regex pattern supplied as an argument.
+        /// </summary>
+        [Obsolete("Use Is.StringMatching")]
+        public static RegexConstraint Matches(string pattern)
+        {
+            return new RegexConstraint(pattern);
+        }
+        
+        #endregion
+        
+        #region DoesNotMatch
+        
+        /// <summary>
+        /// Returns a constraint that fails if the actual
+        /// value matches the pattern supplied as an argument.
+        /// </summary>
+        [Obsolete]
+        public static RegexConstraint DoesNotMatch(string pattern)
+        {
+            return new ConstraintExpression().Not.Matches(pattern);
+        }
+        
+        #endregion
+        
+    }
+}
diff --git a/src/NUnitFramework/framework/TextMessageWriter.cs b/src/NUnitFramework/framework/TextMessageWriter.cs
index a3dc245..e1ae882 100644
--- a/src/NUnitFramework/framework/TextMessageWriter.cs
+++ b/src/NUnitFramework/framework/TextMessageWriter.cs
@@ -1,12 +1,10 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
-using System.IO;
-using System.Text;
 using System.Collections;
 using System.Globalization;
 using NUnit.Framework.Constraints;
@@ -143,7 +141,7 @@ namespace NUnit.Framework
 		/// <param name="expected">The expected value</param>
 		/// <param name="actual">The actual value causing the failure</param>
 		/// <param name="tolerance">The tolerance within which the test was made</param>
-		public override void DisplayDifferences(object expected, object actual, object tolerance)
+		public override void DisplayDifferences(object expected, object actual, Tolerance tolerance)
 		{
 			WriteExpectedLine(expected, tolerance);
 			WriteActualLine(actual);
@@ -169,8 +167,8 @@ namespace NUnit.Framework
             if ( clipping )
                 MsgUtils.ClipExpectedAndActual(ref expected, ref actual, maxDisplayLength, mismatch);
 
-            expected = MsgUtils.ConvertWhitespace(expected);
-            actual = MsgUtils.ConvertWhitespace(actual);
+            expected = MsgUtils.EscapeControlChars(expected);
+            actual = MsgUtils.EscapeControlChars(actual);
 
             // The mismatch position may have changed due to clipping or white space conversion
             mismatch = MsgUtils.FindMismatchPosition(expected, actual, 0, ignoreCase);
@@ -428,15 +426,15 @@ namespace NUnit.Framework
 		/// </summary>
 		/// <param name="expected">The expected value</param>
 		/// <param name="tolerance">The tolerance within which the test was made</param>
-		private void WriteExpectedLine(object expected, object tolerance)
+		private void WriteExpectedLine(object expected, Tolerance tolerance)
 		{
 			Write(Pfx_Expected);
 			WriteExpectedValue(expected);
 
-            if (tolerance != null)
+            if (tolerance != null && !tolerance.IsEmpty)
             {
                 WriteConnector("+/-");
-                WriteExpectedValue(tolerance);
+                WriteExpectedValue(tolerance.Value);
             }
 
 			WriteLine();
diff --git a/src/NUnitFramework/framework/Throws.cs b/src/NUnitFramework/framework/Throws.cs
new file mode 100644
index 0000000..42dca27
--- /dev/null
+++ b/src/NUnitFramework/framework/Throws.cs
@@ -0,0 +1,144 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+// ****************************************************************
+//              Generated by the NUnit Syntax Generator
+//
+// Command Line: GenSyntax.exe SyntaxElements.txt
+// 
+//                  DO NOT MODIFY THIS FILE DIRECTLY
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// Helper class with properties and methods that supply
+    /// constraints that operate on exceptions.
+    /// </summary>
+    public class Throws
+    {
+        #region Exception
+        
+        /// <summary>
+        /// Creates a constraint specifying an expected exception
+        /// </summary>
+        public static ResolvableConstraintExpression Exception
+        {
+            get { return new ConstraintExpression().Append(new ThrowsOperator()); }
+        }
+        
+        #endregion
+        
+        #region InnerException
+        
+        /// <summary>
+        /// Creates a constraint specifying an exception with a given InnerException
+        /// </summary>
+        public static ResolvableConstraintExpression InnerException
+        {
+            get { return Exception.InnerException; }
+        }
+        
+        #endregion
+        
+        #region TargetInvocationException
+        
+        /// <summary>
+        /// Creates a constraint specifying an expected TargetInvocationException
+        /// </summary>
+        public static ExactTypeConstraint TargetInvocationException
+        {
+            get { return TypeOf(typeof(System.Reflection.TargetInvocationException)); }
+        }
+        
+        #endregion
+        
+        #region ArgumentException
+        
+        /// <summary>
+        /// Creates a constraint specifying an expected TargetInvocationException
+        /// </summary>
+        public static ExactTypeConstraint ArgumentException
+        {
+            get { return TypeOf(typeof(System.ArgumentException)); }
+        }
+        
+        #endregion
+        
+        #region InvalidOperationException
+        
+        /// <summary>
+        /// Creates a constraint specifying an expected TargetInvocationException
+        /// </summary>
+        public static ExactTypeConstraint InvalidOperationException
+        {
+            get { return TypeOf(typeof(System.InvalidOperationException)); }
+        }
+        
+        #endregion
+        
+        #region Nothing
+        
+        /// <summary>
+        /// Creates a constraint specifying that no exception is thrown
+        /// </summary>
+        public static ThrowsNothingConstraint Nothing
+        {
+            get { return new ThrowsNothingConstraint(); }
+        }
+        
+        #endregion
+        
+        #region TypeOf
+        
+        /// <summary>
+        /// Creates a constraint specifying the exact type of exception expected
+        /// </summary>
+        public static ExactTypeConstraint TypeOf(Type expectedType)
+        {
+            return Exception.TypeOf(expectedType);
+        }
+        
+#if NET_2_0
+        /// <summary>
+        /// Creates a constraint specifying the exact type of exception expected
+        /// </summary>
+        public static ExactTypeConstraint TypeOf<T>()
+        {
+            return TypeOf(typeof(T));
+        }
+        
+#endif
+        #endregion
+        
+        #region InstanceOf
+        
+        /// <summary>
+        /// Creates a constraint specifying the type of exception expected
+        /// </summary>
+        public static InstanceOfTypeConstraint InstanceOf(Type expectedType)
+        {
+            return Exception.InstanceOf(expectedType);
+        }
+        
+#if NET_2_0
+        /// <summary>
+        /// Creates a constraint specifying the type of exception expected
+        /// </summary>
+        public static InstanceOfTypeConstraint InstanceOf<T>()
+        {
+            return InstanceOf(typeof(T));
+        }
+        
+#endif
+        #endregion
+        
+    }
+}
diff --git a/src/NUnitFramework/framework/nunit.framework.build b/src/NUnitFramework/framework/nunit.framework.build
index b18c5ec..49c7d95 100644
--- a/src/NUnitFramework/framework/nunit.framework.build
+++ b/src/NUnitFramework/framework/nunit.framework.build
@@ -1,78 +1,143 @@
 <?xml version="1.0"?>
 <project name="NUnitFramework" default="build" basedir=".">
 
-  <target name="build">
-    <csc target="library"
-        output="${current.build.dir}/nunit.framework.dll"
-        doc="${current.build.dir}/nunit.framework.xml"
-        debug="${build.debug}" 
-        define="${build.defines}">
-      <nowarn>
-        <warning number="618,672"/>
-        <warning number="1699" if="${runtime.version=='2.0'}"/>
-      </nowarn>
-      <sources basedir=".">
+  <patternset id="source-files">
+        <include name="Attributes/CategoryAttribute.cs"/>
+        <include name="Attributes/DatapointAttributes.cs"/>
+        <include name="Attributes/DescriptionAttribute.cs"/>
+        <include name="Attributes/ExpectedExceptionAttribute.cs"/>
+        <include name="Attributes/ExplicitAttribute.cs"/>
+        <include name="Attributes/IgnoreAttribute.cs"/>
+        <include name="Attributes/IncludeExcludeAttributes.cs"/>
+        <include name="Attributes/JoinTypeAttributes.cs"/>
+        <include name="Attributes/MaxTimeAttribute.cs"/>
+        <include name="Attributes/PropertyAttribute.cs"/>
+        <include name="Attributes/RandomAttribute.cs"/>
+        <include name="Attributes/RangeAttribute.cs"/>
+        <include name="Attributes/RepeatAttribute.cs"/>
+        <include name="Attributes/RequiredAddinAttribute.cs"/>
+        <include name="Attributes/SetCultureAttribute.cs"/>
+        <include name="Attributes/SetUICultureAttribute.cs"/>
+        <include name="Attributes/SetUpAttribute.cs"/>
+        <include name="Attributes/SetUpFixtureAttribute.cs"/>
+        <include name="Attributes/SuiteAttribute.cs"/>
+        <include name="Attributes/TearDownAttribute.cs"/>
+        <include name="Attributes/TestAttribute.cs"/>
+        <include name="Attributes/TestCaseAttribute.cs"/>
+        <include name="Attributes/TestCaseSourceAttribute.cs"/>
+        <include name="Attributes/TestFixtureAttribute.cs"/>
+        <include name="Attributes/TestFixtureSetUpAttribute.cs"/>
+        <include name="Attributes/TestFixtureTearDownAttribute.cs"/>
+        <include name="Attributes/TheoryAttribute.cs"/>
+        <include name="Attributes/ThreadingAttributes.cs"/>
+        <include name="Attributes/ValuesAttribute.cs"/>
+        <include name="Attributes/ValueSourceAttribute.cs"/>
+        <include name="Constraints/AttributeConstraints.cs"/>
+        <include name="Constraints/BasicConstraints.cs"/>
         <include name="Constraints/BinaryOperations.cs"/>
         <include name="Constraints/CollectionConstraints.cs"/>
+        <include name="Constraints/CollectionTally.cs"/>
+        <include name="Constraints/ComparisonAdapter.cs"/>
         <include name="Constraints/ComparisonConstraints.cs"/>
         <include name="Constraints/Constraint.cs"/>
         <include name="Constraints/ConstraintBuilder.cs"/>
+        <include name="Constraints/ConstraintExpression.cs"/>
+        <include name="Constraints/ConstraintExpressionBase.cs"/>
+        <include name="Constraints/ConstraintFactory.cs"/>
+        <include name="Constraints/ConstraintOperators.cs"/>
         <include name="Constraints/ContainsConstraint.cs"/>
+        <include name="Constraints/DelayedConstraint.cs"/>
+        <include name="Constraints/DirectoryConstraints.cs"/>
         <include name="Constraints/EmptyConstraint.cs"/>
         <include name="Constraints/EqualConstraint.cs"/>
+        <include name="Constraints/EqualityAdapter.cs"/>
+        <include name="Constraints/FloatingPointNumerics.cs"/>
+        <include name="Constraints/IResolveConstraint.cs"/>
+        <include name="Constraints/MessageWriter.cs"/>
+        <include name="Constraints/MsgUtils.cs"/>
         <include name="Constraints/Numerics.cs"/>
+        <include name="Constraints/NUnitComparer.cs"/>
+        <include name="Constraints/NUnitEqualityComparer.cs"/>
+        <include name="Constraints/PathConstraints.cs"/>
+        <include name="Constraints/PredicateConstraint.cs"/>
         <include name="Constraints/PrefixConstraints.cs"/>
         <include name="Constraints/PropertyConstraint.cs"/>
+        <include name="Constraints/RangeConstraint.cs"/>
+        <include name="Constraints/ResolvableConstraintExpression.cs"/>
+        <include name="Constraints/ReusableConstraint.cs"/>
         <include name="Constraints/SameAsConstraint.cs"/>
+        <include name="Constraints/SerializableConstraints.cs"/>
         <include name="Constraints/StringConstraints.cs"/>
+        <include name="Constraints/ThrowsConstraint.cs"/>
+        <include name="Constraints/Tolerance.cs"/>
         <include name="Constraints/TypeConstraints.cs"/>
-        <include name="SyntaxHelpers/Has.cs"/>
-        <include name="SyntaxHelpers/Is.cs"/>
-        <include name="SyntaxHelpers/List.cs"/>
-        <include name="SyntaxHelpers/ListMapper.cs"/>
-        <include name="SyntaxHelpers/Text.cs"/>
-        <include name="AbstractAsserter.cs"/>
+        <include name="Exceptions/AssertionException.cs"/>
+        <include name="Exceptions/IgnoreException.cs"/>
+        <include name="Exceptions/InconclusiveException.cs"/>
+        <include name="Exceptions/SuccessException.cs"/>
         <include name="AssemblyInfo.cs"/>
         <include name="Assert.cs"/>
-        <include name="Assertion.cs"/>
-        <include name="AssertionException.cs"/>
-        <include name="AssertionFailureMessage.cs"/>
         <include name="AssertionHelper.cs"/>
-        <include name="CategoryAttribute.cs"/>
+        <include name="Assume.cs"/>
         <include name="CollectionAssert.cs"/>
-        <include name="DescriptionAttribute.cs"/>
-        <include name="ExpectedExceptionAttribute.cs"/>
-        <include name="ExplicitAttribute.cs"/>
+        <include name="Contains.cs"/>
+        <include name="DirectoryAssert.cs"/>
         <include name="FileAssert.cs"/>
         <include name="GlobalSettings.cs"/>
-        <include name="IAsserter.cs"/>
+        <include name="Has.cs"/>
         <include name="IExpectException.cs"/>
-        <include name="IgnoreAttribute.cs"/>
-        <include name="IgnoreException.cs"/>
-        <include name="IncludeExcludeAttributes.cs"/>
-        <include name="MessageWriter.cs"/>
-        <include name="MsgUtils.cs"/>
-        <include name="OldTestCase.cs"/>
-        <include name="PropertyAttribute.cs"/>
-        <include name="SetCultureAttribute.cs"/>
-        <include name="SetUpAttribute.cs"/>
-        <include name="SetUpFixtureAttribute.cs"/>
+        <include name="Is.cs"/>
+        <include name="Iz.cs"/>
+        <include name="ITestCaseData.cs"/>
+        <include name="List.cs"/>
+        <include name="ListMapper.cs"/>
+        <include name="Randomizer.cs"/>
+        <include name="SpecialValue.cs"/>
         <include name="StringAssert.cs"/>
-        <include name="SuiteAttribute.cs"/>
-        <include name="TearDownAttribute.cs"/>
-        <include name="TestAttribute.cs"/>
-        <include name="TestFixtureAttribute.cs"/>
-        <include name="TestFixtureSetUpAttribute.cs"/>
-        <include name="TestFixtureTearDownAttribute.cs"/>
+        <include name="TestCaseData.cs"/>
+        <include name="TestContext.cs"/>
+        <include name="TestState.cs"/>
+        <include name="TestStatus.cs"/>
+        <include name="Text.cs"/>
         <include name="TextMessageWriter.cs"/>
-        <include name="../../CommonAssemblyInfo.cs" />
+        <include name="Throws.cs"/>
+  </patternset>
+
+  <target name="build">
+
+    <csc target="library"
+        output="${current.framework.dir}/nunit.framework.dll"
+        doc="${current.framework.dir}/nunit.framework.xml"
+        debug="${build.debug}" 
+        define="${build.defines}">
+      <nowarn>
+        <warning number="618,672"/>
+        <warning number="1699" if="${runtime.version>='2.0'}"/>
+      </nowarn>
+      <sources basedir=".">
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs" />
       </sources>
     </csc>
+
+    <!-- Needed locally by some NUnit tests -->
+    <copy file="${current.framework.dir}/nunit.framework.dll"
+      todir="${current.test.dir}"/>
+
+    <!-- Needed in base dir by pnunit tests -->
+    <copy file="${current.framework.dir}/nunit.framework.dll"
+      todir="${current.build.dir}"/>
+
   </target>
 
   <target name="package">
     <copy todir="${package.src.dir}/NUnitFramework/framework">
-      <fileset refid="source-files" />
+      <fileset>
+        <patternset refid="source-files"/>
+        <include name="nunit.framework.build"/>
+        <include name="nunit.framework.dll.csproj"/>
+        <include name="SyntaxElements.txt"/>
+      </fileset>
     </copy>
   </target>
 
diff --git a/src/NUnitFramework/framework/nunit.framework.dll.csproj b/src/NUnitFramework/framework/nunit.framework.dll.csproj
index 6ebd26d..2432274 100644
--- a/src/NUnitFramework/framework/nunit.framework.dll.csproj
+++ b/src/NUnitFramework/framework/nunit.framework.dll.csproj
@@ -1,361 +1,188 @@
-<VisualStudioProject>
-    <CSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{83DD7E12-A705-4DBA-9D71-09C8973D9382}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = ""
-                AssemblyKeyContainerName = ""
-                AssemblyName = "nunit.framework"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "Library"
-                PreBuildEvent = ""
-                PostBuildEvent = ""
-                RootNamespace = "NUnit.Framework"
-                RunPostBuildEvent = "OnBuildSuccess"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE"
-                    DocumentationFile = "bin\Debug\nunit.framework.xml"
-                    DebugSymbols = "true"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "true"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-                <Config
-                    Name = "Release"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DocumentationFile = "bin\Release\nunit.framework.xml"
-                    DebugSymbols = "false"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "System"
-                    AssemblyName = "System"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.dll"
-                />
-                <Reference
-                    Name = "System.Data"
-                    AssemblyName = "System.Data"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Data.dll"
-                />
-                <Reference
-                    Name = "System.XML"
-                    AssemblyName = "System.Xml"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.XML.dll"
-                />
-            </References>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "AbstractAsserter.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "AssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Assert.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Assertion.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "AssertionException.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "AssertionFailureMessage.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "AssertionHelper.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CategoryAttribute.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CollectionAssert.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CommonAssemblyInfo.cs"
-                    Link = "..\..\CommonAssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "DescriptionAttribute.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ExpectedExceptionAttribute.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ExplicitAttribute.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "FileAssert.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "IAsserter.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "IExpectException.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "IgnoreAttribute.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "IgnoreException.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "IncludeExcludeAttributes.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "MessageWriter.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "MsgUtils.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "OldTestCase.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "PropertyAttribute.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SetCultureAttribute.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "GlobalSettings.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SetUpAttribute.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SetUpFixtureAttribute.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "StringAssert.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SuiteAttribute.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TearDownAttribute.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestAttribute.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestFixtureAttribute.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestFixtureSetUpAttribute.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestFixtureTearDownAttribute.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TextMessageWriter.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Constraints\BinaryOperations.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Constraints\CollectionConstraints.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Constraints\ComparisonConstraints.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Constraints\Constraint.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Constraints\ConstraintBuilder.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Constraints\ContainsConstraint.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Constraints\EmptyConstraint.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Constraints\EqualConstraint.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Constraints\Numerics.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Constraints\PrefixConstraints.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Constraints\PropertyConstraint.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Constraints\SameAsConstraint.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Constraints\StringConstraints.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Constraints\TypeConstraints.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SyntaxHelpers\Has.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SyntaxHelpers\Is.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SyntaxHelpers\List.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SyntaxHelpers\ListMapper.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SyntaxHelpers\Text.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-            </Include>
-        </Files>
-    </CSHARP>
-</VisualStudioProject>
-
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit.framework</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.Framework</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\framework\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG;NET_2_0</DefineConstants>
+    <DocumentationFile>..\..\bin\Debug\framework\nunit.framework.xml</DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>1699</NoWarn>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\framework\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;NET_2_0</DefineConstants>
+    <DocumentationFile>..\..\bin\Release\framework\nunit.framework.xml</DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>1699</NoWarn>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="AssemblyInfo.cs" />
+    <Compile Include="Assert.cs" />
+    <Compile Include="AssertionHelper.cs" />
+    <Compile Include="Assume.cs" />
+    <Compile Include="Attributes\CategoryAttribute.cs" />
+    <Compile Include="Attributes\DatapointAttributes.cs" />
+    <Compile Include="Attributes\DescriptionAttribute.cs" />
+    <Compile Include="Attributes\ExpectedExceptionAttribute.cs" />
+    <Compile Include="Attributes\ExplicitAttribute.cs" />
+    <Compile Include="Attributes\IgnoreAttribute.cs" />
+    <Compile Include="Attributes\IncludeExcludeAttributes.cs" />
+    <Compile Include="Attributes\JoinTypeAttributes.cs" />
+    <Compile Include="Attributes\MaxTimeAttribute.cs" />
+    <Compile Include="Attributes\PropertyAttribute.cs" />
+    <Compile Include="Attributes\RandomAttribute.cs" />
+    <Compile Include="Attributes\RangeAttribute.cs" />
+    <Compile Include="Attributes\RepeatAttribute.cs" />
+    <Compile Include="Attributes\RequiredAddinAttribute.cs" />
+    <Compile Include="Attributes\SetCultureAttribute.cs" />
+    <Compile Include="Attributes\SetUICultureAttribute.cs" />
+    <Compile Include="Attributes\SetUpAttribute.cs" />
+    <Compile Include="Attributes\SetUpFixtureAttribute.cs" />
+    <Compile Include="Attributes\SuiteAttribute.cs" />
+    <Compile Include="Attributes\TearDownAttribute.cs" />
+    <Compile Include="Attributes\TestAttribute.cs" />
+    <Compile Include="Attributes\TestCaseAttribute.cs" />
+    <Compile Include="Attributes\TestCaseSourceAttribute.cs" />
+    <Compile Include="Attributes\TestFixtureAttribute.cs" />
+    <Compile Include="Attributes\TestFixtureSetUpAttribute.cs" />
+    <Compile Include="Attributes\TestFixtureTearDownAttribute.cs" />
+    <Compile Include="Attributes\TheoryAttribute.cs" />
+    <Compile Include="Attributes\ThreadingAttributes.cs" />
+    <Compile Include="Attributes\ValuesAttribute.cs" />
+    <Compile Include="Attributes\ValueSourceAttribute.cs" />
+    <Compile Include="CollectionAssert.cs" />
+    <Compile Include="Constraints\AttributeConstraints.cs" />
+    <Compile Include="Constraints\BasicConstraints.cs" />
+    <Compile Include="Constraints\BinaryOperations.cs" />
+    <Compile Include="Constraints\CollectionConstraints.cs" />
+    <Compile Include="Constraints\CollectionTally.cs" />
+    <Compile Include="Constraints\ComparisonAdapter.cs" />
+    <Compile Include="Constraints\ComparisonConstraints.cs" />
+    <Compile Include="Constraints\Constraint.cs" />
+    <Compile Include="Constraints\ConstraintBuilder.cs" />
+    <Compile Include="Constraints\ConstraintExpression.cs" />
+    <Compile Include="Constraints\ConstraintExpressionBase.cs" />
+    <Compile Include="Constraints\ConstraintFactory.cs" />
+    <Compile Include="Constraints\ConstraintOperators.cs" />
+    <Compile Include="Constraints\ContainsConstraint.cs" />
+    <Compile Include="Constraints\DelayedConstraint.cs" />
+    <Compile Include="Constraints\DirectoryConstraints.cs" />
+    <Compile Include="Constraints\EmptyConstraint.cs" />
+    <Compile Include="Constraints\EqualConstraint.cs" />
+    <Compile Include="Constraints\EqualityAdapter.cs" />
+    <Compile Include="Constraints\FloatingPointNumerics.cs" />
+    <Compile Include="Constraints\IResolveConstraint.cs" />
+    <Compile Include="Constraints\MessageWriter.cs" />
+    <Compile Include="Constraints\MsgUtils.cs" />
+    <Compile Include="Constraints\Numerics.cs" />
+    <Compile Include="Constraints\NUnitComparer.cs" />
+    <Compile Include="Constraints\NUnitEqualityComparer.cs" />
+    <Compile Include="Constraints\PathConstraints.cs" />
+    <Compile Include="Constraints\PredicateConstraint.cs" />
+    <Compile Include="Constraints\PrefixConstraints.cs" />
+    <Compile Include="Constraints\PropertyConstraint.cs" />
+    <Compile Include="Constraints\RangeConstraint.cs" />
+    <Compile Include="Constraints\ResolvableConstraintExpression.cs" />
+    <Compile Include="Constraints\ReusableConstraint.cs" />
+    <Compile Include="Constraints\SameAsConstraint.cs" />
+    <Compile Include="Constraints\SerializableConstraints.cs" />
+    <Compile Include="Constraints\StringConstraints.cs" />
+    <Compile Include="Constraints\ThrowsConstraint.cs" />
+    <Compile Include="Constraints\Tolerance.cs" />
+    <Compile Include="Constraints\TypeConstraints.cs" />
+    <Compile Include="Contains.cs" />
+    <Compile Include="DirectoryAssert.cs" />
+    <Compile Include="Exceptions\AssertionException.cs" />
+    <Compile Include="Exceptions\IgnoreException.cs" />
+    <Compile Include="Exceptions\InconclusiveException.cs" />
+    <Compile Include="Exceptions\SuccessException.cs" />
+    <Compile Include="FileAssert.cs" />
+    <Compile Include="GlobalSettings.cs" />
+    <Compile Include="Has.cs" />
+    <Compile Include="IExpectException.cs" />
+    <Compile Include="Is.cs" />
+    <Compile Include="ITestCaseData.cs" />
+    <Compile Include="Iz.cs" />
+    <Compile Include="List.cs" />
+    <Compile Include="ListMapper.cs" />
+    <Compile Include="Randomizer.cs" />
+    <Compile Include="SpecialValue.cs" />
+    <Compile Include="StringAssert.cs" />
+    <Compile Include="TestCaseData.cs" />
+    <Compile Include="TestContext.cs" />
+    <Compile Include="TestState.cs" />
+    <Compile Include="TestStatus.cs" />
+    <Compile Include="Text.cs" />
+    <Compile Include="TextMessageWriter.cs" />
+    <Compile Include="Throws.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="SyntaxElements.txt" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit.framework.build" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/NUnitFramework/framework/nunit.framework.dll_VS2005.csproj b/src/NUnitFramework/framework/nunit.framework.dll_VS2005.csproj
deleted file mode 100644
index d54161b..0000000
--- a/src/NUnitFramework/framework/nunit.framework.dll_VS2005.csproj
+++ /dev/null
@@ -1,165 +0,0 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>8.0.50727</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ApplicationIcon>
-    </ApplicationIcon>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit.framework</AssemblyName>
-    <AssemblyOriginatorKeyFile>
-    </AssemblyOriginatorKeyFile>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.Framework</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <StartupObject>
-    </StartupObject>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-    <SignAssembly>false</SignAssembly>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release2005|AnyCPU' ">
-    <OutputPath>bin\Release2005\</OutputPath>
-    <DefineConstants>TRACE;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <DocumentationFile>nunit.framework.xml</DocumentationFile>
-    <Optimize>true</Optimize>
-    <NoWarn>1699</NoWarn>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug2005|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\Debug2005\</OutputPath>
-    <DefineConstants>TRACE;DEBUG;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <DocumentationFile>nunit.framework.xml</DocumentationFile>
-    <NoWarn>1699</NoWarn>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="AbstractAsserter.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="AssemblyInfo.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="Assert.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="Assertion.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="AssertionException.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="AssertionFailureMessage.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="AssertionHelper.cs" />
-    <Compile Include="CategoryAttribute.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="CollectionAssert.cs" />
-    <Compile Include="Constraints\BinaryOperations.cs" />
-    <Compile Include="Constraints\CollectionConstraints.cs" />
-    <Compile Include="Constraints\ComparisonConstraints.cs" />
-    <Compile Include="Constraints\Constraint.cs" />
-    <Compile Include="Constraints\ConstraintBuilder.cs" />
-    <Compile Include="Constraints\ContainsConstraint.cs" />
-    <Compile Include="Constraints\EmptyConstraint.cs" />
-    <Compile Include="Constraints\EqualConstraint.cs" />
-    <Compile Include="Constraints\Numerics.cs" />
-    <Compile Include="Constraints\PrefixConstraints.cs" />
-    <Compile Include="Constraints\PropertyConstraint.cs" />
-    <Compile Include="Constraints\SameAsConstraint.cs" />
-    <Compile Include="Constraints\StringConstraints.cs" />
-    <Compile Include="Constraints\TypeConstraints.cs" />
-    <Compile Include="DescriptionAttribute.cs" />
-    <Compile Include="ExpectedExceptionAttribute.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="ExplicitAttribute.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="FileAssert.cs" />
-    <Compile Include="IAsserter.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="IExpectException.cs" />
-    <Compile Include="IgnoreAttribute.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="IgnoreException.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="IncludeExcludeAttributes.cs" />
-    <Compile Include="MessageWriter.cs" />
-    <Compile Include="MsgUtils.cs" />
-    <Compile Include="OldTestCase.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="PropertyAttribute.cs" />
-    <Compile Include="SetCultureAttribute.cs" />
-    <Compile Include="GlobalSettings.cs" />
-    <Compile Include="SetUpAttribute.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="SetUpFixtureAttribute.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="StringAssert.cs" />
-    <Compile Include="SuiteAttribute.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="SyntaxHelpers\List.cs" />
-    <Compile Include="SyntaxHelpers\Has.cs" />
-    <Compile Include="SyntaxHelpers\Is.cs" />
-    <Compile Include="SyntaxHelpers\ListMapper.cs" />
-    <Compile Include="SyntaxHelpers\Text.cs" />
-    <Compile Include="TearDownAttribute.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestAttribute.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestFixtureAttribute.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestFixtureSetUpAttribute.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestFixtureTearDownAttribute.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TextMessageWriter.cs" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
-</Project>
\ No newline at end of file
diff --git a/src/NUnitFramework/tests/ArrayEqualsFailureMessageFixture.cs b/src/NUnitFramework/tests/ArrayEqualsFailureMessageFixture.cs
index 611a546..ac0ff48 100644
--- a/src/NUnitFramework/tests/ArrayEqualsFailureMessageFixture.cs
+++ b/src/NUnitFramework/tests/ArrayEqualsFailureMessageFixture.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -12,229 +12,229 @@ namespace NUnit.Framework.Tests
 	/// <summary>
 	/// Summary description for ArrayEqualsFailureMessageFixture.
 	/// </summary>
-	[TestFixture]
-	public class ArrayEqualsFailureMessageFixture : MessageChecker
-	{
-		[Test, ExpectedException(typeof(AssertionException))]
-		public void ArraysHaveDifferentRanks()
-		{
-			int[] expected = new int[] { 1, 2, 3, 4 };
-			int[,] actual = new int[,] { { 1, 2 }, { 3, 4 } };
-
-			expectedMessage =
-				"  Expected is <System.Int32[4]>, actual is <System.Int32[2,2]>" + Environment.NewLine;
-			Expect(actual, EqualTo(expected));
-		}
-
-		[Test, ExpectedException(typeof(AssertionException))]
-		public void ExpectedArrayIsLonger()
-		{
-			int[] expected = new int[] { 1, 2, 3, 4, 5 };
-			int[] actual = new int[] { 1, 2, 3 };
-
-			expectedMessage =
-				"  Expected is <System.Int32[5]>, actual is <System.Int32[3]>" + Environment.NewLine +
-				"  Values differ at index [3]" + Environment.NewLine +
-				"  Missing:  < 4, 5 >";
-			Expect(actual, EqualTo(expected));
-		}
-
-		[Test, ExpectedException(typeof(AssertionException))]
-		public void ActualArrayIsLonger()
-		{
-			int[] expected = new int[] { 1, 2, 3 };
-			int[] actual = new int[] { 1, 2, 3, 4, 5, 6, 7 };
-
-			expectedMessage =
-				"  Expected is <System.Int32[3]>, actual is <System.Int32[7]>" + Environment.NewLine +
-				"  Values differ at index [3]" + Environment.NewLine +
-				"  Extra:    < 4, 5, 6... >";
-			Expect(actual, EqualTo(expected));
-		}
-
-		[Test, ExpectedException(typeof(AssertionException))]
-		public void FailureOnSingleDimensionedArrays()
-		{
-			int[] expected = new int[] { 1, 2, 3 };
-			int[] actual = new int[] { 1, 5, 3 };
-
-			expectedMessage =
-				"  Expected and actual are both <System.Int32[3]>" + Environment.NewLine +
-				"  Values differ at index [1]" + Environment.NewLine +
-				TextMessageWriter.Pfx_Expected + "2" + Environment.NewLine +
-				TextMessageWriter.Pfx_Actual   + "5" + Environment.NewLine;
-			Expect(actual, EqualTo(expected));
-		}
-
-		[Test, ExpectedException(typeof(AssertionException))]
-		public void DoubleDimensionedArrays()
-		{
-			int[,] expected = new int[,] { { 1, 2, 3 }, { 4, 5, 6 } };
-			int[,] actual = new int[,] { { 1, 3, 2 }, { 4, 0, 6 } };
-
-			expectedMessage =
-				"  Expected and actual are both <System.Int32[2,3]>" + Environment.NewLine +
-				"  Values differ at index [0,1]" + Environment.NewLine +
-				TextMessageWriter.Pfx_Expected + "2" + Environment.NewLine +
-				TextMessageWriter.Pfx_Actual   + "3" + Environment.NewLine;
-			Expect(actual, EqualTo(expected));
-		}
-
-		[Test, ExpectedException(typeof(AssertionException))]
-		public void TripleDimensionedArrays()
-		{
-			int[, ,] expected = new int[,,] { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } };
-			int[, ,] actual = new int[,,] { { { 1, 2 }, { 3, 4 } }, { { 0, 6 }, { 7, 8 } } };
-
-			expectedMessage =
-				"  Expected and actual are both <System.Int32[2,2,2]>" + Environment.NewLine +
-				"  Values differ at index [1,0,0]" + Environment.NewLine +
-				TextMessageWriter.Pfx_Expected + "5" + Environment.NewLine +
-				TextMessageWriter.Pfx_Actual   + "0" + Environment.NewLine;
-			Expect(actual, EqualTo(expected));
-		}
-
-		[Test, ExpectedException(typeof(AssertionException))]
-		public void FiveDimensionedArrays()
-		{
-			int[, , , ,] expected = new int[2, 2, 2, 2, 2] { { { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } }, { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } } }, { { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } }, { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } } } };
-			int[, , , ,] actual = new int[2, 2, 2, 2, 2] { { { { { 1, 2 }, { 4, 3 } }, { { 5, 6 }, { 7, 8 } } }, { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } } }, { { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } }, { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } } } };
-
-			expectedMessage =
-				"  Expected and actual are both <System.Int32[2,2,2,2,2]>" + Environment.NewLine +
-				"  Values differ at index [0,0,0,1,0]" + Environment.NewLine +
-				TextMessageWriter.Pfx_Expected + "3" + Environment.NewLine +
-				TextMessageWriter.Pfx_Actual   + "4" + Environment.NewLine;
-			Expect(actual, EqualTo(expected));
-		}
-
-		[Test, ExpectedException(typeof(AssertionException))]
-		public void JaggedArrays()
-		{
-			int[][] expected = new int[][] { new int[] { 1, 2, 3 }, new int[] { 4, 5, 6, 7 }, new int[] { 8, 9 } };
-			int[][] actual = new int[][] { new int[] { 1, 2, 3 }, new int[] { 4, 5, 0, 7 }, new int[] { 8, 9 } };
-
-			expectedMessage =
-				"  Expected and actual are both <System.Int32[3][]>" + Environment.NewLine +
-				"  Values differ at index [1]" + Environment.NewLine +
-				"    Expected and actual are both <System.Int32[4]>" + Environment.NewLine +
-				"    Values differ at index [2]" + Environment.NewLine +
-				TextMessageWriter.Pfx_Expected + "6" + Environment.NewLine +
-				TextMessageWriter.Pfx_Actual   + "0" + Environment.NewLine;
-			Expect(actual, EqualTo(expected));
-		}
-
-		[Test, ExpectedException(typeof(AssertionException))]
-		public void JaggedArrayComparedToSimpleArray()
-		{
-			int[] expected = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
-			int[][] actual = new int[][] { new int[] { 1, 2, 3 }, new int[] { 4, 5, 0, 7 }, new int[] { 8, 9 } };
-
-			expectedMessage =
-				"  Expected is <System.Int32[9]>, actual is <System.Int32[3][]>" + Environment.NewLine +
-				"  Values differ at index [0]" + Environment.NewLine +
-				TextMessageWriter.Pfx_Expected + "1" + Environment.NewLine +
-				TextMessageWriter.Pfx_Actual   + "< 1, 2, 3 >" + Environment.NewLine;
-			Expect(actual, EqualTo(expected));
-		}
-
-		[Test, ExpectedException(typeof(AssertionException))]
-		public void ArraysWithDifferentRanksAsCollection()
-		{
-			int[] expected = new int[] { 1, 2, 3, 4 };
-			int[,] actual = new int[,] { { 1, 0 }, { 3, 4 } };
-
-			expectedMessage =
-				"  Expected is <System.Int32[4]>, actual is <System.Int32[2,2]>" + Environment.NewLine +
-				"  Values differ at expected index [1], actual index [0,1]" + Environment.NewLine +
-				TextMessageWriter.Pfx_Expected + "2" + Environment.NewLine +
-				TextMessageWriter.Pfx_Actual   + "0" + Environment.NewLine;
-			Expect(actual, EqualTo(expected).AsCollection);
-		}
-
-		[Test, ExpectedException(typeof(AssertionException))]
-		public void ArraysWithDifferentDimensionsAsCollection()
-		{
-			int[,] expected = new int[,] { { 1, 2, 3 }, { 4, 5, 6 } };
-			int[,] actual = new int[,] { { 1, 2 }, { 3, 0 }, { 5, 6 } };
-
-			expectedMessage =
-				"  Expected is <System.Int32[2,3]>, actual is <System.Int32[3,2]>" + Environment.NewLine +
-				"  Values differ at expected index [1,0], actual index [1,1]" + Environment.NewLine +
-				TextMessageWriter.Pfx_Expected + "4" + Environment.NewLine +
-				TextMessageWriter.Pfx_Actual   + "0" + Environment.NewLine;
-			Expect(actual, EqualTo(expected).AsCollection);
-		}
-
-//		[Test,ExpectedException(typeof(AssertionException))]
-//		public void ExpectedArrayIsLonger()
-//		{
-//			string[] array1 = { "one", "two", "three" };
-//			string[] array2 = { "one", "two", "three", "four", "five" };
-//
-//			expectedMessage =
-//				"  Expected is <System.String[5]>, actual is <System.String[3]>" + Environment.NewLine +
-//				"  Values differ at index [3]" + Environment.NewLine +
-//				"  Missing:  < \"four\", \"five\" >";
-//			Expect(array1, EqualTo(array2));
-//		}
-
-		[Test,ExpectedException(typeof(AssertionException))]
-		public void SameLengthDifferentContent()
-		{
-			string[] array1 = { "one", "two", "three" };
-			string[] array2 = { "one", "two", "ten" };
-
-			expectedMessage =
-				"  Expected and actual are both <System.String[3]>" + Environment.NewLine +
-				"  Values differ at index [2]" + Environment.NewLine +
-				"  Expected string length 3 but was 5. Strings differ at index 1." + Environment.NewLine +
-				"  Expected: \"ten\"" + Environment.NewLine +
-				"  But was:  \"three\"" + Environment.NewLine +
-				"  ------------^" + Environment.NewLine;
-			Expect(array1, EqualTo(array2));
-		}
-
-		[Test,ExpectedException(typeof(AssertionException))]
-		public void ArraysDeclaredAsDifferentTypes()
-		{
-			string[] array1 = { "one", "two", "three" };
-			object[] array2 = { "one", "three", "two" };
-
-			expectedMessage =
-				"  Expected is <System.Object[3]>, actual is <System.String[3]>" + Environment.NewLine +
-				"  Values differ at index [1]" + Environment.NewLine +
-				"  Expected string length 5 but was 3. Strings differ at index 1." + Environment.NewLine +
-				"  Expected: \"three\"" + Environment.NewLine +
-				"  But was:  \"two\"" + Environment.NewLine +
-				"  ------------^" + Environment.NewLine;
-			Expect(array1, EqualTo(array2));
-		}
-
-		[Test, ExpectedException( typeof(AssertionException) )]
-		public void ArrayAndCollection_Failure()
-		{
-			int[] a = new int[] { 1, 2, 3 };
-			ArrayList b = new ArrayList();
-			b.Add( 1 );
-			b.Add( 3 );
-			Assert.AreEqual( a, b );
-		}
-
-		[Test,ExpectedException(typeof(AssertionException))]
-		public void DifferentArrayTypesEqualFails()
-		{
-			string[] array1 = { "one", "two", "three" };
-			object[] array2 = { "one", "three", "two" };
-
-			expectedMessage =
-				"  Expected is <System.String[3]>, actual is <System.Object[3]>" + System.Environment.NewLine +
-				"  Values differ at index [1]" + System.Environment.NewLine +
-				"  Expected string length 3 but was 5. Strings differ at index 1." + System.Environment.NewLine +
-				"  Expected: \"two\"" + System.Environment.NewLine +
-				"  But was:  \"three\"" + System.Environment.NewLine +
-				"  ------------^" + System.Environment.NewLine;
-			Assert.AreEqual(array1, array2);
-		}
-	}
+    [TestFixture]
+    public class ArrayEqualsFailureMessageFixture : MessageChecker
+    {
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void ArraysHaveDifferentRanks()
+        {
+            int[] expected = new int[] { 1, 2, 3, 4 };
+            int[,] actual = new int[,] { { 1, 2 }, { 3, 4 } };
+
+            expectedMessage =
+                "  Expected is <System.Int32[4]>, actual is <System.Int32[2,2]>" + Environment.NewLine;
+            Expect(actual, EqualTo(expected));
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void ExpectedArrayIsLonger()
+        {
+            int[] expected = new int[] { 1, 2, 3, 4, 5 };
+            int[] actual = new int[] { 1, 2, 3 };
+
+            expectedMessage =
+                "  Expected is <System.Int32[5]>, actual is <System.Int32[3]>" + Environment.NewLine +
+                "  Values differ at index [3]" + Environment.NewLine +
+                "  Missing:  < 4, 5 >";
+            Expect(actual, EqualTo(expected));
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void ActualArrayIsLonger()
+        {
+            int[] expected = new int[] { 1, 2, 3 };
+            int[] actual = new int[] { 1, 2, 3, 4, 5, 6, 7 };
+
+            expectedMessage =
+                "  Expected is <System.Int32[3]>, actual is <System.Int32[7]>" + Environment.NewLine +
+                "  Values differ at index [3]" + Environment.NewLine +
+                "  Extra:    < 4, 5, 6... >";
+            Expect(actual, EqualTo(expected));
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void FailureOnSingleDimensionedArrays()
+        {
+            int[] expected = new int[] { 1, 2, 3 };
+            int[] actual = new int[] { 1, 5, 3 };
+
+            expectedMessage =
+                "  Expected and actual are both <System.Int32[3]>" + Environment.NewLine +
+                "  Values differ at index [1]" + Environment.NewLine +
+                TextMessageWriter.Pfx_Expected + "2" + Environment.NewLine +
+                TextMessageWriter.Pfx_Actual + "5" + Environment.NewLine;
+            Expect(actual, EqualTo(expected));
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void DoubleDimensionedArrays()
+        {
+            int[,] expected = new int[,] { { 1, 2, 3 }, { 4, 5, 6 } };
+            int[,] actual = new int[,] { { 1, 3, 2 }, { 4, 0, 6 } };
+
+            expectedMessage =
+                "  Expected and actual are both <System.Int32[2,3]>" + Environment.NewLine +
+                "  Values differ at index [0,1]" + Environment.NewLine +
+                TextMessageWriter.Pfx_Expected + "2" + Environment.NewLine +
+                TextMessageWriter.Pfx_Actual + "3" + Environment.NewLine;
+            Expect(actual, EqualTo(expected));
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void TripleDimensionedArrays()
+        {
+            int[, ,] expected = new int[,,] { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } };
+            int[, ,] actual = new int[,,] { { { 1, 2 }, { 3, 4 } }, { { 0, 6 }, { 7, 8 } } };
+
+            expectedMessage =
+                "  Expected and actual are both <System.Int32[2,2,2]>" + Environment.NewLine +
+                "  Values differ at index [1,0,0]" + Environment.NewLine +
+                TextMessageWriter.Pfx_Expected + "5" + Environment.NewLine +
+                TextMessageWriter.Pfx_Actual + "0" + Environment.NewLine;
+            Expect(actual, EqualTo(expected));
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void FiveDimensionedArrays()
+        {
+            int[, , , ,] expected = new int[2, 2, 2, 2, 2] { { { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } }, { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } } }, { { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } }, { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } } } };
+            int[, , , ,] actual = new int[2, 2, 2, 2, 2] { { { { { 1, 2 }, { 4, 3 } }, { { 5, 6 }, { 7, 8 } } }, { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } } }, { { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } }, { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } } } };
+
+            expectedMessage =
+                "  Expected and actual are both <System.Int32[2,2,2,2,2]>" + Environment.NewLine +
+                "  Values differ at index [0,0,0,1,0]" + Environment.NewLine +
+                TextMessageWriter.Pfx_Expected + "3" + Environment.NewLine +
+                TextMessageWriter.Pfx_Actual + "4" + Environment.NewLine;
+            Expect(actual, EqualTo(expected));
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void JaggedArrays()
+        {
+            int[][] expected = new int[][] { new int[] { 1, 2, 3 }, new int[] { 4, 5, 6, 7 }, new int[] { 8, 9 } };
+            int[][] actual = new int[][] { new int[] { 1, 2, 3 }, new int[] { 4, 5, 0, 7 }, new int[] { 8, 9 } };
+
+            expectedMessage =
+                "  Expected and actual are both <System.Int32[3][]>" + Environment.NewLine +
+                "  Values differ at index [1]" + Environment.NewLine +
+                "    Expected and actual are both <System.Int32[4]>" + Environment.NewLine +
+                "    Values differ at index [2]" + Environment.NewLine +
+                TextMessageWriter.Pfx_Expected + "6" + Environment.NewLine +
+                TextMessageWriter.Pfx_Actual + "0" + Environment.NewLine;
+            Expect(actual, EqualTo(expected));
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void JaggedArrayComparedToSimpleArray()
+        {
+            int[] expected = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
+            int[][] actual = new int[][] { new int[] { 1, 2, 3 }, new int[] { 4, 5, 0, 7 }, new int[] { 8, 9 } };
+
+            expectedMessage =
+                "  Expected is <System.Int32[9]>, actual is <System.Int32[3][]>" + Environment.NewLine +
+                "  Values differ at index [0]" + Environment.NewLine +
+                TextMessageWriter.Pfx_Expected + "1" + Environment.NewLine +
+                TextMessageWriter.Pfx_Actual + "< 1, 2, 3 >" + Environment.NewLine;
+            Expect(actual, EqualTo(expected));
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void ArraysWithDifferentRanksAsCollection()
+        {
+            int[] expected = new int[] { 1, 2, 3, 4 };
+            int[,] actual = new int[,] { { 1, 0 }, { 3, 4 } };
+
+            expectedMessage =
+                "  Expected is <System.Int32[4]>, actual is <System.Int32[2,2]>" + Environment.NewLine +
+                "  Values differ at expected index [1], actual index [0,1]" + Environment.NewLine +
+                TextMessageWriter.Pfx_Expected + "2" + Environment.NewLine +
+                TextMessageWriter.Pfx_Actual + "0" + Environment.NewLine;
+            Expect(actual, EqualTo(expected).AsCollection);
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void ArraysWithDifferentDimensionsAsCollection()
+        {
+            int[,] expected = new int[,] { { 1, 2, 3 }, { 4, 5, 6 } };
+            int[,] actual = new int[,] { { 1, 2 }, { 3, 0 }, { 5, 6 } };
+
+            expectedMessage =
+                "  Expected is <System.Int32[2,3]>, actual is <System.Int32[3,2]>" + Environment.NewLine +
+                "  Values differ at expected index [1,0], actual index [1,1]" + Environment.NewLine +
+                TextMessageWriter.Pfx_Expected + "4" + Environment.NewLine +
+                TextMessageWriter.Pfx_Actual + "0" + Environment.NewLine;
+            Expect(actual, EqualTo(expected).AsCollection);
+        }
+
+        //		[Test,ExpectedException(typeof(AssertionException))]
+        //		public void ExpectedArrayIsLonger()
+        //		{
+        //			string[] array1 = { "one", "two", "three" };
+        //			string[] array2 = { "one", "two", "three", "four", "five" };
+        //
+        //			expectedMessage =
+        //				"  Expected is <System.String[5]>, actual is <System.String[3]>" + Environment.NewLine +
+        //				"  Values differ at index [3]" + Environment.NewLine +
+        //				"  Missing:  < \"four\", \"five\" >";
+        //			Expect(array1, EqualTo(array2));
+        //		}
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void SameLengthDifferentContent()
+        {
+            string[] array1 = { "one", "two", "three" };
+            string[] array2 = { "one", "two", "ten" };
+
+            expectedMessage =
+                "  Expected and actual are both <System.String[3]>" + Environment.NewLine +
+                "  Values differ at index [2]" + Environment.NewLine +
+                "  Expected string length 3 but was 5. Strings differ at index 1." + Environment.NewLine +
+                "  Expected: \"ten\"" + Environment.NewLine +
+                "  But was:  \"three\"" + Environment.NewLine +
+                "  ------------^" + Environment.NewLine;
+            Expect(array1, EqualTo(array2));
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void ArraysDeclaredAsDifferentTypes()
+        {
+            string[] array1 = { "one", "two", "three" };
+            object[] array2 = { "one", "three", "two" };
+
+            expectedMessage =
+                "  Expected is <System.Object[3]>, actual is <System.String[3]>" + Environment.NewLine +
+                "  Values differ at index [1]" + Environment.NewLine +
+                "  Expected string length 5 but was 3. Strings differ at index 1." + Environment.NewLine +
+                "  Expected: \"three\"" + Environment.NewLine +
+                "  But was:  \"two\"" + Environment.NewLine +
+                "  ------------^" + Environment.NewLine;
+            Expect(array1, EqualTo(array2));
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void ArrayAndCollection_Failure()
+        {
+            int[] a = new int[] { 1, 2, 3 };
+            ArrayList b = new ArrayList();
+            b.Add(1);
+            b.Add(3);
+            Assert.AreEqual(a, b);
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void DifferentArrayTypesEqualFails()
+        {
+            string[] array1 = { "one", "two", "three" };
+            object[] array2 = { "one", "three", "two" };
+
+            expectedMessage =
+                "  Expected is <System.String[3]>, actual is <System.Object[3]>" + System.Environment.NewLine +
+                "  Values differ at index [1]" + System.Environment.NewLine +
+                "  Expected string length 3 but was 5. Strings differ at index 1." + System.Environment.NewLine +
+                "  Expected: \"two\"" + System.Environment.NewLine +
+                "  But was:  \"three\"" + System.Environment.NewLine +
+                "  ------------^" + System.Environment.NewLine;
+            Assert.AreEqual(array1, array2);
+        }
+    }
 }
diff --git a/src/NUnitFramework/tests/ArrayEqualsFixture.cs b/src/NUnitFramework/tests/ArrayEqualsFixture.cs
index 0d2ddcf..b8964a7 100644
--- a/src/NUnitFramework/tests/ArrayEqualsFixture.cs
+++ b/src/NUnitFramework/tests/ArrayEqualsFixture.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -99,8 +99,8 @@ namespace NUnit.Framework.Tests
 			object[] array2 = new object[] { 1.0d, 2, 3.5, 7, "Hello", now };
 			Assert.AreEqual( array1, array2 );
 			Assert.AreEqual(array2, array1);
-			Expect(array1, EqualTo(array2));
-			Expect(array2, EqualTo(array1));
+            Expect(array1, EqualTo(array2));
+            Expect(array2, EqualTo(array1));
 		}
 
 		[Test]
@@ -121,7 +121,7 @@ namespace NUnit.Framework.Tests
 			int[,,] actual = new int[,,] { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } };
 
 			Assert.AreEqual(expected, actual);
-			Expect(actual, EqualTo(expected));
+            Expect(actual, EqualTo(expected));
 		}
 
 		[Test]
@@ -131,7 +131,7 @@ namespace NUnit.Framework.Tests
 			int[, , , ,] actual = new int[2, 2, 2, 2, 2] { { { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } }, { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } } }, { { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } }, { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } } } };
 
 			Assert.AreEqual(expected, actual);
-			Expect(actual, EqualTo(expected));
+            Expect(actual, EqualTo(expected));
 		}
 
 		[Test]
@@ -152,7 +152,7 @@ namespace NUnit.Framework.Tests
 			int[][] actual = new int[][] { new int[] { 1, 2, 3 }, new int[] { 4, 5, 6, 7 }, new int[] { 8, 9 } };
 
 			Assert.AreEqual(expected, actual);
-			Expect(actual, EqualTo(expected));
+            Expect(actual, EqualTo(expected));
 		}
 
 		[Test]
@@ -184,8 +184,8 @@ namespace NUnit.Framework.Tests
 			int[,] actual = new int[,] { { 1, 2 }, { 3, 4 } };
 
 			Assert.AreNotEqual(expected, actual);
-			Expect(actual, Not.EqualTo(expected));
-			Expect(actual, EqualTo(expected).AsCollection);
+            Expect(actual, Not.EqualTo(expected));
+            Expect(actual, EqualTo(expected).AsCollection);
 		}
 
 		[Test]
@@ -195,8 +195,8 @@ namespace NUnit.Framework.Tests
 			int[,] actual = new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 } };
 
 			Assert.AreNotEqual(expected, actual);
-			Expect(actual, Not.EqualTo(expected));
-			Expect(actual, EqualTo(expected).AsCollection);
+            Expect(actual, Not.EqualTo(expected));
+            Expect(actual, EqualTo(expected).AsCollection);
 		}
     }
 }
diff --git a/src/NUnitFramework/tests/ArrayNotEqualFixture.cs b/src/NUnitFramework/tests/ArrayNotEqualFixture.cs
index 1fd83c0..b327c5d 100644
--- a/src/NUnitFramework/tests/ArrayNotEqualFixture.cs
+++ b/src/NUnitFramework/tests/ArrayNotEqualFixture.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -22,8 +22,8 @@ namespace NUnit.Framework.Tests
 
 			Assert.AreNotEqual(array1, array2);
 			Assert.AreNotEqual(array2, array1);
-			Expect(array1, Not.EqualTo(array2));
-			Expect(array2, Not.EqualTo(array1));
+            Expect(array1, Not.EqualTo(array2));
+            Expect(array2, Not.EqualTo(array1));
 		}
 
 		[Test]
@@ -33,8 +33,8 @@ namespace NUnit.Framework.Tests
 			string[] array2 = { "one", "two", "ten" };
 			Assert.AreNotEqual(array1, array2);
 			Assert.AreNotEqual(array2, array1);
-			Expect(array1, Not.EqualTo(array2));
-			Expect(array2, Not.EqualTo(array1));
+            Expect(array1, Not.EqualTo(array2));
+            Expect(array2, Not.EqualTo(array1));
 		}
 
 		[Test]
@@ -43,8 +43,8 @@ namespace NUnit.Framework.Tests
 			string[] array1 = { "one", "two", "three" };
 			object[] array2 = { "one", "three", "two" };
 			Assert.AreNotEqual(array1, array2);
-			Expect(array1, Not.EqualTo(array2));
-			Expect(array2, Not.EqualTo(array1));
+            Expect(array1, Not.EqualTo(array2));
+            Expect(array2, Not.EqualTo(array1));
 		}
 
 	}
diff --git a/src/NUnitFramework/tests/AssertExtensionTests.cs b/src/NUnitFramework/tests/AssertExtensionTests.cs
deleted file mode 100644
index d7f6a2a..0000000
--- a/src/NUnitFramework/tests/AssertExtensionTests.cs
+++ /dev/null
@@ -1,81 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-using System.Text;
-
-namespace NUnit.Framework.Tests
-{
-	[TestFixture]
-	public class AssertExtensionTests
-	{
-		[Test]
-		public void OddNumber()
-		{
-			MyAssert.IsOdd( 27 );
-		}
-
-		[Test]
-		public void OddNumberFails()
-		{
-			try
-			{
-				MyAssert.IsOdd( 28 );
-				Assert.Fail("An AssertionException was expected but not thrown");
-			}
-			catch(AssertionException ae)
-			{
-				Assert.AreEqual(ae.Message,
-					"\texpected: odd number" 
-					+ System.Environment.NewLine 
-					+ "\tactual:  <28>",
-					"AssertionException thrown with incorrect message");
-			}
-			catch(Exception ex)
-			{
-				Assert.Fail("Expected AssertionException but caught: " + ex.ToString());
-			}
-		}
-
-		[Obsolete]
-		private class MyAssert
-		{
-			static public void IsOdd( int num )
-			{
-				NUnit.Framework.Assert.DoAssert( new OddAsserter( num, null, null ) );
-			}
-		}
-
-		[Obsolete]
-		private class OddAsserter : AbstractAsserter
-		{
-			private int num;
-
-			public OddAsserter( int num, string message, params object[] args )
-			   : base( message, args )
-			{
-				this.num = num;
-			}
-
-            public override bool Test()
-            {
-                return (this.num & 1)== 1;
-            }
-			public override string Message
-			{
-				get
-				{	
-					if ( FailureMessage.GetStringBuilder().Length > 0 )
-						FailureMessage.WriteLine();
-					FailureMessage.WriteLine( "\texpected: odd number" );
-					FailureMessage.Write( "\tactual:  <{0}>", this.num );
-					return FailureMessage.ToString();
-				}
-			}
-
-		}
-	}
-}
diff --git a/src/NUnitFramework/tests/AssertSyntaxTests.cs b/src/NUnitFramework/tests/AssertSyntaxTests.cs
deleted file mode 100644
index efb8d5d..0000000
--- a/src/NUnitFramework/tests/AssertSyntaxTests.cs
+++ /dev/null
@@ -1,860 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-using System.Collections;
-using NUnit.Framework.Constraints;
-using NUnit.Framework.SyntaxHelpers;
-
-namespace NUnit.Framework.Tests
-{
-	/// <summary>
-	/// This test fixture attempts to exercise all the syntactic
-	/// variations of Assert without getting into failures, errors 
-	/// or corner cases. Thus, some of the tests may be duplicated 
-	/// in other fixtures.
-	/// 
-	/// Each test performs the same operations using the classic
-	/// syntax (if available) and the new syntax in both the
-	/// helper-based and inherited forms.
-	/// 
-	/// This Fixture will eventually be duplicated in other
-	/// supported languages. 
-	/// </summary>
-	[TestFixture]
-	public class AssertSyntaxTests : AssertionHelper
-	{
-		#region Simple Constraint Tests
-		[Test]
-		public void IsNull()
-		{
-			// Classic syntax
-			Assert.IsNull(null);
-
-			// Helper syntax
-			Assert.That(null, Is.Null);
-
-			// Inherited syntax
-			Expect(null, Null);
-		}
-
-		[Test]
-		public void IsNotNull()
-		{
-			// Classic syntax
-			Assert.IsNotNull(42);
-
-			// Helper syntax
-			Assert.That(42, Is.Not.Null);
-
-			// Inherited syntax
-			Expect( 42, Not.Null );
-		}
-
-		[Test]
-		public void IsTrue()
-		{
-			// Classic syntax
-			Assert.IsTrue(2+2==4);
-
-			// Helper syntax
-			Assert.That(2+2==4, Is.True);
-			Assert.That(2+2==4);
-
-			// Inherited syntax
-			Expect(2+2==4, True);
-			Expect(2+2==4);
-		}
-
-		[Test]
-		public void IsFalse()
-		{
-			// Classic syntax
-			Assert.IsFalse(2+2==5);
-
-			// Helper syntax
-			Assert.That(2+2== 5, Is.False);
-			
-			// Inherited syntax
-			Expect(2+2==5, False);
-		}
-
-		[Test]
-		public void IsNaN()
-		{
-			double d = double.NaN;
-			float f = float.NaN;
-
-			// Classic syntax
-			Assert.IsNaN(d);
-			Assert.IsNaN(f);
-
-			// Helper syntax
-			Assert.That(d, Is.NaN);
-			Assert.That(f, Is.NaN);
-			
-			// Inherited syntax
-			Expect(d, NaN);
-			Expect(f, NaN);
-		}
-
-		[Test]
-		public void EmptyStringTests()
-		{
-			// Classic syntax
-			Assert.IsEmpty("");
-			Assert.IsNotEmpty("Hello!");
-
-			// Helper syntax
-			Assert.That("", Is.Empty);
-			Assert.That("Hello!", Is.Not.Empty);
-
-			// Inherited syntax
-			Expect("", Empty);
-			Expect("Hello!", Not.Empty);
-		}
-
-		[Test]
-		public void EmptyCollectionTests()
-		{
-			// Classic syntax
-			Assert.IsEmpty(new bool[0]);
-			Assert.IsNotEmpty(new int[] { 1, 2, 3 });
-
-			// Helper syntax
-			Assert.That(new bool[0], Is.Empty);
-			Assert.That(new int[] { 1, 2, 3 }, Is.Not.Empty);
-
-			// Inherited syntax
-			Expect(new bool[0], Empty);
-			Expect(new int[] { 1, 2, 3 }, Not.Empty);
-		}
-		#endregion
-
-		#region TypeConstraint Tests
-		[Test]
-		public void ExactTypeTests()
-		{
-			// Classic syntax workarounds
-			Assert.AreEqual(typeof(string), "Hello".GetType());
-			Assert.AreEqual("System.String", "Hello".GetType().FullName);
-			Assert.AreNotEqual(typeof(int), "Hello".GetType());
-			Assert.AreNotEqual("System.Int32", "Hello".GetType().FullName);
-
-			// Helper syntax
-			Assert.That("Hello", Is.TypeOf(typeof(string)));
-			Assert.That("Hello", Is.Not.TypeOf(typeof(int)));
-			
-			// Inherited syntax
-			Expect( "Hello", TypeOf(typeof(string)));
-			Expect( "Hello", Not.TypeOf(typeof(int)));
-		}
-
-		[Test]
-		public void InstanceOfTypeTests()
-		{
-			// Classic syntax
-			Assert.IsInstanceOfType(typeof(string), "Hello");
-			Assert.IsNotInstanceOfType(typeof(string), 5);
-
-			// Helper syntax
-			Assert.That("Hello", Is.InstanceOfType(typeof(string)));
-			Assert.That(5, Is.Not.InstanceOfType(typeof(string)));
-
-			// Inherited syntax
-			Expect("Hello", InstanceOfType(typeof(string)));
-			Expect(5, Not.InstanceOfType(typeof(string)));
-		}
-
-		[Test]
-		public void AssignableFromTypeTests()
-		{
-			// Classic syntax
-			Assert.IsAssignableFrom(typeof(string), "Hello");
-			Assert.IsNotAssignableFrom(typeof(string), 5);
-
-			// Helper syntax
-			Assert.That( "Hello", Is.AssignableFrom(typeof(string)));
-			Assert.That( 5, Is.Not.AssignableFrom(typeof(string)));
-			
-			// Inherited syntax
-			Expect( "Hello", AssignableFrom(typeof(string)));
-			Expect( 5, Not.AssignableFrom(typeof(string)));
-		}
-		#endregion
-
-		#region StringConstraint Tests
-		[Test]
-		public void SubstringTests()
-		{
-			string phrase = "Hello World!";
-			string[] array = new string[] { "abc", "bad", "dba" };
-			
-			// Classic Syntax
-			StringAssert.Contains("World", phrase);
-			
-			// Helper syntax
-			Assert.That(phrase, Text.Contains("World"));
-			// Only available using new syntax
-			Assert.That(phrase, Text.DoesNotContain("goodbye"));
-			Assert.That(phrase, Text.Contains("WORLD").IgnoreCase);
-			Assert.That(phrase, Text.DoesNotContain("BYE").IgnoreCase);
-			Assert.That(array, Text.All.Contains( "b" ) );
-
-			// Inherited syntax
-			Expect(phrase, Contains("World"));
-			// Only available using new syntax
-			Expect(phrase, Not.Contains("goodbye"));
-			Expect(phrase, Contains("WORLD").IgnoreCase);
-			Expect(phrase, Not.Contains("BYE").IgnoreCase);
-			Expect(array, All.Contains("b"));
-		}
-
-		[Test]
-		public void StartsWithTests()
-		{
-			string phrase = "Hello World!";
-			string[] greetings = new string[] { "Hello!", "Hi!", "Hola!" };
-
-			// Classic syntax
-			StringAssert.StartsWith("Hello", phrase);
-
-			// Helper syntax
-			Assert.That(phrase, Text.StartsWith("Hello"));
-			// Only available using new syntax
-			Assert.That(phrase, Text.DoesNotStartWith("Hi!"));
-			Assert.That(phrase, Text.StartsWith("HeLLo").IgnoreCase);
-			Assert.That(phrase, Text.DoesNotStartWith("HI").IgnoreCase);
-			Assert.That(greetings, Text.All.StartsWith("h").IgnoreCase);
-
-			// Inherited syntax
-			Expect(phrase, StartsWith("Hello"));
-			// Only available using new syntax
-			Expect(phrase, Not.StartsWith("Hi!"));
-			Expect(phrase, StartsWith("HeLLo").IgnoreCase);
-			Expect(phrase, Not.StartsWith("HI").IgnoreCase);
-			Expect(greetings, All.StartsWith("h").IgnoreCase);
-		}
-
-		[Test]
-		public void EndsWithTests()
-		{
-			string phrase = "Hello World!";
-			string[] greetings = new string[] { "Hello!", "Hi!", "Hola!" };
-
-			// Classic Syntax
-			StringAssert.EndsWith("!", phrase);
-
-			// Helper syntax
-			Assert.That(phrase, Text.EndsWith("!"));
-			// Only available using new syntax
-			Assert.That(phrase, Text.DoesNotEndWith("?"));
-			Assert.That(phrase, Text.EndsWith("WORLD!").IgnoreCase);
-			Assert.That(greetings, Text.All.EndsWith("!"));
-		
-			// Inherited syntax
-			Expect(phrase, EndsWith("!"));
-			// Only available using new syntax
-			Expect(phrase, Not.EndsWith("?"));
-			Expect(phrase, EndsWith("WORLD!").IgnoreCase);
-			Expect(greetings, All.EndsWith("!") );
-		}
-
-		[Test]
-		public void EqualIgnoringCaseTests()
-		{
-			string phrase = "Hello World!";
-
-			// Classic syntax
-			StringAssert.AreEqualIgnoringCase("hello world!",phrase);
-            
-			// Helper syntax
-			Assert.That(phrase, Is.EqualTo("hello world!").IgnoreCase);
-			//Only available using new syntax
-			Assert.That(phrase, Is.Not.EqualTo("goodbye world!").IgnoreCase);
-			Assert.That(new string[] { "Hello", "World" }, 
-				Is.EqualTo(new object[] { "HELLO", "WORLD" }).IgnoreCase);
-			Assert.That(new string[] {"HELLO", "Hello", "hello" },
-				Is.All.EqualTo( "hello" ).IgnoreCase);
-		            
-			// Inherited syntax
-			Expect(phrase, EqualTo("hello world!").IgnoreCase);
-			//Only available using new syntax
-			Expect(phrase, Not.EqualTo("goodbye world!").IgnoreCase);
-			Expect(new string[] { "Hello", "World" }, 
-				EqualTo(new object[] { "HELLO", "WORLD" }).IgnoreCase);
-			Expect(new string[] {"HELLO", "Hello", "hello" },
-				All.EqualTo( "hello" ).IgnoreCase);
-		}
-
-		[Test]
-		public void RegularExpressionTests()
-		{
-			string phrase = "Now is the time for all good men to come to the aid of their country.";
-			string[] quotes = new string[] { "Never say never", "It's never too late", "Nevermore!" };
-
-			// Classic syntax
-			StringAssert.IsMatch( "all good men", phrase );
-			StringAssert.IsMatch( "Now.*come", phrase );
-
-			// Helper syntax
-			Assert.That( phrase, Text.Matches( "all good men" ) );
-			Assert.That( phrase, Text.Matches( "Now.*come" ) );
-			// Only available using new syntax
-			Assert.That(phrase, Text.DoesNotMatch("all.*men.*good"));
-			Assert.That(phrase, Text.Matches("ALL").IgnoreCase);
-			Assert.That(quotes, Text.All.Matches("never").IgnoreCase);
-		
-			// Inherited syntax
-			Expect( phrase, Matches( "all good men" ) );
-			Expect( phrase, Matches( "Now.*come" ) );
-			// Only available using new syntax
-			Expect(phrase, Not.Matches("all.*men.*good"));
-			Expect(phrase, Matches("ALL").IgnoreCase);
-			Expect(quotes, All.Matches("never").IgnoreCase);
-		}
-		#endregion
-
-		#region Equality Tests
-		[Test]
-		public void EqualityTests()
-		{
-			int[] i3 = new int[] { 1, 2, 3 };
-			double[] d3 = new double[] { 1.0, 2.0, 3.0 };
-			int[] iunequal = new int[] { 1, 3, 2 };
-
-			// Classic Syntax
-			Assert.AreEqual(4, 2 + 2);
-			Assert.AreEqual(i3, d3);
-			Assert.AreNotEqual(5, 2 + 2);
-			Assert.AreNotEqual(i3, iunequal);
-
-			// Helper syntax
-			Assert.That(2 + 2, Is.EqualTo(4));
-			Assert.That(2 + 2 == 4);
-			Assert.That(i3, Is.EqualTo(d3));
-			Assert.That(2 + 2, Is.Not.EqualTo(5));
-			Assert.That(i3, Is.Not.EqualTo(iunequal));
-		
-			// Inherited syntax
-			Expect(2 + 2, EqualTo(4));
-			Expect(2 + 2 == 4);
-			Expect(i3, EqualTo(d3));
-			Expect(2 + 2, Not.EqualTo(5));
-			Expect(i3, Not.EqualTo(iunequal));
-		}
-
-		[Test]
-		public void EqualityTestsWithTolerance()
-		{
-			// CLassic syntax
-			Assert.AreEqual(5.0d, 4.99d, 0.05d);
-			Assert.AreEqual(5.0f, 4.99f, 0.05f);
-
-			// Helper syntax
-			Assert.That(4.99d, Is.EqualTo(5.0d).Within(0.05d));
-			Assert.That(4.0d, Is.Not.EqualTo(5.0d).Within(0.5d));
-			Assert.That(4.99f, Is.EqualTo(5.0f).Within(0.05f));
-			Assert.That(4.99m, Is.EqualTo(5.0m).Within(0.05m));
-			Assert.That(3999999999u, Is.EqualTo(4000000000u).Within(5u));
-			Assert.That(499, Is.EqualTo(500).Within(5));
-			Assert.That(4999999999L, Is.EqualTo(5000000000L).Within(5L));
-			Assert.That(5999999999ul, Is.EqualTo(6000000000ul).Within(5ul));
-		
-			// Inherited syntax
-			Expect(4.99d, EqualTo(5.0d).Within(0.05d));
-			Expect(4.0d, Not.EqualTo(5.0d).Within(0.5d));
-			Expect(4.99f, EqualTo(5.0f).Within(0.05f));
-			Expect(4.99m, EqualTo(5.0m).Within(0.05m));
-			Expect(499u, EqualTo(500u).Within(5u));
-			Expect(499, EqualTo(500).Within(5));
-			Expect(4999999999L, EqualTo(5000000000L).Within(5L));
-			Expect(5999999999ul, EqualTo(6000000000ul).Within(5ul));
-		}
-
-		[Test]
-		public void EqualityTestsWithTolerance_MixedFloatAndDouble()
-		{
-			// Bug Fix 1743844
-			Assert.That(2.20492d, Is.EqualTo(2.2d).Within(0.01f),
-				"Double actual, Double expected, Single tolerance");
-			Assert.That(2.20492d, Is.EqualTo(2.2f).Within(0.01d),
-				"Double actual, Single expected, Double tolerance" );
-			Assert.That(2.20492d, Is.EqualTo(2.2f).Within(0.01f),
-				"Double actual, Single expected, Single tolerance" );
-			Assert.That(2.20492f, Is.EqualTo(2.2f).Within(0.01d),
-				"Single actual, Single expected, Double tolerance");
-			Assert.That(2.20492f, Is.EqualTo(2.2d).Within(0.01d),
-				"Single actual, Double expected, Double tolerance");
-			Assert.That(2.20492f, Is.EqualTo(2.2d).Within(0.01f),
-				"Single actual, Double expected, Single tolerance");
-		}
-
-		[Test]
-			public void EqualityTestsWithTolerance_MixingTypesGenerally()
-		{
-			// Extending tolerance to all numeric types
-			Assert.That(202d, Is.EqualTo(200d).Within(2),
-				"Double actual, Double expected, int tolerance");
-			Assert.That( 4.87m, Is.EqualTo(5).Within(.25),
-				"Decimal actual, int expected, Double tolerance" );
-			Assert.That( 4.87m, Is.EqualTo(5ul).Within(1),
-				"Decimal actual, ulong expected, int tolerance" );
-			Assert.That( 487, Is.EqualTo(500).Within(25),
-				"int actual, int expected, int tolerance" );
-			Assert.That( 487u, Is.EqualTo(500).Within(25),
-				"uint actual, int expected, int tolerance" );
-			Assert.That( 487L, Is.EqualTo(500).Within(25),
-				"long actual, int expected, int tolerance" );
-			Assert.That( 487ul, Is.EqualTo(500).Within(25),
-				"ulong actual, int expected, int tolerance" );
-		}
-
-        [Test]
-        public void EqualityTestsUsingDefaultFloatingPointTolerance()
-        {
-            GlobalSettings.DefaultFloatingPointTolerance = 0.05d;
-
-            try
-            {
-                Assert.AreEqual(5.0d, 4.99d);
-                Assert.AreEqual(5.0f, 4.99f);
-
-                // Helper syntax
-                Assert.That(4.99d, Is.EqualTo(5.0d));
-                Assert.That(4.0d, Is.Not.EqualTo(5.0d));
-                Assert.That(4.99f, Is.EqualTo(5.0f));
-            }
-            finally
-            {
-                GlobalSettings.DefaultFloatingPointTolerance = 0.0d;
-            }
-        }
-		#endregion
-
-		#region Comparison Tests
-		[Test]
-		public void ComparisonTests()
-		{
-			// Classic Syntax
-			Assert.Greater(7, 3);
-			Assert.GreaterOrEqual(7, 3);
-			Assert.GreaterOrEqual(7, 7);
-
-			// Helper syntax
-			Assert.That(7, Is.GreaterThan(3));
-			Assert.That(7, Is.GreaterThanOrEqualTo(3));
-			Assert.That(7, Is.AtLeast(3));
-			Assert.That(7, Is.GreaterThanOrEqualTo(7));
-			Assert.That(7, Is.AtLeast(7));
-
-			// Inherited syntax
-			Expect(7, GreaterThan(3));
-			Expect(7, GreaterThanOrEqualTo(3));
-			Expect(7, AtLeast(3));
-			Expect(7, GreaterThanOrEqualTo(7));
-			Expect(7, AtLeast(7));
-
-			// Classic syntax
-			Assert.Less(3, 7);
-			Assert.LessOrEqual(3, 7);
-			Assert.LessOrEqual(3, 3);
-
-			// Helper syntax
-			Assert.That(3, Is.LessThan(7));
-			Assert.That(3, Is.LessThanOrEqualTo(7));
-			Assert.That(3, Is.AtMost(7));
-			Assert.That(3, Is.LessThanOrEqualTo(3));
-			Assert.That(3, Is.AtMost(3));
-		
-			// Inherited syntax
-			Expect(3, LessThan(7));
-			Expect(3, LessThanOrEqualTo(7));
-			Expect(3, AtMost(7));
-			Expect(3, LessThanOrEqualTo(3));
-			Expect(3, AtMost(3));
-		}
-		#endregion
-
-		#region Collection Tests
-		[Test]
-		public void AllItemsTests()
-		{
-			object[] ints = new object[] { 1, 2, 3, 4 };
-			object[] doubles = new object[] { 0.99, 2.1, 3.0, 4.05 };
-			object[] strings = new object[] { "abc", "bad", "cab", "bad", "dad" };
-
-			// Classic syntax
-			CollectionAssert.AllItemsAreNotNull(ints);
-			CollectionAssert.AllItemsAreInstancesOfType(ints, typeof(int));
-			CollectionAssert.AllItemsAreInstancesOfType(strings, typeof(string));
-			CollectionAssert.AllItemsAreUnique(ints);
-
-			// Helper syntax
-			Assert.That(ints, Is.All.Not.Null);
-			Assert.That(ints, Has.None.Null);
-			Assert.That(ints, Is.All.InstanceOfType(typeof(int)));
-			Assert.That(ints, Has.All.InstanceOfType(typeof(int)));
-			Assert.That(strings, Is.All.InstanceOfType(typeof(string)));
-			Assert.That(strings, Has.All.InstanceOfType(typeof(string)));
-			Assert.That(ints, Is.Unique);
-			// Only available using new syntax
-			Assert.That(strings, Is.Not.Unique);
-			Assert.That(ints, Is.All.GreaterThan(0));
-			Assert.That(ints, Has.All.GreaterThan(0));
-			Assert.That(ints, Has.None.LessThanOrEqualTo(0));
-			Assert.That(strings, Text.All.Contains( "a" ) );
-			Assert.That(strings, Has.All.Contains( "a" ) );
-			Assert.That(strings, Has.Some.StartsWith( "ba" ) );
-			Assert.That( strings, Has.Some.Property( "Length", 3 ) );
-			Assert.That( strings, Has.Some.StartsWith( "BA" ).IgnoreCase );
-			Assert.That( doubles, Has.Some.EqualTo( 1.0 ).Within( .05 ) );
-		
-			// Inherited syntax
-			Expect(ints, All.Not.Null);
-			Expect(ints, None.Null);
-			Expect(ints, All.InstanceOfType(typeof(int)));
-			Expect(strings, All.InstanceOfType(typeof(string)));
-			Expect(ints, Unique);
-			// Only available using new syntax
-			Expect(strings, Not.Unique);
-			Expect(ints, All.GreaterThan(0));
-			Expect(ints, None.LessThanOrEqualTo(0));
-			Expect(strings, All.Contains( "a" ) );
-			Expect(strings, Some.StartsWith( "ba" ) );
-			Expect(strings, Some.StartsWith( "BA" ).IgnoreCase );
-			Expect(doubles, Some.EqualTo( 1.0 ).Within( .05 ) );
-		}
-
-		[Test]
-		public void SomeItemTests()
-		{
-			object[] mixed = new object[] { 1, 2, "3", null, "four", 100 };
-			object[] strings = new object[] { "abc", "bad", "cab", "bad", "dad" };
-
-			// Not available using the classic syntax
-
-			// Helper syntax
-			Assert.That(mixed, Has.Some.Null);
-			Assert.That(mixed, Has.Some.InstanceOfType(typeof(int)));
-			Assert.That(mixed, Has.Some.InstanceOfType(typeof(string)));
-			Assert.That(strings, Has.Some.StartsWith( "ba" ) );
-			Assert.That(strings, Has.Some.Not.StartsWith( "ba" ) );
-		
-			// Inherited syntax
-			Expect(mixed, Some.Null);
-			Expect(mixed, Some.InstanceOfType(typeof(int)));
-			Expect(mixed, Some.InstanceOfType(typeof(string)));
-			Expect(strings, Some.StartsWith( "ba" ) );
-			Expect(strings, Some.Not.StartsWith( "ba" ) );
-		}
-
-		[Test]
-		public void NoItemTests()
-		{
-			object[] ints = new object[] { 1, 2, 3, 4, 5 };
-			object[] strings = new object[] { "abc", "bad", "cab", "bad", "dad" };
-
-			// Not available using the classic syntax
-
-			// Helper syntax
-			Assert.That(ints, Has.None.Null);
-			Assert.That(ints, Has.None.InstanceOfType(typeof(string)));
-			Assert.That(ints, Has.None.GreaterThan(99));
-			Assert.That(strings, Has.None.StartsWith( "qu" ) );
-		
-			// Inherited syntax
-			Expect(ints, None.Null);
-			Expect(ints, None.InstanceOfType(typeof(string)));
-			Expect(ints, None.GreaterThan(99));
-			Expect(strings, None.StartsWith( "qu" ) );
-		}
-
-		[Test]
-		public void CollectionContainsTests()
-		{
-			int[] iarray = new int[] { 1, 2, 3 };
-			string[] sarray = new string[] { "a", "b", "c" };
-
-			// Classic syntax
-			Assert.Contains(3, iarray);
-			Assert.Contains("b", sarray);
-			CollectionAssert.Contains(iarray, 3);
-			CollectionAssert.Contains(sarray, "b");
-			CollectionAssert.DoesNotContain(sarray, "x");
-			// Showing that Contains uses object equality
-			CollectionAssert.DoesNotContain( iarray, 1.0d );
-
-			// Helper syntax
-			Assert.That(iarray, Has.Member(3));
-			Assert.That(sarray, Has.Member("b"));
-			Assert.That(sarray, Has.No.Member("x"));
-			// Showing that Contains uses object equality
-			Assert.That(iarray, Has.No.Member( 1.0d ));
-
-			// Only available using the new syntax
-			// Note that EqualTo and SameAs do NOT give
-			// identical results to Contains because 
-			// Contains uses Object.Equals()
-			Assert.That(iarray, Has.Some.EqualTo(3));
-			Assert.That(iarray, Has.Member(3));
-			Assert.That(sarray, Has.Some.EqualTo("b"));
-			Assert.That(sarray, Has.None.EqualTo("x"));
-			Assert.That(iarray, Has.None.SameAs( 1.0d ));
-			Assert.That(iarray, Has.All.LessThan(10));
-			Assert.That(sarray, Has.All.Length(1));
-			Assert.That(sarray, Has.None.Property("Length").GreaterThan(3));
-		
-			// Inherited syntax
-			Expect(iarray, Contains(3));
-			Expect(sarray, Contains("b"));
-			Expect(sarray, Not.Contains("x"));
-
-			// Only available using new syntax
-			// Note that EqualTo and SameAs do NOT give
-			// identical results to Contains because 
-			// Contains uses Object.Equals()
-			Expect(iarray, Some.EqualTo(3));
-			Expect(sarray, Some.EqualTo("b"));
-			Expect(sarray, None.EqualTo("x"));
-			Expect(iarray, All.LessThan(10));
-			Expect(sarray, All.Length(1));
-			Expect(sarray, None.Property("Length").GreaterThan(3));
-		}
-
-		[Test]
-		public void CollectionEquivalenceTests()
-		{
-			int[] ints1to5 = new int[] { 1, 2, 3, 4, 5 };
-			int[] twothrees = new int[] { 1, 2, 3, 3, 4, 5 };
-			int[] twofours = new int[] { 1, 2, 3, 4, 4, 5 };
-
-		    // Classic syntax
-		    CollectionAssert.AreEquivalent(new int[] { 2, 1, 4, 3, 5 }, ints1to5);
-			CollectionAssert.AreNotEquivalent(new int[] { 2, 2, 4, 3, 5 }, ints1to5);
-			CollectionAssert.AreNotEquivalent(new int[] { 2, 4, 3, 5 }, ints1to5);
-			CollectionAssert.AreNotEquivalent(new int[] { 2, 2, 1, 1, 4, 3, 5 }, ints1to5);
-            CollectionAssert.AreNotEquivalent(twothrees, twofours); 
-		
-			// Helper syntax
-			Assert.That(new int[] { 2, 1, 4, 3, 5 }, Is.EquivalentTo(ints1to5));
-			Assert.That(new int[] { 2, 2, 4, 3, 5 }, Is.Not.EquivalentTo(ints1to5));
-			Assert.That(new int[] { 2, 4, 3, 5 }, Is.Not.EquivalentTo(ints1to5));
-			Assert.That(new int[] { 2, 2, 1, 1, 4, 3, 5 }, Is.Not.EquivalentTo(ints1to5));
-
-			// Inherited syntax
-			Expect(new int[] { 2, 1, 4, 3, 5 }, EquivalentTo(ints1to5));
-			Expect(new int[] { 2, 2, 4, 3, 5 }, Not.EquivalentTo(ints1to5));
-			Expect(new int[] { 2, 4, 3, 5 }, Not.EquivalentTo(ints1to5));
-			Expect(new int[] { 2, 2, 1, 1, 4, 3, 5 }, Not.EquivalentTo(ints1to5));
-		}
-
-		[Test]
-		public void SubsetTests()
-		{
-			int[] ints1to5 = new int[] { 1, 2, 3, 4, 5 };
-
-			// Classic syntax
-			CollectionAssert.IsSubsetOf(new int[] { 1, 3, 5 }, ints1to5);
-			CollectionAssert.IsSubsetOf(new int[] { 1, 2, 3, 4, 5 }, ints1to5);
-			CollectionAssert.IsNotSubsetOf(new int[] { 2, 4, 6 }, ints1to5);
-			CollectionAssert.IsNotSubsetOf(new int[] { 1, 2, 2, 2, 5 }, ints1to5);
-
-			// Helper syntax
-			Assert.That(new int[] { 1, 3, 5 }, Is.SubsetOf(ints1to5));
-			Assert.That(new int[] { 1, 2, 3, 4, 5 }, Is.SubsetOf(ints1to5));
-			Assert.That(new int[] { 2, 4, 6 }, Is.Not.SubsetOf(ints1to5));
-		
-			// Inherited syntax
-			Expect(new int[] { 1, 3, 5 }, SubsetOf(ints1to5));
-			Expect(new int[] { 1, 2, 3, 4, 5 }, SubsetOf(ints1to5));
-			Expect(new int[] { 2, 4, 6 }, Not.SubsetOf(ints1to5));
-		}
-		#endregion
-
-		#region Property Tests
-		[Test]
-		public void PropertyTests()
-		{
-			string[] array = { "abc", "bca", "xyz", "qrs" };
-			string[] array2 = { "a", "ab", "abc" };
-			ArrayList list = new ArrayList( array );
-
-			// Not available using the classic syntax
-
-			// Helper syntax
-			Assert.That( list, Has.Property( "Count" ) );
-			Assert.That( list, Has.No.Property( "Length" ) );
-
-			Assert.That( "Hello", Has.Property("Length", 5) );
-			Assert.That( "Hello", Has.Length( 5 ) );
-			Assert.That( "Hello", Has.Property("Length").EqualTo(5) );
-			Assert.That( "Hello", Has.Property("Length").GreaterThan(3) );
-
-			Assert.That( array, Has.Property( "Length", 4 ) );
-			Assert.That( array, Has.Length( 4 ) );
-			Assert.That( array, Has.Property( "Length" ).LessThan( 10 ) );
-
-			Assert.That( array, Has.All.Property("Length", 3) );
-			Assert.That( array, Has.All.Length( 3 ) );
-			Assert.That( array, Is.All.Length( 3 ) );
-			Assert.That( array, Has.All.Property("Length").EqualTo(3) );
-			Assert.That( array, Is.All.Property("Length").EqualTo(3) );
-			Assert.That( array, Has.None.Property("Length").Not.EqualTo(3) );
-
-			Assert.That( array2, Has.Some.Property("Length", 2) );
-			Assert.That( array2, Has.Some.Length(2) );
-			Assert.That( array2, Has.Some.Property("Length").GreaterThan(2) );
-			Assert.That( array2, Has.No.Property("Length").GreaterThan(3) );
-
-			Assert.That( array2, Is.Not.Property("Length", 4) );
-			Assert.That( array2, Is.Not.Length( 4 ) );
-			Assert.That( array2, Has.No.Property("Length").GreaterThan(3) );
-
-			Assert.That( List.Map( array2 ).Property("Length"), Is.EqualTo( new int[] { 1, 2, 3 } ) );
-			Assert.That( List.Map( array2 ).Property("Length"), Is.EquivalentTo( new int[] { 3, 2, 1 } ) );
-			Assert.That( List.Map( array2 ).Property("Length"), Is.SubsetOf( new int[] { 1, 2, 3, 4, 5 } ) );
-			Assert.That( List.Map( array2 ).Property("Length"), Is.Unique );
-
-			Assert.That( list, Has.Count( 4 ) );
-			
-			// Inherited syntax
-			Expect( list, Property( "Count" ) );
-			Expect( list, Not.Property( "Nada" ) );
-
-			Expect( "Hello", Property("Length", 5) );
-			Expect( "Hello", Length( 5 ) );
-			Expect( "Hello", Property("Length").EqualTo(5) );
-			Expect( "Hello", Property("Length").GreaterThan(0) );
-
-			Expect( array, Property("Length", 4) );
-			Expect( array, Length(4) );
-			Expect( array, Property("Length").LessThan(10));
-
-			Expect( array, All.Property("Length", 3 ) );
-			Expect( array, All.Length( 3 ) );
-			Expect( array, All.Property("Length").EqualTo(3));
-
-			Expect( array2, Some.Property("Length", 2) );
-			Expect( array2, Some.Length( 2 ) );
-			Expect( array2, Some.Property("Length").GreaterThan(2));
-
-			Expect( array2, None.Property("Length", 4) );
-			Expect( array2, None.Length( 4 ) );
-			Expect( array2, None.Property("Length").GreaterThan(3));
-
-			Expect( Map( array2 ).Property("Length"), EqualTo( new int[] { 1, 2, 3 } ) );
-			Expect( Map( array2 ).Property("Length"), EquivalentTo( new int[] { 3, 2, 1 } ) );
-			Expect( Map( array2 ).Property("Length"), SubsetOf( new int[] { 1, 2, 3, 4, 5 } ) );
-			Expect( Map( array2 ).Property("Length"), Unique );
-
-			Expect( list, Count( 4 ) );
-
-		}
-
-		[Test, ExpectedException( typeof(AssertionException) )]
-		public void PropertyTests_DoesNotExistFails()
-		{
-			object[] array = new object[] { 1, "two", 3, null };
-			Assert.That( array, Has.None.Property( "Length" ) );
-		}
-			
-		#endregion
-
-		#region Not Tests
-		[Test]
-		public void NotTests()
-		{
-			// Not available using the classic syntax
-
-			// Helper syntax
-			Assert.That(42, Is.Not.Null);
-			Assert.That(42, Is.Not.True);
-			Assert.That(42, Is.Not.False);
-			Assert.That(2.5, Is.Not.NaN);
-			Assert.That(2 + 2, Is.Not.EqualTo(3));
-			Assert.That(2 + 2, Is.Not.Not.EqualTo(4));
-			Assert.That(2 + 2, Is.Not.Not.Not.EqualTo(5));
-
-			// Inherited syntax
-			Expect(42, Not.Null);
-			Expect(42, Not.True);
-			Expect(42, Not.False);
-			Expect(2.5, Not.NaN);
-			Expect(2 + 2, Not.EqualTo(3));
-			Expect(2 + 2, Not.Not.EqualTo(4));
-			Expect(2 + 2, Not.Not.Not.EqualTo(5));
-		}
-		#endregion
-
-		#region Operator Tests
-		[Test]
-		public void NotOperator()
-		{
-			// The ! operator is only available in the new syntax
-			Assert.That(42, !Is.Null);
-			// Inherited syntax
-			Expect( 42, !Null );
-		}
-
-		[Test]
-		public void AndOperator()
-		{
-			// The & operator is only available in the new syntax
-			Assert.That(7, Is.GreaterThan(5) & Is.LessThan(10));
-			// Inherited syntax
-			Expect( 7, GreaterThan(5) & LessThan(10));
-		}
-
-		[Test]
-		public void OrOperator()
-		{
-			// The | operator is only available in the new syntax
-			Assert.That(3, Is.LessThan(5) | Is.GreaterThan(10));
-			Expect( 3, LessThan(5) | GreaterThan(10));
-		}
-
-		[Test]
-		public void ComplexTests()
-		{
-			Assert.That(7, Is.Not.Null & Is.Not.LessThan(5) & Is.Not.GreaterThan(10));
-			Expect(7, Not.Null & Not.LessThan(5) & Not.GreaterThan(10));
-
-			Assert.That(7, !Is.Null & !Is.LessThan(5) & !Is.GreaterThan(10));
-			Expect(7, !Null & !LessThan(5) & !GreaterThan(10));
-
-			// TODO: Remove #if when mono compiler can handle null
-#if MONO
-            Constraint x = null;
-            Assert.That(7, !x & !Is.LessThan(5) & !Is.GreaterThan(10));
-			Expect(7, !x & !LessThan(5) & !GreaterThan(10));
-#else
-			Assert.That(7, !(Constraint)null & !Is.LessThan(5) & !Is.GreaterThan(10));
-			Expect(7, !(Constraint)null & !LessThan(5) & !GreaterThan(10));
-#endif
-		}
-		#endregion
- 
-		#region Invalid Code Tests
-		// This method contains assertions that should not compile
-		// You can check by uncommenting it.
-		//public void WillNotCompile()
-		//{
-		//    Assert.That(42, Is.Not);
-		//    Assert.That(42, Is.All);
-		//    Assert.That(42, Is.Null.Not);
-		//    Assert.That(42, Is.Not.Null.GreaterThan(10));
-		//    Assert.That(42, Is.GreaterThan(10).LessThan(99));
-
-		//    object[] c = new object[0];
-		//    Assert.That(c, Is.Null.All);
-		//    Assert.That(c, Is.Not.All);
-		//    Assert.That(c, Is.All.Not);
-		//}
-		#endregion
-	}
-
-}
diff --git a/src/NUnitFramework/tests/AssertThrowsTests.cs b/src/NUnitFramework/tests/AssertThrowsTests.cs
new file mode 100644
index 0000000..7810213
--- /dev/null
+++ b/src/NUnitFramework/tests/AssertThrowsTests.cs
@@ -0,0 +1,184 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+using System;
+//using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework.Tests
+{
+	[TestFixture]
+	public class AssertThrowsTests : MessageChecker
+	{
+        [Test]
+        public void CanCatchUnspecifiedException()
+        {
+            Exception ex = Assert.Catch(new TestDelegate(TestDelegates.ThrowsArgumentException));
+            Assert.That(ex, Is.TypeOf(typeof(ArgumentException)));
+
+#if NET_2_0
+            ex = Assert.Catch(TestDelegates.ThrowsArgumentException);
+            Assert.That(ex, Is.TypeOf(typeof(ArgumentException)));
+#endif
+        }
+
+        [Test]
+        public void CanCatchExceptionOfExactType()
+        {
+            Exception ex = Assert.Catch(typeof(ArgumentException), new TestDelegate(TestDelegates.ThrowsArgumentException));
+            Assert.That(ex, Is.TypeOf(typeof(ArgumentException)));
+
+#if NET_2_0
+            ex = Assert.Catch<ArgumentException>(new TestDelegate(TestDelegates.ThrowsArgumentException));
+            Assert.That(ex, Is.TypeOf(typeof(ArgumentException)));
+#endif
+        }
+
+        [Test]
+        public void CanCatchExceptionOfDerivedType()
+        {
+            Exception ex = Assert.Catch(typeof(ApplicationException), new TestDelegate(TestDelegates.ThrowsDerivedApplicationException));
+            Assert.That(ex, Is.TypeOf(typeof(TestDelegates.DerivedApplicationException)));
+
+#if NET_2_0
+            ex = Assert.Catch<ApplicationException>(TestDelegates.ThrowsDerivedApplicationException);
+            Assert.That(ex, Is.TypeOf(typeof(TestDelegates.DerivedApplicationException)));
+#endif
+        }
+
+        [Test]
+		public void CorrectExceptionThrown()
+		{
+#if NET_2_0
+            Assert.Throws(typeof(ArgumentException), TestDelegates.ThrowsArgumentException);
+            Assert.Throws(typeof(ArgumentException),
+                delegate { throw new ArgumentException(); });
+
+            Assert.Throws<ArgumentException>(
+                delegate { throw new ArgumentException(); });
+            Assert.Throws<ArgumentException>(TestDelegates.ThrowsArgumentException);
+
+            // Without cast, delegate is ambiguous before C# 3.0.
+            Assert.That((TestDelegate)delegate { throw new ArgumentException(); },
+                    Throws.Exception.TypeOf<ArgumentException>() );
+            //Assert.Throws( Is.TypeOf(typeof(ArgumentException)),
+            //        delegate { throw new ArgumentException(); } );
+#else
+			Assert.Throws(typeof(ArgumentException),
+				new TestDelegate( TestDelegates.ThrowsArgumentException ) );
+#endif
+        }
+
+		[Test]
+		public void CorrectExceptionIsReturnedToMethod()
+		{
+			ArgumentException ex = Assert.Throws(typeof(ArgumentException),
+                new TestDelegate(TestDelegates.ThrowsArgumentException)) as ArgumentException;
+
+            Assert.IsNotNull(ex, "No ArgumentException thrown");
+            Assert.That(ex.Message, StartsWith("myMessage"));
+            Assert.That(ex.ParamName, Is.EqualTo("myParam"));
+
+#if NET_2_0
+            ex = Assert.Throws<ArgumentException>(
+                delegate { throw new ArgumentException("myMessage", "myParam"); }) as ArgumentException;
+
+            Assert.IsNotNull(ex, "No ArgumentException thrown");
+            Assert.That(ex.Message, StartsWith("myMessage"));
+            Assert.That(ex.ParamName, Is.EqualTo("myParam"));
+
+			ex = Assert.Throws(typeof(ArgumentException), 
+                delegate { throw new ArgumentException("myMessage", "myParam"); } ) as ArgumentException;
+
+            Assert.IsNotNull(ex, "No ArgumentException thrown");
+            Assert.That(ex.Message, StartsWith("myMessage"));
+            Assert.That(ex.ParamName, Is.EqualTo("myParam"));
+
+            ex = Assert.Throws<ArgumentException>(TestDelegates.ThrowsArgumentException) as ArgumentException;
+
+            Assert.IsNotNull(ex, "No ArgumentException thrown");
+            Assert.That(ex.Message, StartsWith("myMessage"));
+            Assert.That(ex.ParamName, Is.EqualTo("myParam"));
+#endif
+		}
+
+		[Test, ExpectedException(typeof(AssertionException))]
+		public void NoExceptionThrown()
+		{
+			expectedMessage =
+				"  Expected: <System.ArgumentException>" + Environment.NewLine +
+				"  But was:  null" + Environment.NewLine;
+#if NET_2_0
+            Assert.Throws<ArgumentException>(TestDelegates.ThrowsNothing);
+#else
+			Assert.Throws( typeof(ArgumentException),
+				new TestDelegate( TestDelegates.ThrowsNothing ) );
+#endif
+		}
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void UnrelatedExceptionThrown()
+        {
+            expectedMessage =
+                "  Expected: <System.ArgumentException>" + Environment.NewLine +
+                "  But was:  <System.ApplicationException>" + Environment.NewLine;
+#if NET_2_0
+            Assert.Throws<ArgumentException>(TestDelegates.ThrowsApplicationException);
+#else
+			Assert.Throws( typeof(ArgumentException),
+				new TestDelegate(TestDelegates.ThrowsApplicationException) );
+#endif
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void BaseExceptionThrown()
+        {
+            expectedMessage =
+                "  Expected: <System.ArgumentException>" + Environment.NewLine +
+                "  But was:  <System.Exception>" + Environment.NewLine;
+#if NET_2_0
+            Assert.Throws<ArgumentException>(TestDelegates.ThrowsSystemException);
+#else
+            Assert.Throws( typeof(ArgumentException),
+                new TestDelegate( TestDelegates.ThrowsSystemException) );
+#endif
+        }
+
+        [Test,ExpectedException(typeof(AssertionException))]
+        public void DerivedExceptionThrown()
+        {
+            expectedMessage =
+                "  Expected: <System.Exception>" + Environment.NewLine +
+                "  But was:  <System.ArgumentException>" + Environment.NewLine;
+#if NET_2_0
+            Assert.Throws<Exception>(TestDelegates.ThrowsArgumentException);
+#else
+            Assert.Throws( typeof(Exception),
+				new TestDelegate( TestDelegates.ThrowsArgumentException) );
+#endif
+        }
+
+        [Test]
+        public void DoesNotThrowSuceeds()
+        {
+#if NET_2_0
+            Assert.DoesNotThrow(TestDelegates.ThrowsNothing);
+#else
+            Assert.DoesNotThrow( new TestDelegate( TestDelegates.ThrowsNothing ) );
+
+			Assert.That( new TestDelegate( TestDelegates.ThrowsNothing ), Throws.Nothing );
+#endif
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void DoesNotThrowFails()
+        {
+#if NET_2_0
+            Assert.DoesNotThrow(TestDelegates.ThrowsArgumentException);
+#else
+            Assert.DoesNotThrow( new TestDelegate( TestDelegates.ThrowsArgumentException ) );
+#endif
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/AssertionTest.cs b/src/NUnitFramework/tests/AssertionTest.cs
deleted file mode 100644
index f92f496..0000000
--- a/src/NUnitFramework/tests/AssertionTest.cs
+++ /dev/null
@@ -1,440 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-namespace NUnit.Framework.Tests
-{
-	using System;
-	using NUnit.Framework;
-
-	[TestFixture]
-	public class AssertionTest
-	{
-		private string expected;
-
-		[SetUp]
-		public void SetUp() 
-		{
-			expected = "Hello NUnit";
-		}
-
-		[Test]
-		public void AssertEquals()
-		{
-			Assertion.AssertEquals(expected, expected);
-		}
-
-		[Test]
-		public void Bug1076043AreEqualsNotTransitiveForDecimal()
-		{
-			decimal d1 = 123M;
-			d1 /= 10M;
-			decimal d2 = Decimal.Parse("012.300", System.Globalization.CultureInfo.InvariantCulture);
-			decimal d3 = 12.30M;
-
-			Assert.AreEqual(d1, d2, "1");
-			Assert.AreEqual(d1, d3, "2");
-			Assert.AreEqual(d2, d3, "3");
-
-			object o1 = d1;
-			object o2 = d2;
-			object o3 = d3;
-
-			Assert.AreEqual(o1, d1, "4");
-			Assert.AreEqual(o2, d2, "5");
-			Assert.AreEqual(o3, d3, "6");
-
-			Assert.AreEqual(o1, o2, "7");
-			Assert.AreEqual(o1, o3, "8");
-			Assert.AreEqual(o2, o3, "9");
-		}
-
-		[Test]
-		public void Bug575936Int32Int64Comparison()
-		{
-			long l64 = 0;
-			int i32 = 0;
-			Assertion.AssertEquals(i32, l64);
-		}
-
-		[Test]
-		public void IntegerLongComparison()
-		{
-			Assertion.AssertEquals(1, 1L);
-			Assertion.AssertEquals(1L, 1);
-		}
-
-		[Test]
-		public void AssertEqualsFail()
-		{
-			string actual = "Goodbye JUnit";
-			Assertion.Assert(!expected.Equals(actual));
-		}
-
-		[Test]
-		[ExpectedException(typeof(AssertionException))]
-		public void AssertEqualsTestCaseFail()
-		{
-			string actual = "Goodbye JUnit";
-			Assertion.AssertEquals("should not be equal", expected, actual);
-		}
-
-
-		/// <summary>
-		/// 
-		/// </summary>
-		[Test]
-		public void AssertEqualsNaNFails() 
-		{
-			try 
-			{
-				Assertion.AssertEquals(1.234, Double.NaN, 0.0);
-			} 
-			catch (AssertionException) 
-			{
-				return;
-			}
-			Assertion.Fail();
-		}    
-
-		/// <summary>
-		/// 
-		/// </summary>
-		[Test]
-		public void AssertEqualsNull() 
-		{
-			Assertion.AssertEquals(null, null);
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		[Test]
-		public void AssertNanEqualsFails() 
-		{
-			try 
-			{
-				Assertion.AssertEquals(Double.NaN, 1.234, 0.0);
-			} 
-			catch (AssertionException) 
-			{
-				return;
-			}
-			Assertion.Fail();
-		}     
-
-		/// <summary>
-		/// 
-		/// </summary>
-		[Test]
-		public void AssertNanEqualsNaNSucceeds() 
-		{
-			Assertion.AssertEquals(Double.NaN, Double.NaN, 0.0);
-		}     
-
-		/// <summary>
-		/// 
-		/// </summary>
-		[Test]
-		public void AssertNegInfinityEqualsInfinity() 
-		{
-			Assertion.AssertEquals(Double.NegativeInfinity, Double.NegativeInfinity, 0.0);
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		[Test]
-		public void AssertPosInfinityEqualsInfinity() 
-		{
-			Assertion.AssertEquals(Double.PositiveInfinity, Double.PositiveInfinity, 0.0);
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		[Test]
-		public void AssertPosInfinityNotEquals() 
-		{
-			try 
-			{
-				Assertion.AssertEquals(Double.PositiveInfinity, 1.23, 0.0);
-			} 
-			catch (AssertionException) 
-			{
-				return;
-			}
-			Assertion.Fail();
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		[Test]
-		public void AssertPosInfinityNotEqualsNegInfinity() 
-		{
-			try 
-			{
-				Assertion.AssertEquals(Double.PositiveInfinity, Double.NegativeInfinity, 0.0);
-			} 
-			catch (AssertionException) 
-			{
-				return;
-			}
-			Assertion.Fail();
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		[Test]
-		public void AssertSinglePosInfinityNotEqualsNegInfinity() 
-		{
-			try 
-			{
-				Assertion.AssertEquals(float.PositiveInfinity, float.NegativeInfinity, (float)0.0);
-			} 
-			catch (AssertionException) 
-			{
-				return;
-			}
-			Assertion.Fail();
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		[Test]
-		public void AssertSingle() 
-		{
-			Assertion.AssertEquals((float)1.0, (float)1.0, (float)0.0);
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		[Test]
-		public void AssertByte() 
-		{
-			Assertion.AssertEquals((byte)1, (byte)1);
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		[Test]
-		public void AssertString() 
-		{
-			string s1 = "test";
-			string s2 = new System.Text.StringBuilder(s1).ToString();
-			Assertion.AssertEquals(s1,s2);
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		[Test]
-		public void AssertShort() 
-		{
-			Assertion.AssertEquals((short)1,(short)1);
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		[Test]
-		public void AssertNull() 
-		{
-			Assertion.AssertNull(null);
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		[Test]
-		public void AssertNullNotEqualsNull() 
-		{
-			try 
-			{
-				Assertion.AssertEquals(null, new Object());
-			} 
-			catch (AssertionException) 
-			{
-				return;
-			}
-			Assertion.Fail();
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		[Test]
-		public void AssertSame() 
-		{
-			Object o= new Object();
-			Assertion.AssertSame(o, o);
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		[Test]
-		public void AssertSameFails() 
-		{
-			try 
-			{
-				object one = 1;
-				object two = 1;
-				Assertion.AssertSame(one, two);
-			} 
-			catch (AssertionException) 
-			{
-				return;
-			}
-			Assertion.Fail();
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		[Test]
-		public void Fail() 
-		{
-			try 
-			{
-				Assertion.Fail();
-			} 
-			catch (AssertionException) 
-			{
-				return;
-			}
-			throw new AssertionException("fail"); // You can't call fail() here
-		}
-
-		[Test]
-		public void Bug561909FailInheritsFromSystemException() 
-		{
-			try 
-			{
-				Assertion.Fail();
-			} 
-			catch (System.Exception) 
-			{
-				return;
-			}
-			throw new AssertionException("fail"); // You can't call fail() here
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		[Test]
-		public void FailAssertNotNull() 
-		{
-			try 
-			{
-				Assertion.AssertNotNull(null);
-			} 
-			catch (AssertionException) 
-			{
-				return;
-			}
-			Assertion.Fail();
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		/// 
-		[Test]
-		public void SucceedAssertNotNull() 
-		{
-			Assertion.AssertNotNull(new Object());
-		}
-
-		/// <summary>
-		/// Checks to see that a value comparison works with all types.
-		/// Current version has problems when value is the same but the
-		/// types are different...C# is not like Java, and doesn't automatically
-		/// perform value type conversion to simplify this type of comparison.
-		/// 
-		/// Related to Bug575936Int32Int64Comparison, but covers all numeric
-		/// types.
-		/// </summary>
-		[Test]
-		public void AssertEqualsSameTypes()
-		{
-			byte      b1 = 35;
-			sbyte    sb2 = 35;
-			decimal   d4 = 35;
-			double    d5 = 35;
-			float     f6 = 35;
-			int       i7 = 35;
-			uint      u8 = 35;
-			long      l9 = 35;
-			short    s10 = 35;
-			ushort  us11 = 35;
-
-			System.Byte    b12  = 35;  
-			System.SByte   sb13 = 35; 
-			System.Decimal d14  = 35; 
-			System.Double  d15  = 35; 
-			System.Single  s16  = 35; 
-			System.Int32   i17  = 35; 
-			System.UInt32  ui18 = 35; 
-			System.Int64   i19  = 35; 
-			System.UInt64  ui20 = 35; 
-			System.Int16   i21  = 35; 
-			System.UInt16  i22  = 35;
-
-			Assertion.AssertEquals( 35, b1 );
-			Assertion.AssertEquals( 35, sb2 );
-			Assertion.AssertEquals( 35, d4 );
-			Assertion.AssertEquals( 35, d5 );
-			Assertion.AssertEquals( 35, f6 );
-			Assertion.AssertEquals( 35, i7 );
-			Assertion.AssertEquals( 35, u8 );
-			Assertion.AssertEquals( 35, l9 );
-			Assertion.AssertEquals( 35, s10 );
-			Assertion.AssertEquals( 35, us11 );
-
-			Assertion.AssertEquals( 35, b12  );
-			Assertion.AssertEquals( 35, sb13 );
-			Assertion.AssertEquals( 35, d14  );
-			Assertion.AssertEquals( 35, d15  );
-			Assertion.AssertEquals( 35, s16  );
-			Assertion.AssertEquals( 35, i17  );
-			Assertion.AssertEquals( 35, ui18 );
-			Assertion.AssertEquals( 35, i19  );
-			Assertion.AssertEquals( 35, ui20 );
-			Assertion.AssertEquals( 35, i21  );
-			Assertion.AssertEquals( 35, i22  );
-		}
-
-		[Test]
-		public void SucceedAssertFail()
-		{
-			Assert.IsFalse(false);
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		[Test]
-		public void FailAssertFalse() 
-		{
-			try 
-			{
-				Assert.IsFalse(true);
-			} 
-			catch (AssertionException) 
-			{
-				return;
-			}
-			Assert.Fail();
-		}
-	}
-}
-
diff --git a/src/NUnitFramework/tests/AssumeThatTests.cs b/src/NUnitFramework/tests/AssumeThatTests.cs
new file mode 100644
index 0000000..34d923a
--- /dev/null
+++ b/src/NUnitFramework/tests/AssumeThatTests.cs
@@ -0,0 +1,174 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using NUnit.Framework;
+
+namespace NUnit.Framework.Tests
+{
+    [TestFixture]
+    public class AssumeThatTests
+    {
+        [Test]
+        public void AssumptionPasses_Boolean()
+        {
+            Assume.That(2 + 2 == 4);
+        }
+
+        [Test]
+        public void AssumptionPasses_BooleanWithMessage()
+        {
+            Assume.That(2 + 2 == 4, "Not Equal");
+        }
+
+        [Test]
+        public void AssumptionPasses_BooleanWithMessageAndArgs()
+        {
+            Assume.That(2 + 2 == 4, "Not Equal to {0}", 4);
+        }
+
+        [Test]
+        public void AssumptionPasses_ActualAndConstraint()
+        {
+            Assume.That(2 + 2, Is.EqualTo(4));
+        }
+
+        [Test]
+        public void AssumptionPasses_ActualAndConstraintWithMessage()
+        {
+            Assume.That(2 + 2, Is.EqualTo(4), "Should be 4");
+        }
+
+        [Test]
+        public void AssumptionPasses_ActualAndConstraintWithMessageAndArgs()
+        {
+            Assume.That(2 + 2, Is.EqualTo(4), "Should be {0}", 4);
+        }
+
+        [Test]
+        public void AssumptionPasses_ReferenceAndConstraint()
+        {
+            bool value = true;
+            Assume.That(ref value, Is.True);
+        }
+
+        [Test]
+        public void AssumptionPasses_ReferenceAndConstraintWithMessage()
+        {
+            bool value = true;
+            Assume.That(ref value, Is.True, "Message");
+        }
+
+        [Test]
+        public void AssumptionPasses_ReferenceAndConstraintWithMessageAndArgs()
+        {
+            bool value = true;
+            Assume.That(ref value, Is.True, "Message", 42);
+        }
+
+        [Test]
+        public void AssumptionPasses_DelegateAndConstraint()
+        {
+            Assume.That(new Constraints.ActualValueDelegate(ReturnsFour), Is.EqualTo(4));
+        }
+
+        [Test]
+        public void AssumptionPasses_DelegateAndConstraintWithMessage()
+        {
+            Assume.That(new Constraints.ActualValueDelegate(ReturnsFour), Is.EqualTo(4), "Message");
+        }
+
+        [Test]
+        public void AssumptionPasses_DelegateAndConstraintWithMessageAndArgs()
+        {
+            Assume.That(new Constraints.ActualValueDelegate(ReturnsFour), Is.EqualTo(4), "Should be {0}", 4);
+        }
+
+        private object ReturnsFour()
+        {
+            return 4;
+        }
+
+        [Test, ExpectedException(typeof(InconclusiveException))]
+        public void FailureThrowsInconclusiveException_Boolean()
+        {
+            Assume.That(2 + 2 == 5);
+        }
+
+        [Test, ExpectedException(typeof(InconclusiveException))]
+        public void FailureThrowsInconclusiveException_BooleanWithMessage()
+        {
+            Assume.That(2 + 2 == 5, "message");
+        }
+
+        [Test, ExpectedException(typeof(InconclusiveException))]
+        public void FailureThrowsInconclusiveException_BooleanWithMessageAndArgs()
+        {
+            Assume.That(2 + 2 == 5, "message", 5);
+        }
+
+        [Test, ExpectedException(typeof(InconclusiveException))]
+        public void FailureThrowsInconclusiveException_ActualAndConstraint()
+        {
+            Assume.That(2 + 2, Is.EqualTo(5));
+        }
+
+        [Test, ExpectedException(typeof(InconclusiveException))]
+        public void FailureThrowsInconclusiveException_ActualAndConstraintWithMessage()
+        {
+            Assume.That(2 + 2, Is.EqualTo(5), "Error");
+        }
+
+        [Test, ExpectedException(typeof(InconclusiveException))]
+        public void FailureThrowsInconclusiveException_ActualAndConstraintWithMessageAndArgs()
+        {
+            Assume.That(2 + 2, Is.EqualTo(5), "Should be {0}", 5);
+        }
+
+        [Test, ExpectedException(typeof(InconclusiveException))]
+        public void FailureThrowsInconclusiveException_ReferenceAndConstraint()
+        {
+            bool value = false;
+            Assume.That(ref value, Is.True);
+        }
+
+        [Test, ExpectedException(typeof(InconclusiveException))]
+        public void FailureThrowsInconclusiveException_ReferenceAndConstraintWithMessage()
+        {
+            bool value = false;
+            Assume.That(ref value, Is.True, "message");
+        }
+
+        [Test, ExpectedException(typeof(InconclusiveException))]
+        public void FailureThrowsInconclusiveException_ReferenceAndConstraintWithMessageAndArgs()
+        {
+            bool value = false;
+            Assume.That(ref value, Is.True, "message", 42);
+        }
+
+        [Test, ExpectedException(typeof(InconclusiveException))]
+        public void FailureThrowsInconclusiveException_DelegateAndConstraint()
+        {
+            Assume.That(new Constraints.ActualValueDelegate(ReturnsFive), Is.EqualTo(4));
+        }
+
+        [Test, ExpectedException(typeof(InconclusiveException))]
+        public void FailureThrowsInconclusiveException_DelegateAndConstraintWithMessage()
+        {
+            Assume.That(new Constraints.ActualValueDelegate(ReturnsFive), Is.EqualTo(4), "Error");
+        }
+
+        [Test, ExpectedException(typeof(InconclusiveException))]
+        public void FailureThrowsInconclusiveException_DelegateAndConstraintWithMessageAndArgs()
+        {
+            Assume.That(new Constraints.ActualValueDelegate(ReturnsFive), Is.EqualTo(4), "Should be {0}", 4);
+        }
+
+        private object ReturnsFive()
+        {
+            return 5;
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/CollectionAdapter.cs b/src/NUnitFramework/tests/CollectionAdapter.cs
index fafa8b4..6fad66b 100644
--- a/src/NUnitFramework/tests/CollectionAdapter.cs
+++ b/src/NUnitFramework/tests/CollectionAdapter.cs
@@ -1,7 +1,6 @@
 // ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitFramework/tests/CollectionAssertTest.cs b/src/NUnitFramework/tests/CollectionAssertTest.cs
index 131ea31..ea0c4c1 100644
--- a/src/NUnitFramework/tests/CollectionAssertTest.cs
+++ b/src/NUnitFramework/tests/CollectionAssertTest.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -194,7 +194,23 @@ namespace NUnit.Framework.Tests
 
 			CollectionAssert.AreEqual(array1, array2, new AlwaysEqualComparer());
 		}
-	
+
+#if NET_2_0
+        [Test]
+        public void AreEqual_UsingIterator()
+        {
+            int[] array = new int[] { 1, 2, 3 };
+
+            CollectionAssert.AreEqual(array, CountToThree());
+        }
+
+        IEnumerable CountToThree()
+        {
+            yield return 1;
+            yield return 2;
+            yield return 3;
+        }
+#endif
 		#endregion
 
 		#region AreEquivalent
@@ -576,14 +592,110 @@ namespace NUnit.Framework.Tests
 			CollectionAssert.IsNotSubsetOf(set1,set2);
 		}
 		#endregion
-	}
+
+        #region IsOrdered
+
+        [Test]
+        public void IsOrdered()
+        {
+            ArrayList al = new ArrayList();
+            al.Add("x");
+            al.Add("y");
+            al.Add("z");
+
+            CollectionAssert.IsOrdered(al);
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void IsOrdered_Fails()
+        {
+            ArrayList al = new ArrayList();
+            al.Add("x");
+            al.Add("z");
+            al.Add("y");
+
+            expectedMessage =
+                "  Expected: collection ordered" + Environment.NewLine +
+                "  But was:  < \"x\", \"z\", \"y\" >" + Environment.NewLine;
+
+            CollectionAssert.IsOrdered(al);
+        }
+
+        [Test]
+        public void IsOrdered_Allows_adjacent_equal_values()
+        {
+            ArrayList al = new ArrayList();
+            al.Add("x");
+            al.Add("x");
+            al.Add("z");
+
+            CollectionAssert.IsOrdered(al);
+        }
+
+        [Test, ExpectedException(typeof(ArgumentNullException),
+            ExpectedMessage = "index 1", MatchType = MessageMatch.Contains)]
+        public void IsOrdered_Handles_null()
+        {
+            ArrayList al = new ArrayList();
+            al.Add("x");
+            al.Add(null);
+            al.Add("z");
+
+            CollectionAssert.IsOrdered(al);
+        }
+
+        [Test, ExpectedException(typeof(ArgumentException))]
+        public void IsOrdered_ContainedTypesMustBeCompatible()
+        {
+            ArrayList al = new ArrayList();
+            al.Add(1);
+            al.Add("x");
+
+            CollectionAssert.IsOrdered(al);
+        }
+
+        [Test, ExpectedException(typeof(ArgumentException))]
+        public void IsOrdered_TypesMustImplementIComparable()
+        {
+            ArrayList al = new ArrayList();
+            al.Add(new object());
+            al.Add(new object());
+
+            CollectionAssert.IsOrdered(al);
+        }
+
+        [Test]
+        public void IsOrdered_Handles_custom_comparison()
+        {
+            ArrayList al = new ArrayList();
+            al.Add(new object());
+            al.Add(new object());
+
+            CollectionAssert.IsOrdered(al, new AlwaysEqualComparer());
+        }
+
+        [Test]
+        public void IsOrdered_Handles_custom_comparison2()
+        {
+            ArrayList al = new ArrayList();
+            al.Add(2);
+            al.Add(1);
+
+            CollectionAssert.IsOrdered(al, new TestComparer());
+        }
+
+        #endregion
+    }
 
 	public class TestComparer : IComparer
 	{
-		#region IComparer Members
-
+        public bool Called = false;
+        
+        #region IComparer Members
 		public int Compare(object x, object y)
 		{
+            Called = true;
+
 			if ( x == null && y == null )
 				return 0;
 
@@ -595,15 +707,17 @@ namespace NUnit.Framework.Tests
 
 			return -1;
 		}
-
 		#endregion
-
 	}
 
 	public class AlwaysEqualComparer : IComparer
 	{
+        public bool Called = false;
+
 		int IComparer.Compare(object x, object y)
 		{
+            Called = true;
+
 			// This comparer ALWAYS returns zero (equal)!
 			return 0;
 		}
diff --git a/src/NUnitFramework/tests/ConditionAssertTests.cs b/src/NUnitFramework/tests/ConditionAssertTests.cs
index fc0da6d..7cd18d0 100644
--- a/src/NUnitFramework/tests/ConditionAssertTests.cs
+++ b/src/NUnitFramework/tests/ConditionAssertTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitFramework/tests/Constraints/AfterConstraintTests.cs b/src/NUnitFramework/tests/Constraints/AfterConstraintTests.cs
new file mode 100644
index 0000000..b5c5f8f
--- /dev/null
+++ b/src/NUnitFramework/tests/Constraints/AfterConstraintTests.cs
@@ -0,0 +1,104 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Threading;
+
+namespace NUnit.Framework.Constraints
+{
+    [TestFixture]
+	public class AfterConstraintTest : ConstraintTestBase
+	{
+		private static bool value;
+
+		[SetUp]
+		public void SetUp()
+		{
+			theConstraint = new DelayedConstraint(new EqualConstraint(true), 500);
+			expectedDescription = "True after 500 millisecond delay";
+			stringRepresentation = "<after 500 <equal True>>";
+
+            value = false;
+            //SetValueTrueAfterDelay(300);
+		}
+
+        internal object[] SuccessData = new object[] { true };
+        internal object[] FailureData = new object[] { false, 0, null };
+		internal string[] ActualValues = new string[] { "False", "0", "null" };
+
+		internal object[] InvalidData = new object[] { InvalidDelegate };
+
+        internal ActualValueDelegate[] SuccessDelegates = new ActualValueDelegate[] { DelegateReturningValue };
+        internal ActualValueDelegate[] FailureDelegates = new ActualValueDelegate[] { DelegateReturningFalse, DelegateReturningZero };
+
+        [Test, TestCaseSource("SuccessDelegates")]
+        public void SucceedsWithGoodDelegates(ActualValueDelegate del)
+        {
+            SetValueTrueAfterDelay(300);
+            Assert.That(theConstraint.Matches(del));
+        }
+
+        [Test,TestCaseSource("FailureDelegates")]
+        public void FailsWithBadDelegates(ActualValueDelegate del)
+        {
+            Assert.IsFalse(theConstraint.Matches(del));
+        }
+
+        [Test]
+        public void SimpleTest()
+        {
+            SetValueTrueAfterDelay(500);
+            Assert.That(DelegateReturningValue, new DelayedConstraint(new EqualConstraint(true), 5000, 200));
+        }
+
+        [Test]
+        public void SimpleTestUsingReference()
+        {
+            SetValueTrueAfterDelay(500);
+            Assert.That(ref value, new DelayedConstraint(new EqualConstraint(true), 5000, 200));
+        }
+
+        [Test]
+        public void ThatOverload_ZeroDelayIsAllowed()
+        {
+            Assert.That(DelegateReturningZero, new DelayedConstraint(new EqualConstraint(0), 0));
+        }
+
+        [Test, ExpectedException(typeof(ArgumentException))]
+        public void ThatOverload_DoesNotAcceptNegativeDelayValues()
+        {
+            Assert.That(DelegateReturningZero, new DelayedConstraint(new EqualConstraint(0), -1));
+        }
+
+        private static int setValueTrueDelay;
+
+		private void SetValueTrueAfterDelay(int delay)
+		{
+            setValueTrueDelay = delay;
+            Thread thread = new Thread( SetValueTrueDelegate );
+            thread.Start();
+		}
+
+		private static void MethodReturningVoid() { }
+		private static TestDelegate InvalidDelegate = new TestDelegate(MethodReturningVoid);
+
+		private static object MethodReturningValue() { return value; }
+		private static ActualValueDelegate DelegateReturningValue = new ActualValueDelegate(MethodReturningValue);
+
+		private static object MethodReturningFalse() { return false; }
+		private static ActualValueDelegate DelegateReturningFalse = new ActualValueDelegate(MethodReturningFalse);
+
+		private static object MethodReturningZero() { return 0; }
+		private static ActualValueDelegate DelegateReturningZero = new ActualValueDelegate(MethodReturningZero);
+
+        private static void MethodSetsValueTrue()
+        {
+            Thread.Sleep(setValueTrueDelay);
+            value = true;
+        }
+		private ThreadStart SetValueTrueDelegate = new ThreadStart(MethodSetsValueTrue);
+	}
+}
diff --git a/src/NUnitFramework/tests/Constraints/AndTest.cs b/src/NUnitFramework/tests/Constraints/AndTest.cs
index 5862d68..cb5f080 100644
--- a/src/NUnitFramework/tests/Constraints/AndTest.cs
+++ b/src/NUnitFramework/tests/Constraints/AndTest.cs
@@ -1,29 +1,32 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 
-using System;
-
-namespace NUnit.Framework.Constraints.Tests
+namespace NUnit.Framework.Constraints
 {
     [TestFixture]
     public class AndTest : ConstraintTestBase
     {
-		[SetUp]
+        [SetUp]
         public void SetUp()
         {
-            Matcher = new AndConstraint(new GreaterThanConstraint(40), new LessThanConstraint(50));
-            GoodValues = new object[] { 42 };
-            BadValues = new object[] { 37, 53 };
-            Description = "greater than 40 and less than 50";
+            theConstraint = new AndConstraint(new GreaterThanConstraint(40), new LessThanConstraint(50));
+            expectedDescription = "greater than 40 and less than 50";
+            stringRepresentation = "<and <greaterthan 40> <lessthan 50>>";
         }
 
-        [Test]
+		internal object[] SuccessData = new object[] { 42 };
+	
+		internal object[] FailureData = new object[] { 37, 53 };
+
+		internal string[] ActualValues = new string[] { "37", "53" };
+
+		[Test]
         public void CanCombineTestsWithAndOperator()
         {
             Assert.That(42, new GreaterThanConstraint(40) & new LessThanConstraint(50));
         }
     }
-}
+}
\ No newline at end of file
diff --git a/src/NUnitFramework/tests/Constraints/BasicConstraintTests.cs b/src/NUnitFramework/tests/Constraints/BasicConstraintTests.cs
new file mode 100644
index 0000000..3078008
--- /dev/null
+++ b/src/NUnitFramework/tests/Constraints/BasicConstraintTests.cs
@@ -0,0 +1,87 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework.Constraints
+{
+    [TestFixture]
+    public class NullConstraintTest : ConstraintTestBase
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new NullConstraint();
+            expectedDescription = "null";
+            stringRepresentation = "<null>";
+        }
+        
+        internal object[] SuccessData = new object[] { null };
+        
+        internal object[] FailureData = new object[] { "hello" };
+
+        internal string[] ActualValues = new string[] { "\"hello\"" };
+    }
+
+    [TestFixture]
+    public class TrueConstraintTest : ConstraintTestBase
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new TrueConstraint();
+            expectedDescription = "True";
+            stringRepresentation = "<true>";
+        }
+        
+        internal object[] SuccessData = new object[] { true, 2+2==4 };
+        
+        internal object[] FailureData = new object[] { null, "hello", false, 2+2==5 };
+
+        internal string[] ActualValues = new string[] { "null", "\"hello\"", "False", "False" };
+    }
+
+    [TestFixture]
+    public class FalseConstraintTest : ConstraintTestBase
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new FalseConstraint();
+            expectedDescription = "False";
+            stringRepresentation = "<false>";
+        }
+
+        internal object[] SuccessData = new object[] { false, 2 + 2 == 5 };
+
+        internal object[] FailureData = new object[] { null, "hello", true, 2+2==4 };
+
+        internal string[] ActualValues = new string[] { "null", "\"hello\"", "True", "True" };
+    }
+
+    [TestFixture]
+    public class NaNConstraintTest : ConstraintTestBase
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new NaNConstraint();
+            expectedDescription = "NaN";
+            stringRepresentation = "<nan>";
+        }
+        
+        internal object[] SuccessData = new object[] { double.NaN, float.NaN };
+
+        internal object[] FailureData = new object[] { null, "hello", 42, 
+            double.PositiveInfinity, double.NegativeInfinity,
+            float.PositiveInfinity, float.NegativeInfinity };
+
+        internal string[] ActualValues = new string[] { "null", "\"hello\"", "42", 
+            "Infinity", "-Infinity", "Infinity", "-Infinity" };
+    }
+}
diff --git a/src/NUnitFramework/tests/Constraints/CollectionConstraintTests.cs b/src/NUnitFramework/tests/Constraints/CollectionConstraintTests.cs
index 45296bd..d9c3ae3 100644
--- a/src/NUnitFramework/tests/Constraints/CollectionConstraintTests.cs
+++ b/src/NUnitFramework/tests/Constraints/CollectionConstraintTests.cs
@@ -1,23 +1,27 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 
 using System;
 using System.Collections;
+#if NET_2_0
+using System.Collections.Generic;
+#endif
 using NUnit.Framework.Tests;
 
-namespace NUnit.Framework.Constraints.Tests
+namespace NUnit.Framework.Constraints
 {
+    #region AllItems
     [TestFixture]
-    public class AllItemsTests : NUnit.Framework.Tests.MessageChecker
+    public class AllItemsTests : MessageChecker
     {
         [Test]
         public void AllItemsAreNotNull()
         {
             object[] c = new object[] { 1, "hello", 3, Environment.OSVersion };
-            Assert.That(c, new AllItemsConstraint(new NotConstraint( new EqualConstraint(null))));
+            Assert.That(c, new AllItemsConstraint( Is.Not.Null ));
         }
 
         [Test, ExpectedException(typeof(AssertionException))]
@@ -27,24 +31,47 @@ namespace NUnit.Framework.Constraints.Tests
             expectedMessage = 
 				TextMessageWriter.Pfx_Expected + "all items not null" + Environment.NewLine +
                 TextMessageWriter.Pfx_Actual + "< 1, \"hello\", null, 3 >" + Environment.NewLine;
-            Assert.That(c, new AllItemsConstraint(new NotConstraint( new EqualConstraint(null))));
+            Assert.That(c, new AllItemsConstraint(new NotConstraint(new EqualConstraint(null))));
         }
 
         [Test]
         public void AllItemsAreInRange()
         {
             int[] c = new int[] { 12, 27, 19, 32, 45, 99, 26 };
-            Assert.That(c, new AllItemsConstraint(new GreaterThanConstraint(10) & new LessThanConstraint(100)));
+            Assert.That(c, new AllItemsConstraint(new RangeConstraint(10, 100)));
         }
 
-        [Test, ExpectedException(typeof(AssertionException))]
+        [Test]
+        public void AllItemsAreInRange_UsingIComparer()
+        {
+            int[] c = new int[] { 12, 27, 19, 32, 45, 99, 26 };
+            Assert.That(c, new AllItemsConstraint(new RangeConstraint(10, 100).Using(Comparer.Default)));
+        }
+
+#if NET_2_0
+        [Test]
+        public void AllItemsAreInRange_UsingIComparerOfT()
+        {
+            int[] c = new int[] { 12, 27, 19, 32, 45, 99, 26 };
+            Assert.That(c, new AllItemsConstraint(new RangeConstraint(10, 100).Using(Comparer.Default)));
+        }
+
+        [Test]
+        public void AllItemsAreInRange_UsingComparisonOfT()
+        {
+            int[] c = new int[] { 12, 27, 19, 32, 45, 99, 26 };
+            Assert.That(c, new AllItemsConstraint(new RangeConstraint(10, 100).Using(Comparer.Default)));
+        }
+#endif
+
+		[Test, ExpectedException(typeof(AssertionException))]
         public void AllItemsAreInRangeFailureMessage()
         {
             int[] c = new int[] { 12, 27, 19, 32, 107, 99, 26 };
             expectedMessage = 
-                TextMessageWriter.Pfx_Expected + "all items greater than 10 and less than 100" + Environment.NewLine +
+                TextMessageWriter.Pfx_Expected + "all items in range (10,100)" + Environment.NewLine +
                 TextMessageWriter.Pfx_Actual   + "< 12, 27, 19, 32, 107, 99, 26 >" + Environment.NewLine;
-            Assert.That(c, new AllItemsConstraint(new GreaterThanConstraint(10) & new LessThanConstraint(100)));
+            Assert.That(c, new AllItemsConstraint(new RangeConstraint(10, 100)));
         }
 
         [Test]
@@ -64,7 +91,9 @@ namespace NUnit.Framework.Constraints.Tests
             Assert.That(c, new AllItemsConstraint(new InstanceOfTypeConstraint(typeof(char))));
         }
     }
+    #endregion
 
+    #region CollectionContains
     [TestFixture]
     public class CollectionContainsTests
     {
@@ -102,5 +131,478 @@ namespace NUnit.Framework.Constraints.Tests
 			ICollectionAdapter ints = new ICollectionAdapter(new int[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9});           
 			Assert.That(ints, new CollectionContainsConstraint( 9 ));
 		}
+
+        [Test]
+        public void IgnoreCaseIsHonored()
+        {
+            Assert.That(new string[] { "Hello", "World" }, 
+                new CollectionContainsConstraint("WORLD").IgnoreCase);
+        }
+		
+        [Test]
+        public void UsesProvidedIComparer()
+        {
+            MyComparer comparer = new MyComparer();
+            Assert.That(new string[] { "Hello", "World" }, 
+                new CollectionContainsConstraint("World").Using(comparer));
+            Assert.That(comparer.Called, "Comparer was not called");
+        }
+
+        class MyComparer : IComparer
+        {
+            public bool Called;
+
+            public int Compare(object x, object y)
+            {
+                Called = true;
+                return Comparer.Default.Compare(x, y);
+            }
+        }
+
+#if NET_2_0	
+        [Test]
+        public void UsesProvidedEqualityComparer()
+        {
+            MyEqualityComparer comparer = new MyEqualityComparer();
+            Assert.That(new string[] { "Hello", "World" }, 
+                new CollectionContainsConstraint("World").Using(comparer));
+            Assert.That(comparer.Called, "Comparer was not called");
+        }
+
+        class MyEqualityComparer : IEqualityComparer
+        {
+            public bool Called;
+
+            bool IEqualityComparer.Equals(object x, object y)
+            {
+                Called = true;
+                return Comparer.Default.Compare(x, y) == 0;
+            }
+
+            int IEqualityComparer.GetHashCode(object x)
+            {
+                return x.GetHashCode();
+            }
+        }
+
+        [Test]
+        public void UsesProvidedEqualityComparerOfT()
+        {
+            MyEqualityComparerOfT<string> comparer = new MyEqualityComparerOfT<string>();
+            Assert.That(new string[] { "Hello", "World" }, 
+                new CollectionContainsConstraint("World").Using(comparer));
+            Assert.That(comparer.Called, "Comparer was not called");
+        }
+
+        class MyEqualityComparerOfT<T> : IEqualityComparer<T>
+        {
+            public bool Called;
+
+            bool IEqualityComparer<T>.Equals(T x, T y)
+            {
+                Called = true;
+                return Comparer<T>.Default.Compare(x, y) == 0;
+            }
+
+            int IEqualityComparer<T>.GetHashCode(T x)
+            {
+                return x.GetHashCode();
+            }
+        }
+
+        [Test]
+        public void UsesProvidedComparerOfT()
+        {
+            MyComparer<string> comparer = new MyComparer<string>();
+            Assert.That(new string[] { "Hello", "World" }, 
+                new CollectionContainsConstraint("World").Using(comparer));
+            Assert.That(comparer.Called, "Comparer was not called");
+        }
+
+        class MyComparer<T> : IComparer<T>
+        {
+            public bool Called;
+
+            public int Compare(T x, T y)
+            {
+                Called = true;
+                return Comparer<T>.Default.Compare(x, y);
+            }
+        }
+
+        [Test]
+        public void UsesProvidedComparisonOfT()
+        {
+            MyComparison<string> comparer = new MyComparison<string>();
+            Assert.That(new string[] { "Hello", "World" }, 
+                new CollectionContainsConstraint("World").Using(new Comparison<string>(comparer.Compare)));
+            Assert.That(comparer.Called, "Comparer was not called");
+        }
+
+        class MyComparison<T>
+        {
+            public bool Called;
+
+            public int Compare(T x, T y)
+            {
+                Called = true;
+                return Comparer<T>.Default.Compare(x, y);
+            }
+        }
+
+#if CS_3_0
+        [Test]
+        public void UsesProvidedLambdaExpression()
+        {
+            Assert.That(new string[] { "Hello", "World" },
+                new CollectionContainsConstraint("WORLD").Using<string>( (x,y)=>String.Compare(x, y, true) ));
+        }
+#endif
+#endif
+    }
+    #endregion
+
+    #region CollectionEquivalent
+    public class CollectionEquivalentTests
+    {
+        [Test]
+        public void EqualCollectionsAreEquivalent()
+        {
+            ICollection set1 = new ICollectionAdapter("x", "y", "z");
+            ICollection set2 = new ICollectionAdapter("x", "y", "z");
+
+            Assert.That(new CollectionEquivalentConstraint(set1).Matches(set2));
+        }
+
+        [Test]
+        public void WorksWithCollectionsOfArrays()
+        {
+            byte[] array1 = new byte[] { 0x20, 0x44, 0x56, 0x76, 0x1e, 0xff };
+            byte[] array2 = new byte[] { 0x42, 0x52, 0x72, 0xef };
+            byte[] array3 = new byte[] { 0x20, 0x44, 0x56, 0x76, 0x1e, 0xff };
+            byte[] array4 = new byte[] { 0x42, 0x52, 0x72, 0xef };
+
+            ICollection set1 = new ICollectionAdapter(array1, array2);
+            ICollection set2 = new ICollectionAdapter(array3, array4);
+
+            Constraint constraint = new CollectionEquivalentConstraint(set1);
+            Assert.That(constraint.Matches(set2));
+
+            set2 = new ICollectionAdapter(array4, array3);
+            Assert.That(constraint.Matches(set2));
+        }
+
+        [Test]
+        public void EquivalentIgnoresOrder()
+        {
+            ICollection set1 = new ICollectionAdapter("x", "y", "z");
+            ICollection set2 = new ICollectionAdapter("z", "y", "x");
+
+            Assert.That(new CollectionEquivalentConstraint(set1).Matches(set2));
+        }
+
+        [Test]
+        public void EquivalentFailsWithDuplicateElementInActual()
+        {
+            ICollection set1 = new ICollectionAdapter("x", "y", "z");
+            ICollection set2 = new ICollectionAdapter("x", "y", "x");
+
+            Assert.False(new CollectionEquivalentConstraint(set1).Matches(set2));
+        }
+
+        [Test]
+        public void EquivalentFailsWithDuplicateElementInExpected()
+        {
+            ICollection set1 = new ICollectionAdapter("x", "y", "x");
+            ICollection set2 = new ICollectionAdapter("x", "y", "z");
+
+            Assert.False(new CollectionEquivalentConstraint(set1).Matches(set2));
+        }
+
+        [Test]
+        public void EquivalentHandlesNull()
+        {
+            ICollection set1 = new ICollectionAdapter(null, "x", null, "z");
+            ICollection set2 = new ICollectionAdapter("z", null, "x", null);
+
+            Assert.That(new CollectionEquivalentConstraint(set1).Matches(set2));
+        }
+
+        [Test]
+        public void EquivalentHonorsIgnoreCase()
+        {
+            ICollection set1 = new ICollectionAdapter("x", "y", "z");
+            ICollection set2 = new ICollectionAdapter("z", "Y", "X");
+
+            Assert.That(new CollectionEquivalentConstraint(set1).IgnoreCase.Matches(set2));
+        }
+
+#if CS_3_0
+        [Test]
+        public void EquivalentHonorsUsing()
+        {
+            ICollection set1 = new ICollectionAdapter("x", "y", "z");
+            ICollection set2 = new ICollectionAdapter("z", "Y", "X");
+
+            Assert.That(new CollectionEquivalentConstraint(set1)
+                .Using<string>( (x,y)=>String.Compare(x,y,true) )
+                .Matches(set2));
+        }
+#endif
+    }
+    #endregion
+
+    #region CollectionOrdered
+    [TestFixture]
+    public class CollectionOrderedTests : MessageChecker
+    {
+        [Test]
+        public void IsOrdered()
+        {
+            ArrayList al = new ArrayList();
+            al.Add("x");
+            al.Add("y");
+            al.Add("z");
+
+            Assert.That(al, Is.Ordered);
+        }
+
+        [Test]
+        public void IsOrdered_2()
+        {
+            ArrayList al = new ArrayList();
+            al.Add(1);
+            al.Add(2);
+            al.Add(3);
+
+            Assert.That(al, Is.Ordered);
+        }
+
+        [Test]
+        public void IsOrderedDescending()
+        {
+            ArrayList al = new ArrayList();
+            al.Add("z");
+            al.Add("y");
+            al.Add("x");
+
+            Assert.That(al, Is.Ordered.Descending);
+        }
+
+        [Test]
+        public void IsOrderedDescending_2()
+        {
+            ArrayList al = new ArrayList();
+            al.Add(3);
+            al.Add(2);
+            al.Add(1);
+
+            Assert.That(al, Is.Ordered.Descending);
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void IsOrdered_Fails()
+        {
+            ArrayList al = new ArrayList();
+            al.Add("x");
+            al.Add("z");
+            al.Add("y");
+
+            expectedMessage =
+                "  Expected: collection ordered" + Environment.NewLine +
+                "  But was:  < \"x\", \"z\", \"y\" >" + Environment.NewLine;
+
+            Assert.That(al, Is.Ordered);
+        }
+
+        [Test]
+        public void IsOrdered_Allows_adjacent_equal_values()
+        {
+            ArrayList al = new ArrayList();
+            al.Add("x");
+            al.Add("x");
+            al.Add("z");
+
+            Assert.That(al, Is.Ordered);
+        }
+
+        [Test, ExpectedException(typeof(ArgumentNullException), 
+            ExpectedMessage="index 1", MatchType=MessageMatch.Contains)]
+        public void IsOrdered_Handles_null()
+        {
+            ArrayList al = new ArrayList();
+            al.Add("x");
+            al.Add(null);
+            al.Add("z");
+
+            Assert.That(al, Is.Ordered);
+        }
+
+        [Test, ExpectedException(typeof(ArgumentException))]
+        public void IsOrdered_TypesMustBeComparable()
+        {
+            ArrayList al = new ArrayList();
+            al.Add(1);
+            al.Add("x");
+
+            Assert.That(al, Is.Ordered);
+        }
+
+        [Test, ExpectedException(typeof(ArgumentException))]
+        public void IsOrdered_AtLeastOneArgMustImplementIComparable()
+        {
+            ArrayList al = new ArrayList();
+            al.Add(new object());
+            al.Add(new object());
+
+            Assert.That(al, Is.Ordered);
+        }
+
+        [Test]
+        public void IsOrdered_Handles_custom_comparison()
+        {
+            ArrayList al = new ArrayList();
+            al.Add(new object());
+            al.Add(new object());
+
+            AlwaysEqualComparer comparer = new AlwaysEqualComparer();
+            Assert.That(al, Is.Ordered.Using(comparer));
+            Assert.That(comparer.Called, "TestComparer was not called");
+        }
+
+        [Test]
+        public void IsOrdered_Handles_custom_comparison2()
+        {
+            ArrayList al = new ArrayList();
+            al.Add(2);
+            al.Add(1);
+
+            TestComparer comparer = new TestComparer();
+            Assert.That(al, Is.Ordered.Using(comparer));
+            Assert.That(comparer.Called, "TestComparer was not called");
+        }
+
+#if NET_2_0
+        [Test]
+        public void UsesProvidedComparerOfT()
+        {
+            ArrayList al = new ArrayList();
+            al.Add(1);
+            al.Add(2);
+
+            MyComparer<int> comparer = new MyComparer<int>();
+            Assert.That(al, Is.Ordered.Using(comparer));
+            Assert.That(comparer.Called, "Comparer was not called");
+        }
+
+        class MyComparer<T> : IComparer<T>
+        {
+            public bool Called;
+
+            public int Compare(T x, T y)
+            {
+                Called = true;
+                return Comparer<T>.Default.Compare(x, y);
+            }
+        }
+
+        [Test]
+        public void UsesProvidedComparisonOfT()
+        {
+            ArrayList al = new ArrayList();
+            al.Add(1);
+            al.Add(2);
+
+            MyComparison<int> comparer = new MyComparison<int>();
+            Assert.That(al, Is.Ordered.Using(new Comparison<int>(comparer.Compare)));
+            Assert.That(comparer.Called, "Comparer was not called");
+        }
+
+        class MyComparison<T>
+        {
+            public bool Called;
+
+            public int Compare(T x, T y)
+            {
+                Called = true;
+                return Comparer<T>.Default.Compare(x, y);
+            }
+        }
+
+#if CS_3_0
+        [Test]
+        public void UsesProvidedLambda()
+        {
+            ArrayList al = new ArrayList();
+            al.Add(1);
+            al.Add(2);
+
+            Comparison<int> comparer = (x, y) => x.CompareTo(y);
+            Assert.That(al, Is.Ordered.Using(comparer));
+        }
+#endif
+#endif
+
+        [Test]
+        public void IsOrderedBy()
+        {
+            ArrayList al = new ArrayList();
+            al.Add(new OrderedByTestClass(1));
+            al.Add(new OrderedByTestClass(2));
+
+            Assert.That(al, Is.Ordered.By("Value"));
+        }
+
+        [Test]
+        public void IsOrderedBy_Comparer()
+        {
+            ArrayList al = new ArrayList();
+            al.Add(new OrderedByTestClass(1));
+            al.Add(new OrderedByTestClass(2));
+
+            Assert.That(al, Is.Ordered.By("Value").Using(Comparer.Default));
+        }
+
+        [Test]
+        public void IsOrderedBy_Handles_heterogeneous_classes_as_long_as_the_property_is_of_same_type()
+        {
+            ArrayList al = new ArrayList();
+            al.Add(new OrderedByTestClass(1));
+            al.Add(new OrderedByTestClass2(2));
+
+            Assert.That(al, Is.Ordered.By("Value"));
+        }
+
+        class OrderedByTestClass
+        {
+            private int myValue;
+
+            public int Value 
+            {
+                get { return myValue; }
+                set { myValue = value; } 
+            }
+
+            public OrderedByTestClass(int value)
+            {
+                Value = value;
+            }
+        }
+
+        class OrderedByTestClass2
+        {
+            private int myValue;
+            public int Value 
+            {
+                get { return myValue; }
+                set { myValue = value; } 
+            }
+
+            public OrderedByTestClass2(int value)
+            {
+                Value = value;
+            }
+        }
     }
+    #endregion
 }
diff --git a/src/NUnitFramework/tests/Constraints/ComparerTests.cs b/src/NUnitFramework/tests/Constraints/ComparerTests.cs
new file mode 100644
index 0000000..57dcb73
--- /dev/null
+++ b/src/NUnitFramework/tests/Constraints/ComparerTests.cs
@@ -0,0 +1,65 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Constraints
+{
+    [TestFixture]
+    public class ComparerTests
+    {
+        [TestCase(4, 4)]
+        [TestCase(4.0d, 4.0d)]
+        [TestCase(4.0f, 4.0f)]
+        [TestCase(4, 4.0d)]
+        [TestCase(4, 4.0f)]
+        [TestCase(4.0d, 4)]
+        [TestCase(4.0d, 4.0f)]
+        [TestCase(4.0f, 4)]
+        [TestCase(4.0f, 4.0d)]
+        [TestCase(SpecialValue.Null, SpecialValue.Null)]
+#if NET_2_0
+        [TestCase(null, null)]
+#endif
+        public void EqualItems(object x, object y)
+        {
+            Assert.That(NUnitComparer.Default.Compare(x, y) == 0);
+            Assert.That(NUnitEqualityComparer.Default.ObjectsEqual(x, y));
+        }
+
+        [TestCase(4, 2)]
+        [TestCase(4.0d, 2.0d)]
+        [TestCase(4.0f, 2.0f)]
+        [TestCase(4, 2.0d)]
+        [TestCase(4, 2.0f)]
+        [TestCase(4.0d, 2)]
+        [TestCase(4.0d, 2.0f)]
+        [TestCase(4.0f, 2)]
+        [TestCase(4.0f, 2.0d)]
+        [TestCase(4, SpecialValue.Null)]
+#if NET_2_0
+        [TestCase(4, null)]
+#endif
+        public void UnequalItems(object greater, object lesser)
+        {
+            Assert.That(NUnitComparer.Default.Compare(greater, lesser) > 0);
+            Assert.That(NUnitComparer.Default.Compare(lesser, greater) < 0);
+            Assert.False(NUnitEqualityComparer.Default.ObjectsEqual( greater, lesser ));
+            Assert.False(NUnitEqualityComparer.Default.ObjectsEqual( lesser, greater ));
+        }
+
+        [TestCase(double.PositiveInfinity)]
+        [TestCase(double.NegativeInfinity)]
+        [TestCase(double.NaN)]
+        [TestCase(float.PositiveInfinity)]
+        [TestCase(float.NegativeInfinity)]
+        [TestCase(float.NaN)]
+        public void SpecialFloatingPointValues(object x)
+        {
+            Assert.That(NUnitEqualityComparer.Default.ObjectsEqual(x, x));
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/Constraints/ComparisonConstraintTests.cs b/src/NUnitFramework/tests/Constraints/ComparisonConstraintTests.cs
index bbf5214..ed4d9f0 100644
--- a/src/NUnitFramework/tests/Constraints/ComparisonConstraintTests.cs
+++ b/src/NUnitFramework/tests/Constraints/ComparisonConstraintTests.cs
@@ -1,77 +1,379 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
+using System.Collections;
+#if NET_2_0
+using System.Collections.Generic;
+#endif
 
-namespace NUnit.Framework.Constraints.Tests
+namespace NUnit.Framework.Constraints
 {
-	public class ComparisonConstraintTestBase : ConstraintTestBase
-	{
-		[Test,ExpectedException(typeof(ArgumentException))]
-		public void NullGivesError()
-		{
-			Assert.That( null, Matcher );
-		}
-
-		[Test,ExpectedException]
-		public void BadTypeGivesError()
-		{
-			Assert.That( "big", Matcher );
-		}
-	}
+    #region ComparisonTest
+    public abstract class ComparisonConstraintTest : ConstraintTestBaseWithArgumentException
+    {
+        protected ComparisonConstraint comparisonConstraint;
+
+        [Test]
+        public void UsesProvidedIComparer()
+        {
+            MyComparer comparer = new MyComparer();
+            comparisonConstraint.Using(comparer).Matches(0);
+            Assert.That(comparer.Called, "Comparer was not called");
+        }
+
+        class MyComparer : IComparer
+        {
+            public bool Called;
+
+            public int Compare(object x, object y)
+            {
+                Called = true;
+                return Comparer.Default.Compare(x, y);
+            }
+        }
 
+#if NET_2_0
+        [Test]
+        public void UsesProvidedComparerOfT()
+        {
+            MyComparer<int> comparer = new MyComparer<int>();
+            comparisonConstraint.Using(comparer).Matches(0);
+            Assert.That(comparer.Called, "Comparer was not called");
+        }
+
+        class MyComparer<T> : IComparer<T>
+        {
+            public bool Called;
+
+            public int Compare(T x, T y)
+            {
+                Called = true;
+                return Comparer<T>.Default.Compare(x, y);
+            }
+        }
+
+        [Test]
+        public void UsesProvidedComparisonOfT()
+        {
+            MyComparison<int> comparer = new MyComparison<int>();
+            comparisonConstraint.Using(new Comparison<int>(comparer.Compare)).Matches(0);
+            Assert.That(comparer.Called, "Comparer was not called");
+        }
+
+        class MyComparison<T>
+        {
+            public bool Called;
+
+            public int Compare(T x, T y)
+            {
+                Called = true;
+                return Comparer<T>.Default.Compare(x, y);
+            }
+        }
+
+#if CS_3_0
+        [Test]
+        public void UsesProvidedLambda()
+        {
+            Comparison<int> comparer = (x, y) => x.CompareTo(y);
+            comparisonConstraint.Using(comparer).Matches(0);
+        }
+#endif
+#endif
+    }
+    #endregion
+
+    #region GreaterThan
     [TestFixture]
-    public class GreaterThanTest : ComparisonConstraintTestBase
+    public class GreaterThanTest : ComparisonConstraintTest
     {
-		[SetUp]
+        [SetUp]
         public void SetUp()
         {
-            Matcher = new GreaterThanConstraint(5);
-            GoodValues = new object[] { 6 };
-            BadValues = new object[] { 4, 5 };
-            Description = "greater than 5";
+            theConstraint = comparisonConstraint = new GreaterThanConstraint(5);
+            expectedDescription = "greater than 5";
+            stringRepresentation = "<greaterthan 5>";
         }
+
+        internal object[] SuccessData = new object[] { 6, 5.001 };
+
+        internal object[] FailureData = new object[] { 4, 5 };
+
+        internal string[] ActualValues = new string[] { "4", "5" };
+
+        internal object[] InvalidData = new object[] { null, "xxx" };
+
+        [Test]
+        public void CanCompareIComparables()
+        {
+            ClassWithIComparable expected = new ClassWithIComparable(0);
+            ClassWithIComparable actual = new ClassWithIComparable(42);
+            Assert.That(actual, Is.GreaterThan(expected));
+        }
+
+#if NET_2_0
+        [Test]
+        public void CanCompareIComparablesOfT()
+        {
+            ClassWithIComparableOfT expected = new ClassWithIComparableOfT(0);
+            ClassWithIComparableOfT actual = new ClassWithIComparableOfT(42);
+            Assert.That(actual, Is.GreaterThan(expected));
+        }
+#endif
     }
+    #endregion
 
+    #region GreaterThanOrEqual
     [TestFixture]
-    public class GreaterThanOrEqualTest : ComparisonConstraintTestBase
+    public class GreaterThanOrEqualTest : ComparisonConstraintTest
     {
-		[SetUp]
+        [SetUp]
         public void SetUp()
         {
-            Matcher = new GreaterThanOrEqualConstraint(5);
-            GoodValues = new object[] { 6, 5 };
-            BadValues = new object[] { 4 };
-            Description = "greater than or equal to 5";
+            theConstraint = comparisonConstraint = new GreaterThanOrEqualConstraint(5);
+            expectedDescription = "greater than or equal to 5";
+            stringRepresentation = "<greaterthanorequal 5>";
+        }
+
+        internal object[] SuccessData = new object[] { 6, 5 };
+
+        internal object[] FailureData = new object[] { 4 };
+
+        internal string[] ActualValues = new string[] { "4" };
+
+        internal object[] InvalidData = new object[] { null, "xxx" };
+
+        [Test]
+        public void CanCompareIComparables()
+        {
+            ClassWithIComparable expected = new ClassWithIComparable(0);
+            ClassWithIComparable actual = new ClassWithIComparable(42);
+            Assert.That(actual, Is.GreaterThanOrEqualTo(expected));
+        }
+
+#if NET_2_0
+        [Test]
+        public void CanCompareIComparablesOfT()
+        {
+            ClassWithIComparableOfT expected = new ClassWithIComparableOfT(0);
+            ClassWithIComparableOfT actual = new ClassWithIComparableOfT(42);
+            Assert.That(actual, Is.GreaterThanOrEqualTo(expected));
         }
+#endif
     }
+    #endregion
 
+    #region LessThan
     [TestFixture]
-    public class LessThanTest : ComparisonConstraintTestBase
+    public class LessThanTest : ComparisonConstraintTest
     {
-		[SetUp]
+        [SetUp]
         public void SetUp()
         {
-            Matcher = new LessThanConstraint(5);
-            GoodValues = new object[] { 4 };
-            BadValues = new object[] { 6, 5 };
-            Description = "less than 5";
+            theConstraint = comparisonConstraint = new LessThanConstraint(5);
+            expectedDescription = "less than 5";
+            stringRepresentation = "<lessthan 5>";
         }
+
+        internal object[] SuccessData = new object[] { 4, 4.999 };
+
+        internal object[] FailureData = new object[] { 6, 5 };
+
+        internal string[] ActualValues = new string[] { "6", "5" };
+
+        internal object[] InvalidData = new object[] { null, "xxx" };
+
+        [Test]
+        public void CanCompareIComparables()
+        {
+            ClassWithIComparable expected = new ClassWithIComparable(42);
+            ClassWithIComparable actual = new ClassWithIComparable(0);
+            Assert.That(actual, Is.LessThan(expected));
+        }
+
+#if NET_2_0
+        [Test]
+        public void CanCompareIComparablesOfT()
+        {
+            ClassWithIComparableOfT expected = new ClassWithIComparableOfT(42);
+            ClassWithIComparableOfT actual = new ClassWithIComparableOfT(0);
+            Assert.That(actual, Is.LessThan(expected));
+        }
+#endif
     }
+    #endregion
 
+    #region LessThanOrEqual
     [TestFixture]
-    public class LessThanOrEqualTest : ComparisonConstraintTestBase
+    public class LessThanOrEqualTest : ComparisonConstraintTest
     {
-		[SetUp]
+        [SetUp]
         public void SetUp()
         {
-            Matcher = new LessThanOrEqualConstraint(5);
-            GoodValues = new object[] { 4 , 5 };
-            BadValues = new object[] { 6 };
-            Description = "less than or equal to 5";
+            theConstraint = comparisonConstraint = new LessThanOrEqualConstraint(5);
+            expectedDescription = "less than or equal to 5";
+            stringRepresentation = "<lessthanorequal 5>";
+        }
+
+        internal object[] SuccessData = new object[] { 4, 5 };
+
+        internal object[] FailureData = new object[] { 6 };
+
+        internal string[] ActualValues = new string[] { "6" };
+
+        internal object[] InvalidData = new object[] { null, "xxx" };
+
+        [Test]
+        public void CanCompareIComparables()
+        {
+            ClassWithIComparable expected = new ClassWithIComparable(42);
+            ClassWithIComparable actual = new ClassWithIComparable(0);
+            Assert.That(actual, Is.LessThanOrEqualTo(expected));
+        }
+
+#if NET_2_0
+        [Test]
+        public void CanCompareIComparablesOfT()
+        {
+            ClassWithIComparableOfT expected = new ClassWithIComparableOfT(42);
+            ClassWithIComparableOfT actual = new ClassWithIComparableOfT(0);
+            Assert.That(actual, Is.LessThanOrEqualTo(expected));
+        }
+#endif
+    }
+    #endregion
+
+    #region RangeConstraint
+    [TestFixture]
+    public class RangeConstraintTest : ConstraintTestBaseWithArgumentException
+    {
+        RangeConstraint rangeConstraint;
+
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = rangeConstraint = new RangeConstraint(5, 42);
+            expectedDescription = "in range (5,42)";
+            stringRepresentation = "<range 5 42>";
+        }
+
+        internal object[] SuccessData = new object[] { 5, 23, 42 };
+
+        internal object[] FailureData = new object[] { 4, 43 };
+
+        internal string[] ActualValues = new string[] { "4", "43" };
+
+        internal object[] InvalidData = new object[] { null, "xxx" };
+
+        [Test]
+        public void UsesProvidedIComparer()
+        {
+            MyComparer comparer = new MyComparer();
+            Assert.That(rangeConstraint.Using(comparer).Matches(19));
+            Assert.That(comparer.Called, "Comparer was not called");
+        }
+
+        class MyComparer : IComparer
+        {
+            public bool Called;
+
+            public int Compare(object x, object y)
+            {
+                Called = true;
+                return Comparer.Default.Compare(x, y);
+            }
+        }
+
+#if NET_2_0
+        [Test]
+        public void UsesProvidedComparerOfT()
+        {
+            MyComparer<int> comparer = new MyComparer<int>();
+            Assert.That(rangeConstraint.Using(comparer).Matches(19));
+            Assert.That(comparer.Called, "Comparer was not called");
+        }
+
+        class MyComparer<T> : IComparer<T>
+        {
+            public bool Called;
+
+            public int Compare(T x, T y)
+            {
+                Called = true;
+                return Comparer<T>.Default.Compare(x, y);
+            }
+        }
+
+        [Test]
+        public void UsesProvidedComparisonOfT()
+        {
+            MyComparison<int> comparer = new MyComparison<int>();
+            Assert.That(rangeConstraint.Using(new Comparison<int>(comparer.Compare)).Matches(19));
+            Assert.That(comparer.Called, "Comparer was not called");
+        }
+
+        class MyComparison<T>
+        {
+            public bool Called;
+
+            public int Compare(T x, T y)
+            {
+                Called = true;
+                return Comparer<T>.Default.Compare(x, y);
+            }
+        }
+
+#if CS_3_0
+        [Test]
+        public void UsesProvidedLambda()
+        {
+            Comparison<int> comparer = (x, y) => x.CompareTo(y);
+            Assert.That(rangeConstraint.Using(comparer).Matches(19));
+        }
+#endif
+#endif
+    }
+    #endregion
+
+    #region Test Classes
+    class ClassWithIComparable : IComparable
+    {
+        private int val;
+
+        public ClassWithIComparable(int val)
+        {
+            this.val = val;
+        }
+
+        public int CompareTo(object x)
+        {
+            ClassWithIComparable other = x as ClassWithIComparable;
+            if (x is ClassWithIComparable)
+                return val.CompareTo(other.val);
+
+            throw new ArgumentException();
+        }
+    }
+
+#if NET_2_0
+    class ClassWithIComparableOfT : IComparable<ClassWithIComparableOfT>
+    {
+        private int val;
+
+        public ClassWithIComparableOfT(int val)
+        {
+            this.val = val;
+        }
+
+        public int CompareTo(ClassWithIComparableOfT other)
+        {
+            return val.CompareTo(other.val);
         }
     }
-}
+#endif
+    #endregion
+}
\ No newline at end of file
diff --git a/src/NUnitFramework/tests/Constraints/ConstraintTestBase.cs b/src/NUnitFramework/tests/Constraints/ConstraintTestBase.cs
index 39fe18f..1fe4bbc 100644
--- a/src/NUnitFramework/tests/Constraints/ConstraintTestBase.cs
+++ b/src/NUnitFramework/tests/Constraints/ConstraintTestBase.cs
@@ -1,56 +1,85 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
-
 using System;
 
-namespace NUnit.Framework.Constraints.Tests
+namespace NUnit.Framework.Constraints
 {
-    public abstract class ConstraintTestBase
+    public abstract class ConstraintTestBaseNoData
     {
-        protected Constraint Matcher;
-        protected object[] GoodValues;
-        protected object[] BadValues;
-        protected string Description;
+        protected Constraint theConstraint;
+        protected string expectedDescription = "<NOT SET>";
+        protected string stringRepresentation = "<NOT SET>";
 
         [Test]
-		public void SucceedsOnGoodValues()
+        public void ProvidesProperDescription()
         {
-            foreach (object value in GoodValues)
-                Assert.That(value, Matcher, "Test should succeed with {0}", value);
+            TextMessageWriter writer = new TextMessageWriter();
+            theConstraint.WriteDescriptionTo(writer);
+            Assert.AreEqual(expectedDescription, writer.ToString());
         }
 
         [Test]
-		public void FailsOnBadValues()
+        public void ProvidesProperStringRepresentation()
         {
-            foreach (object value in BadValues)
-            {
-                Assert.That(Matcher.Matches(value), new EqualConstraint(false), "Test should fail with value {0}", value);
-            }
+            Assert.AreEqual(stringRepresentation, theConstraint.ToString());
         }
+    }
 
-		[Test]
-        public void ProvidesProperDescription()
+    public abstract class ConstraintTestBase : ConstraintTestBaseNoData
+    {
+        [Test, TestCaseSource("SuccessData")]
+        public void SucceedsWithGoodValues(object value)
         {
+            Assert.That(theConstraint.Matches(value));
+        }
+
+        [Test, TestCaseSource("FailureData")]
+        public void FailsWithBadValues(object badValue)
+        {
+            Assert.IsFalse(theConstraint.Matches(badValue));
+        }
+
+        [Test, Sequential]
+        public void ProvidesProperFailureMessage(
+            [ValueSource("FailureData")] object badValue,
+            [ValueSource("ActualValues")] string message)
+        {
+            theConstraint.Matches(badValue);
             TextMessageWriter writer = new TextMessageWriter();
-            Matcher.WriteDescriptionTo(writer);
-            Assert.That(writer.ToString(), new EqualConstraint(Description), null);
+            theConstraint.WriteMessageTo(writer);
+            Assert.AreEqual(
+                TextMessageWriter.Pfx_Expected + expectedDescription + Environment.NewLine +
+                TextMessageWriter.Pfx_Actual + message + Environment.NewLine,
+                writer.ToString());
         }
+    }
 
-		[Test]
-        public void ProvidesProperFailureMessage()
+    /// <summary>
+    /// Base class for testing constraints that can throw an ArgumentException
+    /// </summary>
+    public abstract class ConstraintTestBaseWithArgumentException : ConstraintTestBase
+    {
+        [Test, TestCaseSource("InvalidData")]
+        [ExpectedException(typeof(ArgumentException))]
+        public void InvalidDataThrowsArgumentException(object value)
+        {
+            theConstraint.Matches(value);
+        }
+    }
+
+    /// <summary>
+    /// Base class for tests that can throw multiple exceptions. Use
+    /// TestCaseData class to specify the expected exception type.
+    /// </summary>
+    public abstract class ConstraintTestBaseWithExceptionTests : ConstraintTestBase
+    {
+        [Test, TestCaseSource("InvalidData")]
+        public void InvalidDataThrowsException(object value)
         {
-			object badValue = BadValues[0];
-			string badString = badValue == null ? "null" : badValue.ToString();
-
-			TextMessageWriter writer = new TextMessageWriter();
-            Matcher.Matches(badValue);
-            Matcher.WriteMessageTo(writer);
-            Assert.That(writer.ToString(), new SubstringConstraint(Description));
-			Assert.That(writer.ToString(), new SubstringConstraint(badString));
-            Assert.That(writer.ToString(), new NotConstraint(new SubstringConstraint("<UNSET>")));
+            theConstraint.Matches(value);
         }
     }
-}
+}
\ No newline at end of file
diff --git a/src/NUnitFramework/tests/Constraints/EmptyConstraintTest.cs b/src/NUnitFramework/tests/Constraints/EmptyConstraintTest.cs
new file mode 100644
index 0000000..fd84b4f
--- /dev/null
+++ b/src/NUnitFramework/tests/Constraints/EmptyConstraintTest.cs
@@ -0,0 +1,84 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+
+namespace NUnit.Framework.Constraints
+{
+    [TestFixture]
+    public class EmptyConstraintTest : ConstraintTestBaseWithArgumentException
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new EmptyConstraint();
+            expectedDescription = "<empty>";
+            stringRepresentation = "<empty>";
+        }
+
+        internal static object[] SuccessData = new object[] 
+        {
+            string.Empty,
+            new object[0],
+            new ArrayList(),
+#if NET_2_0
+            new System.Collections.Generic.List<int>()
+#endif  
+        };
+
+        internal static object[] FailureData = new object[]
+        {
+            "Hello",
+            new object[] { 1, 2, 3 }
+        };
+
+        internal static string[] ActualValues = new string[]
+        {
+            "\"Hello\"",
+            "< 1, 2, 3 >"
+        };
+
+        internal static object[] InvalidData = new object[]
+            {
+                null,
+                5
+            };
+    }
+
+    [TestFixture]
+    public class NullOrEmptyStringConstraintTest : ConstraintTestBaseWithArgumentException
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new NullOrEmptyStringConstraint();
+            expectedDescription = "null or empty string";
+            stringRepresentation = "<nullorempty>";
+        }
+
+        internal static object[] SuccessData = new object[] 
+        {
+            string.Empty,
+            null
+        };
+
+        internal static object[] FailureData = new object[]
+        {
+            "Hello"
+        };
+
+        internal static string[] ActualValues = new string[]
+        {
+            "\"Hello\""
+        };
+
+        internal static object[] InvalidData = new object[]
+            {
+                5
+            };
+    }
+}
\ No newline at end of file
diff --git a/src/NUnitFramework/tests/Constraints/EmptyTest.cs b/src/NUnitFramework/tests/Constraints/EmptyTest.cs
deleted file mode 100644
index a629ecb..0000000
--- a/src/NUnitFramework/tests/Constraints/EmptyTest.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework.Constraints.Tests
-{
-    [TestFixture]
-    public class EmptyTest : ConstraintTestBase
-    {
-		[SetUp]
-        public void SetUp()
-        {
-            Matcher = new EmptyConstraint();
-            GoodValues = new object[] { string.Empty, new object[0], new System.Collections.ArrayList() };
-            BadValues = new object[] { "Hello", new object[] { 1, 2, 3 } };
-            Description = "<empty>";
-        }
-
-		[Test,ExpectedException(typeof(ArgumentException))]
-		public void NullGivesArgumentException()
-		{
-			Matcher.Matches(null);
-		}
-    }
-}
diff --git a/src/NUnitFramework/tests/Constraints/EqualTest.cs b/src/NUnitFramework/tests/Constraints/EqualTest.cs
index b1fa1a5..44f928a 100644
--- a/src/NUnitFramework/tests/Constraints/EqualTest.cs
+++ b/src/NUnitFramework/tests/Constraints/EqualTest.cs
@@ -1,34 +1,451 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 
 using System;
 using System.IO;
 using System.Drawing;
+using System.Collections;
+#if NET_2_0
+using System.Collections.Generic;
+#endif
 
-namespace NUnit.Framework.Constraints.Tests
+namespace NUnit.Framework.Constraints
 {
     [TestFixture]
-    public class EqualTest : ConstraintTestBase, IExpectException
+    public class EqualConstraintTest : ConstraintTestBase
     {
-		[SetUp]
+        [SetUp]
         public void SetUp()
         {
-            Matcher = new EqualConstraint( 4 );
-            GoodValues = new object[] { 4, 4.0f, 4.0d, 4.0000m };
-            BadValues = new object[] { 5, null, "Hello" };
-            Description = "4";
+            theConstraint = new EqualConstraint(4);
+            expectedDescription = "4";
+            stringRepresentation = "<equal 4>";
+        }
+
+        internal object[] SuccessData = new object[] { 4, 4.0f, 4.0d, 4.0000m };
+            
+        internal object[] FailureData = new object[] { 5, null, "Hello", double.NaN, double.PositiveInfinity };
+
+        internal string[] ActualValues = new string[] { "5", "null", "\"Hello\"", "NaN", "Infinity" };
+
+        [TestCase(double.NaN)]
+        [TestCase(double.PositiveInfinity)]
+        [TestCase(double.NegativeInfinity)]
+        [TestCase(float.NaN)]
+        [TestCase(float.PositiveInfinity)]
+        [TestCase(float.NegativeInfinity)]
+        public void CanMatchSpecialFloatingPointValues(object value)
+        {
+            Assert.That(value, new EqualConstraint(value));
+        }
+
+        #region DateTime Tests
+        [Test]
+        public void CanMatchDates()
+        {
+            DateTime expected = new DateTime(2007, 4, 1);
+            DateTime actual = new DateTime(2007, 4, 1);
+            Assert.That(actual, new EqualConstraint(expected));
+        }
+
+        [Test]
+        public void CanMatchDatesWithinTimeSpan()
+        {
+            DateTime expected = new DateTime(2007, 4, 1, 13, 0, 0);
+            DateTime actual = new DateTime(2007, 4, 1, 13, 1, 0);
+            TimeSpan tolerance = TimeSpan.FromMinutes(5.0);
+            Assert.That(actual, new EqualConstraint(expected).Within(tolerance));
+        }
+
+        [Test]
+        public void CanMatchDatesWithinDays()
+        {
+            DateTime expected = new DateTime(2007, 4, 1, 13, 0, 0);
+            DateTime actual = new DateTime(2007, 4, 4, 13, 0, 0);
+            Assert.That(actual, new EqualConstraint(expected).Within(5).Days);
+        }
+
+        [Test]
+        public void CanMatchDatesWithinHours()
+        {
+            DateTime expected = new DateTime(2007, 4, 1, 13, 0, 0);
+            DateTime actual = new DateTime(2007, 4, 1, 16, 0, 0);
+            Assert.That(actual, new EqualConstraint(expected).Within(5).Hours);
+        }
+
+        [Test]
+        public void CanMatchDatesWithinMinutes()
+        {
+            DateTime expected = new DateTime(2007, 4, 1, 13, 0, 0);
+            DateTime actual = new DateTime(2007, 4, 1, 13, 1, 0);
+            Assert.That(actual, new EqualConstraint(expected).Within(5).Minutes);
+        }
+
+        [Test]
+        public void CanMatchTimeSpanWithinMinutes()
+        {
+            TimeSpan expected = new TimeSpan( 10, 0, 0);
+            TimeSpan actual = new TimeSpan(10, 2, 30);
+            Assert.That(actual, new EqualConstraint(expected).Within(5).Minutes);
+        }
+
+        [Test]
+        public void CanMatchDatesWithinSeconds()
+        {
+            DateTime expected = new DateTime(2007, 4, 1, 13, 0, 0);
+            DateTime actual = new DateTime(2007, 4, 1, 13, 1, 0);
+            Assert.That(actual, new EqualConstraint(expected).Within(300).Seconds);
+        }
+
+        [Test]
+        public void CanMatchDatesWithinMilliseconds()
+        {
+            DateTime expected = new DateTime(2007, 4, 1, 13, 0, 0);
+            DateTime actual = new DateTime(2007, 4, 1, 13, 1, 0);
+            Assert.That(actual, new EqualConstraint(expected).Within(300000).Milliseconds);
+        }
+
+        [Test]
+        public void CanMatchDatesWithinTicks()
+        {
+            DateTime expected = new DateTime(2007, 4, 1, 13, 0, 0);
+            DateTime actual = new DateTime(2007, 4, 1, 13, 1, 0);
+            Assert.That(actual, new EqualConstraint(expected).Within(TimeSpan.TicksPerMinute*5).Ticks);
+        }
+
+        #endregion
+
+        #region Dictionary Tests
+        // TODO: Move these to a separate fixture
+#if CS_3_0
+        [Test]
+        public void CanMatchHashtables_SameOrder()
+        {
+            Assert.AreEqual(new Hashtable { { 0, 0 }, { 1, 1 }, { 2, 2 } },
+                            new Hashtable { { 0, 0 }, { 1, 1 }, { 2, 2 } });
         }
 
         [Test, ExpectedException(typeof(AssertionException))]
+        public void CanMatchHashtables_Failure()
+        {
+            Assert.AreEqual(new Hashtable { { 0, 0 }, { 1, 1 }, { 2, 2 } },
+                            new Hashtable { { 0, 0 }, { 1, 5 }, { 2, 2 } });
+        }
+
+        [Test]
+        public void CanMatchHashtables_DifferentOrder()
+        {
+            Assert.AreEqual(new Hashtable { { 0, 0 }, { 1, 1 }, { 2, 2 } },
+                            new Hashtable { { 0, 0 }, { 2, 2 }, { 1, 1 } });
+        }
+
+#if NET_2_0
+        [Test]
+        public void CanMatchDictionaries_SameOrder()
+        {
+            Assert.AreEqual(new Dictionary<int, int> { { 0, 0 }, { 1, 1 }, { 2, 2 } },
+                            new Dictionary<int, int> { { 0, 0 }, { 1, 1 }, { 2, 2 } });
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void CanMatchDictionaries_Failure()
+        {
+            Assert.AreEqual(new Dictionary<int, int> { { 0, 0 }, { 1, 1 }, { 2, 2 } },
+                            new Dictionary<int, int> { { 0, 0 }, { 1, 5 }, { 2, 2 } });
+        }
+
+        [Test]
+        public void CanMatchDictionaries_DifferentOrder()
+        {
+            Assert.AreEqual(new Dictionary<int, int> { { 0, 0 }, { 1, 1 }, { 2, 2 } },
+                            new Dictionary<int, int> { { 0, 0 }, { 2, 2 }, { 1, 1 } });
+        }
+
+        [Test]
+        public void CanMatchHashtableWithDictionary()
+        {
+            Assert.AreEqual(new Hashtable { { 0, 0 }, { 1, 1 }, { 2, 2 } },
+                            new Dictionary<int, int> { { 0, 0 }, { 2, 2 }, { 1, 1 } });
+        }
+#endif
+#endif
+        #endregion
+
+        [TestCase(20000000000000004.0)]
+        [TestCase(19999999999999996.0)]
+        public void CanMatchDoublesWithUlpTolerance(object value)
+        {
+          Assert.That(value, new EqualConstraint(20000000000000000.0).Within(1).Ulps);
+        }
+
+        [ExpectedException(typeof(AssertionException))]
+        [TestCase(20000000000000008.0)]
+        [TestCase(19999999999999992.0)]
+        public void FailsOnDoublesOutsideOfUlpTolerance(object value)
+        {
+          Assert.That(value, new EqualConstraint(20000000000000000.0).Within(1).Ulps);
+        }
+
+        [TestCase(19999998.0f)]
+        [TestCase(20000002.0f)]
+        public void CanMatchSinglesWithUlpTolerance(object value)
+        {
+          Assert.That(value, new EqualConstraint(20000000.0f).Within(1).Ulps);
+        }
+
+        [ExpectedException(typeof(AssertionException))]
+        [TestCase(19999996.0f)]
+        [TestCase(20000004.0f)]
+        public void FailsOnSinglesOutsideOfUlpTolerance(object value)
+        {
+          Assert.That(value, new EqualConstraint(20000000.0f).Within(1).Ulps);
+        }
+
+        [TestCase(9500.0)]
+        [TestCase(10000.0)]
+        [TestCase(10500.0)]
+        public void CanMatchDoublesWithRelativeTolerance(object value)
+        {
+            Assert.That(value, new EqualConstraint(10000.0).Within(10.0).Percent);
+        }
+
+        [ExpectedException(typeof(AssertionException))]
+        [TestCase(8500.0)]
+        [TestCase(11500.0)]
+        public void FailsOnDoublesOutsideOfRelativeTolerance(object value)
+        {
+            Assert.That(value, new EqualConstraint(10000.0).Within(10.0).Percent);
+        }
+
+        [TestCase(9500.0f)]
+        [TestCase(10000.0f)]
+        [TestCase(10500.0f)]
+        public void CanMatchSinglesWithRelativeTolerance(object value)
+        {
+            Assert.That(value, new EqualConstraint(10000.0f).Within(10.0f).Percent);
+        }
+
+        [ExpectedException(typeof(AssertionException))]
+        [TestCase(8500.0f)]
+        [TestCase(11500.0f)]
+        public void FailsOnSinglesOutsideOfRelativeTolerance(object value)
+        {
+            Assert.That(value, new EqualConstraint(10000.0f).Within(10.0f).Percent);
+        }
+
+        /// <summary>Applies both the Percent and Ulps modifiers to cause an exception</summary>
+        [Test, ExpectedException(typeof(InvalidOperationException))]
+        public void ErrorWithPercentAndUlpsToleranceModes()
+        {
+            Assert.That(100.0f, new EqualConstraint(100.0f).Within(10.0f).Percent.Ulps);
+        }
+
+        /// <summary>Applies both the Ulps and Percent modifiers to cause an exception</summary>
+        [Test, ExpectedException(typeof(InvalidOperationException))]
+        public void ErrorWithUlpsAndPercentToleranceModes() {
+        	Assert.That(100.0f, new EqualConstraint(100.0f).Within(10.0f).Ulps.Percent);
+        }
+
+        [Test, ExpectedException(typeof(InvalidOperationException))]
+        public void ErrorIfPercentPrecedesWithin()
+        {
+            Assert.That(1010, Is.EqualTo(1000).Percent.Within(5));
+        }
+
+        [Test, ExpectedException(typeof(InvalidOperationException))]
+        public void ErrorIfUlpsPrecedesWithin()
+        {
+            Assert.That(1010.0, Is.EqualTo(1000.0).Ulps.Within(5));
+        }
+
+        [Test, ExpectedException(typeof(InvalidOperationException))]
+        public void ErrorIfDaysPrecedesWithin()
+        {
+            Assert.That(DateTime.Now, Is.EqualTo(DateTime.Now).Days.Within(5));
+        }
+
+        [Test, ExpectedException(typeof(InvalidOperationException))]
+        public void ErrorIfHoursPrecedesWithin()
+        {
+            Assert.That(DateTime.Now, Is.EqualTo(DateTime.Now).Hours.Within(5));
+        }
+
+        [Test, ExpectedException(typeof(InvalidOperationException))]
+        public void ErrorIfMinutesPrecedesWithin()
+        {
+            Assert.That(DateTime.Now, Is.EqualTo(DateTime.Now).Minutes.Within(5));
+        }
+
+        [Test, ExpectedException(typeof(InvalidOperationException))]
+        public void ErrorIfSecondsPrecedesWithin()
+        {
+            Assert.That(DateTime.Now, Is.EqualTo(DateTime.Now).Seconds.Within(5));
+        }
+
+        [Test, ExpectedException(typeof(InvalidOperationException))]
+        public void ErrorIfMillisecondsPrecedesWithin()
+        {
+            Assert.That(DateTime.Now, Is.EqualTo(DateTime.Now).Milliseconds.Within(5));
+        }
+
+        [Test, ExpectedException(typeof(InvalidOperationException))]
+        public void ErrorIfTicksPrecedesWithin()
+        {
+            Assert.That(DateTime.Now, Is.EqualTo(DateTime.Now).Ticks.Within(5));
+        }
+
+        [ExpectedException(typeof(InvalidOperationException))]
+        [TestCase(1000, 1010)]
+        [TestCase(1000U, 1010U)]
+        [TestCase(1000L, 1010L)]
+        [TestCase(1000UL, 1010UL)]
+        public void ErrorIfUlpsIsUsedOnIntegralType(object x, object y)
+        {
+            Assert.That(y, Is.EqualTo(x).Within(2).Ulps);
+        }
+
+        [Test, ExpectedException(typeof(InvalidOperationException))]
+        public void ErrorIfUlpsIsUsedOnDecimal()
+        {
+            Assert.That(100m, Is.EqualTo(100m).Within(2).Ulps);
+        }
+
+        [Test]
+        public void UsesProvidedIComparer()
+        {
+            MyComparer comparer = new MyComparer();
+            Assert.That(2 + 2, Is.EqualTo(4).Using(comparer));
+            Assert.That(comparer.Called, "Comparer was not called");
+        }
+
+        class MyComparer : IComparer
+        {
+            public bool Called;
+
+            public int Compare(object x, object y)
+            {
+                Called = true;
+                return Comparer.Default.Compare(x, y);
+            }
+        }
+
+#if NET_2_0
+        [Test]
+        public void UsesProvidedEqualityComparer()
+        {
+            MyEqualityComparer comparer = new MyEqualityComparer();
+            Assert.That(2 + 2, Is.EqualTo(4).Using(comparer));
+            Assert.That(comparer.Called, "Comparer was not called");
+        }
+
+        class MyEqualityComparer : IEqualityComparer
+        {
+            public bool Called;
+
+            bool IEqualityComparer.Equals(object x, object y)
+            {
+                Called = true;
+                return Comparer.Default.Compare(x, y) == 0;
+            }
+
+            int IEqualityComparer.GetHashCode(object x)
+            {
+                return x.GetHashCode();
+            }
+        }
+
+        [Test]
+        public void UsesProvidedEqualityComparerOfT()
+        {
+            MyEqualityComparerOfT<int> comparer = new MyEqualityComparerOfT<int>();
+            Assert.That(2 + 2, Is.EqualTo(4).Using(comparer));
+            Assert.That(comparer.Called, "Comparer was not called");
+        }
+
+        class MyEqualityComparerOfT<T> : IEqualityComparer<T>
+        {
+            public bool Called;
+
+            bool IEqualityComparer<T>.Equals(T x, T y)
+            {
+                Called = true;
+                return Comparer<T>.Default.Compare(x, y) == 0;
+            }
+
+            int IEqualityComparer<T>.GetHashCode(T x)
+            {
+                return x.GetHashCode();
+            }
+        }
+
+        [Test]
+        public void UsesProvidedComparerOfT()
+        {
+            MyComparer<int> comparer = new MyComparer<int>();
+            Assert.That( 2+2, Is.EqualTo(4).Using(comparer));
+            Assert.That(comparer.Called, "Comparer was not called");
+        }
+
+        class MyComparer<T> : IComparer<T>
+        {
+            public bool Called;
+
+            public int Compare(T x, T y)
+            {
+                Called = true;
+                return Comparer<T>.Default.Compare(x, y);
+            }
+        }
+
+        [Test]
+        public void UsesProvidedComparisonOfT()
+        {
+            MyComparison<int> comparer = new MyComparison<int>();
+            Assert.That(2 + 2, Is.EqualTo(4).Using(new Comparison<int>(comparer.Compare)));
+            Assert.That(comparer.Called, "Comparer was not called");
+        }
+
+        class MyComparison<T>
+        {
+            public bool Called;
+
+            public int Compare(T x, T y)
+            {
+                Called = true;
+                return Comparer<T>.Default.Compare(x, y);
+            }
+        }
+
+#if CS_3_0
+        [Test]
+        public void UsesProvidedLambda_IntArgs()
+        {
+            Assert.That(2 + 2, Is.EqualTo(4).Using<int>( (x, y) => x.CompareTo(y) ) );
+        }
+
+        [Test]
+        public void UsesProvidedLambda_StringArgs()
+        {
+            Assert.That("hello", Is.EqualTo("HELLO").Using<string>((x,y) => String.Compare(x, y, true)));
+        }
+#endif
+#endif
+    }
+
+    [TestFixture]
+    public class EqualTest : IExpectException
+    {
+
+        [Test, ExpectedException(typeof(AssertionException))]
         public void FailedStringMatchShowsFailurePosition()
         {
             Assert.That( "abcdgfe", new EqualConstraint( "abcdefg" ) );
         }
 
-        static string testString = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
+        static readonly string testString = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
 
         [Test, ExpectedException(typeof(AssertionException))]
         public void LongStringsAreTruncated()
@@ -57,29 +474,6 @@ namespace NUnit.Framework.Constraints.Tests
             Assert.That(actual, new EqualConstraint(expected));
         }
 
-        [Test]
-        public void NANsCompareAsEqual()
-        {
-            Assert.That(double.NaN, new EqualConstraint(double.NaN));
-        }
-
-		[Test]
-		public void CanCompareDates()
-		{
-			DateTime expected = new DateTime( 2007, 4, 1 );
-			DateTime actual = new DateTime( 2007, 4, 1 );
-			Assert.That( actual, new EqualConstraint( expected ));
-		}
-
-		[Test]
-		public void CanCompareDatesWithinTolerance()
-		{
-			DateTime expected = new DateTime( 2007, 4, 1, 13, 0, 0 );
-			DateTime actual = new DateTime( 2007, 4, 1, 13, 1, 0 );
-			TimeSpan tolerance = TimeSpan.FromMinutes( 5.0 );
-			Assert.That( actual, new EqualConstraint( expected ).Within( tolerance ));
-		}
-
 //        [Test]
 //        public void NamedAndUnnamedColorsCompareAsEqual()
 //        {
@@ -91,7 +485,7 @@ namespace NUnit.Framework.Constraints.Tests
         public void HandleException(Exception ex)
         {
             StringReader rdr = new StringReader(ex.Message);
-            string report = rdr.ReadLine();
+            /* skip */ rdr.ReadLine();
             string expected = rdr.ReadLine();
             if (expected != null && expected.Length > 11)
                 expected = expected.Substring(11);
@@ -110,7 +504,7 @@ namespace NUnit.Framework.Constraints.Tests
                 if (caret > minLength ||
                     expected.Substring(0, minMatch) != actual.Substring(0, minMatch) ||
                     expected[caret] == actual[caret])
-                Assert.Fail("Message Error: Caret does not point at first mismatch..." + Environment.NewLine + ex.Message);
+                    Assert.Fail("Message Error: Caret does not point at first mismatch..." + Environment.NewLine + ex.Message);
             }
 
             if (expected.Length > 68 || actual.Length > 68 || caret > 68)
@@ -134,9 +528,39 @@ namespace NUnit.Framework.Constraints.Tests
 
             public override void WriteDescriptionTo(MessageWriter writer)
             {
-                writer.WriteExpectedValue( "same color as " + expectedColor.ToString());
+                writer.WriteExpectedValue( "same color as " + expectedColor );
             }
         }
 
+#if NET_2_0
+        [Test]
+        public void TestPropertyWithPrivateSetter()
+        {
+            SomeClass obj = new SomeClass();
+            Assert.That(obj.BrokenProp, Is.EqualTo(string.Empty));
+        }
+
+        private class SomeClass
+        {
+            public string BrokenProp
+            {
+                get { return string.Empty; }
+                private set { }
+            }
+        }
+#endif
     }
-}
+	
+	[TestFixture]
+	public class EqualityComparerTests
+	{
+		[Test]
+		public void CanCompareArrayContainingSelfToSelf()
+		{
+			object[] array = new object[1];
+			array[0] = array;
+			NUnitEqualityComparer comparer = new NUnitEqualityComparer();
+			Assert.True(comparer.ObjectsEqual(array, array));
+		}
+	}
+}
\ No newline at end of file
diff --git a/src/NUnitFramework/tests/Constraints/FloatingPointNumericsTest.cs b/src/NUnitFramework/tests/Constraints/FloatingPointNumericsTest.cs
new file mode 100644
index 0000000..4d55d2d
--- /dev/null
+++ b/src/NUnitFramework/tests/Constraints/FloatingPointNumericsTest.cs
@@ -0,0 +1,107 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.IO;
+using System.Drawing;
+
+namespace NUnit.Framework.Constraints
+{
+    [TestFixture]
+    public class FloatingPointNumericsTest
+    {
+
+        /// <summary>Tests the floating point value comparison helper</summary>
+        [Test]
+        public void FloatEqualityWithUlps()
+        {
+            Assert.IsTrue(
+                FloatingPointNumerics.AreAlmostEqualUlps(0.00000001f, 0.0000000100000008f, 1)
+            );
+            Assert.IsFalse(
+                FloatingPointNumerics.AreAlmostEqualUlps(0.00000001f, 0.0000000100000017f, 1)
+            );
+
+            Assert.IsTrue(
+                FloatingPointNumerics.AreAlmostEqualUlps(1000000.00f, 1000000.06f, 1)
+            );
+            Assert.IsFalse(
+                FloatingPointNumerics.AreAlmostEqualUlps(1000000.00f, 1000000.13f, 1)
+            );
+        }
+
+        /// <summary>Tests the double precision floating point value comparison helper</summary>
+        [Test]
+        public void DoubleEqualityWithUlps()
+        {
+            Assert.IsTrue(
+                FloatingPointNumerics.AreAlmostEqualUlps(0.00000001, 0.000000010000000000000002, 1)
+            );
+            Assert.IsFalse(
+                FloatingPointNumerics.AreAlmostEqualUlps(0.00000001, 0.000000010000000000000004, 1)
+            );
+
+            Assert.IsTrue(
+                FloatingPointNumerics.AreAlmostEqualUlps(1000000.00, 1000000.0000000001, 1)
+            );
+            Assert.IsFalse(
+                FloatingPointNumerics.AreAlmostEqualUlps(1000000.00, 1000000.0000000002, 1)
+            );
+        }
+
+        /// <summary>Tests the integer reinterpretation functions</summary>
+        [Test]
+        public void MirroredIntegerReinterpretation()
+        {
+            Assert.AreEqual(
+                12345.0f,
+                FloatingPointNumerics.ReinterpretAsFloat(
+                    FloatingPointNumerics.ReinterpretAsInt(12345.0f)
+                )
+            );
+        }
+
+        /// <summary>Tests the long reinterpretation functions</summary>
+        [Test]
+        public void MirroredLongReinterpretation()
+        {
+            Assert.AreEqual(
+                12345.67890,
+                FloatingPointNumerics.ReinterpretAsDouble(
+                    FloatingPointNumerics.ReinterpretAsLong(12345.67890)
+                )
+            );
+        }
+
+        /// <summary>Tests the floating point reinterpretation functions</summary>
+        [Test]
+        public void MirroredFloatReinterpretation()
+        {
+            Assert.AreEqual(
+                12345,
+                FloatingPointNumerics.ReinterpretAsInt(
+                    FloatingPointNumerics.ReinterpretAsFloat(12345)
+                )
+            );
+        }
+
+
+        /// <summary>
+        ///   Tests the double prevision floating point reinterpretation functions
+        /// </summary>
+        [Test]
+        public void MirroredDoubleReinterpretation()
+        {
+            Assert.AreEqual(
+                1234567890,
+                FloatingPointNumerics.ReinterpretAsLong(
+                    FloatingPointNumerics.ReinterpretAsDouble(1234567890)
+                )
+            );
+        }
+
+  }
+}
diff --git a/src/NUnitFramework/tests/Constraints/MsgUtilTests.cs b/src/NUnitFramework/tests/Constraints/MsgUtilTests.cs
new file mode 100644
index 0000000..c2ca2b5
--- /dev/null
+++ b/src/NUnitFramework/tests/Constraints/MsgUtilTests.cs
@@ -0,0 +1,113 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+	/// <summary>
+	/// Summary description for MsgUtilTests.
+	/// </summary>
+	[TestFixture]
+	public class MsgUtilTests
+	{
+        [TestCase("\n", "\\n")]
+        [TestCase("\n\n", "\\n\\n")]
+        [TestCase("\n\n\n", "\\n\\n\\n")]
+        [TestCase("\r", "\\r")]
+        [TestCase("\r\r", "\\r\\r")]
+        [TestCase("\r\r\r", "\\r\\r\\r")]
+        [TestCase("\r\n", "\\r\\n")]
+        [TestCase("\n\r", "\\n\\r")]
+        [TestCase("This is a\rtest message", "This is a\\rtest message")]
+        [TestCase("", "")]
+#if NET_2_0
+		[TestCase(null, null)]
+#endif
+        [TestCase("\t", "\\t")]
+        [TestCase("\t\n", "\\t\\n")]
+        [TestCase("\\r\\n", "\\\\r\\\\n")]
+        // TODO: Figure out why this fails in Mono
+        // TODO: Need Platform property on test case
+        //[TestCase("\0", "\\0")]
+        [TestCase("\a", "\\a")]
+        [TestCase("\b", "\\b")]
+        [TestCase("\f", "\\f")]
+        [TestCase("\v", "\\v")]
+        // New Line
+        [TestCase("\x0085", "\\x0085", Description = "Next line character")]
+        [TestCase("\x2028", "\\x2028", Description = "Line separator character")]
+        [TestCase("\x2029", "\\x2029", Description = "Paragraph separator character")]
+        public void EscapeControlCharsTest(string input, string expected)
+		{
+            Assert.AreEqual( expected, MsgUtils.EscapeControlChars(input) );
+		}
+
+#if MONO
+        [Test]
+        public void EscapeNullCharInString()
+        {
+            Assert.That(MsgUtils.EscapeControlChars("\0"), Is.EqualTo("\\0"));
+        }
+#endif
+
+        private const string s52 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+        [TestCase(s52, 52, 0, s52, TestName="NoClippingNeeded")]
+        [TestCase(s52, 29, 0, "abcdefghijklmnopqrstuvwxyz...", TestName="ClipAtEnd")]
+        [TestCase(s52, 29, 26, "...ABCDEFGHIJKLMNOPQRSTUVWXYZ", TestName="ClipAtStart")]
+        [TestCase(s52, 28, 26, "...ABCDEFGHIJKLMNOPQRSTUV...", TestName="ClipAtStartAndEnd")]
+        public void TestClipString(string input, int max, int start, string result)
+        {
+            Assert.AreEqual(result, MsgUtils.ClipString(input, max, start));
+        }
+
+        //[TestCase('\0')]
+        //[TestCase('\r')]
+        //public void CharacterArgumentTest(char c)
+        //{
+        //}
+
+        [Test]
+        public void ClipExpectedAndActual_StringsFitInLine()
+        {
+            string eClip = s52;
+            string aClip = "abcde";
+            MsgUtils.ClipExpectedAndActual(ref eClip, ref aClip, 52, 5);
+            Assert.AreEqual(s52, eClip);
+            Assert.AreEqual("abcde", aClip);
+
+            eClip = s52;
+            aClip = "abcdefghijklmno?qrstuvwxyz";
+            MsgUtils.ClipExpectedAndActual(ref eClip, ref aClip, 52, 15);
+            Assert.AreEqual(s52, eClip);
+            Assert.AreEqual("abcdefghijklmno?qrstuvwxyz", aClip);
+        }
+
+        [Test]
+        public void ClipExpectedAndActual_StringTailsFitInLine()
+        {
+            string s1 = s52;
+            string s2 = s52.Replace('Z', '?');
+            MsgUtils.ClipExpectedAndActual(ref s1, ref s2, 29, 51);
+            Assert.AreEqual("...ABCDEFGHIJKLMNOPQRSTUVWXYZ", s1);
+        }
+
+        [Test]
+        public void ClipExpectedAndActual_StringsDoNotFitInLine()
+        {
+            string s1 = s52;
+            string s2 = "abcdefghij";
+            MsgUtils.ClipExpectedAndActual(ref s1, ref s2, 29, 10);
+            Assert.AreEqual("abcdefghijklmnopqrstuvwxyz...", s1);
+            Assert.AreEqual("abcdefghij", s2);
+
+            s1 = s52;
+            s2 = "abcdefghijklmno?qrstuvwxyz";
+            MsgUtils.ClipExpectedAndActual(ref s1, ref s2, 25, 15);
+            Assert.AreEqual("...efghijklmnopqrstuvw...", s1);
+            Assert.AreEqual("...efghijklmno?qrstuvwxyz", s2);
+        }
+	}
+}
diff --git a/src/NUnitFramework/tests/Constraints/NotTest.cs b/src/NUnitFramework/tests/Constraints/NotTest.cs
index f426254..377cf7a 100644
--- a/src/NUnitFramework/tests/Constraints/NotTest.cs
+++ b/src/NUnitFramework/tests/Constraints/NotTest.cs
@@ -1,43 +1,47 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 
-using System;
-using NUnit.Framework.SyntaxHelpers;
+using NUnit.Framework.Constraints;
 
-namespace NUnit.Framework.Constraints.Tests
+namespace NUnit.Framework.Constraints
 {
     [TestFixture]
     public class NotTest : ConstraintTestBase
     {
-		[SetUp]
+        [SetUp]
         public void SetUp()
         {
-            Matcher = new NotConstraint( new EqualConstraint(null) );
-            GoodValues = new object[] { 42, "Hello" };
-            BadValues = new object [] { null };
-            Description = "not null";
+            theConstraint = new NotConstraint( new EqualConstraint(null) );
+            expectedDescription = "not null";
+            stringRepresentation = "<not <equal null>>";
         }
 
-		[Test,ExpectedException(typeof(AssertionException),ExpectedMessage="ignoring case",MatchType=MessageMatch.Contains)]
-		public void NotHonorsIgnoreCaseUsingConstructors()
-		{
-			Assert.That( "abc", new NotConstraint( new EqualConstraint( "ABC" ).IgnoreCase ) );
-		}
+        internal object[] SuccessData = new object[] { 42, "Hello" };
+            
+        internal object[] FailureData = new object [] { null };
 
-		[Test,ExpectedException(typeof(AssertionException),ExpectedMessage="ignoring case",MatchType=MessageMatch.Contains)]
-		public void NotHonorsIgnoreCaseUsingPrefixNotation()
-		{
-			Assert.That( "abc", Is.Not.EqualTo( "ABC" ).IgnoreCase );
-		}
+        internal string[] ActualValues = new string[] { "null" };
 
-		[Test,ExpectedException(typeof(AssertionException),ExpectedMessage="+/-",MatchType=MessageMatch.Contains)]
-		public void NotHonorsTolerance()
-		{
-			Assert.That( 4.99d, Is.Not.EqualTo( 5.0d ).Within( .05d ) );
-		}
+        [Test, ExpectedException(typeof(AssertionException), ExpectedMessage = "ignoring case", MatchType = MessageMatch.Contains)]
+        public void NotHonorsIgnoreCaseUsingConstructors()
+        {
+            Assert.That("abc", new NotConstraint(new EqualConstraint("ABC").IgnoreCase));
+        }
+
+        [Test,ExpectedException(typeof(AssertionException),ExpectedMessage="ignoring case",MatchType=MessageMatch.Contains)]
+        public void NotHonorsIgnoreCaseUsingPrefixNotation()
+        {
+            Assert.That( "abc", Is.Not.EqualTo( "ABC" ).IgnoreCase );
+        }
+
+        [Test,ExpectedException(typeof(AssertionException),ExpectedMessage="+/-",MatchType=MessageMatch.Contains)]
+        public void NotHonorsTolerance()
+        {
+            Assert.That( 4.99d, Is.Not.EqualTo( 5.0d ).Within( .05d ) );
+        }
 
         [Test]
         public void CanUseNotOperator()
@@ -45,4 +49,4 @@ namespace NUnit.Framework.Constraints.Tests
             Assert.That(42, !new EqualConstraint(99));
         }
     }
-}
+}
\ No newline at end of file
diff --git a/src/NUnitFramework/tests/Constraints/NumericsTest.cs b/src/NUnitFramework/tests/Constraints/NumericsTest.cs
new file mode 100644
index 0000000..a859f38
--- /dev/null
+++ b/src/NUnitFramework/tests/Constraints/NumericsTest.cs
@@ -0,0 +1,95 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework.Constraints
+{
+    [TestFixture]
+    public class NumericsTest
+    {
+        private Tolerance tenPercent, zeroTolerance;
+
+        [SetUp]
+        public void SetUp()
+        {
+            tenPercent = new Tolerance(10.0).Percent;
+            zeroTolerance = new Tolerance(0);
+        }
+
+        [TestCase(123456789)]
+        [TestCase(123456789U)]
+        [TestCase(123456789L)]
+        [TestCase(123456789UL)]
+        [TestCase(1234.5678f)]
+        [TestCase(1234.5678)]
+        [Test]
+        public void CanMatchWithoutToleranceMode(object value)
+        {
+            Assert.IsTrue(Numerics.AreEqual(value, value, ref zeroTolerance));
+        }
+
+        // Separate test case because you can't use decimal in an attribute (24.1.3)
+        [Test]
+        public void CanMatchDecimalWithoutToleranceMode()
+        {
+            Assert.IsTrue(Numerics.AreEqual(123m, 123m, ref zeroTolerance));
+        }
+
+        [TestCase((int)9500)]
+        [TestCase((int)10000)]
+        [TestCase((int)10500)]
+        [TestCase((uint)9500)]
+        [TestCase((uint)10000)]
+        [TestCase((uint)10500)]
+        [TestCase((long)9500)]
+        [TestCase((long)10000)]
+        [TestCase((long)10500)]
+        [TestCase((ulong)9500)]
+        [TestCase((ulong)10000)]
+        [TestCase((ulong)10500)]
+        [Test]
+        public void CanMatchIntegralsWithPercentage(object value)
+        {
+            Assert.IsTrue(Numerics.AreEqual(10000, value, ref tenPercent));
+        }
+
+        [Test]
+        public void CanMatchDecimalWithPercentage()
+        {
+            Assert.IsTrue(Numerics.AreEqual(10000m, 9500m, ref tenPercent));
+            Assert.IsTrue(Numerics.AreEqual(10000m, 10000m, ref tenPercent));
+            Assert.IsTrue(Numerics.AreEqual(10000m, 10500m, ref tenPercent));
+        }
+
+        [TestCase((int)8500)]
+        [TestCase((int)11500)]
+        [TestCase((uint)8500)]
+        [TestCase((uint)11500)]
+        [TestCase((long)8500)]
+        [TestCase((long)11500)]
+        [TestCase((ulong)8500)]
+        [TestCase((ulong)11500)]
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void FailsOnIntegralsOutsideOfPercentage(object value)
+        {
+            Assert.IsTrue(Numerics.AreEqual(10000, value, ref tenPercent));
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void FailsOnDecimalBelowPercentage()
+        {
+            Assert.IsTrue(Numerics.AreEqual(10000m, 8500m, ref tenPercent));
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void FailsOnDecimalAbovePercentage()
+        {
+            Assert.IsTrue(Numerics.AreEqual(10000m, 11500m, ref tenPercent));
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/NUnitFramework/tests/Constraints/OrTest.cs b/src/NUnitFramework/tests/Constraints/OrTest.cs
index 0b24d35..8f466ad 100644
--- a/src/NUnitFramework/tests/Constraints/OrTest.cs
+++ b/src/NUnitFramework/tests/Constraints/OrTest.cs
@@ -1,29 +1,32 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 
-using System;
-
-namespace NUnit.Framework.Constraints.Tests
+namespace NUnit.Framework.Constraints
 {
     [TestFixture]
     public class OrTest : ConstraintTestBase
     {
-		[SetUp]
+        [SetUp]
         public void SetUp()
         {
-            Matcher = new OrConstraint(new EqualConstraint(42), new EqualConstraint(99));
-            GoodValues = new object[] { 99, 42 };
-            BadValues = new object[] { 37 };
-            Description = "42 or 99";
+            theConstraint = new OrConstraint(new EqualConstraint(42), new EqualConstraint(99));
+            expectedDescription = "42 or 99";
+            stringRepresentation = "<or <equal 42> <equal 99>>";
         }
 
-        [Test]
+		internal object[] SuccessData = new object[] { 99, 42 };
+
+		internal object[] FailureData = new object[] { 37 };
+
+		internal string[] ActualValues = new string[] { "37" };
+
+		[Test]
         public void CanCombineTestsWithOrOperator()
         {
             Assert.That(99, new EqualConstraint(42) | new EqualConstraint(99) );
         }
     }
-}
+}
\ No newline at end of file
diff --git a/src/NUnitFramework/tests/Constraints/PathConstraintTests.cs b/src/NUnitFramework/tests/Constraints/PathConstraintTests.cs
new file mode 100644
index 0000000..6712cec
--- /dev/null
+++ b/src/NUnitFramework/tests/Constraints/PathConstraintTests.cs
@@ -0,0 +1,284 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// Summary description for PathConstraintTests.
+    /// </summary>]
+    [TestFixture]
+    public class SamePathTest_Windows : ConstraintTestBase
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new SamePathConstraint( @"C:\folder1\file.tmp" ).IgnoreCase;
+            expectedDescription = @"Path matching ""C:\folder1\file.tmp""";
+            stringRepresentation = "<samepath \"C:\\folder1\\file.tmp\" ignorecase>";
+        }
+
+        internal object[] SuccessData = new object[] 
+            { 
+                @"C:\folder1\file.tmp", 
+                @"C:\Folder1\File.TMP",
+                @"C:\folder1\.\file.tmp",
+                @"C:\folder1\folder2\..\file.tmp",
+                @"C:\FOLDER1\.\folder2\..\File.TMP",
+                @"C:/folder1/file.tmp"
+            };
+        internal object[] FailureData = new object[] 
+            { 
+                123,
+                @"C:\folder2\file.tmp",
+                @"C:\folder1\.\folder2\..\file.temp"
+            };
+        internal string[] ActualValues = new string[] 
+            { 
+                "123",
+                "\"C:\\folder2\\file.tmp\"",
+                "\"C:\\folder1\\.\\folder2\\..\\file.temp\""
+            };
+		
+		[Test]
+		public void RootPathEquality()
+		{
+			Assert.That("c:\\", Is.SamePath("C:\\junk\\..\\").IgnoreCase);
+		}
+    }
+
+    [TestFixture]
+    public class SamePathTest_Linux : ConstraintTestBase
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new SamePathConstraint(@"/folder1/file.tmp").RespectCase;
+            expectedDescription = @"Path matching ""/folder1/file.tmp""";
+            stringRepresentation = @"<samepath ""/folder1/file.tmp"" respectcase>";
+        }
+
+        internal object[] SuccessData = new object[] 
+            { 
+                @"/folder1/file.tmp", 
+                @"/folder1/./file.tmp",
+                @"/folder1/folder2/../file.tmp",
+                @"/folder1/./folder2/../file.tmp",
+                @"\folder1\file.tmp"
+            };
+        internal object[] FailureData = new object[] 
+            { 
+                123,
+                @"/folder2/file.tmp",
+                @"/folder1/./folder2/../file.temp",
+                @"/Folder1/File.TMP",
+                @"/FOLDER1/./folder2/../File.TMP",
+            };
+        internal string[] ActualValues = new string[] 
+            { 
+                "123",
+                "\"/folder2/file.tmp\"",
+                "\"/folder1/./folder2/../file.temp\"",
+                "\"/Folder1/File.TMP\"",
+                "\"/FOLDER1/./folder2/../File.TMP\"",
+            };
+
+		[Test]
+		public void RootPathEquality()
+		{
+			Assert.That("/", Is.SamePath("/junk/../"));
+		}
+	}
+
+    [TestFixture]
+    public class SubPathTest_Windows : ConstraintTestBase
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new SubPathConstraint( @"C:\folder1\folder2" ).IgnoreCase;
+            expectedDescription = @"Path under ""C:\folder1\folder2""";
+            stringRepresentation = @"<subpath ""C:\folder1\folder2"" ignorecase>";
+        }
+
+        internal object[] SuccessData = new object[]
+            {
+                @"C:\folder1\folder2\folder3",
+                @"C:\folder1\.\folder2\folder3",
+                @"C:\folder1\junk\..\folder2\folder3",
+                @"C:\FOLDER1\.\junk\..\Folder2\temp\..\Folder3",
+                @"C:/folder1/folder2/folder3",
+            };
+        internal object[] FailureData = new object[]
+            {
+                123,
+                @"C:\folder1\folder3",
+                @"C:\folder1\.\folder2\..\file.temp",
+                @"C:\folder1\folder2",
+                @"C:\Folder1\Folder2",
+                @"C:\folder1\.\folder2",
+                @"C:\folder1\junk\..\folder2",
+                @"C:\FOLDER1\.\junk\..\Folder2",
+                @"C:/folder1/folder2"
+            };
+        internal string[] ActualValues = new string[]
+            {
+                "123",
+                "\"C:\\folder1\\folder3\"",
+                "\"C:\\folder1\\.\\folder2\\..\\file.temp\"",
+                "\"C:\\folder1\\folder2\"",
+                "\"C:\\Folder1\\Folder2\"",
+                "\"C:\\folder1\\.\\folder2\"",
+                "\"C:\\folder1\\junk\\..\\folder2\"",
+                "\"C:\\FOLDER1\\.\\junk\\..\\Folder2\"",
+                "\"C:/folder1/folder2\""
+            };
+		
+		[Test]
+		public void SubPathOfRoot()
+		{
+			Assert.That("C:\\junk\\file.temp", new SubPathConstraint("C:\\"));
+		}
+    }
+
+    [TestFixture]
+    public class SubPathTest_Linux : ConstraintTestBase
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new SubPathConstraint( @"/folder1/folder2"  ).RespectCase;
+            expectedDescription = @"Path under ""/folder1/folder2""";
+            stringRepresentation = @"<subpath ""/folder1/folder2"" respectcase>";
+        }
+
+        internal object[] SuccessData = new object[]
+            {
+                @"/folder1/folder2/folder3",
+                @"/folder1/./folder2/folder3",
+                @"/folder1/junk/../folder2/folder3",
+                @"\folder1\folder2\folder3",
+            };
+        internal object[] FailureData = new object[]
+            {
+                123,
+                "/Folder1/Folder2",
+                "/FOLDER1/./junk/../Folder2",
+                "/FOLDER1/./junk/../Folder2/temp/../Folder3",
+                "/folder1/folder3",
+                "/folder1/./folder2/../folder3",
+				"/folder1",
+                "/folder1/folder2",
+                "/folder1/./folder2",
+                "/folder1/junk/../folder2",
+                @"\folder1\folder2"
+            };
+        internal string[] ActualValues = new string[]
+            {
+                "123",
+                "\"/Folder1/Folder2\"",
+                "\"/FOLDER1/./junk/../Folder2\"",
+                "\"/FOLDER1/./junk/../Folder2/temp/../Folder3\"",
+                "\"/folder1/folder3\"",
+                "\"/folder1/./folder2/../folder3\"",
+				"\"/folder1\"",
+                "\"/folder1/folder2\"",
+                "\"/folder1/./folder2\"",
+                "\"/folder1/junk/../folder2\"",
+                "\"\\folder1\\folder2\""
+            };
+
+		[Test]
+		public void SubPathOfRoot()
+		{
+			Assert.That("/junk/file.temp", new SubPathConstraint("/"));
+		}
+}
+	
+    [TestFixture]
+    public class SamePathOrUnderTest_Windows : ConstraintTestBase
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new SamePathOrUnderConstraint( @"C:\folder1\folder2" ).IgnoreCase;
+            expectedDescription = @"Path under or matching ""C:\folder1\folder2""";
+            stringRepresentation = @"<samepathorunder ""C:\folder1\folder2"" ignorecase>";
+        }
+
+        internal object[] SuccessData = new object[]
+            {
+                @"C:\folder1\folder2",
+                @"C:\Folder1\Folder2",
+                @"C:\folder1\.\folder2",
+                @"C:\folder1\junk\..\folder2",
+                @"C:\FOLDER1\.\junk\..\Folder2",
+                @"C:/folder1/folder2",
+                @"C:\folder1\folder2\folder3",
+                @"C:\folder1\.\folder2\folder3",
+                @"C:\folder1\junk\..\folder2\folder3",
+                @"C:\FOLDER1\.\junk\..\Folder2\temp\..\Folder3",
+                @"C:/folder1/folder2/folder3",
+            };
+        internal object[] FailureData = new object[]
+            {
+                123,
+                @"C:\folder1\folder3",
+                @"C:\folder1\.\folder2\..\file.temp"
+            };
+        internal string[] ActualValues = new string[]
+            {
+                "123",
+                "\"C:\\folder1\\folder3\"",
+                "\"C:\\folder1\\.\\folder2\\..\\file.temp\""
+            };
+    }
+
+    [TestFixture]
+    public class SamePathOrUnderTest_Linux : ConstraintTestBase
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new SamePathOrUnderConstraint( @"/folder1/folder2"  ).RespectCase;
+            expectedDescription = @"Path under or matching ""/folder1/folder2""";
+            stringRepresentation = @"<samepathorunder ""/folder1/folder2"" respectcase>";
+        }
+
+        internal object[] SuccessData = new object[]
+            {
+                @"/folder1/folder2",
+                @"/folder1/./folder2",
+                @"/folder1/junk/../folder2",
+                @"\folder1\folder2",
+                @"/folder1/folder2/folder3",
+                @"/folder1/./folder2/folder3",
+                @"/folder1/junk/../folder2/folder3",
+                @"\folder1\folder2\folder3",
+            };
+        internal object[] FailureData = new object[]
+            {
+                123,
+                "/Folder1/Folder2",
+                "/FOLDER1/./junk/../Folder2",
+                "/FOLDER1/./junk/../Folder2/temp/../Folder3",
+                "/folder1/folder3",
+                "/folder1/./folder2/../folder3",
+				"/folder1"
+            };
+        internal string[] ActualValues = new string[]
+            {
+                "123",
+                "\"/Folder1/Folder2\"",
+                "\"/FOLDER1/./junk/../Folder2\"",
+                "\"/FOLDER1/./junk/../Folder2/temp/../Folder3\"",
+                "\"/folder1/folder3\"",
+                "\"/folder1/./folder2/../folder3\"",
+				"\"/folder1\""
+            };
+    }
+}
\ No newline at end of file
diff --git a/src/NUnitFramework/tests/Constraints/PropertyTests.cs b/src/NUnitFramework/tests/Constraints/PropertyTests.cs
new file mode 100644
index 0000000..cd49ba8
--- /dev/null
+++ b/src/NUnitFramework/tests/Constraints/PropertyTests.cs
@@ -0,0 +1,70 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Constraints
+{
+    public class PropertyExistsTest : ConstraintTestBaseWithExceptionTests
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new PropertyExistsConstraint("Length");
+            expectedDescription = "property Length";
+            stringRepresentation = "<propertyexists Length>";
+        }
+
+        internal static object[] SuccessData = new object[] { new int[0], "hello", typeof(Array) };
+
+        internal static object[] FailureData = new object[] { 42, new System.Collections.ArrayList(), typeof(Int32) };
+
+        internal static string[] ActualValues = new string[] { "<System.Int32>", "<System.Collections.ArrayList>", "<System.Int32>" };
+
+        internal static object[] InvalidData = new TestCaseData[] 
+        { 
+            new TestCaseData(null).Throws(typeof(ArgumentNullException))
+        };
+    }
+
+    public class PropertyTest : ConstraintTestBaseWithExceptionTests
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new PropertyConstraint("Length", new EqualConstraint(5));
+            expectedDescription = "property Length equal to 5";
+            stringRepresentation = "<property Length <equal 5>>";
+        }
+
+        internal static object[] SuccessData = new object[] { new int[5], "hello" };
+
+        internal static object[] FailureData = new object[] { new int[3], "goodbye" };
+
+        internal static string[] ActualValues = new string[] { "3", "7" };
+
+        internal static object[] InvalidData = new object[] 
+        { 
+            new TestCaseData(null).Throws(typeof(ArgumentNullException)),
+            new TestCaseData(42).Throws(typeof(ArgumentException)), 
+            new TestCaseData(new System.Collections.ArrayList()).Throws(typeof(ArgumentException))
+        };
+
+        [Test]
+        public void PropertyEqualToValueWithTolerance()
+        {
+            Constraint c = new EqualConstraint(105m).Within(0.1m);
+            TextMessageWriter w = new TextMessageWriter();
+            c.WriteDescriptionTo(w);
+            Assert.That(w.ToString(), Is.EqualTo("105m +/- 0.1m"));
+
+            c = new PropertyConstraint("D", new EqualConstraint(105m).Within(0.1m));
+            w = new TextMessageWriter();
+            c.WriteDescriptionTo(w);
+            Assert.That(w.ToString(), Is.EqualTo("property D equal to 105m +/- 0.1m"));
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/Constraints/ReusableConstraintTests.cs b/src/NUnitFramework/tests/Constraints/ReusableConstraintTests.cs
new file mode 100644
index 0000000..53306c4
--- /dev/null
+++ b/src/NUnitFramework/tests/Constraints/ReusableConstraintTests.cs
@@ -0,0 +1,39 @@
+using System;
+
+namespace NUnit.Framework.Constraints
+{
+    [TestFixture]
+    public class ReusableConstraintTests
+    {
+        [Datapoints]
+        internal static readonly ReusableConstraint[] constraints = new ReusableConstraint[] {
+            Is.Not.Empty,
+            Is.Not.Null,
+            Has.Length.GreaterThan(3),
+            Has.Property("Length").EqualTo(4).And.StartsWith("te")
+        };
+
+        [Theory]
+        public void CanReuseReusableConstraintMultipleTimes(ReusableConstraint c)
+        {
+            string s = "test";
+
+            Assume.That(s, c);
+
+            Assert.That(s, c, "Should pass first time");
+            Assert.That(s, c, "Should pass second time");
+            Assert.That(s, c, "Should pass third time");
+        }
+
+        [Test]
+        public void CanCreateReusableConstraintByImplicitConversion()
+        {
+            ReusableConstraint c = Is.Not.Null;
+
+            string s = "test";
+            Assert.That(s, c, "Should pass first time");
+            Assert.That(s, c, "Should pass second time");
+            Assert.That(s, c, "Should pass third time");
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/Constraints/SameAsTest.cs b/src/NUnitFramework/tests/Constraints/SameAsTest.cs
index 106e06c..c72b38d 100644
--- a/src/NUnitFramework/tests/Constraints/SameAsTest.cs
+++ b/src/NUnitFramework/tests/Constraints/SameAsTest.cs
@@ -1,26 +1,29 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 
-using System;
-
-namespace NUnit.Framework.Constraints.Tests
+namespace NUnit.Framework.Constraints
 {
     [TestFixture]
     public class SameAsTest : ConstraintTestBase
     {
-		[SetUp]
+        private static readonly object obj1 = new object();
+        private static readonly object obj2 = new object();
+
+        [SetUp]
         public void SetUp()
         {
-            object obj1 = new object();
-            object obj2 = new object();
-
-            Matcher = new SameAsConstraint(obj1);
-            GoodValues = new object[] { obj1 };
-            BadValues = new object[] { obj2, 3, "Hello" };
-            Description = "same as <System.Object>";
+            theConstraint = new SameAsConstraint(obj1);
+            expectedDescription = "same as <System.Object>";
+            stringRepresentation = "<sameas System.Object>";
         }
+
+        internal static object[] SuccessData = new object[] { obj1 };
+
+        internal static object[] FailureData = new object[] { obj2, 3, "Hello" };
+
+        internal static string[] ActualValues = new string[] { "<System.Object>", "3", "\"Hello\"" };
     }
-}
+}
\ No newline at end of file
diff --git a/src/NUnitFramework/tests/Constraints/SerializableConstraintTest.cs b/src/NUnitFramework/tests/Constraints/SerializableConstraintTest.cs
new file mode 100644
index 0000000..a4da77c
--- /dev/null
+++ b/src/NUnitFramework/tests/Constraints/SerializableConstraintTest.cs
@@ -0,0 +1,66 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+#if NET_2_0
+using System.Collections.Generic;
+#endif
+
+namespace NUnit.Framework.Constraints
+{
+    [TestFixture]
+    public class BinarySerializableTest : ConstraintTestBaseWithArgumentException
+    {
+		[SetUp]
+        public void SetUp()
+        {
+            theConstraint = new BinarySerializableConstraint();
+            expectedDescription = "binary serializable";
+            stringRepresentation = "<binaryserializable>";
+        }
+
+        internal object[] SuccessData = new object[] { 1, "a", new ArrayList(), new InternalWithSerializableAttributeClass() };
+        
+        internal object[] FailureData = new object[] { new InternalClass() };
+
+        internal string[] ActualValues = new string[] { "<InternalClass>" }; 
+
+        internal object[] InvalidData = new object[] { null };
+    }
+
+    [TestFixture]
+    public class XmlSerializableTest : ConstraintTestBaseWithArgumentException
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new XmlSerializableConstraint();
+            expectedDescription = "xml serializable";
+            stringRepresentation = "<xmlserializable>";
+        }
+
+        internal object[] SuccessData = new object[] { 1, "a", new ArrayList() };
+
+#if NET_2_0
+		internal object[] FailureData = new object[] { new Dictionary<string, string>(), new InternalClass(), new InternalWithSerializableAttributeClass() };
+        internal string[] ActualValues = new string[] { "<Dictionary`2>", "<InternalClass>", "<InternalWithSerializableAttributeClass>" };
+#else
+		internal object[] FailureData = new object[] { new InternalClass(), new InternalWithSerializableAttributeClass() };
+		internal string[] ActualValues = new string[] { "<InternalClass>", "<InternalWithSerializableAttributeClass>" };
+#endif
+
+
+        internal object[] InvalidData = new object[] { null };
+    }
+
+    internal class InternalClass
+    {}
+
+    [Serializable]
+    internal class InternalWithSerializableAttributeClass
+    {}
+}
diff --git a/src/NUnitFramework/tests/Constraints/StringConstraintTests.cs b/src/NUnitFramework/tests/Constraints/StringConstraintTests.cs
index 96cb287..da3218d 100644
--- a/src/NUnitFramework/tests/Constraints/StringConstraintTests.cs
+++ b/src/NUnitFramework/tests/Constraints/StringConstraintTests.cs
@@ -1,12 +1,12 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 
 using System;
 
-namespace NUnit.Framework.Constraints.Tests
+namespace NUnit.Framework.Constraints
 {
     [TestFixture]
     public class SubstringTest : ConstraintTestBase, IExpectException
@@ -14,12 +14,17 @@ namespace NUnit.Framework.Constraints.Tests
 		[SetUp]
         public void SetUp()
         {
-            Matcher = new SubstringConstraint("hello");
-            GoodValues = new object[] { "hello", "hello there", "I said hello", "say hello to fred" };
-            BadValues = new object[] { "goodbye", "What the hell?", string.Empty, null };
-            Description = "String containing \"hello\"";
+            theConstraint = new SubstringConstraint("hello");
+            expectedDescription = "String containing \"hello\"";
+            stringRepresentation = "<substring \"hello\">";
         }
 
+        internal object[] SuccessData = new object[] { "hello", "hello there", "I said hello", "say hello to fred" };
+        
+        internal object[] FailureData = new object[] { "goodbye", "HELLO", "What the hell?", string.Empty, null };
+
+        internal string[] ActualValues = new string[] { "\"goodbye\"", "\"HELLO\"", "\"What the hell?\"", "<string.Empty>", "null" }; 
+
         public void HandleException(Exception ex)
         {
             Assert.That(ex.Message, new EqualConstraint(
@@ -34,11 +39,16 @@ namespace NUnit.Framework.Constraints.Tests
 		[SetUp]
         public void SetUp()
         {
-            Matcher = new SubstringConstraint("hello").IgnoreCase;
-            GoodValues = new object[] { "Hello", "HellO there", "I said HELLO", "say hello to fred" };
-            BadValues = new object[] { "goodbye", "What the hell?", string.Empty, null };
-            Description = "String containing \"hello\", ignoring case";
+            theConstraint = new SubstringConstraint("hello").IgnoreCase;
+            expectedDescription = "String containing \"hello\", ignoring case";
+            stringRepresentation = "<substring \"hello\">";
         }
+
+        internal object[] SuccessData = new object[] { "Hello", "HellO there", "I said HELLO", "say hello to fred" };
+        
+        internal object[] FailureData = new object[] { "goodbye", "What the hell?", string.Empty, null };
+
+        internal string[] ActualValues = new string[] { "\"goodbye\"", "\"What the hell?\"", "<string.Empty>", "null" };
     }
 
     [TestFixture]
@@ -47,11 +57,16 @@ namespace NUnit.Framework.Constraints.Tests
 		[SetUp]
         public void SetUp()
         {
-            Matcher = new StartsWithConstraint("hello");
-            GoodValues = new object[] { "hello", "hello there" };
-            BadValues = new object[] { "goodbye", "What the hell?", "I said hello", "say hello to fred", string.Empty, null };
-            Description = "String starting with \"hello\"";
+            theConstraint = new StartsWithConstraint("hello");
+            expectedDescription = "String starting with \"hello\"";
+            stringRepresentation = "<startswith \"hello\">";
         }
+
+        internal object[] SuccessData = new object[] { "hello", "hello there" };
+
+        internal object[] FailureData = new object[] { "goodbye", "HELLO THERE", "I said hello", "say hello to fred", string.Empty, null };
+
+        internal string[] ActualValues = new string[] { "\"goodbye\"", "\"HELLO THERE\"", "\"I said hello\"", "\"say hello to fred\"", "<string.Empty>", "null" };
     }
 
     [TestFixture]
@@ -60,11 +75,16 @@ namespace NUnit.Framework.Constraints.Tests
 		[SetUp]
         public void SetUp()
         {
-            Matcher = new StartsWithConstraint("hello").IgnoreCase;
-            GoodValues = new object[] { "Hello", "HELLO there" };
-            BadValues = new object[] { "goodbye", "What the hell?", "I said hello", "say Hello to fred", string.Empty, null };
-            Description = "String starting with \"hello\", ignoring case";
+            theConstraint = new StartsWithConstraint("hello").IgnoreCase;
+            expectedDescription = "String starting with \"hello\", ignoring case";
+            stringRepresentation = "<startswith \"hello\">";
         }
+
+        internal object[] SuccessData = new object[] { "Hello", "HELLO there" };
+            
+        internal object[] FailureData = new object[] { "goodbye", "What the hell?", "I said hello", "say Hello to fred", string.Empty, null };
+
+        internal string[] ActualValues = new string[] { "\"goodbye\"", "\"What the hell?\"", "\"I said hello\"", "\"say Hello to fred\"", "<string.Empty>", "null" };
     }
 
     [TestFixture]
@@ -73,36 +93,50 @@ namespace NUnit.Framework.Constraints.Tests
 		[SetUp]
         public void SetUp()
         {
-            Matcher = new EndsWithConstraint("hello");
-            GoodValues = new object[] { "hello", "I said hello" };
-            BadValues = new object[] { "goodbye", "What the hell?", "hello there", "say hello to fred", string.Empty, null };
-            Description = "String ending with \"hello\"";
+            theConstraint = new EndsWithConstraint("hello");
+            expectedDescription = "String ending with \"hello\"";
+            stringRepresentation = "<endswith \"hello\">";
         }
-    }
 
-    [TestFixture]
-    public class EndsWithTestIgnoringCase : ConstraintTestBase//, IExpectException
-    {
-		[SetUp]
-        public void SetUp()
-        {
-            Matcher = new EndsWithConstraint("hello").IgnoreCase;
-            GoodValues = new object[] { "HELLO", "I said Hello" };
-            BadValues = new object[] { "goodbye", "What the hell?", "hello there", "say hello to fred", string.Empty, null };
-            Description = "String ending with \"hello\", ignoring case";
-        }
+        internal object[] SuccessData = new object[] { "hello", "I said hello" };
+            
+        internal object[] FailureData = new object[] { "goodbye", "What the hell?", "hello there", "say hello to fred", string.Empty, null };
+
+        internal string[] ActualValues = new string[] { "\"goodbye\"", "\"What the hell?\"", "\"hello there\"", "\"say hello to fred\"", "<string.Empty>", "null" };
     }
 
     [TestFixture]
-    public class EqualIgnoringCaseTest : ConstraintTestBase
+    public class EndsWithTestIgnoringCase : ConstraintTestBase
     {
 		[SetUp]
         public void SetUp()
         {
-            Matcher = new EqualConstraint("Hello World!").IgnoreCase;
-            GoodValues = new object[] { "hello world!", "Hello World!", "HELLO world!" };
-            BadValues = new object[] { "goodbye", "Hello Friends!", string.Empty, null };
-            Description = "\"Hello World!\", ignoring case";
+            theConstraint = new EndsWithConstraint("hello").IgnoreCase;
+            expectedDescription = "String ending with \"hello\", ignoring case";
+            stringRepresentation = "<endswith \"hello\">";
         }
+
+        internal object[] SuccessData = new object[] { "HELLO", "I said Hello" };
+            
+        internal object[] FailureData = new object[] { "goodbye", "What the hell?", "hello there", "say hello to fred", string.Empty, null };
+
+        internal string[] ActualValues = new string[] { "\"goodbye\"", "\"What the hell?\"", "\"hello there\"", "\"say hello to fred\"", "<string.Empty>", "null" };
     }
+
+    //[TestFixture]
+    //public class EqualIgnoringCaseTest : ConstraintTest
+    //{
+    //    [SetUp]
+    //    public void SetUp()
+    //    {
+    //        Matcher = new EqualConstraint("Hello World!").IgnoreCase;
+    //        Description = "\"Hello World!\", ignoring case";
+    //    }
+
+    //    object[] SuccessData = new object[] { "hello world!", "Hello World!", "HELLO world!" };
+            
+    //    object[] FailureData = new object[] { "goodbye", "Hello Friends!", string.Empty, null };
+
+    //    string[] ActualValues = new string[] { "\"goodbye\"", "\"Hello Friends!\"", "<string.Empty>", "null" };
+    //}
 }
diff --git a/src/NUnitFramework/tests/Constraints/ThrowsConstraintTests.cs b/src/NUnitFramework/tests/Constraints/ThrowsConstraintTests.cs
new file mode 100644
index 0000000..1dc9ed8
--- /dev/null
+++ b/src/NUnitFramework/tests/Constraints/ThrowsConstraintTests.cs
@@ -0,0 +1,109 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework.Tests;
+
+namespace NUnit.Framework.Constraints
+{
+    [TestFixture]
+    public class ThrowsConstraintTest_ExactType : ConstraintTestBase
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new ThrowsConstraint(
+                new ExactTypeConstraint(typeof(ArgumentException)));
+            expectedDescription = "<System.ArgumentException>";
+            stringRepresentation = "<throws <typeof System.ArgumentException>>";
+        }
+
+        internal static object[] SuccessData = new object[]
+        {
+            new TestDelegate( TestDelegates.ThrowsArgumentException )
+        };
+
+        internal static object[] FailureData = new object[]
+        {
+            new TestDelegate( TestDelegates.ThrowsApplicationException ),
+            new TestDelegate( TestDelegates.ThrowsNothing ),
+            new TestDelegate( TestDelegates.ThrowsSystemException )
+        };
+
+        internal static string[] ActualValues = new string[]
+        {
+            "<System.ApplicationException>",
+            "no exception thrown",
+            "<System.Exception>"
+        };
+    }
+
+    [TestFixture]
+    public class ThrowsConstraintTest_InstanceOfType : ConstraintTestBase
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new ThrowsConstraint(
+                new InstanceOfTypeConstraint(typeof(ApplicationException)));
+            expectedDescription = "instance of <System.ApplicationException>";
+            stringRepresentation = "<throws <instanceof System.ApplicationException>>";
+        }
+
+        internal static object[] SuccessData = new object[]
+        {
+            new TestDelegate( TestDelegates.ThrowsApplicationException ),
+            new TestDelegate( TestDelegates.ThrowsDerivedApplicationException )
+        };
+
+        internal static object[] FailureData = new object[]
+        {
+            new TestDelegate( TestDelegates.ThrowsArgumentException ),
+            new TestDelegate( TestDelegates.ThrowsNothing ),
+            new TestDelegate( TestDelegates.ThrowsSystemException )
+        };
+
+        internal static string[] ActualValues = new string[]
+        {
+            "<System.ArgumentException>",
+            "no exception thrown",
+            "<System.Exception>"
+        };
+    }
+
+    public class ThrowsConstraintTest_WithConstraint : ConstraintTestBase
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new ThrowsConstraint(
+                new AndConstraint(
+                    new ExactTypeConstraint(typeof(ArgumentException)),
+                    new PropertyConstraint("ParamName", new EqualConstraint("myParam"))));
+            expectedDescription = @"<System.ArgumentException> and property ParamName equal to ""myParam""";
+            stringRepresentation = @"<throws <and <typeof System.ArgumentException> <property ParamName <equal ""myParam"">>>>";
+        }
+
+        internal static object[] SuccessData = new object[]
+        {
+            new TestDelegate( TestDelegates.ThrowsArgumentException )
+        };
+
+        internal static object[] FailureData = new object[]
+        {
+            new TestDelegate( TestDelegates.ThrowsApplicationException ),
+            new TestDelegate( TestDelegates.ThrowsNothing ),
+            new TestDelegate( TestDelegates.ThrowsSystemException )
+        };
+
+        internal static string[] ActualValues = new string[]
+        {
+            "<System.ApplicationException>",
+            "no exception thrown",
+            "<System.Exception>"
+        };
+    }
+}
diff --git a/src/NUnitFramework/tests/Constraints/ToStringTests.cs b/src/NUnitFramework/tests/Constraints/ToStringTests.cs
new file mode 100644
index 0000000..b48bd49
--- /dev/null
+++ b/src/NUnitFramework/tests/Constraints/ToStringTests.cs
@@ -0,0 +1,69 @@
+// ****************************************************************
+// Copyright 2010, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Constraints
+{
+    public class ToStringTests
+    {
+        [Test]
+        public void CanDisplaySimpleConstraints_Unresolved()
+        {
+            Assert.That(Is.EqualTo(5).ToString(), Is.EqualTo("<equal 5>"));
+            Assert.That(Has.Property("X").ToString(), Is.EqualTo("<propertyexists X>"));
+            Assert.That(Has.Attribute(typeof(TestAttribute)).ToString(), 
+                Is.EqualTo("<attributeexists NUnit.Framework.TestAttribute>"));
+        }
+
+        [Test]
+        public void CanDisplaySimpleConstraints_Resolved()
+        {
+            IResolveConstraint constraint = Is.EqualTo(5);
+            Assert.That(constraint.Resolve().ToString(), Is.EqualTo("<equal 5>"));
+            constraint = Has.Property("X");
+            Assert.That(constraint.Resolve().ToString(), Is.EqualTo("<propertyexists X>"));
+            constraint = Has.Attribute(typeof(TestAttribute)).With.Property("Description").EqualTo("smoke");
+            Assert.That(constraint.Resolve().ToString(),
+                Is.EqualTo("<attribute NUnit.Framework.TestAttribute <property Description <equal \"smoke\">>>"));
+        }
+
+        [Test]
+        public void DisplayPrefixConstraints_Unresolved()
+        {
+            Assert.That(Is.Not.EqualTo(5).ToString(), Is.EqualTo("<unresolved <equal 5>>"));
+            Assert.That(Is.Not.All.EqualTo(5).ToString(), Is.EqualTo("<unresolved <equal 5>>"));
+            Assert.That(Has.Property("X").EqualTo(5).ToString(), Is.EqualTo("<unresolved <equal 5>>"));
+            Assert.That(Has.Attribute(typeof(TestAttribute)).With.Property("Description").EqualTo("smoke").ToString(),
+                Is.EqualTo("<unresolved <equal \"smoke\">>"));
+        }
+
+        [Test]
+        public void CanDisplayPrefixConstraints_Resolved()
+        {
+            IResolveConstraint constraint = Is.Not.EqualTo(5);
+            Assert.That(constraint.Resolve().ToString(), Is.EqualTo("<not <equal 5>>"));
+            constraint = Is.Not.All.EqualTo(5);
+            Assert.That(constraint.Resolve().ToString(), Is.EqualTo("<not <all <equal 5>>>"));
+            constraint = Has.Property("X").EqualTo(5);
+            Assert.That(constraint.Resolve().ToString(), Is.EqualTo("<property X <equal 5>>"));
+        }
+
+        [Test]
+        public void DisplayBinaryConstraints_Resolved()
+        {
+            IResolveConstraint constraint = Is.GreaterThan(0).And.LessThan(100);
+            Assert.That(constraint.Resolve().ToString(), Is.EqualTo("<and <greaterthan 0> <lessthan 100>>"));
+        }
+
+        [Test]
+        public void DisplayBinaryConstraints_UnResolved()
+        {
+            IResolveConstraint constraint = Is.GreaterThan(0).And.LessThan(100);
+            Assert.That(constraint.ToString(), Is.EqualTo("<unresolved <lessthan 100>>"));
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/Constraints/TypeConstraintTests.cs b/src/NUnitFramework/tests/Constraints/TypeConstraintTests.cs
index fda9d69..2cff43d 100644
--- a/src/NUnitFramework/tests/Constraints/TypeConstraintTests.cs
+++ b/src/NUnitFramework/tests/Constraints/TypeConstraintTests.cs
@@ -1,37 +1,52 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 
-using System;
-
-namespace NUnit.Framework.Constraints.Tests
+namespace NUnit.Framework.Constraints
 {
     [TestFixture]
     public class ExactTypeTest : ConstraintTestBase
     {
-		[SetUp]
+        [SetUp]
         public void SetUp()
         {
-            Matcher = new ExactTypeConstraint(typeof(D1));
-            GoodValues = new object[] { new D1() };
-            BadValues = new object[] { new B(), new D2() };
-            Description = "<NUnit.Framework.Constraints.Tests.D1>";
+            theConstraint = new ExactTypeConstraint(typeof(D1));
+            expectedDescription = string.Format("<{0}>", typeof(D1));
+            stringRepresentation = string.Format("<typeof {0}>", typeof(D1));
         }
+
+        internal object[] SuccessData = new object[] { new D1() };
+        
+        internal object[] FailureData = new object[] { new B(), new D2() };
+
+        internal string[] ActualValues = new string[]
+            {
+                "<NUnit.Framework.Constraints.B>",
+                "<NUnit.Framework.Constraints.D2>"
+            };
     }
 
     [TestFixture]
     public class InstanceOfTypeTest : ConstraintTestBase
     {
-		[SetUp]
+        [SetUp]
         public void SetUp()
         {
-            Matcher = new InstanceOfTypeConstraint(typeof(D1));
-            GoodValues = new object[] { new D1(), new D2() };
-            BadValues = new object[] { new B() };
-            Description = "instance of <NUnit.Framework.Constraints.Tests.D1>";
+            theConstraint = new InstanceOfTypeConstraint(typeof(D1));
+            expectedDescription = string.Format("instance of <{0}>", typeof(D1));
+            stringRepresentation = string.Format("<instanceof {0}>", typeof(D1));
         }
+
+        internal object[] SuccessData = new object[] { new D1(), new D2() };
+
+        internal object[] FailureData = new object[] { new B() };
+
+        internal string[] ActualValues = new string[]
+            {
+                "<NUnit.Framework.Constraints.B>"
+            };
     }
 
     [TestFixture]
@@ -40,14 +55,88 @@ namespace NUnit.Framework.Constraints.Tests
         [SetUp]
         public void SetUp()
         {
-            Matcher = new AssignableFromConstraint(typeof(D1));
-            GoodValues = new object[] { new D1(), new B() };
-            BadValues = new object[] { new D2() };
-            Description = "Type assignable from <NUnit.Framework.Constraints.Tests.D1>";
+            theConstraint = new AssignableFromConstraint(typeof(D1));
+            expectedDescription = string.Format("assignable from <{0}>", typeof(D1));
+            stringRepresentation = string.Format("<assignablefrom {0}>", typeof(D1));
+        }
+
+        internal object[] SuccessData = new object[] { new D1(), new B() };
+            
+        internal object[] FailureData = new object[] { new D2() };
+
+        internal string[] ActualValues = new string[]
+            {
+                "<NUnit.Framework.Constraints.D2>"
+            };
+    }
+
+    [TestFixture]
+    public class AssignableToTest : ConstraintTestBase
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new AssignableToConstraint(typeof(D1));
+            expectedDescription = string.Format("assignable to <{0}>", typeof(D1));
+            stringRepresentation = string.Format("<assignableto {0}>", typeof(D1));
         }
+        
+        internal object[] SuccessData = new object[] { new D1(), new D2() };
+            
+        internal object[] FailureData = new object[] { new B() };
+
+        internal string[] ActualValues = new string[]
+            {
+                "<NUnit.Framework.Constraints.B>"
+            };
     }
 
     class B { }
+
     class D1 : B { }
+
     class D2 : D1 { }
-}
+
+    [TestFixture]
+    public class AttributeExistsConstraintTest : ConstraintTestBase
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new AttributeExistsConstraint(typeof(TestFixtureAttribute));
+            expectedDescription = "type with attribute <NUnit.Framework.TestFixtureAttribute>";
+            stringRepresentation = "<attributeexists NUnit.Framework.TestFixtureAttribute>";
+        }
+
+        internal object[] SuccessData = new object[] { typeof(AttributeExistsConstraintTest) };
+            
+        internal object[] FailureData = new object[] { typeof(D2) };
+
+        internal string[] ActualValues = new string[]
+            {
+                "<NUnit.Framework.Constraints.D2>"
+            };
+
+        [Test, ExpectedException(typeof(System.ArgumentException))]
+        public void NonAttributeThrowsException()
+        {
+            new AttributeExistsConstraint(typeof(string));
+        }
+
+        [Test]
+        public void AttributeExistsOnMethodInfo()
+        {
+            Assert.That(
+                System.Reflection.MethodInfo.GetCurrentMethod(),
+                new AttributeExistsConstraint(typeof(TestAttribute)));
+        }
+
+        [Test, Description("my description")]
+        public void AttributeTestPropertyValueOnMethodInfo()
+        {
+            Assert.That(
+                System.Reflection.MethodInfo.GetCurrentMethod(),
+                Has.Attribute(typeof(DescriptionAttribute)).Property("Description").EqualTo("my description"));
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/NUnitFramework/tests/DirectoryAssertTests.cs b/src/NUnitFramework/tests/DirectoryAssertTests.cs
new file mode 100644
index 0000000..3867e35
--- /dev/null
+++ b/src/NUnitFramework/tests/DirectoryAssertTests.cs
@@ -0,0 +1,449 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.IO;
+using System.Reflection;
+
+namespace NUnit.Framework.Tests
+{
+    public class TestDirectory : IDisposable
+    {
+        private bool _disposedValue = false;
+        public string directoryName;
+        public DirectoryInfo directoryInformation;
+        public DirectoryInfo diSubSubDirectory;
+
+        #region TestDirectory Utility Class
+
+        public TestDirectory(string directoryName) : this(directoryName, true) { }
+
+        public TestDirectory(string directoryName, bool CreateSubDirectory)
+        {
+            this.directoryName = Path.Combine(Environment.CurrentDirectory, directoryName);
+
+            directoryInformation = Directory.CreateDirectory(directoryName);
+
+            if (CreateSubDirectory)
+            {
+                DirectoryInfo diSubDirectory = directoryInformation.CreateSubdirectory("SubDirectory");
+                diSubSubDirectory = diSubDirectory.CreateSubdirectory("SubSubDirectory");
+            }
+        }
+
+        protected virtual void Dispose(bool disposing)
+        {
+            if (!this._disposedValue)
+            {
+                if (disposing)
+                {
+                    if (Directory.Exists(directoryName))
+                    {
+                        Directory.Delete(directoryName,true);
+                    }
+                }
+            }
+            this._disposedValue = true;
+        }
+
+        #region IDisposable Members
+
+        public void Dispose()
+        {
+            // Do not change this code.  Put cleanup code in Dispose(bool disposing) above.
+            Dispose(true);
+            GC.SuppressFinalize(this);
+        }
+
+        #endregion
+
+        #endregion
+    }
+
+    /// <summary>
+	/// Summary description for DirectoryAssertTests.
+	/// </summary>
+	[TestFixture, Obsolete("DirectoryAssert is obsolete")]
+    public class DirectoryAssertTests : MessageChecker
+    {
+        #region AreEqual
+
+        #region Success Tests
+        [Test]
+        public void AreEqualPassesWhenBothAreNull()
+        {
+            DirectoryInfo expected = null;
+            DirectoryInfo actual = null;
+            DirectoryAssert.AreEqual(expected, actual);
+        }
+
+        [Test]
+        public void AreEqualPassesWithDirectoryInfos()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory"))
+            {
+                DirectoryAssert.AreEqual(td.directoryInformation, td.directoryInformation);
+            }
+        }
+
+        [Test]
+        public void AreEqualPassesWithStringPath()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory"))
+            {
+                DirectoryAssert.AreEqual(td.directoryName, td.directoryName);
+            }
+        }
+        #endregion
+
+        #region Failure Tests
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void AreEqualFailsWhenOneIsNull()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory"))
+            {               
+                DirectoryAssert.AreEqual(td.directoryInformation, null);
+            }
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void AreEqualFailsWhenOneDoesNotExist()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory"))
+            {
+                DirectoryInfo actual = new DirectoryInfo("NotExistingDirectoryName");
+                DirectoryAssert.AreEqual(td.directoryInformation, actual);
+            }
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void AreEqualFailsWithDirectoryInfos()
+        {
+            using (TestDirectory td1 = new TestDirectory("ParentDirectory1"))
+            {
+                using (TestDirectory td2 = new TestDirectory("ParentDirectory2"))
+                {
+                    DirectoryAssert.AreEqual(td1.directoryInformation, td2.directoryInformation);
+                }
+            }
+        }
+
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void AreEqualFailsWithStringPath()
+        {
+            using (TestDirectory td1 = new TestDirectory("ParentDirectory1"))
+            {
+                using (TestDirectory td2 = new TestDirectory("ParentDirectory2"))
+                {
+                    DirectoryAssert.AreEqual(td1.directoryName, td2.directoryName);
+                }
+            }
+        }
+        #endregion
+
+        #endregion
+
+        #region AreNotEqual
+
+        #region Success Tests
+        [Test]
+        public void AreNotEqualPassesIfOneIsNull()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory"))
+            {
+                DirectoryAssert.AreNotEqual(td.directoryInformation, null);
+            }
+        }
+
+        [Test]
+        public void AreNotEqualPassesWhenOneDoesNotExist()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory"))
+            {
+                DirectoryInfo actual = new DirectoryInfo("NotExistingDirectoryName");
+                DirectoryAssert.AreNotEqual(td.directoryInformation, actual);
+            }
+        }
+
+        public void AreNotEqualPassesWithDirectoryInfos()
+        {
+            using (TestDirectory td1 = new TestDirectory("ParentDirectory1"))
+            {
+                using (TestDirectory td2 = new TestDirectory("ParentDirectory2"))
+                {
+                    DirectoryAssert.AreNotEqual(td1.directoryInformation, td2.directoryInformation);
+                }
+            }
+        }
+
+        [Test]
+        public void AreNotEqualPassesWithStringPath()
+        {
+            using (TestDirectory td1 = new TestDirectory("ParentDirectory1"))
+            {
+                using (TestDirectory td2 = new TestDirectory("ParentDirectory2"))
+                {
+                    DirectoryAssert.AreNotEqual(td1.directoryName, td2.directoryName);
+                }
+            }
+        }
+        #endregion
+
+        #region Failure Tests
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void AreNotEqualFailsWhenBothAreNull()
+        {
+            DirectoryInfo expected = null;
+            DirectoryInfo actual = null;
+            expectedMessage =
+    "  Expected: not null" + Environment.NewLine +
+    "  But was:  null" + Environment.NewLine;
+            DirectoryAssert.AreNotEqual(expected, actual);
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void AreNotEqualFailsWithDirectoryInfos()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory"))
+            {
+                DirectoryAssert.AreNotEqual(td.directoryInformation, td.directoryInformation);
+            }
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void AreNotEqualFailsWithStringPath()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory"))
+            {
+                DirectoryAssert.AreNotEqual(td.directoryName, td.directoryName);
+            }
+        }
+        #endregion
+
+        #endregion
+
+        #region IsEmpty
+
+        [Test]
+        public void IsEmptyPassesWithEmptyDirectoryUsingDirectoryInfo()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory", false))
+            {
+                DirectoryAssert.IsEmpty(td.directoryInformation);
+                Assert.That(td.directoryInformation, Is.Empty);
+            }
+        }
+
+        [Test]
+        public void IsEmptyPassesWithEmptyDirectoryUsingStringPath()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory", false))
+            {
+                DirectoryAssert.IsEmpty(td.directoryName);
+            }
+        }
+
+        [Test, ExpectedException(typeof(DirectoryNotFoundException))]
+        public void IsEmptyFailsWithInvalidDirectory()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory", false))
+            {
+                DirectoryAssert.IsEmpty(td.directoryName + "INVALID");
+            }
+        }
+
+        [Test,ExpectedException(typeof(ArgumentException))]
+        public void IsEmptyThrowsUsingNull()
+        {
+            DirectoryAssert.IsEmpty((DirectoryInfo)null);
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void IsEmptyFailsWithNonEmptyDirectoryUsingDirectoryInfo()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory", true))
+            {
+                DirectoryAssert.IsEmpty(td.directoryInformation);
+            }
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void IsEmptyFailsWithNonEmptyDirectoryUsingStringPath()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory", true))
+            {
+                DirectoryAssert.IsEmpty(td.directoryName);
+            }
+        }
+
+        #endregion
+
+        #region IsNotEmpty
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void IsNotEmptyFailsWithEmptyDirectoryUsingDirectoryInfo()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory", false))
+            {
+                DirectoryAssert.IsNotEmpty(td.directoryInformation);
+            }
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void IsNotEmptyFailsWithEmptyDirectoryUsingStringPath()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory", false))
+            {
+                DirectoryAssert.IsNotEmpty(td.directoryName);
+            }
+        }
+
+        [Test, ExpectedException(typeof(ArgumentException))]
+        public void IsNotEmptyThrowsUsingNull()
+        {
+            DirectoryAssert.IsNotEmpty((DirectoryInfo) null);
+        }
+
+        [Test, ExpectedException(typeof(DirectoryNotFoundException))]
+        public void IsNotEmptyFailsWithInvalidDirectory()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory", false))
+            {
+                DirectoryAssert.IsNotEmpty(td.directoryName + "INVALID");
+            }
+        }
+
+        [Test]
+        public void IsNotEmptyPassesWithNonEmptyDirectoryUsingDirectoryInfo()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory", true))
+            {
+                DirectoryAssert.IsNotEmpty(td.directoryInformation);
+                Assert.That(td.directoryInformation, Is.Not.Empty);
+            }
+        }
+
+        [Test]
+        public void IsNotEmptyPassesWithNonEmptyDirectoryUsingStringPath()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory", true))
+            {
+                DirectoryAssert.IsNotEmpty(td.directoryName);
+            }
+        }
+
+        #endregion
+
+        #region IsWithin
+
+        [Test, ExpectedException(typeof(ArgumentException))]
+        public void IsWithinThrowsWhenBothAreNull()
+        {
+            DirectoryInfo expected = null;
+            DirectoryInfo actual = null;
+            DirectoryAssert.IsWithin(expected, actual);
+        }
+
+        [Test]
+        public void IsWithinPassesWithDirectoryInfo()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory",true))
+            {
+                DirectoryAssert.IsWithin(td.directoryInformation, td.diSubSubDirectory);
+            }
+        }
+
+        [Test]
+        public void IsWithinPassesWithStringPath()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory", true))
+            {
+                DirectoryAssert.IsWithin(td.directoryName, td.diSubSubDirectory.FullName);
+            }
+        }
+
+        [Test]
+        public void IsWithinPassesWithTempPath()
+        {
+            // Special case because GetTempPath() returns with a trailing slash
+            string tempPath = Path.GetTempPath();
+            string tempPathParent = Path.GetDirectoryName(Path.GetDirectoryName(tempPath));
+
+            DirectoryAssert.IsWithin(tempPathParent, tempPath);
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void IsWithinFailsWhenOutsidePathUsingDirectoryInfo()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory", true))
+            {
+                DirectoryInfo diSystemFolder = new DirectoryInfo(Environment.SpecialFolder.System.ToString());
+                DirectoryAssert.IsWithin(td.directoryInformation, diSystemFolder);
+            }
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void IsWithinFailsWhenOutsidePathUsingStringPath()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory", true))
+            {
+                DirectoryAssert.IsWithin(td.directoryName, Environment.SpecialFolder.System.ToString());
+            }
+        }
+
+        #endregion
+
+        #region IsNotWithin
+
+        [Test, ExpectedException(typeof(ArgumentException))]
+        public void IsNotWithinThrowsWhenBothAreNull()
+        {
+            DirectoryInfo expected = null;
+            DirectoryInfo actual = null;
+            DirectoryAssert.IsNotWithin(expected, actual);
+        }
+
+        [Test]
+        public void IsNotWithinPassesWhenOutsidePathUsingDirectoryInfo()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory", true))
+            {
+                DirectoryInfo diSystemFolder = new DirectoryInfo(Environment.SpecialFolder.System.ToString());
+                DirectoryAssert.IsNotWithin(td.directoryInformation, diSystemFolder);
+            }
+        }
+
+        [Test]
+        public void IsNotWithinPassesWhenOutsidePathUsingStringPath()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory", true))
+            {
+                DirectoryAssert.IsNotWithin(td.directoryName, Environment.SpecialFolder.System.ToString());
+            }
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void IsNotWithinFailsWithDirectoryInfo()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory", true))
+            {
+                DirectoryAssert.IsNotWithin(td.directoryInformation, td.diSubSubDirectory);
+            }
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void IsNotWithinFailsWithStringPath()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory", true))
+            {
+                DirectoryAssert.IsNotWithin(td.directoryName, td.diSubSubDirectory.FullName);
+            }
+        }
+
+        #endregion
+    }
+}
diff --git a/src/NUnitFramework/tests/EqualsFixture.cs b/src/NUnitFramework/tests/EqualsFixture.cs
index 9aa7f64..e4060eb 100644
--- a/src/NUnitFramework/tests/EqualsFixture.cs
+++ b/src/NUnitFramework/tests/EqualsFixture.cs
@@ -1,12 +1,13 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
 using System.Text.RegularExpressions;
 using System.Globalization;
+using System.IO;
 using System.Threading;
 
 namespace NUnit.Framework.Tests
@@ -263,17 +264,17 @@ namespace NUnit.Framework.Tests
 			System.UInt64  ui20 = 35; 
 			System.Int16   i21  = 35; 
 			System.UInt16  i22  = 35;
-		
-			Assert.AreEqual( 35, b1 );
-			Assert.AreEqual( 35, sb2 );
-			Assert.AreEqual( 35, d4 );
-			Assert.AreEqual( 35, d5 );
-			Assert.AreEqual( 35, f6 );
-			Assert.AreEqual( 35, i7 );
-			Assert.AreEqual( 35, u8 );
-			Assert.AreEqual( 35, l9 );
-			Assert.AreEqual( 35, s10 );
-			Assert.AreEqual( 35, us11 );
+
+            Assert.AreEqual(35, b1);
+            Assert.AreEqual(35, sb2);
+            Assert.AreEqual(35, d4);
+            Assert.AreEqual(35, d5);
+            Assert.AreEqual(35, f6);
+            Assert.AreEqual(35, i7);
+            Assert.AreEqual(35, u8);
+            Assert.AreEqual(35, l9);
+            Assert.AreEqual(35, s10);
+            Assert.AreEqual(35, us11);
 		
 			Assert.AreEqual( 35, b12  );
 			Assert.AreEqual( 35, sb13 );
@@ -286,7 +287,31 @@ namespace NUnit.Framework.Tests
 			Assert.AreEqual( 35, ui20 );
 			Assert.AreEqual( 35, i21  );
 			Assert.AreEqual( 35, i22  );
-		}
+
+#if NET_2_0
+            byte? b23 = 35;
+            sbyte? sb24 = 35;
+            decimal? d25 = 35;
+            double? d26 = 35;
+            float? f27 = 35;
+            int? i28 = 35;
+            uint? u29 = 35;
+            long? l30 = 35;
+            short? s31 = 35;
+            ushort? us32 = 35;
+
+            Assert.AreEqual(35, b23);
+            Assert.AreEqual(35, sb24);
+            Assert.AreEqual(35, d25);
+            Assert.AreEqual(35, d26);
+            Assert.AreEqual(35, f27);
+            Assert.AreEqual(35, i28);
+            Assert.AreEqual(35, u29);
+            Assert.AreEqual(35, l30);
+            Assert.AreEqual(35, s31);
+            Assert.AreEqual(35, us32);
+#endif
+        }
 
 		[Test]
 		public void EnumsEqual()
@@ -484,6 +509,34 @@ namespace NUnit.Framework.Tests
 
             Assert.That(message.IndexOf("+/-") == -1);
         }
+
+        [Test]
+        public void DirectoryInfoEquality()
+        {
+            string path = Environment.CurrentDirectory;
+            DirectoryInfo dir1 = new DirectoryInfo(path);
+            DirectoryInfo dir2 = new DirectoryInfo(path);
+
+            Assert.AreEqual(dir1, dir2);
+        }
+
+        [Test]
+        public void DirectoryInfoEqualityIgnoresTrailingDirectorySeparator()
+        {
+            string path1 = Environment.CurrentDirectory;
+            string path2 = path1;
+            int length = path1.Length;
+
+            if (path1[length - 1] == Path.DirectorySeparatorChar)
+                path1 = path1.Substring(0, length - 1);
+            else
+                path1 += Path.DirectorySeparatorChar;
+
+            DirectoryInfo dir1 = new DirectoryInfo(path1);
+            DirectoryInfo dir2 = new DirectoryInfo(path2);
+
+            Assert.AreEqual(dir1, dir2);
+        }
     }
 }
 
diff --git a/src/NUnitFramework/tests/FailureMessageFixture.cs b/src/NUnitFramework/tests/FailureMessageFixture.cs
deleted file mode 100644
index a0120aa..0000000
--- a/src/NUnitFramework/tests/FailureMessageFixture.cs
+++ /dev/null
@@ -1,546 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-namespace NUnit.Framework.Tests
-{
-    using System;
-	using System.Collections;
-
-    /// <summary>
-    /// Wrapper class to give us 'inner-class' access to the methods of this
-    /// class, without exposing them publicly.  We need to be able to test
-    /// these methods, but because this is a framework, don't want others
-    /// calling the methods.
-    /// </summary>
-    public class MyAssertionFailureMessage : NUnit.Framework.AssertionFailureMessage
-    {
-        /// <summary>
-        /// Protected constructor, used since this class is only used via
-        /// static methods
-        /// </summary>
-        protected MyAssertionFailureMessage() : base()	{}
-
-        /// <summary>
-        /// Summary description for AssertionFailureMessageTests.
-        /// </summary>
-        /// 
-		[TestFixture]
-			public class FailureMessageFixture
-		{
-			/// <summary>
-			/// 
-			/// </summary>
-			/// 
-			[Test]
-			public void TestInputsAreStrings()
-			{
-				Assert.AreEqual( false, InputsAreStrings( null, null ) );
-				Assert.AreEqual( false, InputsAreStrings( new Object(), null ) );
-				Assert.AreEqual( false, InputsAreStrings( null, new Object() ) );
-				Assert.AreEqual( false, InputsAreStrings( new Object(), "" ) );
-				Assert.AreEqual( false, InputsAreStrings( "", new Object() ) );
-				Assert.AreEqual( true,  InputsAreStrings( "", "" ) );
-				Assert.AreEqual( true,  InputsAreStrings( "test1", "test1" ) );
-				Assert.AreEqual( true,  InputsAreStrings( "some", "value" ) );
-			}
-
-			/// <summary>
-			/// Tests the string-clipping method to see if it clips at the
-			/// expected positions.
-			/// </summary>
-			[Test]
-			public void TestClipAroundPosition()
-			{
-				// Some spot-checks
-				Assert.AreEqual( "", ClipAroundPosition( null, 0 ) );
-				Assert.AreEqual( "", ClipAroundPosition( "", 0 ) );
-				Assert.AreEqual( "a", ClipAroundPosition( "a", 0 ) );
-				Assert.AreEqual( "ab", ClipAroundPosition( "ab", 0 ) );
-				Assert.AreEqual( "ab", ClipAroundPosition( "ab", 1 ) );
-				Assert.AreEqual( "abc", ClipAroundPosition( "abc", 0 ) );
-				Assert.AreEqual( "abc", ClipAroundPosition( "abc", 1 ) );
-				Assert.AreEqual( "abc", ClipAroundPosition( "abc", 2 ) );
-
-				Assert.AreEqual( "012345678", ClipAroundPosition( "012345678", 0 ) );
-				Assert.AreEqual( "012345678", ClipAroundPosition( "012345678", 1 ) );
-				Assert.AreEqual( "012345678", ClipAroundPosition( "012345678", 2 ) );
-				Assert.AreEqual( "012345678", ClipAroundPosition( "012345678", 7 ) );
-				Assert.AreEqual( "012345678", ClipAroundPosition( "012345678", 8 ) );
-
-				Assert.AreEqual( "0123456789", ClipAroundPosition( "0123456789", 0 ) );
-				Assert.AreEqual( "0123456789", ClipAroundPosition( "0123456789", 1 ) );
-				Assert.AreEqual( "0123456789", ClipAroundPosition( "0123456789", 2 ) );
-				Assert.AreEqual( "0123456789", ClipAroundPosition( "0123456789", 7 ) );
-				Assert.AreEqual( "0123456789", ClipAroundPosition( "0123456789", 8 ) );
-				Assert.AreEqual( "0123456789", ClipAroundPosition( "0123456789", 9 ) );
-
-				Assert.AreEqual( "01234567890", ClipAroundPosition( "01234567890", 0 ) );
-				Assert.AreEqual( "01234567890", ClipAroundPosition( "01234567890", 1 ) );
-				Assert.AreEqual( "01234567890", ClipAroundPosition( "01234567890", 2 ) );
-				Assert.AreEqual( "01234567890", ClipAroundPosition( "01234567890", 7 ) );
-				Assert.AreEqual( "01234567890", ClipAroundPosition( "01234567890", 8 ) );
-				Assert.AreEqual( "01234567890", ClipAroundPosition( "01234567890", 9 ) );
-				Assert.AreEqual( "01234567890", ClipAroundPosition( "01234567890", 10 ) );
-			}
-
-			/// <summary>
-			/// Tests the string-clipping method to see if it clips at the
-			/// expected positions.
-			/// </summary>
-			[Test]
-			public void TestClipAroundPosition2()
-			{
-				const string sTest = "a0a1a2a3a4a5a6a7a8a9b0b1b2b3b4b5b6b7b8b9c0c1c2c3c4c5c6c7c8c9d0d1d2d3d4d5d6d7d8d9";
-				int iTestPosition;
-
-				// Want no pre-clipping and post-clipping when position is before 
-				// first 10 digits
-				for( int i=0; i<=PreClipLength; i++ )
-				{
-					iTestPosition = i;
-					Assert.AreEqual( sTest.Substring( 0, i+PostClipLength ) + "...",
-						ClipAroundPosition( sTest, iTestPosition ) );
-				}
-
-				// Want pre- and post-clipping when position is after
-				// first 10 digits and before last 40 digits
-				for( int i=PreClipLength+1; i<(sTest.Length - PostClipLength); i++ )
-				{
-					iTestPosition = i;
-					Assert.AreEqual( "..." + sTest.Substring( iTestPosition-PreClipLength, PreClipLength+PostClipLength ) + "...",
-						ClipAroundPosition( sTest, iTestPosition ) );
-				}
-
-				// Want pre-clipping and no post-clipping when position is within 
-				// last 40 digits
-				for( int i=(sTest.Length - PostClipLength); i<sTest.Length; i++ )
-				{
-					iTestPosition = i;
-					Assert.AreEqual( "..." + sTest.Substring( iTestPosition-PreClipLength ),
-						ClipAroundPosition( sTest, iTestPosition ) );
-				}
-			}
-
-			/// <summary>
-			/// Makes sure that whitespace conversion for CR, LF, or TAB
-			///  characters into 2 characters, one slash '\' and 
-			///  one 'r' or 'n' or 't' for display
-			/// </summary>
-			[Test]
-			public void TestConvertWhitespace()
-			{
-				Assert.AreEqual( "\\n", ConvertWhitespace("\n") );
-				Assert.AreEqual( "\\n\\n", ConvertWhitespace("\n\n") );
-				Assert.AreEqual( "\\n\\n\\n", ConvertWhitespace("\n\n\n") );
-
-				Assert.AreEqual( "\\r", ConvertWhitespace("\r") );
-				Assert.AreEqual( "\\r\\r", ConvertWhitespace("\r\r") );
-				Assert.AreEqual( "\\r\\r\\r", ConvertWhitespace("\r\r\r") );
-
-				Assert.AreEqual( "\\r\\n", ConvertWhitespace("\r\n") );
-				Assert.AreEqual( "\\n\\r", ConvertWhitespace("\n\r") );
-				Assert.AreEqual( "This is a\\rtest message", ConvertWhitespace("This is a\rtest message") );
-
-				Assert.AreEqual( "", ConvertWhitespace("") );
-				Assert.AreEqual( null, ConvertWhitespace(null) );
-                
-				Assert.AreEqual( "\\t", ConvertWhitespace( "\t" ) );
-				Assert.AreEqual( "\\t\\n", ConvertWhitespace( "\t\n" ) );
-
-				Assert.AreEqual( "\\\\r\\\\n", ConvertWhitespace( "\\r\\n" ) );
-			}
-
-			/// <summary>
-			/// Checks several common failure conditions to ensure the output
-			/// strings match the expected output.
-			/// </summary>
-			[Test]
-			public void TestFormatMessageForFailNotEquals()
-			{
-				Assert.AreEqual( "	expected: <(null)>" + Environment.NewLine + 
-					"	 but was: <(null)>" + Environment.NewLine, 
-					GetMsg( null, null, null ) );
-
-				Assert.AreEqual( 
-					"	expected: <(null)>" + Environment.NewLine + 
-					"	 but was: <(null)>" + Environment.NewLine, 
-					GetMsg(null, null,  "") );
-
-				Assert.AreEqual( "message" +
-					Environment.NewLine + "	expected: <(null)>" +
-					Environment.NewLine + "	 but was: <(null)>" + Environment.NewLine, 
-					GetMsg(null, null, "message" ) );
-
-				Assert.AreEqual( "message" +
-					Environment.NewLine + "	expected: <1>" +
-					Environment.NewLine + "	 but was: <2>" + Environment.NewLine, 
-					GetMsg( 1, 2, "message" ) );
-
-				Assert.AreEqual( "message" +
-					Environment.NewLine + "	expected: <\"\">" +
-					Environment.NewLine + "	 but was: <(null)>" + Environment.NewLine, 
-					GetMsg( "", null, "message" ) );
-
-				Assert.AreEqual( "message" +
-					Environment.NewLine + "	expected: <1>" +
-					Environment.NewLine + "	 but was: <\"1\">" + Environment.NewLine,
-					GetMsg( 1, "1", "message" ) );
-
-				Assert.AreEqual( "message 5" +
-					Environment.NewLine + "	expected: <1>" +
-					Environment.NewLine + "	 but was: <\"1\">" + Environment.NewLine,
-					GetMsg( 1, "1", "message {0}", 5 ) );
-			
-				Assert.AreEqual( "message" +
-					Environment.NewLine + "	String lengths differ.  Expected length=1, but was length=2." +
-					Environment.NewLine + "	Strings differ at index 1." +
-					Environment.NewLine + "	expected: <\"a\">" +
-					Environment.NewLine + "	 but was: <\"aa\">" +
-					Environment.NewLine + "	-------------^" + Environment.NewLine,
-					GetMsg( "a", "aa", "message" ) );
-
-				Assert.AreEqual( "message" +
-					Environment.NewLine + "	String lengths are both 2." +
-					Environment.NewLine + "	Strings differ at index 1." +
-					Environment.NewLine + "	expected: <\"aa\">" +
-					Environment.NewLine + "	 but was: <\"ab\">" +
-					Environment.NewLine + "	-------------^" + Environment.NewLine,
-					GetMsg( "aa", "ab", "message" ) );
-
-				Assert.AreEqual( "message" +
-					Environment.NewLine + "	String lengths differ.  Expected length=1, but was length=3." +
-					Environment.NewLine + "	Strings differ at index 1." +
-					Environment.NewLine + "	expected: <\"a\">" +
-					Environment.NewLine + "	 but was: <\"abc\">" +
-					Environment.NewLine + "	-------------^" + Environment.NewLine,
-					GetMsg( "a", "abc", "message" ) );
-
-				Assert.AreEqual( "message" +
-					Environment.NewLine + "	String lengths are both 3." +
-					Environment.NewLine + "	Strings differ at index 1." +
-					Environment.NewLine + "	expected: <\"123\">" +
-					Environment.NewLine + "	 but was: <\"1x3\">" +
-					Environment.NewLine + "	-------------^" + Environment.NewLine,
-					GetMsg( "123", "1x3", "message" ) );
-
-				Assert.AreEqual( "message" +
-					Environment.NewLine + "	String lengths differ.  Expected length=5, but was length=3." +
-					Environment.NewLine + "	Strings differ at index 3." +
-					Environment.NewLine + "	expected: <\"12345\">" +
-					Environment.NewLine + "	 but was: <\"123\">" +
-					Environment.NewLine + "	---------------^" + Environment.NewLine,
-					GetMsg( "12345", "123", "message" ) );
-
-				Assert.AreEqual( "message" +
-					Environment.NewLine + "	expected: <" + new DateTime(2005, 6, 1, 0, 0, 0) + ">" +
-					Environment.NewLine + "	 but was: <" + new DateTime(2005, 6, 7, 0, 0, 0) + ">" + Environment.NewLine,
-					GetMsg( new DateTime( 2005, 6, 1 ), new DateTime( 2005, 6, 7 ), "message" ) );
-			}
-
-			[Test]
-			public void TestFormatMessageForFailNotEqualsIgnoringCase()
-			{
-				AssertionFailureMessage msg = new AssertionFailureMessage( "message" );
-				msg.DisplayDifferences( "Name", "NAMES", true );
-
-				Assert.AreEqual( "message" +
-					Environment.NewLine + "	String lengths differ.  Expected length=4, but was length=5." +
-					Environment.NewLine + "	Strings differ at index 4." +
-					Environment.NewLine + "	expected: <\"Name\">" +
-					Environment.NewLine + "	 but was: <\"NAMES\">" +
-					Environment.NewLine + "	----------------^" + Environment.NewLine,
-					msg.ToString() );
-			}
-
-			private string GetMsg( object expected, object actual, string message, params object[] args )
-			{
-				AssertionFailureMessage msg = new AssertionFailureMessage( message, args );
-				msg.DisplayDifferences( expected, actual, false );
-				return msg.ToString();
-			}
-
-			/// <summary>
-			/// Checks several common failure conditions to ensure the output
-			/// strings match the expected output when newlines are in the
-			/// string.  Newlines (CR or LF) characters are rendered in the
-			/// output string as "\"+"r" or "\"+"n", so that they can be
-			/// seen, and also to preserve the alignment of the output
-			/// position differences.  Without this, the lines will wrap
-			/// when displayed, and the differences marker will not align
-			/// where the differences actually are.
-			/// </summary>
-			[Test]
-			public void TestFormatMessageForFailNotEqualsNewlines2()
-			{
-				Assert.AreEqual( "message" +
-					Environment.NewLine + "	String lengths differ.  Expected length=2, but was length=3." +
-					Environment.NewLine + "	Strings differ at index 1." +
-					Environment.NewLine + "	expected: <\"a\\r\">" +
-					Environment.NewLine + "	 but was: <\"aa\\r\">" +
-					Environment.NewLine + "	-------------^" + Environment.NewLine,
-					GetMsg( "a\r", "aa\r", "message" ) );
-
-				Assert.AreEqual( "message" +
-					Environment.NewLine + "	String lengths differ.  Expected length=2, but was length=3." +
-					Environment.NewLine + "	Strings differ at index 1." +
-					Environment.NewLine + "	expected: <\"a\\n\">" +
-					Environment.NewLine + "	 but was: <\"aa\\n\">" +
-					Environment.NewLine + "	-------------^" + Environment.NewLine,
-					GetMsg( "a\n", "aa\n", "message" ) );
-
-				Assert.AreEqual( "message" +
-					Environment.NewLine + "	String lengths are both 6." +
-					Environment.NewLine + "	Strings differ at index 5." +
-					Environment.NewLine + "	expected: <\"aa\\r\\naa\">" +
-					Environment.NewLine + "	 but was: <\"aa\\r\\nab\">" +
-					Environment.NewLine + "	-------------------^" + Environment.NewLine,
-					GetMsg( "aa\r\naa", "aa\r\nab", "message" ) );
-			}
-
-			/// <summary>
-			/// Test to track down a bug with string length differences
-			/// One string has length 164, the other length 166.  Content is the
-			/// same for both strings, but the longer string has 2 extra chars.
-			/// </summary>
-			[Test]
-			public void TestStringLengthsDiffer()
-			{
-				// 2 strings, one length 166, the other length 164.  Indexes for each:
-				// length 166: index=0...165
-				// length 164: index=0...163
-
-				// Assume content is same for all 164 common characters, and only the length
-				// is different, so we want to show the length marker starting at position
-				// 164
-
-				// 111111111111111111111111111111
-				// 444444444455555555556666666666
-				// 012345678901234567890123456789
-				// ...same content to here!++       length 166 has 2 extra chars
-				// ...same content to here!         length 164
-				// ------------------------^
-
-				// On entry, the iPosition will be 164 since we start mismatching after
-				// the first string ends (since all content is the same)
-
-				// Need to clip appropriately when iPosition=164, and build characters
-				// for the shorter string appropriately.  Longer string will be able
-				// to be clipped up to position 164, but 164 will be past the end of
-				// the short string.
-
-				string sFirst  = "00000000001111111111222222222233333333334444444444555555555566666666667777777777888888888899999999990000000000111111111122222222223333333333444444444455555555556666";
-				string sSecond = "00000000001111111111222222222233333333334444444444555555555566666666667777777777888888888899999999990000000000111111111122222222223333333333444444444455555555556666++";
-				Assert.AreEqual(
-"	String lengths differ.  Expected length=164, but was length=166." + System.Environment.NewLine +
-"	Strings differ at index 164." + System.Environment.NewLine + 
-"	expected: <\"...23333333333444444444455555555556666\">" + System.Environment.NewLine + 
-"	 but was: <\"...23333333333444444444455555555556666++\">" + System.Environment.NewLine + 
-"	--------------------------------------------------^" + Environment.NewLine,
-					GetMsg( sFirst, sSecond, null ) );
-			}
-
-			/// <summary>
-			/// Test to verify conditions found by a bug, where strings have same
-			/// content bug lengths are different.  Checking lengths shorter than
-			/// clipping range, with 2 extra chars on longer string.
-			/// </summary>
-			[Test]
-			public void TestStringLengthsDiffer2()
-			{
-				string sFirst  = "0000000000111111111122";
-				string sSecond = "0000000000111111111122++";
-				Assert.AreEqual( 
-					"	String lengths differ.  Expected length=22, but was length=24." + 
-					Environment.NewLine + "	Strings differ at index 22." + 
-					Environment.NewLine + "	expected: <\"0000000000111111111122\">" + 
-					Environment.NewLine + "	 but was: <\"0000000000111111111122++\">" + 
-					Environment.NewLine + "	----------------------------------^" + Environment.NewLine,
-					GetMsg( sFirst, sSecond, null ) );
-			}
-
-			/// <summary>
-			/// Exhaustive test, all strings up to 200 characters in length,
-			/// with one string 1, 2, 3, 4, or 5 characters longer than the other.
-			/// 
-			/// Verifies conditions found by a bug, that appears when strings have same
-			/// content bug lengths are different.
-			/// </summary>
-			[Test]
-			public void TestStringLengthsDiffer3()
-			{
-				VerifySameContentDifferentLengths( "+" );
-				VerifySameContentDifferentLengths( "++" );
-				VerifySameContentDifferentLengths( "+++" );
-				VerifySameContentDifferentLengths( "++++" );
-				VerifySameContentDifferentLengths( "+++++" );
-			}
-
-			private void VerifySameContentDifferentLengths( string sExtra )
-			{
-				//
-				// Makes sure N-longer is ok just up to the point where
-				// clipping would occur
-				//
-				for( int i=1; i<=PreClipLength; i++ )
-				{
-					string sFirst  = new string( '=', i );
-					string sSecond = new string( '=', i ) + sExtra;
-					Assert.AreEqual( 
-						"\tString lengths differ.  Expected length=" + i + ", but was length=" + (i+sExtra.Length) + "." + System.Environment.NewLine + 
-						"\tStrings differ at index "+ i +"." + System.Environment.NewLine + 
-						"\texpected: <\""+ sFirst +"\">" + System.Environment.NewLine + 
-						"\t but was: <\""+ sSecond +"\">" + System.Environment.NewLine + 
-						"\t" + (new string('-',actualPrefix.Length+i+3)) + "^" + Environment.NewLine,
-						GetMsg( sFirst, sSecond, null ),
-						"Failed at index " + i);
-				}
-
-				//
-				// Makes sure N-longer is ok from for strings equal in length
-				// to the start of clipping and longer
-				//
-				string sExpected = "..." + new string( '=', PreClipLength );
-				string sActual   = "..." + new string( '=', PreClipLength ) + sExtra;
-
-				for( int i=PreClipLength+1; i<200; i++ )
-				{
-					string sFirst  = new string( '=', i );
-					string sSecond = new string( '=', i ) + sExtra;
-					Assert.AreEqual( 
-						"\tString lengths differ.  Expected length=" + i + ", but was length=" + (i+sExtra.Length) + "." + System.Environment.NewLine + 
-						"\tStrings differ at index "+ i +"." + System.Environment.NewLine + 
-						"\texpected: <\""+ sExpected +"\">" + System.Environment.NewLine + 
-						"\t but was: <\""+ sActual +"\">" + System.Environment.NewLine + 
-						"\t" + (new string('-',actualPrefix.Length+"...".Length+PreClipLength+3)) + "^" + Environment.NewLine,
-						GetMsg( sFirst, sSecond, null ),
-						"Failed at index " + i );
-				}
-			}
-
-			[Test]
-			public void DisplayListElements()
-			{
-				AssertionFailureMessage msg = null;
-
-				msg = new AssertionFailureMessage( "message");
-				msg.DisplayListElements( "label:", new object[] { "a", "b", "c" }, 0, 3 );
-				Assert.AreEqual( 
-					"message" + System.Environment.NewLine + 
-					"label:<<\"a\">,<\"b\">,<\"c\">>" + Environment.NewLine,
-					msg.ToString() );
-
-				msg = new AssertionFailureMessage( "message");
-				msg.DisplayListElements( "label:", new object[] { "a", "b", "c" }, 0, 5 );
-				Assert.AreEqual( 
-					"message" + System.Environment.NewLine + 
-					"label:<<\"a\">,<\"b\">,<\"c\">>" + Environment.NewLine,
-					msg.ToString() );
-
-				msg = new AssertionFailureMessage( "message");
-				msg.DisplayListElements( "label:", new object[] { "a", "b", "c" }, 1, 1 );
-				Assert.AreEqual( 
-					"message" + System.Environment.NewLine + 
-					"label:<<\"b\">,...>" + Environment.NewLine,
-					msg.ToString() );
-
-				msg = new AssertionFailureMessage( "message");
-				msg.DisplayListElements( "label:", new object[] { "a", "b", "c" }, 1, 5 );
-				Assert.AreEqual( 
-					"message" + System.Environment.NewLine + 
-					"label:<<\"b\">,<\"c\">>" + Environment.NewLine,
-					msg.ToString() );
-
-				msg = new AssertionFailureMessage( "message");
-				msg.DisplayListElements( "label:", new object[0], 0, 5 );
-				Assert.AreEqual( 
-					"message" + System.Environment.NewLine + 
-					"label:<empty>" + Environment.NewLine,
-					msg.ToString() );
-
-
-				msg = new AssertionFailureMessage( "message");
-				msg.DisplayListElements( "label:", null, 0, 5 );
-				Assert.AreEqual( 
-					"message" + System.Environment.NewLine + 
-					"label:<null>" + Environment.NewLine,
-					msg.ToString() );
-			}
-
-			[Test]
-			public void TestFormatMessageForArraysNotEqual()
-			{
-				AssertionFailureMessage msg = null;
-				
-				msg = new AssertionFailureMessage( "message" );
-				msg.DisplayArrayDifferences( 
-					new object[] { "one", "two", "three" },
-					new object[] { "one", "two", "three", "four", "five" },
-					3 );
-
-				Assert.AreEqual( "message" +
-					Environment.NewLine + "Array lengths differ.  Expected length=3, but was length=5." +
-					Environment.NewLine + "Arrays differ at index 3." +
-					Environment.NewLine + "   extra:<<\"four\">,<\"five\">>" + Environment.NewLine,
-					msg.ToString() );
-
-				msg = new AssertionFailureMessage( "message" );
-				msg.DisplayArrayDifferences( 
-					new object[] { "one", "two", "three", "four", "five" },
-					new object[] { "one", "two", "three" },
-					3 );
-
-				Assert.AreEqual( "message" +
-					Environment.NewLine + "Array lengths differ.  Expected length=5, but was length=3." +
-					Environment.NewLine + "Arrays differ at index 3." +
-					Environment.NewLine + " missing:<<\"four\">,<\"five\">>" + Environment.NewLine,
-					msg.ToString() );
-
-				msg = new AssertionFailureMessage( "message" );
-				msg.DisplayArrayDifferences( 
-					new object[] { "one", "two", "three" },
-					new object[] { "one", "two", "ten" },
-					2 );
-
-				Assert.AreEqual( "message" +
-					Environment.NewLine + "Array lengths are both 3." +
-					Environment.NewLine + "Arrays differ at index 2." +
-					Environment.NewLine + "	String lengths differ.  Expected length=5, but was length=3." +
-					Environment.NewLine + "	Strings differ at index 1." +
-					Environment.NewLine + "	expected: <\"three\">" +
-					Environment.NewLine + "	 but was: <\"ten\">" +
-					Environment.NewLine + "	-------------^" + Environment.NewLine,
-					msg.ToString() );
-
-				msg = new AssertionFailureMessage( "message" );
-				msg.DisplayArrayDifferences( 
-					new object[] { 1, 2, 3 },
-					new object[] { 1, 2, 10 },
-					2 );
-
-				Assert.AreEqual( "message" +
-					Environment.NewLine + "Array lengths are both 3." +
-					Environment.NewLine + "Arrays differ at index 2." +
-					Environment.NewLine + "	expected: <3>" +
-					Environment.NewLine + "	 but was: <10>" + Environment.NewLine,
-					msg.ToString() );
-
-				msg = new AssertionFailureMessage( "message" );
-				msg.DisplayArrayDifferences( 
-					new object[,] { { 1, 2, 3 }, { 4, 5, 6 } },
-					new object[,] { { 1, 2, 9 }, { 4, 5, 6 } },
-					2 );
-
-				Assert.AreEqual( "message" +
-					Environment.NewLine + "Array lengths are both 6." +
-					Environment.NewLine + "Arrays differ at index 2." +
-					Environment.NewLine + "	expected: <3>" +
-					Environment.NewLine + "	 but was: <9>" + Environment.NewLine,
-					msg.ToString() );
-
-			}
-		}
-    }
-}
diff --git a/src/NUnitFramework/tests/FileAssertTests.cs b/src/NUnitFramework/tests/FileAssertTests.cs
index b0d6e86..718a2fa 100644
--- a/src/NUnitFramework/tests/FileAssertTests.cs
+++ b/src/NUnitFramework/tests/FileAssertTests.cs
@@ -1,12 +1,13 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
 using System.IO;
 using System.Reflection;
+using System.Net.Sockets;
 
 namespace NUnit.Framework.Tests
 {
@@ -19,7 +20,7 @@ namespace NUnit.Framework.Tests
 		#region Nested TestFile Utility Class
 		public TestFile(string fileName, string resourceName)
 		{
-			_resourceName = resourceName;
+			_resourceName = "NUnit.Framework.Tests.data." + resourceName;
 			_fileName = fileName;
 
 			Assembly a = Assembly.GetExecutingAssembly();
@@ -85,27 +86,75 @@ namespace NUnit.Framework.Tests
 			FileAssert.AreEqual( expected, actual );
 		}
 
-		[Test]
-		public void AreEqualPassesWithStreams()
-		{
-			using(TestFile tf1 = new TestFile("Test1.jpg","NUnit.Framework.Tests.TestImage1.jpg"))
-			using(TestFile tf2 = new TestFile("Test2.jpg","NUnit.Framework.Tests.TestImage1.jpg"))
-			{
-				using(FileStream expected = File.OpenRead("Test1.jpg"))
-				{
-					using(FileStream actual = File.OpenRead("Test2.jpg"))
-					{
-						FileAssert.AreEqual( expected, actual );
-					}
-				}
-			}
-		}
-
-		[Test]
+        [Test]
+        public void AreEqualPassesWithSameStream()
+        {
+            Stream exampleStream = new MemoryStream(new byte[] { 1, 2, 3 });
+            Assert.That(exampleStream, Is.EqualTo(exampleStream));
+        }
+
+        [Test]
+        public void AreEqualPassesWithEqualStreams()
+        {
+            using (TestFile tf1 = new TestFile("Test1.jpg", "TestImage1.jpg"))
+            using (TestFile tf2 = new TestFile("Test2.jpg", "TestImage1.jpg"))
+            {
+                using (FileStream expected = File.OpenRead("Test1.jpg"))
+                {
+                    using (FileStream actual = File.OpenRead("Test2.jpg"))
+                    {
+                        FileAssert.AreEqual(expected, actual);
+                    }
+                }
+            }
+        }
+
+        [Test, ExpectedException(typeof(ArgumentException),
+            ExpectedMessage = "not readable", MatchType = MessageMatch.Contains)]
+        public void NonReadableStreamGivesException()
+        {
+            using (TestFile tf1 = new TestFile("Test1.jpg", "TestImage1.jpg"))
+            using (TestFile tf2 = new TestFile("Test2.jpg", "TestImage1.jpg"))
+            {
+                using (FileStream expected = File.OpenRead("Test1.jpg"))
+                {
+                    using (FileStream actual = File.OpenWrite("Test2.jpg"))
+                    {
+                        FileAssert.AreEqual(expected, actual);
+                    }
+                }
+            }
+        }
+
+        [Test, ExpectedException(typeof(ArgumentException),
+            ExpectedMessage = "not seekable", MatchType = MessageMatch.Contains)]
+        public void NonSeekableStreamGivesException()
+        {
+            using (TestFile tf1 = new TestFile("Test1.jpg", "TestImage1.jpg"))
+            {
+                using (FileStream expected = File.OpenRead("Test1.jpg"))
+                {
+                    using (FakeStream actual = new FakeStream())
+                    {
+                        FileAssert.AreEqual(expected, actual);
+                    }
+                }
+            }
+        }
+
+        private class FakeStream : MemoryStream
+        {
+            public override bool CanSeek
+            {
+                get { return false; }
+            }
+        }
+
+        [Test]
 		public void AreEqualPassesWithFiles()
 		{
-			using(TestFile tf1 = new TestFile("Test1.jpg","NUnit.Framework.Tests.TestImage1.jpg"))
-			using(TestFile tf2 = new TestFile("Test2.jpg","NUnit.Framework.Tests.TestImage1.jpg"))
+            using (TestFile tf1 = new TestFile("Test1.jpg", "TestImage1.jpg"))
+            using (TestFile tf2 = new TestFile("Test2.jpg", "TestImage1.jpg"))
 			{
 				FileAssert.AreEqual( "Test1.jpg", "Test2.jpg", "Failed using file names" );
 			}
@@ -114,7 +163,7 @@ namespace NUnit.Framework.Tests
 		[Test]
 		public void AreEqualPassesUsingSameFileTwice()
 		{
-			using(TestFile tf1 = new TestFile("Test1.jpg","NUnit.Framework.Tests.TestImage1.jpg"))
+            using (TestFile tf1 = new TestFile("Test1.jpg", "TestImage1.jpg"))
 			{
 				FileAssert.AreEqual( "Test1.jpg", "Test1.jpg" );
 			}
@@ -123,8 +172,8 @@ namespace NUnit.Framework.Tests
 		[Test]
 		public void AreEqualPassesWithFileInfos()
 		{
-			using(TestFile tf1 = new TestFile("Test1.jpg","NUnit.Framework.Tests.TestImage1.jpg"))
-			using(TestFile tf2 = new TestFile("Test2.jpg","NUnit.Framework.Tests.TestImage1.jpg"))
+			using(TestFile tf1 = new TestFile("Test1.jpg","TestImage1.jpg"))
+			using(TestFile tf2 = new TestFile("Test2.jpg","TestImage1.jpg"))
 			{
 				FileInfo expected = new FileInfo( "Test1.jpg" );
 				FileInfo actual = new FileInfo( "Test2.jpg" );
@@ -136,9 +185,9 @@ namespace NUnit.Framework.Tests
 		[Test]
 		public void AreEqualPassesWithTextFiles()
 		{
-			using(TestFile tf1 = new TestFile("Test1.txt","NUnit.Framework.Tests.TestText1.txt"))
+			using(TestFile tf1 = new TestFile("Test1.txt","TestText1.txt"))
 			{
-				using(TestFile tf2 = new TestFile("Test2.txt","NUnit.Framework.Tests.TestText1.txt"))
+				using(TestFile tf2 = new TestFile("Test2.txt","TestText1.txt"))
 				{
 					FileAssert.AreEqual( "Test1.txt", "Test2.txt" );
 				}
@@ -150,7 +199,7 @@ namespace NUnit.Framework.Tests
 		[Test,ExpectedException(typeof(AssertionException))]
 		public void AreEqualFailsWhenOneIsNull()
 		{
-			using(TestFile tf1 = new TestFile("Test1.jpg","NUnit.Framework.Tests.TestImage1.jpg"))
+            using (TestFile tf1 = new TestFile("Test1.jpg", "TestImage1.jpg"))
 			{
 				using(FileStream expected = File.OpenRead("Test1.jpg"))
 				{
@@ -167,9 +216,9 @@ namespace NUnit.Framework.Tests
 		{
 			string expectedFile = "Test1.jpg";
 			string actualFile = "Test2.jpg";
-			using(TestFile tf1 = new TestFile(expectedFile,"NUnit.Framework.Tests.TestImage1.jpg"))
+            using (TestFile tf1 = new TestFile(expectedFile, "TestImage1.jpg"))
 			{
-				using(TestFile tf2 = new TestFile(actualFile,"NUnit.Framework.Tests.TestImage2.jpg"))
+                using (TestFile tf2 = new TestFile(actualFile, "TestImage2.jpg"))
 				{
 					using(FileStream expected = File.OpenRead(expectedFile))
 					{
@@ -188,9 +237,9 @@ namespace NUnit.Framework.Tests
 		[Test,ExpectedException(typeof(AssertionException))]
 		public void AreEqualFailsWithFileInfos()
 		{
-			using(TestFile tf1 = new TestFile("Test1.jpg","NUnit.Framework.Tests.TestImage1.jpg"))
+            using (TestFile tf1 = new TestFile("Test1.jpg", "TestImage1.jpg"))
 			{
-				using(TestFile tf2 = new TestFile("Test2.jpg","NUnit.Framework.Tests.TestImage2.jpg"))
+                using (TestFile tf2 = new TestFile("Test2.jpg", "TestImage2.jpg"))
 				{
 					FileInfo expected = new FileInfo( "Test1.jpg" );
 					FileInfo actual = new FileInfo( "Test2.jpg" );
@@ -208,9 +257,9 @@ namespace NUnit.Framework.Tests
 		{
 			string expected = "Test1.jpg";
 			string actual = "Test2.jpg";
-			using(TestFile tf1 = new TestFile(expected,"NUnit.Framework.Tests.TestImage1.jpg"))
+            using (TestFile tf1 = new TestFile(expected, "TestImage1.jpg"))
 			{
-				using(TestFile tf2 = new TestFile(actual,"NUnit.Framework.Tests.TestImage2.jpg"))
+                using (TestFile tf2 = new TestFile(actual, "TestImage2.jpg"))
 				{
 					expectedMessage =
 						string.Format("  Expected Stream length {0} but was {1}." + Environment.NewLine,
@@ -220,15 +269,16 @@ namespace NUnit.Framework.Tests
 			}
 		}
 
-		[Test,ExpectedException(typeof(AssertionException))]
+		[Test]
+        [ExpectedException(typeof(AssertionException), 
+            ExpectedMessage="Stream lengths are both",
+            MatchType=MessageMatch.Contains)]
 		public void AreEqualFailsWithTextFilesAfterReadingBothFiles()
 		{
-			using(TestFile tf1 = new TestFile("Test1.txt","NUnit.Framework.Tests.TestText1.txt"))
+            using (TestFile tf1 = new TestFile("Test1.txt", "TestText1.txt"))
 			{
-				using(TestFile tf2 = new TestFile("Test2.txt","NUnit.Framework.Tests.TestText2.txt"))
+                using (TestFile tf2 = new TestFile("Test2.txt", "TestText2.txt"))
 				{
-					expectedMessage =
-						"  Stream lengths are both 65600. Streams differ at offset 65597." + Environment.NewLine;
 					FileAssert.AreEqual( "Test1.txt", "Test2.txt" );
 				}
 			}
@@ -243,7 +293,7 @@ namespace NUnit.Framework.Tests
 		[Test]
 		public void AreNotEqualPassesIfOneIsNull()
 		{
-			using(TestFile tf1 = new TestFile("Test1.jpg","NUnit.Framework.Tests.TestImage1.jpg"))
+            using (TestFile tf1 = new TestFile("Test1.jpg", "TestImage1.jpg"))
 			{
 				using(FileStream expected = File.OpenRead("Test1.jpg"))
 				{
@@ -255,9 +305,9 @@ namespace NUnit.Framework.Tests
 		[Test]
 		public void AreNotEqualPassesWithStreams()
 		{
-			using(TestFile tf1 = new TestFile("Test1.jpg","NUnit.Framework.Tests.TestImage1.jpg"))
+            using (TestFile tf1 = new TestFile("Test1.jpg", "TestImage1.jpg"))
 			{
-				using(TestFile tf2 = new TestFile("Test2.jpg","NUnit.Framework.Tests.TestImage2.jpg"))
+                using (TestFile tf2 = new TestFile("Test2.jpg", "TestImage2.jpg"))
 				{
 					using(FileStream expected = File.OpenRead("Test1.jpg"))
 					{
@@ -273,9 +323,9 @@ namespace NUnit.Framework.Tests
 		[Test]
 		public void AreNotEqualPassesWithFiles()
 		{
-			using(TestFile tf1 = new TestFile("Test1.jpg","NUnit.Framework.Tests.TestImage1.jpg"))
+            using (TestFile tf1 = new TestFile("Test1.jpg", "TestImage1.jpg"))
 			{
-				using(TestFile tf2 = new TestFile("Test2.jpg","NUnit.Framework.Tests.TestImage2.jpg"))
+                using (TestFile tf2 = new TestFile("Test2.jpg", "TestImage2.jpg"))
 				{
 					FileAssert.AreNotEqual( "Test1.jpg", "Test2.jpg" );
 				}
@@ -285,9 +335,9 @@ namespace NUnit.Framework.Tests
 		[Test]
 		public void AreNotEqualPassesWithFileInfos()
 		{
-			using(TestFile tf1 = new TestFile("Test1.jpg","NUnit.Framework.Tests.TestImage1.jpg"))
+            using (TestFile tf1 = new TestFile("Test1.jpg", "TestImage1.jpg"))
 			{
-				using(TestFile tf2 = new TestFile("Test2.jpg","NUnit.Framework.Tests.TestImage2.jpg"))
+                using (TestFile tf2 = new TestFile("Test2.jpg", "TestImage2.jpg"))
 				{
 					FileInfo expected = new FileInfo( "Test1.jpg" );
 					FileInfo actual = new FileInfo( "Test2.jpg" );
@@ -299,9 +349,9 @@ namespace NUnit.Framework.Tests
 		[Test]
 		public void AreNotEqualIteratesOverTheEntireFile()
 		{
-			using(TestFile tf1 = new TestFile("Test1.txt","NUnit.Framework.Tests.TestText1.txt"))
+            using (TestFile tf1 = new TestFile("Test1.txt", "TestText1.txt"))
 			{
-				using(TestFile tf2 = new TestFile("Test2.txt","NUnit.Framework.Tests.TestText2.txt"))
+                using (TestFile tf2 = new TestFile("Test2.txt", "TestText2.txt"))
 				{
 					FileAssert.AreNotEqual( "Test1.txt", "Test2.txt" );
 				}
@@ -324,8 +374,8 @@ namespace NUnit.Framework.Tests
 		[Test,ExpectedException(typeof(AssertionException))]
 		public void AreNotEqualFailsWithStreams()
 		{
-			using(TestFile tf1 = new TestFile("Test1.jpg","NUnit.Framework.Tests.TestImage1.jpg"))
-			using(TestFile tf2 = new TestFile("Test2.jpg","NUnit.Framework.Tests.TestImage1.jpg"))
+			using(TestFile tf1 = new TestFile("Test1.jpg","TestImage1.jpg"))
+			using(TestFile tf2 = new TestFile("Test2.jpg","TestImage1.jpg"))
 			using(FileStream expected = File.OpenRead("Test1.jpg"))
 			using(FileStream actual = File.OpenRead("Test2.jpg"))
 			{
@@ -339,9 +389,9 @@ namespace NUnit.Framework.Tests
 		[Test,ExpectedException(typeof(AssertionException))]
 		public void AreNotEqualFailsWithFileInfos()
 		{
-			using(TestFile tf1 = new TestFile("Test1.jpg","NUnit.Framework.Tests.TestImage1.jpg"))
+			using(TestFile tf1 = new TestFile("Test1.jpg","TestImage1.jpg"))
 			{
-				using(TestFile tf2 = new TestFile("Test2.jpg","NUnit.Framework.Tests.TestImage1.jpg"))
+				using(TestFile tf2 = new TestFile("Test2.jpg","TestImage1.jpg"))
 				{
 					FileInfo expected = new FileInfo( "Test1.jpg" );
 					FileInfo actual = new FileInfo( "Test2.jpg" );
@@ -356,7 +406,7 @@ namespace NUnit.Framework.Tests
 		[Test,ExpectedException(typeof(AssertionException))]
 		public void AreNotEqualFailsWithFiles()
 		{
-			using(TestFile tf1 = new TestFile("Test1.jpg","NUnit.Framework.Tests.TestImage1.jpg"))
+			using(TestFile tf1 = new TestFile("Test1.jpg","TestImage1.jpg"))
 			{
 				expectedMessage = 
 					"  Expected: not <System.IO.FileStream>" + Environment.NewLine +
@@ -368,9 +418,9 @@ namespace NUnit.Framework.Tests
 		[Test,ExpectedException(typeof(AssertionException))]
 		public void AreNotEqualIteratesOverTheEntireFileAndFails()
 		{
-			using(TestFile tf1 = new TestFile("Test1.txt","NUnit.Framework.Tests.TestText1.txt"))
+			using(TestFile tf1 = new TestFile("Test1.txt","TestText1.txt"))
 			{
-				using(TestFile tf2 = new TestFile("Test2.txt","NUnit.Framework.Tests.TestText1.txt"))
+				using(TestFile tf2 = new TestFile("Test2.txt","TestText1.txt"))
 				{
 					expectedMessage = 
 						"  Expected: not <System.IO.FileStream>" + Environment.NewLine +
diff --git a/src/NUnitFramework/tests/GreaterEqualFixture.cs b/src/NUnitFramework/tests/GreaterEqualFixture.cs
index 1354589..bf2dbb5 100644
--- a/src/NUnitFramework/tests/GreaterEqualFixture.cs
+++ b/src/NUnitFramework/tests/GreaterEqualFixture.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitFramework/tests/GreaterFixture.cs b/src/NUnitFramework/tests/GreaterFixture.cs
index 426e2c9..a4fab10 100644
--- a/src/NUnitFramework/tests/GreaterFixture.cs
+++ b/src/NUnitFramework/tests/GreaterFixture.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitFramework/tests/LessEqualFixture.cs b/src/NUnitFramework/tests/LessEqualFixture.cs
index 44094bc..3e3c893 100644
--- a/src/NUnitFramework/tests/LessEqualFixture.cs
+++ b/src/NUnitFramework/tests/LessEqualFixture.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitFramework/tests/LessFixture.cs b/src/NUnitFramework/tests/LessFixture.cs
index c0a6d86..f44d67d 100644
--- a/src/NUnitFramework/tests/LessFixture.cs
+++ b/src/NUnitFramework/tests/LessFixture.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitFramework/tests/ListContentsTests.cs b/src/NUnitFramework/tests/ListContentsTests.cs
index 9a37ef7..eaf76ad 100644
--- a/src/NUnitFramework/tests/ListContentsTests.cs
+++ b/src/NUnitFramework/tests/ListContentsTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -69,8 +69,8 @@ namespace NUnit.Framework.Tests
 			Assert.Contains( "def", new ArrayList( testArray ) );
 		}
 
-		[Test,ExpectedException(typeof(AssertionException))]
-		public void DifferentTypesFail()
+		[Test]
+		public void DifferentTypesMayBeEqual()
 		{
 			// TODO: Better message for this case
 			expectedMessage =
diff --git a/src/NUnitFramework/tests/MessageChecker.cs b/src/NUnitFramework/tests/MessageChecker.cs
index 3af9551..bb3fa84 100644
--- a/src/NUnitFramework/tests/MessageChecker.cs
+++ b/src/NUnitFramework/tests/MessageChecker.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitFramework/tests/MessageWriterTests.cs b/src/NUnitFramework/tests/MessageWriterTests.cs
deleted file mode 100644
index b3daa99..0000000
--- a/src/NUnitFramework/tests/MessageWriterTests.cs
+++ /dev/null
@@ -1,139 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-using System.Threading;
-using System.Globalization;
-
-namespace NUnit.Framework.Tests
-{
-    public class MessageWriterTests : AssertionHelper
-    {
-        protected TextMessageWriter writer;
-
-		[SetUp]
-		public void SetUp()
-        {
-            writer = new TextMessageWriter();
-        }
-    }
-
-    [TestFixture]
-    public class TestMessageWriterTests : MessageWriterTests
-    {
-        [Test]
-        public void ConnectorIsWrittenWithSurroundingSpaces()
-        {
-            writer.WriteConnector("and");
-            Expect(writer.ToString(), EqualTo(" and "));
-        }
-
-        [Test]
-        public void PredicateIsWrittenWithTrailingSpace()
-        {
-            writer.WritePredicate("contains");
-            Expect(writer.ToString(), EqualTo("contains "));
-        }
-
-        [TestFixture]
-        public class ExpectedValueTests : ValueTests
-        {
-            protected override void WriteValue(object obj)
-            {
-                writer.WriteExpectedValue(obj);
-            }
-        }
-
-        [TestFixture]
-        public class ActualValueTests : ValueTests
-        {
-            protected override void WriteValue(object obj)
-            {
-                writer.WriteActualValue( obj );
-            }
-        }
-
-        public abstract class ValueTests : MessageWriterTests
-        {
-            protected abstract void WriteValue( object obj);
-
-            [Test]
-            public void IntegerIsWrittenAsIs()
-            {
-                WriteValue(42);
-                Expect(writer.ToString(), EqualTo("42"));
-            }
-
-            [Test]
-            public void StringIsWrittenWithQuotes()
-            {
-                WriteValue("Hello");
-                Expect(writer.ToString(), EqualTo("\"Hello\""));
-            }
-
-			// This test currently fails because control character replacement is
-			// done at a higher level...
-			// TODO: See if we should do it at a lower level
-//            [Test]
-//            public void ControlCharactersInStringsAreEscaped()
-//            {
-//                WriteValue("Best Wishes,\r\n\tCharlie\r\n");
-//                Assert.That(writer.ToString(), Is.EqualTo("\"Best Wishes,\\r\\n\\tCharlie\\r\\n\""));
-//            }
-
-            [Test]
-            public void FloatIsWrittenWithTrailingF()
-            {
-                WriteValue(0.5f);
-                Expect(writer.ToString(), EqualTo("0.5f"));
-            }
-
-            [Test]
-            public void FloatIsWrittenToNineDigits()
-            {
-                WriteValue(0.33333333333333f);
-                int digits = writer.ToString().Length - 3;   // 0.dddddddddf
-                Expect(digits, EqualTo(9));
-				Expect(writer.ToString().Length, EqualTo(12));
-            }
-
-            [Test]
-            public void DoubleIsWrittenWithTrailingD()
-            {
-                WriteValue(0.5d);
-                Expect(writer.ToString(), EqualTo("0.5d"));
-            }
-
-            [Test]
-            public void DoubleIsWrittenToSeventeenDigits()
-            {
-                WriteValue(0.33333333333333333333333333333333333333333333d);
-                Expect(writer.ToString().Length, EqualTo(20)); // add 3 for leading 0, decimal and trailing d
-            }
-
-            [Test]
-            public void DecimalIsWrittenWithTrailingM()
-            {
-                WriteValue(0.5m);
-                Expect(writer.ToString(), EqualTo("0.5m"));
-            }
-
-            [Test]
-            public void DecimalIsWrittenToTwentyNineDigits()
-            {
-                WriteValue(12345678901234567890123456789m);
-                Expect(writer.ToString(), EqualTo("12345678901234567890123456789m"));
-            }
-
-			[Test]
-			public void DateTimeTest()
-			{
-				WriteValue(new DateTime(2007, 7, 4, 9, 15, 30, 123));
-				Expect(writer.ToString(), EqualTo("2007-07-04 09:15:30.123"));
-			}
-        }
-    }
-}
diff --git a/src/NUnitFramework/tests/MsgUtilTests.cs b/src/NUnitFramework/tests/MsgUtilTests.cs
deleted file mode 100644
index 178c91e..0000000
--- a/src/NUnitFramework/tests/MsgUtilTests.cs
+++ /dev/null
@@ -1,97 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework.Tests
-{
-	/// <summary>
-	/// Summary description for MsgUtilTests.
-	/// </summary>
-	[TestFixture]
-	public class MsgUtilTests
-	{
-		[Test]
-		public void TestConvertWhitespace()
-		{
-			Assert.AreEqual( "\\n", MsgUtils.ConvertWhitespace("\n") );
-			Assert.AreEqual( "\\n\\n", MsgUtils.ConvertWhitespace("\n\n") );
-			Assert.AreEqual( "\\n\\n\\n", MsgUtils.ConvertWhitespace("\n\n\n") );
-
-			Assert.AreEqual( "\\r", MsgUtils.ConvertWhitespace("\r") );
-			Assert.AreEqual( "\\r\\r", MsgUtils.ConvertWhitespace("\r\r") );
-			Assert.AreEqual( "\\r\\r\\r", MsgUtils.ConvertWhitespace("\r\r\r") );
-
-			Assert.AreEqual( "\\r\\n", MsgUtils.ConvertWhitespace("\r\n") );
-			Assert.AreEqual( "\\n\\r", MsgUtils.ConvertWhitespace("\n\r") );
-			Assert.AreEqual( "This is a\\rtest message", MsgUtils.ConvertWhitespace("This is a\rtest message") );
-
-			Assert.AreEqual( "", MsgUtils.ConvertWhitespace("") );
-			Assert.AreEqual( null, MsgUtils.ConvertWhitespace(null) );
-                
-			Assert.AreEqual( "\\t", MsgUtils.ConvertWhitespace( "\t" ) );
-			Assert.AreEqual( "\\t\\n", MsgUtils.ConvertWhitespace( "\t\n" ) );
-
-			Assert.AreEqual( "\\\\r\\\\n", MsgUtils.ConvertWhitespace( "\\r\\n" ) );
-		}
-
-        [Test]
-        public void TestClipString()
-        {
-            Assert.AreEqual(s52, MsgUtils.ClipString(s52, 52, 0));
-
-            Assert.AreEqual("abcdefghijklmnopqrstuvwxyz...",
-                MsgUtils.ClipString(s52, 29, 0));
-            Assert.AreEqual("...ABCDEFGHIJKLMNOPQRSTUVWXYZ",
-                MsgUtils.ClipString(s52, 29, 26));
-            Assert.AreEqual("...ABCDEFGHIJKLMNOPQRSTUV...",
-                MsgUtils.ClipString(s52, 28, 26));
-        }
-
-        private static readonly string s52 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
-
-        [Test]
-        public void ClipExpectedAndActual_StringsFitInLine()
-        {
-            string eClip = s52;
-            string aClip = "abcde";
-            MsgUtils.ClipExpectedAndActual(ref eClip, ref aClip, 52, 5);
-            Assert.AreEqual(s52, eClip);
-            Assert.AreEqual("abcde", aClip);
-
-            eClip = s52;
-            aClip = "abcdefghijklmno?qrstuvwxyz";
-            MsgUtils.ClipExpectedAndActual(ref eClip, ref aClip, 52, 15);
-            Assert.AreEqual(s52, eClip);
-            Assert.AreEqual("abcdefghijklmno?qrstuvwxyz", aClip);
-        }
-
-        [Test]
-        public void ClipExpectedAndActual_StringTailsFitInLine()
-        {
-            string s1 = s52;
-            string s2 = s52.Replace('Z', '?');
-            MsgUtils.ClipExpectedAndActual(ref s1, ref s2, 29, 51);
-            Assert.AreEqual("...ABCDEFGHIJKLMNOPQRSTUVWXYZ", s1);
-        }
-
-        [Test]
-        public void ClipExpectedAndActual_StringsDoNotFitInLine()
-        {
-            string s1 = s52;
-            string s2 = "abcdefghij";
-            MsgUtils.ClipExpectedAndActual(ref s1, ref s2, 29, 10);
-            Assert.AreEqual("abcdefghijklmnopqrstuvwxyz...", s1);
-            Assert.AreEqual("abcdefghij", s2);
-
-            s1 = s52;
-            s2 = "abcdefghijklmno?qrstuvwxyz";
-            MsgUtils.ClipExpectedAndActual(ref s1, ref s2, 25, 15);
-            Assert.AreEqual("...efghijklmnopqrstuvw...", s1);
-            Assert.AreEqual("...efghijklmno?qrstuvwxyz", s2);
-        }
-	}
-}
diff --git a/src/NUnitFramework/tests/NUnitLite/ArrayFailureMessageTests.cs b/src/NUnitFramework/tests/NUnitLite/ArrayFailureMessageTests.cs
deleted file mode 100644
index 10f838a..0000000
--- a/src/NUnitFramework/tests/NUnitLite/ArrayFailureMessageTests.cs
+++ /dev/null
@@ -1,175 +0,0 @@
-// *****************************************************
-// Copyright 2006, Charlie Poole
-//
-// Licensed under the Open Software License version 3.0
-// *****************************************************
-
-using System;
-using System.Text;
-
-namespace NUnitLite.Framework
-{
-    [TestFixture]
-    public class ArrayFailureMessageTests : IExpectException
-    {
-        private static readonly string NL = Environment.NewLine;
-
-        private string expectedMessage;
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void FailsWhenArraysHaveDifferentRanks()
-        {
-            int[] expected = new int[] { 1, 2, 3, 4 };
-            int[,] actual = new int[,] { { 1, 2 }, { 3, 4 } };
-
-            expectedMessage =
-                "  Expected is <System.Int32[4]>, actual is <System.Int32[2,2]>" + NL;
-            Assert.That(actual, Is.EqualTo(expected));
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void FailureWhenExpectedArrayIsLonger()
-        {
-            int[] expected = new int[] { 1, 2, 3, 4, 5 };
-            int[] actual = new int[] { 1, 2, 3 };
-
-            expectedMessage =
-                "  Expected is <System.Int32[5]>, actual is <System.Int32[3]>" + NL +
-                "  Values differ at index [3]" + NL +
-                Msgs.Pfx_Missing + "< 4, 5 >";
-            Assert.That(actual, Is.EqualTo(expected));
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void FailureWhenActualArrayIsLonger()
-        {
-            int[] expected = new int[] { 1, 2, 3 };
-            int[] actual = new int[] { 1, 2, 3, 4, 5, 6, 7 };
-
-            expectedMessage =
-                "  Expected is <System.Int32[3]>, actual is <System.Int32[7]>" + NL +
-                "  Values differ at index [3]" + NL +
-                Msgs.Pfx_Extra + "< 4, 5, 6... >";
-            Assert.That(actual, Is.EqualTo(expected));
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void FailureOnSingleDimensionedArrays()
-        {
-            int[] expected = new int[] { 1, 2, 3 };
-            int[] actual = new int[] { 1, 5, 3 };
-
-            expectedMessage =
-                "  Expected and actual are both <System.Int32[3]>" + NL +
-                "  Values differ at index [1]" + NL +
-                Msgs.Pfx_Expected + "2" + NL +
-                Msgs.Pfx_Actual   + "5" + NL;
-            Assert.That(actual, Is.EqualTo(expected));
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void FailureOnDoubleDimensionedArrays()
-        {
-            int[,] expected = new int[,] { { 1, 2, 3 }, { 4, 5, 6 } };
-            int[,] actual = new int[,] { { 1, 3, 2 }, { 4, 0, 6 } };
-
-            expectedMessage =
-                "  Expected and actual are both <System.Int32[2,3]>" + NL +
-                "  Values differ at index [0,1]" + NL +
-                Msgs.Pfx_Expected + "2" + NL +
-                Msgs.Pfx_Actual   + "3" + NL;
-            Assert.That(actual, Is.EqualTo(expected));
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void FailureOnTripleDimensionedArrays()
-        {
-            int[, ,] expected = new int[,,] { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } };
-            int[, ,] actual = new int[,,] { { { 1, 2 }, { 3, 4 } }, { { 0, 6 }, { 7, 8 } } };
-
-            expectedMessage =
-                "  Expected and actual are both <System.Int32[2,2,2]>" + NL +
-                "  Values differ at index [1,0,0]" + NL +
-                Msgs.Pfx_Expected + "5" + NL +
-                Msgs.Pfx_Actual   + "0" + NL;
-            Assert.That(actual, Is.EqualTo(expected));
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void FailureOnFiveDimensionedArrays()
-        {
-            int[, , , ,] expected = new int[2, 2, 2, 2, 2] { { { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } }, { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } } }, { { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } }, { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } } } };
-            int[, , , ,] actual = new int[2, 2, 2, 2, 2] { { { { { 1, 2 }, { 4, 3 } }, { { 5, 6 }, { 7, 8 } } }, { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } } }, { { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } }, { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } } } };
-
-            expectedMessage =
-                "  Expected and actual are both <System.Int32[2,2,2,2,2]>" + NL +
-                "  Values differ at index [0,0,0,1,0]" + NL +
-                Msgs.Pfx_Expected + "3" + NL +
-                Msgs.Pfx_Actual   + "4" + NL;
-            Assert.That(actual, Is.EqualTo(expected));
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void FailureOnJaggedArrays()
-        {
-            int[][] expected = new int[][] { new int[] { 1, 2, 3 }, new int[] { 4, 5, 6, 7 }, new int[] { 8, 9 } };
-            int[][] actual = new int[][] { new int[] { 1, 2, 3 }, new int[] { 4, 5, 0, 7 }, new int[] { 8, 9 } };
-
-            expectedMessage =
-                "  Expected and actual are both <System.Int32[3][]>" + NL +
-                "  Values differ at index [1]" + NL +
-                "    Expected and actual are both <System.Int32[4]>" + NL +
-                "    Values differ at index [2]" + NL +
-                Msgs.Pfx_Expected + "6" + NL +
-                Msgs.Pfx_Actual   + "0" + NL;
-            Assert.That(actual, Is.EqualTo(expected));
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void FailureOnJaggedArrayComparedToSimpleArray()
-        {
-            int[] expected = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
-            int[][] actual = new int[][] { new int[] { 1, 2, 3 }, new int[] { 4, 5, 0, 7 }, new int[] { 8, 9 } };
-
-            expectedMessage =
-                "  Expected is <System.Int32[9]>, actual is <System.Int32[3][]>" + NL +
-                "  Values differ at index [0]" + NL +
-                Msgs.Pfx_Expected + "1" + NL +
-                Msgs.Pfx_Actual   + "< 1, 2, 3 >" + NL;
-            Assert.That(actual, Is.EqualTo(expected));
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void FailureOnArraysWithDifferentRanksAsCollection()
-        {
-            int[] expected = new int[] { 1, 2, 3, 4 };
-            int[,] actual = new int[,] { { 1, 0 }, { 3, 4 } };
-
-            expectedMessage =
-                "  Expected is <System.Int32[4]>, actual is <System.Int32[2,2]>" + NL +
-                "  Values differ at expected index [1], actual index [0,1]" + NL +
-                Msgs.Pfx_Expected + "2" + NL +
-                Msgs.Pfx_Actual   + "0" + NL;
-            Assert.That(actual, Is.EqualTo(expected).AsCollection);
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void FailureArraysWithDifferentDimensionsAsCollection()
-        {
-            int[,] expected = new int[,] { { 1, 2, 3 }, { 4, 5, 6 } };
-            int[,] actual = new int[,] { { 1, 2 }, { 3, 0 }, { 5, 6 } };
-
-            expectedMessage =
-                "  Expected is <System.Int32[2,3]>, actual is <System.Int32[3,2]>" + NL +
-                "  Values differ at expected index [1,0], actual index [1,1]" + NL +
-                Msgs.Pfx_Expected + "4" + NL +
-                Msgs.Pfx_Actual   + "0" + NL;
-            Assert.That(actual, Is.EqualTo(expected).AsCollection);
-        }
-
-        public void HandleException(Exception ex)
-        {
-            Assert.That(ex.Message, Is.EqualTo(expectedMessage));
-        }
-    }
-}
diff --git a/src/NUnitFramework/tests/NUnitLite/AssertTests.cs b/src/NUnitFramework/tests/NUnitLite/AssertTests.cs
deleted file mode 100644
index 960686d..0000000
--- a/src/NUnitFramework/tests/NUnitLite/AssertTests.cs
+++ /dev/null
@@ -1,96 +0,0 @@
-// *****************************************************
-// Copyright 2006, Charlie Poole
-//
-// Licensed under the Open Software License version 3.0
-// *****************************************************
-
-using System;
-using NUnit.Framework;
-using NUnitLite.Framework;
-using NUnitLite.Constraints;
-
-namespace NUnitLite.Tests
-{
-    [TestFixture]
-    public class AssertTests
-    {
-        [Test]
-        public void AssertPassesIfMatcherMatches()
-        {
-            Assert.That( 4, new AlwaysMatcher() );
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void AssertFailsIfMatcherFails()
-        {
-            Assert.That(4, new NeverMatcher());
-        }
-
-        //[Test, ExpectedException(typeof(AssertionException),Handler="MessageChecker1")]
-        public void HasValidMessageFormat()
-        {
-            Assert.That(42, Is.Null);
-        }
-
-        private static void MessageChecker1(Exception ex)
-        {
-            Assert.That(ex.Message, Is.EqualTo(
-                Msgs.Pfx_Expected + "null" + Environment.NewLine +
-                Msgs.Pfx_Actual   + "42" + Environment.NewLine));
-        }
-
-        //[Test, ExpectedException(typeof(AssertionException), Handler = "MessageChecker2")]
-        public void CanSupplyUserMessage()
-        {
-            Assert.That(42, Is.Null, "Wrong answer!");
-        }
-
-        private static void MessageChecker2(Exception ex)
-        {
-            Assert.That(ex.Message, Is.EqualTo(
-                "  Wrong answer!" + Environment.NewLine +
-                Msgs.Pfx_Expected + "null" + Environment.NewLine +
-                Msgs.Pfx_Actual   + "42" + Environment.NewLine));
-        }
-
-        //[Test, ExpectedException(typeof(AssertionException), Handler = "MessageChecker3")]
-        public void CanSupplyUserMessageWithParams()
-        {
-            Assert.That(42, Is.Null, "{0} is the wrong answer, {1}!", 42, "fool");
-        }
-
-        private static void MessageChecker3(Exception ex)
-        {
-            Assert.That(ex.Message, Is.EqualTo(
-                "  42 is the wrong answer, fool!" + Environment.NewLine +
-                Msgs.Pfx_Expected + "null" + Environment.NewLine +
-                Msgs.Pfx_Actual   + "42" + Environment.NewLine));
-        }
-
-        class AlwaysMatcher : Constraint
-        {
-            public override bool Matches(object actual)
-            {
-                return true;
-            }
-
-            public override void WriteDescriptionTo(MessageWriter writer)
-            {
-                writer.Write("always");
-            }
-        }
-
-        class NeverMatcher : Constraint
-        {
-            public override bool Matches(object actual)
-            {
-                return false;
-            }
-
-            public override void WriteDescriptionTo(MessageWriter writer)
-            {
-                writer.Write("never");
-            }
-        }
-    }
-}
diff --git a/src/NUnitFramework/tests/NUnitLite/AssertionHelper.cs b/src/NUnitFramework/tests/NUnitLite/AssertionHelper.cs
deleted file mode 100644
index c315f2e..0000000
--- a/src/NUnitFramework/tests/NUnitLite/AssertionHelper.cs
+++ /dev/null
@@ -1,55 +0,0 @@
-using System;
-using NUnitLite.Constraints;
-
-namespace NUnitLite.Framework
-{
-    class AssertionHelper : Is
-    {
-        #region Expect
-        public static void Expect( bool expression )
-        {
-            Expect(expression, True, null);
-        }
-
-        public static void Expect(bool expression, string message)
-        {
-            Expect(expression, True, message);
-        }
-
-        public static void Expect(object actual, Constraint constraint)
-        {
-            Expect(actual, constraint, null);
-        }
-
-        public static void Expect(object actual, Constraint constraint, string message)
-        {
-            Assert.That(actual, constraint, message);
-        }
-
-        public static void Expect(object actual, Constraint constraint, string message, params object[] args)
-        {
-            Assert.That(actual, constraint, message, args);
-        }
-
-        public static void Expect(object actual, Type type)
-        {
-            Assert.That(actual, Is.InstanceOfType(type));
-        }
-        #endregion
-
-        #region String Helpers
-        public static Constraint StartsWith(string substring)
-        {
-            return new StartsWithConstraint(substring);
-        }
-
-        public static Constraint EndsWith(string substring)
-        {
-            return new EndsWithConstraint(substring);
-        }
-        #endregion
-
-        #region Collection Helpers
-        #endregion
-    }
-}
diff --git a/src/NUnitFramework/tests/NUnitLite/CollectionTests.cs b/src/NUnitFramework/tests/NUnitLite/CollectionTests.cs
deleted file mode 100644
index b1571de..0000000
--- a/src/NUnitFramework/tests/NUnitLite/CollectionTests.cs
+++ /dev/null
@@ -1,52 +0,0 @@
-// *****************************************************
-// Copyright 2006, Charlie Poole
-//
-// Licensed under the Open Software License version 3.0
-// *****************************************************
-
-using System;
-using System.Collections;
-
-namespace NUnitLite.Framework
-{
-    [TestFixture]
-    class CollectionTests : IExpectException
-    {
-        [Test]
-        public void CanMatchTwoCollections()
-        {
-            ArrayList expected = new ArrayList(new int[] { 1, 2, 3 });
-            ArrayList actual = new ArrayList(new int[] { 1, 2, 3 });
-
-            Assert.That(actual, Is.EqualTo(expected));
-        }
-
-        [Test]
-        public void CanMatchAnArrayWithACollection()
-        {
-            ArrayList collection = new ArrayList(new int[] { 1, 2, 3 });
-            int[] array = new int[] { 1, 2, 3 };
-
-            Assert.That(collection, Is.EqualTo(array));
-            Assert.That(array, Is.EqualTo(collection));
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void FailureMatchingArrayAndCollection()
-        {
-            int[] expected = new int[] { 1, 2, 3 };
-            ArrayList actual = new ArrayList( new int[] { 1, 5, 3 } );
-
-            Assert.That(actual, Is.EqualTo(expected));
-        }
-
-        public void HandleException(Exception ex)
-        {
-            Assert.That(ex.Message, Is.EqualTo(
-                "  Expected is <System.Int32[3]>, actual is <System.Collections.ArrayList>" + Environment.NewLine +
-                "  Values differ at index [1]" + Environment.NewLine +
-                Msgs.Pfx_Expected + "2" + Environment.NewLine +
-                Msgs.Pfx_Actual   + "5" + Environment.NewLine));
-        }
-    }
-}
diff --git a/src/NUnitFramework/tests/NUnitLite/ExpectedExceptionTests.cs b/src/NUnitFramework/tests/NUnitLite/ExpectedExceptionTests.cs
deleted file mode 100644
index e32b398..0000000
--- a/src/NUnitFramework/tests/NUnitLite/ExpectedExceptionTests.cs
+++ /dev/null
@@ -1,178 +0,0 @@
-// *****************************************************
-// Copyright 2006, Charlie Poole
-//
-// Licensed under the Open Software License version 3.0
-// *****************************************************
-
-using System;
-using NUnitLite.Framework;
-
-namespace NUnitLite.Tests
-{
-    [TestFixture]
-    public class ExpectedExceptionTests
-    {
-        [Test, ExpectedException(typeof(ArgumentException))]
-        public void TestSucceedsWhenSpecifiedExceptionIsThrown()
-        {
-            throw new ArgumentException();
-        }
-
-        [Test]
-        public void TestFailsWhenNoExceptionIsThrown()
-        {
-            TestSuite suite = new TestSuite(typeof(NoExceptionThrownClass));
-            TestResult result = (TestResult)suite.Run().Results[0];
-            Assert.That(result.ResultState, Is.EqualTo(ResultState.Failure));
-            Assert.That(result.Message, Is.EqualTo( 
-                "Expected Exception of type <System.ArgumentException>, but none was thrown" ));
-        }
-
-        class NoExceptionThrownClass
-        {
-            [Test, ExpectedException(typeof(ArgumentException))]
-            public void NoExceptionThrown()
-            {
-            }
-        }
-
-        [Test]
-        public void TestFailsWhenWrongExceptionIsThrown()
-        {
-            TestSuite suite = new TestSuite(typeof(WrongExceptionThrownClass));
-            TestResult result = (TestResult)suite.Run().Results[0];
-            Assert.That(result.ResultState, Is.EqualTo(ResultState.Failure));
-            Assert.That(result.Message, Is.EqualTo("Expected Exception of type <System.ArgumentException>, but was <System.ApplicationException>"));
-        }
-
-        class WrongExceptionThrownClass
-        {
-            [Test, ExpectedException(typeof(ArgumentException))]
-            public void WrongExceptionThrown()
-            {
-                throw new ApplicationException();
-            }
-        }
-
-        [Test]
-        public void TestFailsWhenDerivedExceptionIsThrown()
-        {
-            TestSuite suite = new TestSuite(typeof(DerivedExceptionThrownClass));
-            TestResult result = (TestResult)suite.Run().Results[0];
-            Assert.That(result.ResultState, Is.EqualTo(ResultState.Failure));
-            Assert.That(result.Message, Is.EqualTo("Expected Exception of type <System.Exception>, but was <System.ApplicationException>"));
-        }
-
-        class DerivedExceptionThrownClass
-        {
-            [Test, ExpectedException(typeof(Exception))]
-            public void DerivedExceptionThrown()
-            {
-                throw new ApplicationException();
-            }
-        }
-
-        [Test, ExpectedException]
-        public void TestSucceedsWithAnyExceptionWhenNoTypeIsSpecified()
-        {
-            throw new AssertionException("message");
-        }
-
-        [Test]
-        public void ExceptionHandlerIsCalledWhenExceptionMatches_AlternateHandler()
-        {
-            ExceptionHandlerCalledClass fixture = new ExceptionHandlerCalledClass();
-            ITest testCase = new ProxyTestCase("ThrowsArgumentException_AlternateHandler", fixture);
-            testCase.Run();
-            Assert.That(fixture.HandlerCalled, Is.False, "Base Handler should not be called");
-            Assert.That(fixture.AlternateHandlerCalled, "Alternate Handler should be called");
-        }
-
-        [Test]
-        public void ExceptionHandlerIsCalledWhenExceptionMatches()
-        {
-            ExceptionHandlerCalledClass fixture = new ExceptionHandlerCalledClass();
-            ITest testCase = new ProxyTestCase("ThrowsArgumentException", fixture);
-            testCase.Run();
-            Assert.That(fixture.HandlerCalled, Is.True, "Base Handler should be called");
-            Assert.That(fixture.AlternateHandlerCalled, Is.False, "Alternate Handler should be called");
-        }
-
-        [Test]
-        public void ExceptionHandlerIsNotCalledWhenExceptionDoesNotMatch()
-        {
-            ExceptionHandlerCalledClass fixture = new ExceptionHandlerCalledClass();
-            ITest testCase = new ProxyTestCase("ThrowsApplicationException", fixture);
-            testCase.Run();
-            Assert.That(fixture.HandlerCalled, Is.False, "Base Handler should not be called");
-            Assert.That(fixture.AlternateHandlerCalled, Is.False, "Alternate Handler should not be called");
-        }
-
-        [Test]
-        public void ExceptionHandlerIsNotCalledWhenExceptionDoesNotMatch_AlternateHandler()
-        {
-            ExceptionHandlerCalledClass fixture = new ExceptionHandlerCalledClass();
-            ITest testCase = new ProxyTestCase("ThrowsApplicationException_AlternateHandler", fixture);
-            testCase.Run();
-            Assert.That(fixture.HandlerCalled, Is.False, "Base Handler should not be called");
-            Assert.That(fixture.AlternateHandlerCalled, Is.False, "Alternate Handler should not be called");
-        }
-
-        [Test]
-        public void FailsWhenAlternateHandlerIsNotFound()
-        {
-            ExceptionHandlerCalledClass fixture = new ExceptionHandlerCalledClass();
-            ITest testCase = new ProxyTestCase("MethodWithBadHandler", fixture);
-            TestResult result = testCase.Run();
-            Assert.That(result.ResultState, Is.EqualTo(ResultState.Failure));
-            Assert.That(result.Message, Is.EqualTo(
-                "The specified exception handler DeliberatelyMissingHandler was not found" ));
-        }
-
-        class ExceptionHandlerCalledClass : IExpectException
-        {
-            public bool HandlerCalled = false;
-            public bool AlternateHandlerCalled = false;
-
-            [Test, ExpectedException(typeof(ArgumentException))]
-            public void ThrowsArgumentException()
-            {
-                throw new ArgumentException();
-            }
-
-            [Test, ExpectedException(typeof(ArgumentException), Handler = "AlternateExceptionHandler")]
-            public void ThrowsArgumentException_AlternateHandler()
-            {
-                throw new ArgumentException();
-            }
-
-            [Test, ExpectedException(typeof(ArgumentException))]
-            public void ThrowsApplicationException()
-            {
-                throw new ApplicationException();
-            }
-
-            [Test, ExpectedException(typeof(ArgumentException), Handler = "AlternateExceptionHandler")]
-            public void ThrowsApplicationException_AlternateHandler()
-            {
-                throw new ApplicationException();
-            }
-
-            [Test, ExpectedException(typeof(ArgumentException), Handler = "DeliberatelyMissingHandler")]
-            public void MethodWithBadHandler()
-            {
-                throw new ArgumentException();
-            }
-
-            public void HandleException(Exception ex)
-            {
-                HandlerCalled = true;
-            }
-
-            public void AlternateExceptionHandler(Exception ex)
-            {
-                AlternateHandlerCalled = true;
-            }
-        }
-    }
-}
diff --git a/src/NUnitFramework/tests/NUnitLite/MessageWriterTests.cs b/src/NUnitFramework/tests/NUnitLite/MessageWriterTests.cs
deleted file mode 100644
index eb2bc6a..0000000
--- a/src/NUnitFramework/tests/NUnitLite/MessageWriterTests.cs
+++ /dev/null
@@ -1,137 +0,0 @@
-// *****************************************************
-// Copyright 2006, Charlie Poole
-//
-// Licensed under the Open Software License version 3.0
-// *****************************************************
-
-using System;
-using NUnitLite.Framework;
-
-namespace NUnitLite.Tests
-{
-    class MessageWriterTests : TestCase
-    {
-        public MessageWriterTests(string name) : base(name) { }
-
-        protected TextMessageWriter writer;
-
-        protected override void SetUp()
-        {
-            writer = new TextMessageWriter();
-        }
-    }
-
-    [TestFixture]
-    class TestMessageWriterTests : MessageWriterTests
-    {
-        public TestMessageWriterTests(string name) : base(name) { }
-
-        [Test]
-        public void ConnectorIsWrittenWithSurroundingSpaces()
-        {
-            writer.WriteConnector("and");
-            Assert.That(writer.ToString(), Is.EqualTo(" and "));
-        }
-
-        [Test]
-        public void PredicateIsWrittenWithTrailingSpace()
-        {
-            writer.WritePredicate("contains");
-            Assert.That(writer.ToString(), Is.EqualTo("contains "));
-        }
-
-        [TestFixture]
-        class ExpectedValueTests : ValueTests
-        {
-            public ExpectedValueTests(string name) : base(name) { }
-
-            protected override void WriteValue(object obj)
-            {
-                writer.WriteExpectedValue(obj);
-            }
-        }
-
-        [TestFixture]
-        class ActualValueTests : ValueTests
-        {
-            public ActualValueTests(string name) : base(name) { }
-
-            protected override void WriteValue(object obj)
-            {
-                writer.WriteActualValue( obj );
-            }
-        }
-
-        abstract class ValueTests : MessageWriterTests
-        {
-            public ValueTests(string name) : base(name) { }
-
-            protected abstract void WriteValue( object obj);
-
-            [Test]
-            public void IntegerIsWrittenAsIs()
-            {
-                WriteValue(42);
-                Assert.That(writer.ToString(), Is.EqualTo("42"));
-            }
-
-            [Test]
-            public void StringIsWrittenWithQuotes()
-            {
-                WriteValue("Hello");
-                Assert.That(writer.ToString(), Is.EqualTo("\"Hello\""));
-            }
-
-            //[Test]
-            //public void ControlCharactersInStringsAreEscaped()
-            //{
-            //    WriteValue("Best Wishes,\r\n\tCharlie\r\n");
-            //    Assert.That(writer.ToString(), Is.EqualTo("\"Best Wishes,\\r\\n\\tCharlie\\r\\n\""));
-            //}
-
-            [Test]
-            public void FloatIsWrittenWithTrailingF()
-            {
-                WriteValue(0.5f);
-                Assert.That(writer.ToString(), Is.EqualTo("0.5f"));
-            }
-
-            [Test]
-            public void FloatIsWrittenToNineDigits()
-            {
-                WriteValue(0.33333333333333f);
-                int digits = writer.ToString().Length - 3;   // 0.dddddddddf
-                Assert.That(digits, Is.EqualTo(9));
-            }
-
-            [Test]
-            public void DoubleIsWrittenWithTrailingD()
-            {
-                WriteValue(0.5d);
-                Assert.That(writer.ToString(), Is.EqualTo("0.5d"));
-            }
-
-            [Test]
-            public void DoubleIsWrittenToSeventeenDigits()
-            {
-                WriteValue(0.33333333333333333333333333333333333333333333d);
-                int digits = writer.ToString().Length - 3;
-                Assert.That(digits, Is.EqualTo(17));
-            }
-
-            [Test]
-            public void DecimalIsWrittenWithTrailingM()
-            {
-                WriteValue(0.5m);
-                Assert.That(writer.ToString(), Is.EqualTo("0.5m"));
-            }
-
-            [Test]
-            public void DecimalIsWrittenToTwentyNineDigits()
-            {
-                WriteValue(12345678901234567890123456789m);
-                Assert.That(writer.ToString(), Is.EqualTo("12345678901234567890123456789m"));
-            }
-        }
-    }
-}
diff --git a/src/NUnitFramework/tests/NUnitLite/StackFilterTest.cs b/src/NUnitFramework/tests/NUnitLite/StackFilterTest.cs
deleted file mode 100644
index a499a1a..0000000
--- a/src/NUnitFramework/tests/NUnitLite/StackFilterTest.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-// *****************************************************
-// Copyright 2006, Charlie Poole
-//
-// Licensed under the Open Software License version 3.0
-// *****************************************************
-
-using System;
-using NUnitLite.Framework;
-
-namespace NUnitLite.Tests
-{
-    [TestFixture]
-    class StackFilterTest
-    {
-        private static readonly string rawTrace =
-    @"   at NUnitLite.Framework.Assert.Fail(String message) in D:\Dev\NUnitLite\NUnitLite\Framework\Assert.cs:line 56" + Environment.NewLine +
-    @"   at NUnitLite.Framework.Assert.That(String label, Object actual, Matcher expectation, String message) in D:\Dev\NUnitLite\NUnitLite\Framework\Assert.cs:line 50" + Environment.NewLine +
-    @"   at NUnitLite.Framework.Assert.That(Object actual, Matcher expectation) in D:\Dev\NUnitLite\NUnitLite\Framework\Assert.cs:line 19" + Environment.NewLine +
-    @"   at NUnitLite.Tests.GreaterThanMatcherTest.MatchesGoodValue() in D:\Dev\NUnitLite\NUnitLiteTests\GreaterThanMatcherTest.cs:line 12" + Environment.NewLine;
-
-        private static readonly string filteredTrace =
-    @"   at NUnitLite.Tests.GreaterThanMatcherTest.MatchesGoodValue() in D:\Dev\NUnitLite\NUnitLiteTests\GreaterThanMatcherTest.cs:line 12" + Environment.NewLine;
-
-        [Test]
-        public void FilterFailureTrace()
-        {
-            Assert.That( StackFilter.Filter( rawTrace ), Is.EqualTo( filteredTrace ) );
-        }
-    }
-}
diff --git a/src/NUnitFramework/tests/NUnitLite/TestCaseInvocationTests.cs b/src/NUnitFramework/tests/NUnitLite/TestCaseInvocationTests.cs
deleted file mode 100644
index 96043e4..0000000
--- a/src/NUnitFramework/tests/NUnitLite/TestCaseInvocationTests.cs
+++ /dev/null
@@ -1,168 +0,0 @@
-// *****************************************************
-// Copyright 2006, Charlie Poole
-//
-// Licensed under the Open Software License version 3.0
-// *****************************************************
-
-using System;
-using System.Collections;
-using NUnitLite.Framework;
-
-namespace NUnitLite.Tests
-{
-    [TestFixture]
-    public class TestCaseInvocationTests : TestCase
-    {
-        DummyTestCase test;
-        TestResult result;
-
-        public TestCaseInvocationTests(string name) : base(name) { }
-
-        protected override void SetUp()
-        {
-            test = new DummyTestCase( "TheTest" );
-        }
-
-        public void testSetUpCalled()
-        {
-            RunTestAndVerifyResult(ResultState.Success);
-            Assert.That(test.calledSetUp);
-        }
-
-        public void testSetupFailureIsReported()
-        {
-            test.simulateSetUpFailure = true;
-            RunTestAndVerifyResult(ResultState.Failure);
-            Assert.That( result.Message, Is.EqualTo("Simulated SetUp Failure") );
-            VerifyStackTraceContainsMethod("SetUp");
-        }
-
-        public void testSetupErrorIsReported()
-        {
-            test.simulateSetUpError = true;
-            RunTestAndVerifyResult(ResultState.Error);
-            Assert.That( result.Message, Is.EqualTo( "System.Exception : Simulated SetUp Error" ) );
-            VerifyStackTraceContainsMethod("SetUp");
-        }
-
-        public void testTearDownCalled()
-        {
-            RunTestAndVerifyResult(ResultState.Success);
-            Assert.That(test.calledTearDown);
-        }
-
-        public void testTearDownCalledAfterTestFailure()
-        {
-            test.simulateTestFailure = true;
-            test.Run();
-            Assert.That(test.calledTearDown);
-        }
-
-        public void testTearDownCalledAfterTestError()
-        {
-            test.simulateTestError = true;
-            test.Run();
-            Assert.That(test.calledTearDown);
-        }
-
-        public void testThatTestAndTearDownAreNotCalledAfterSetUpFailure()
-        {
-            test.simulateSetUpFailure = true;
-            test.Run();
-            Assert.That( test.calledTheTest, Is.False, "Test" );
-            Assert.That(test.calledTearDown, Is.False, "TearDown" );
-        }
-
-        public void testThatTestAndTearDownAreNotCalledAfterSetUpError()
-        {
-            test.simulateSetUpError = true;
-            test.Run();
-            Assert.That(test.calledTheTest, Is.False, "Test");
-            Assert.That(test.calledTearDown, Is.False, "TearDown");
-        }
-
-        public void testTearDownFailureIsReported()
-        {
-            test.simulateTearDownFailure = true;
-            RunTestAndVerifyResult(ResultState.Failure);
-            Assert.That( result.Message, Is.EqualTo( "Simulated TearDown Failure" ) );
-            VerifyStackTraceContainsMethod("TearDown");
-        }
-
-        //public void testTearDownFailureDoesNotOverWriteTestFailureInfo()
-        //{
-        //    test.simulateTestFailure = true;
-        //    test.simulateTearDownFailure = true;
-        //    RunTestAndVerifyResult(ResultState.Failure);
-        //    NUnit.Framework.StringAssert.Contains("Simulated Test Failure", result.Message);
-        //    NUnit.Framework.StringAssert.Contains("Simulated TearDown Failure", result.Message);
-        //    VerifyStackTraceContainsMethod("TheTest");
-        //    VerifyStackTraceContainsMethod("TearDown");
-        //}
-
-        public void testTearDownErrorIsReported()
-        {
-            test.simulateTearDownError = true;
-            RunTestAndVerifyResult(ResultState.Error);
-            Assert.That( result.Message, Is.EqualTo( "System.Exception : Simulated TearDown Error" ) );
-            VerifyStackTraceContainsMethod("TearDown");
-        }
-
-        public void TestCalled()
-        {
-            RunTestAndVerifyResult(ResultState.Success);
-            Assert.That(test.calledTheTest);
-        }
-
-        public void TestErrorIsReported()
-        {
-            test.simulateTestError = true;
-            RunTestAndVerifyResult(ResultState.Error);
-            Assert.That( result.Message, Is.EqualTo( "System.Exception : Simulated Error" ) );
-            VerifyStackTraceContainsMethod("TheTest");
-        }
-
-        public void TestFailureIsReported()
-        {
-            test.simulateTestFailure = true;
-            RunTestAndVerifyResult(ResultState.Failure);
-            Assert.That( result.Message, Is.EqualTo( "Simulated Failure" ) );
-            VerifyStackTraceContainsMethod("TheTest");
-        }
-
-        public void TestListenerIsCalled()
-        {
-            RecordingTestListener listener = new RecordingTestListener();
-            test.Run(listener);
-            Assert.That( listener.Events, Is.EqualTo( "<TheTest::Success>" ) );
-        }
-
-        public void TestListenerReceivesFailureMessage()
-        {
-            RecordingTestListener listener = new RecordingTestListener();
-            test.simulateTestFailure = true;
-            test.Run(listener);
-            Assert.That( listener.Events, Is.EqualTo( "<TheTest::Failure>" ) );
-        }
-
-        #region Helper Methods
-        private void RunTestAndVerifyResult(ResultState expected)
-        {
-            result = test.Run();
-            VerifyResult(expected);
-        }
-
-        private void VerifyResult(ResultState expected)
-        {
-            Assert.That( result.ResultState, Is.EqualTo( expected ) );
-        }
-
-        private void VerifyStackTraceContainsMethod(string methodName)
-        {
-            Assert.That( result.StackTrace, Is.Not.Null, "StackTrace is null" );
-            string fullName = string.Format("{0}.{1}()", typeof(DummyTestCase).FullName, methodName);
-            Assert.That( result.StackTrace, Contains.Substring( fullName ) );
-        }
-        #endregion
-    }
-}
diff --git a/src/NUnitFramework/tests/NUnitLite/TestResultTests.cs b/src/NUnitFramework/tests/NUnitLite/TestResultTests.cs
deleted file mode 100644
index 9da50e6..0000000
--- a/src/NUnitFramework/tests/NUnitLite/TestResultTests.cs
+++ /dev/null
@@ -1,81 +0,0 @@
-// *****************************************************
-// Copyright 2006, Charlie Poole
-//
-// Licensed under the Open Software License version 3.0
-// *****************************************************
-
-using System;
-using NUnitLite.Framework;
-
-namespace NUnitLite.Tests
-{
-    [TestFixture]
-    public class TestResultTests : TestCase
-    {
-        private static readonly string MESSAGE = "my message";
-        private static readonly string STACKTRACE = "stack trace";
-
-        private TestResult result;
-
-        public TestResultTests(string name) : base(name) { }
-
-        protected override void SetUp()
-        {
-            result = new TestResult(null);
-        }
-
-        void VerifyResultState(ResultState expectedState, bool executed, bool success, bool failure, bool error, string message )
-        {
-            Assert.That( result.ResultState , Is.EqualTo( expectedState ) );
-            Assert.That( result.Executed, Is.EqualTo( executed ) );
-            Assert.That( result.IsSuccess, Is.EqualTo( success ) );
-            Assert.That( result.IsFailure, Is.EqualTo( failure ) );
-            Assert.That( result.IsError, Is.EqualTo( error ) );
-            if ( error )
-                Assert.That(result.Message, Is.EqualTo("System.Exception : " + message));
-            else
-                Assert.That(result.Message, Is.EqualTo(message));
-        }
-
-        public void testDefaultStateIsNotRun()
-        {
-            VerifyResultState(ResultState.NotRun, false, false, false, false, null);
-        }
-
-        public void testCanMarkAsSuccess()
-        {
-            result.Success();
-            VerifyResultState(ResultState.Success, true, true, false, false, null);
-        }
-
-        public void testCanMarkAsFailure()
-        {
-            result.Failure(MESSAGE, STACKTRACE);
-            VerifyResultState(ResultState.Failure, true, false, true, false, MESSAGE);
-            Assert.That( result.StackTrace, Is.EqualTo( STACKTRACE ) );
-        }
-
-        public void testCanMarkAsError()
-        {
-            Exception caught;
-            try
-            {
-                throw new Exception(MESSAGE);
-            }
-            catch(Exception ex)
-            {
-                caught = ex;          
-            }
-
-            result.Error(caught);
-            VerifyResultState(ResultState.Error, true, false, false, true, MESSAGE);
-            Assert.That( result.StackTrace, Is.EqualTo( caught.StackTrace ) );
-        }
-
-        public void testCanMarkAsNotRun()
-        {
-            result.NotRun(MESSAGE);
-            VerifyResultState(ResultState.NotRun, false, false, false, false, MESSAGE);
-        }
-    }
-}
diff --git a/src/NUnitFramework/tests/NUnitLite/TestSuiteBasicTests.cs b/src/NUnitFramework/tests/NUnitLite/TestSuiteBasicTests.cs
deleted file mode 100644
index ddd1f21..0000000
--- a/src/NUnitFramework/tests/NUnitLite/TestSuiteBasicTests.cs
+++ /dev/null
@@ -1,74 +0,0 @@
-// *****************************************************
-// Copyright 2006, Charlie Poole
-//
-// Licensed under the Open Software License version 3.0
-// *****************************************************
-
-using System;
-using NUnitLite.Framework;
-
-namespace NUnitLite.Tests
-{
-    [TestFixture]
-    public class TestSuiteBasicTests : TestCase
-    {
-        public TestSuiteBasicTests(string name) : base(name) { }
-
-        [Test]
-        public void CanAddTestsToSuite()
-        {
-            TestSuite suite = CreateSimpleSuite("my suite");
-            TestSuite suite2 = CreateSimpleSuite("suite two");
-            suite.AddTest(suite2);
-            Assert.That( suite.TestCaseCount, Is.EqualTo( 6 ) );
-        }
-
-        [Test]
-        public void CanRunTestSuite()
-        {
-            RecordingTestListener listener = new RecordingTestListener();
-            TestSuite suite = CreateSimpleSuite("my suite");
-            TestResult result = suite.Run(listener);
-            Assert.That( result.ResultState, Is.EqualTo( ResultState.Success ) );
-            foreach (TestResult r in result.Results)
-                Assert.That( r.ResultState, Is.EqualTo( ResultState.Success ) );
-            Assert.That( listener.Events, Is.EqualTo(
-                "<my suite:<One::Success><Two::Success><Three::Success>:Success>" ) );
-        }
-
-        [Test]
-        public void FailuresPropagateToSuite()
-        {
-            TestSuite suite = CreateSimpleSuite("my suite");
-            DummyTestCase dummy = new DummyTestCase( "TheTest" );
-            suite.AddTest(dummy);
-            dummy.simulateTestFailure = true;
-            TestResult result = suite.Run();
-            Assert.That( result.ResultState, Is.EqualTo( ResultState.Failure ) );
-        }
-
-        [Test]
-        public void ErrorsPropagateToSuiteAsFailures()
-        {
-            TestSuite suite = CreateSimpleSuite("my suite");
-            DummyTestCase dummy = new DummyTestCase( "TheTest" );
-            suite.AddTest(dummy);
-            dummy.simulateTestError = true;
-            TestResult result = suite.Run();
-            Assert.That( result.ResultState, Is.EqualTo( ResultState.Failure ) );
-        }
-
-        #region Helper Methods
-        private TestSuite CreateSimpleSuite(string name)
-        {
-            TestSuite suite = new TestSuite(name);
-            Assert.That( suite.TestCaseCount, Is.EqualTo( 0 ) );
-            suite.AddTest(new SimpleTestCase("One"));
-            suite.AddTest(new SimpleTestCase("Two"));
-            suite.AddTest(new SimpleTestCase("Three"));
-            Assert.That( suite.TestCaseCount, Is.EqualTo( 3 ) );
-            return suite;
-        }
-        #endregion
-    }
-}
diff --git a/src/NUnitFramework/tests/NUnitLite/TestSuiteCreationTests.cs b/src/NUnitFramework/tests/NUnitLite/TestSuiteCreationTests.cs
deleted file mode 100644
index 80e4216..0000000
--- a/src/NUnitFramework/tests/NUnitLite/TestSuiteCreationTests.cs
+++ /dev/null
@@ -1,94 +0,0 @@
-// *****************************************************
-// Copyright 2006, Charlie Poole
-//
-// Licensed under the Open Software License version 3.0
-// *****************************************************
-
-using System;
-using NUnitLite.Framework;
-using NUnitLite.Runner;
-
-namespace NUnitLite.Tests
-{
-    [TestFixture]
-    public class TestSuiteCreationTests : TestCase
-    {
-        public TestSuiteCreationTests(string name ) : base(name) { }
-
-        public void testCanCreateSuiteAutomaticallyFromClass()
-        {
-            TestSuite suite = new TestSuite(typeof(SimpleTestCase));
-            Assert.That(suite.TestCaseCount, Is.EqualTo(6));
-            foreach (ITest test in suite.Tests)
-                Assert.That(test, Is.InstanceOfType(typeof(SimpleTestCase)) | Is.InstanceOfType(typeof(InvalidTestCase)), "Not a TestCase");
-            RecordingTestListener listener = new RecordingTestListener();
-            TestResult result = suite.Run(listener);
-            Assert.That(result.ResultState, Is.EqualTo(ResultState.Failure));
-            Assert.That(result.Results.Count, Is.EqualTo(6));
-            Assert.That(listener.Events, Is.EqualTo(
-                "<SimpleTestCase:<test1::Success><test2::Success><Test3::Success><TEST4::Success><test6::Failure><test7::Failure>:Failure>"));
-        }
-
-        public void testTestCaseSuitesRecognizeMethodsWithTestAttribute()
-        {
-            TestSuite suite = new TestSuite(typeof(TestCaseClassWithTestAttributes));
-            Assert.That(suite.TestCaseCount, Is.EqualTo(3));
-            RecordingTestListener listener = new RecordingTestListener();
-            suite.Run(listener);
-            Assert.That(listener.Events, Is.EqualTo(
-                "<TestCaseClassWithTestAttributes:<FirstTest::Success><SecondTest::Success><TestThree::Success>:Success>"));
-        }
-
-        public void testInvalidConstructorGivesErrorMessage()
-        {
-            TestSuite suite = new TestSuite(typeof(ClassWithNoValidConstructor));
-            Assert.That(suite.TestCaseCount, Is.EqualTo(1), null);
-            TestResult result = suite.Run();
-            Assert.That(result.ResultState, Is.EqualTo(ResultState.Failure ), null);
-            Assert.That(((TestResult)result.Results[0]).Message, Contains.Substring("no default constructor"));
-        }
-
-        public void testNonTestCaseSuitesRecognizeMethodsWithTestAttribute()
-        {
-            TestSuite suite = new TestSuite(typeof(NonTestCaseClassWithTestAttributes));
-            Assert.That(suite.TestCaseCount, Is.EqualTo(3));
-            RecordingTestListener listener = new RecordingTestListener();
-            suite.Run(listener);
-            Assert.That(listener.Events, Is.EqualTo(
-                "<NonTestCaseClassWithTestAttributes:<FirstTest::Success><SecondTest::Success><TestThree::Success>:Success>"));
-        }
-
-        #region Nested Classes for Testing
-        public class TestCaseClassWithTestAttributes : TestCase
-        {
-            public TestCaseClassWithTestAttributes(string name) : base(name) { }
-
-            [Test]
-            public void FirstTest() { }
-
-            [Test]
-            public void SecondTest() { }
-
-            [Test]
-            public void TestThree() { }
-        }
-
-        public class NonTestCaseClassWithTestAttributes
-        {
-            [Test]
-            public void FirstTest() { }
-
-            [Test]
-            public void SecondTest() { }
-
-            [Test]
-            public void TestThree() { }
-        }
-
-        public class ClassWithNoValidConstructor
-        {
-            private ClassWithNoValidConstructor() { }
-        }
-        #endregion
-    }
-}
diff --git a/src/NUnitFramework/tests/NotEqualFixture.cs b/src/NUnitFramework/tests/NotEqualFixture.cs
index 91baa6b..e39676f 100644
--- a/src/NUnitFramework/tests/NotEqualFixture.cs
+++ b/src/NUnitFramework/tests/NotEqualFixture.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitFramework/tests/NotSameFixture.cs b/src/NUnitFramework/tests/NotSameFixture.cs
index 5a320ff..69f4f21 100644
--- a/src/NUnitFramework/tests/NotSameFixture.cs
+++ b/src/NUnitFramework/tests/NotSameFixture.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitFramework/tests/NullableTypesTests.cs b/src/NUnitFramework/tests/NullableTypesTests.cs
new file mode 100644
index 0000000..b61f4dc
--- /dev/null
+++ b/src/NUnitFramework/tests/NullableTypesTests.cs
@@ -0,0 +1,246 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+using System;
+
+namespace NUnit.Framework.Tests
+{
+#if NET_2_0 && !MONO
+    [TestFixture, Category("Generics")]
+    public class NullableTypesTests
+    {
+        [Test]
+        public void CanTestForNull()
+        {
+            int? nullInt = null;
+            int? five = 5;
+
+            Assert.IsNull(nullInt);
+            Assert.IsNotNull(five);
+            Assert.That(nullInt, Is.Null);
+            Assert.That(five, Is.Not.Null);
+        }
+
+        [Test]
+        public void CanCompareNullableInts()
+        {
+            int? five = 5;
+            int? answer = 2 + 3;
+
+            Assert.AreEqual(five, answer);
+            Assert.AreEqual(five, 5);
+            Assert.AreEqual(5, five);
+
+            Assert.That(five, Is.EqualTo(answer));
+            Assert.That(five, Is.EqualTo(5));
+            Assert.That(5, Is.EqualTo(five));
+
+            Assert.Greater(five, 3);
+            Assert.GreaterOrEqual(five, 5);
+            Assert.Less(3, five);
+            Assert.LessOrEqual(5, five);
+
+            Assert.That(five, Is.GreaterThan(3));
+            Assert.That(five, Is.GreaterThanOrEqualTo(5));
+            //Assert.That(3, Is.LessThan(five));
+            //Assert.That(5, Is.LessThanOrEqualTo(five));
+        }
+
+        [Test]
+        public void CanCompareNullableDoubles()
+        {
+            double? five = 5.0;
+            double? answer = 2.0 + 3.0;
+
+            Assert.AreEqual(five, answer);
+            Assert.AreEqual(five, 5.0);
+            Assert.AreEqual(5.0, five);
+
+            Assert.That(five, Is.EqualTo(answer));
+            Assert.That(five, Is.EqualTo(5.0));
+            Assert.That(5.0, Is.EqualTo(five));
+
+            Assert.Greater(five, 3.0);
+            Assert.GreaterOrEqual(five, 5.0);
+            Assert.Less(3.0, five);
+            Assert.LessOrEqual(5.0, five);
+
+            Assert.That(five, Is.GreaterThan(3.0));
+            Assert.That(five, Is.GreaterThanOrEqualTo(5.0));
+            //Assert.That(3.0, Is.LessThan(five));
+            //Assert.That(5.0, Is.LessThanOrEqualTo(five));
+        }
+
+        [Test]
+        public void CanTestForNaN()
+        {
+            double? anNaN = Double.NaN;
+            Assert.IsNaN(anNaN);
+            Assert.That(anNaN, Is.NaN);
+        }
+
+        [Test]
+        public void CanCompareNullableDecimals()
+        {
+            decimal? five = 5m;
+            decimal? answer = 2m + 3m;
+
+            Assert.AreEqual(five, answer);
+            Assert.AreEqual(five, 5m);
+            Assert.AreEqual(5m, five);
+
+            Assert.That(five, Is.EqualTo(answer));
+            Assert.That(five, Is.EqualTo(5m));
+            Assert.That(5m, Is.EqualTo(five));
+
+            Assert.Greater(five, 3m);
+            Assert.GreaterOrEqual(five, 5m);
+            Assert.Less(3m, five);
+            Assert.LessOrEqual(5m, five);
+
+            Assert.That(five, Is.GreaterThan(3m));
+            Assert.That(five, Is.GreaterThanOrEqualTo(5m));
+            //Assert.That(3m, Is.LessThan(five));
+            //Assert.That(5m, Is.LessThanOrEqualTo(five));
+        }
+
+        [Test]
+        public void CanCompareWithTolerance()
+        {
+            double? five = 5.0;
+
+            Assert.AreEqual(5.0000001, five, .0001); 
+            Assert.That( five, Is.EqualTo(5.0000001).Within(.0001));
+
+            float? three = 3.0f;
+
+            Assert.AreEqual(3.00001f, three, .001);
+            Assert.That( three, Is.EqualTo(3.00001f).Within(.001));
+        }
+
+        private enum Colors
+        {
+            Red,
+            Blue,
+            Green
+        }
+
+        [Test]
+        public void CanCompareNullableEnums()
+        {
+            Colors? color = Colors.Red;
+            Colors? other = Colors.Red;
+
+            Assert.AreEqual(color, other);
+            Assert.AreEqual(color, Colors.Red);
+            Assert.AreEqual(Colors.Red, color);
+        }
+
+        [Test]
+        public void CanCompareNullableMixedNumerics()
+        {
+            int? int5 = 5;
+            double? double5 = 5.0;
+            decimal? decimal5 = 5.00m;
+
+            Assert.AreEqual(int5, double5);
+            Assert.AreEqual(int5, decimal5);
+            Assert.AreEqual(double5, int5);
+            Assert.AreEqual(double5, decimal5);
+            Assert.AreEqual(decimal5, int5);
+            Assert.AreEqual(decimal5, double5);
+
+            Assert.That(int5, Is.EqualTo(double5));
+            Assert.That(int5, Is.EqualTo(decimal5));
+            Assert.That(double5, Is.EqualTo(int5));
+            Assert.That(double5, Is.EqualTo(decimal5));
+            Assert.That(decimal5, Is.EqualTo(int5));
+            Assert.That(decimal5, Is.EqualTo(double5));
+
+            Assert.AreEqual(5, double5);
+            Assert.AreEqual(5, decimal5);
+            Assert.AreEqual(5.0, int5);
+            Assert.AreEqual(5.0, decimal5);
+            Assert.AreEqual(5m, int5);
+            Assert.AreEqual(5m, double5);
+
+            Assert.That(5, Is.EqualTo(double5));
+            Assert.That(5, Is.EqualTo(decimal5));
+            Assert.That(5.0, Is.EqualTo(int5));
+            Assert.That(5.0, Is.EqualTo(decimal5));
+            Assert.That(5m, Is.EqualTo(int5));
+            Assert.That(5m, Is.EqualTo(double5));
+
+            Assert.AreEqual(double5, 5);
+            Assert.AreEqual(decimal5, 5);
+            Assert.AreEqual(int5, 5.0);
+            Assert.AreEqual(decimal5, 5.0);
+            Assert.AreEqual(int5, 5m);
+            Assert.AreEqual(double5, 5m);
+
+            Assert.That(double5, Is.EqualTo(5));
+            Assert.That(decimal5, Is.EqualTo(5));
+            Assert.That(int5, Is.EqualTo(5.0));
+            Assert.That(decimal5, Is.EqualTo(5.0));
+            Assert.That(int5, Is.EqualTo(5m));
+            Assert.That(double5, Is.EqualTo(5m));
+
+            Assert.Greater(int5, 3.0);
+            Assert.Greater(int5, 3m);
+            Assert.Greater(double5, 3);
+            Assert.Greater(double5, 3m);
+            Assert.Greater(decimal5, 3);
+            Assert.Greater(decimal5, 3.0);
+
+            Assert.That(int5, Is.GreaterThan(3.0));
+            Assert.That(int5, Is.GreaterThan(3m));
+            Assert.That(double5, Is.GreaterThan(3));
+            Assert.That(double5, Is.GreaterThan(3m));
+            Assert.That(decimal5, Is.GreaterThan(3));
+            Assert.That(decimal5, Is.GreaterThan(3.0));
+
+            Assert.Less(3.0, int5);
+            Assert.Less(3m, int5);
+            Assert.Less(3, double5);
+            Assert.Less(3m, double5);
+            Assert.Less(3, decimal5);
+            Assert.Less(3.0, decimal5);
+
+            //Assert.That(3.0, Is.LessThan(int5));
+            //Assert.That(3m, Is.LessThan(int5));
+            //Assert.That(3, Is.LessThan(double5));
+            //Assert.That(3m, Is.LessThan(double5));
+            //Assert.That(3, Is.LessThan(decimal5));
+            //Assert.That(3.0, Is.LessThan(decimal5));
+        }
+
+        private struct MyStruct
+        {
+            int i;
+            string s;
+
+            public MyStruct(int i, string s)
+            {
+                this.i = i;
+                this.s = s;
+            }
+        }
+
+        [Test]
+        public void CanCompareNullableStructs()
+        {
+            MyStruct struct1 = new MyStruct(5, "Hello");
+            MyStruct struct2 = new MyStruct(5, "Hello");
+            Nullable<MyStruct> one = new MyStruct(5, "Hello");
+            Nullable<MyStruct> two = new MyStruct(5, "Hello");
+
+            Assert.AreEqual(struct1, struct2); // Control
+            Assert.AreEqual(one, two);
+            Assert.AreEqual(one, struct1);
+            Assert.AreEqual(struct2, two);
+        }
+    }
+#endif
+}
diff --git a/src/NUnitFramework/tests/RandomizerTests.cs b/src/NUnitFramework/tests/RandomizerTests.cs
new file mode 100644
index 0000000..3a156d9
--- /dev/null
+++ b/src/NUnitFramework/tests/RandomizerTests.cs
@@ -0,0 +1,109 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Reflection;
+
+namespace NUnit.Framework.Tests
+{
+    public class RandomizerTests
+    {
+        [Test]
+        public void RandomSeedsAreUnique()
+        {
+            int[] seeds = new int[10];
+            for (int i = 0; i < 10; i++)
+                seeds[i] = Randomizer.RandomSeed;
+
+            Assert.That(seeds, Is.Unique);
+        }
+
+        [Test]
+        public void RandomIntsAreUnique()
+        {
+            Randomizer r = new Randomizer();
+
+            int[] values = new int[10];
+            for (int i = 0; i < 10; i++)
+                values[i] = r.Next();
+
+            Assert.That(values, Is.Unique);
+        }
+
+        [Test]
+        public void RandomDoublesAreUnique()
+        {
+            Randomizer r = new Randomizer();
+
+            double[] values = new double[10];
+            for (int i = 0; i < 10; i++)
+                values[i] = r.NextDouble();
+
+            Assert.That(values, Is.Unique);
+        }
+
+        [Test]
+        public void RandomizersWithSameSeedsReturnSameValues()
+        {
+            Randomizer r1 = new Randomizer(1234);
+            Randomizer r2 = new Randomizer(1234);
+
+            for (int i = 0; i < 10; i++)
+                Assert.That(r1.NextDouble(), Is.EqualTo(r2.NextDouble()));
+        }
+
+        [Test]
+        public void RandomizersWithDifferentSeedsReturnDifferentValues()
+        {
+            Randomizer r1 = new Randomizer(1234);
+            Randomizer r2 = new Randomizer(4321);
+
+            for (int i = 0; i < 10; i++)
+                Assert.That(r1.NextDouble(), Is.Not.EqualTo(r2.NextDouble()));
+        }
+
+        [Test]
+        public void ReturnsSameRandomizerForSameParameter()
+        {
+            ParameterInfo p = testMethod.GetParameters()[0];
+            Randomizer r1 = Randomizer.GetRandomizer(p);
+            Randomizer r2 = Randomizer.GetRandomizer(p);
+            Assert.That(r1, Is.SameAs(r2));
+        }
+
+        [Test]
+        public void ReturnsSameRandomizerForDifferentParametersOfSameMethod()
+        {
+            ParameterInfo p1 = testMethod.GetParameters()[0];
+            ParameterInfo p2 = testMethod.GetParameters()[1];
+            Randomizer r1 = Randomizer.GetRandomizer(p1);
+            Randomizer r2 = Randomizer.GetRandomizer(p2);
+            Assert.That(r1, Is.SameAs(r2));
+        }
+
+        [Test]
+        public void ReturnsSameRandomizerForSameMethod()
+        {
+            Randomizer r1 = Randomizer.GetRandomizer(testMethod);
+            Randomizer r2 = Randomizer.GetRandomizer(testMethod);
+            Assert.That(r1, Is.SameAs(r2));
+        }
+
+        [Test]
+        public void ReturnsDifferentRandomizersForDifferentMethods()
+        {
+            Randomizer r1 = Randomizer.GetRandomizer(testMethod);
+            Randomizer r2 = Randomizer.GetRandomizer(MethodInfo.GetCurrentMethod());
+            Assert.That(r1, Is.Not.SameAs(r2));
+        }
+
+        static readonly MethodInfo testMethod =
+            typeof(RandomizerTests).GetMethod("TestMethod", BindingFlags.NonPublic | BindingFlags.Instance);
+        private void TestMethod(int x, int y)
+        {
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/RangeTests.cs b/src/NUnitFramework/tests/RangeTests.cs
new file mode 100644
index 0000000..a0a32a6
--- /dev/null
+++ b/src/NUnitFramework/tests/RangeTests.cs
@@ -0,0 +1,66 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+using System;
+
+namespace NUnit.Framework.Tests
+{
+	[TestFixture]
+	public class RangeTests
+	{
+        static readonly string NL = Environment.NewLine;
+
+		[Test]
+		public void InRangeSucceeds()
+		{
+			Assert.That( 7, Is.InRange(5, 10) );
+			Assert.That(0.23, Is.InRange(-1.0, 1.0));
+			Assert.That(DateTime.Parse("12-December-2008"),
+				Is.InRange(DateTime.Parse("1-October-2008"), DateTime.Parse("31-December-2008")));
+		}
+
+
+		[Test]
+		public void InRangeFails()
+		{
+			string expectedMessage =
+                "  Expected: in range (5,10)" + NL +
+                "  But was:  12" + NL;
+
+			Assert.That(
+				new TestDelegate( FailingInRangeMethod ),
+				Throws.TypeOf(typeof(AssertionException)).With.Message.EqualTo(expectedMessage));
+		}
+
+		private void FailingInRangeMethod()
+		{
+			Assert.That(12, Is.InRange(5, 10));
+		}
+
+		[Test]
+		public void NotInRangeSucceeds()
+		{
+			Assert.That(12, Is.Not.InRange(5, 10));
+			Assert.That(2.57, Is.Not.InRange(-1.0, 1.0));
+		}
+
+		[Test]
+		public void NotInRangeFails()
+		{
+			string expectedMessage =
+                "  Expected: not in range (5,10)" + NL +
+                "  But was:  7" + NL;
+
+			Assert.That(
+				new TestDelegate(FailingNotInRangeMethod),
+				Throws.TypeOf(typeof(AssertionException)).With.Message.EqualTo(expectedMessage));
+		}
+
+		private void FailingNotInRangeMethod()
+		{
+			Assert.That(7, Is.Not.InRange(5, 10));
+		}
+	}
+}
diff --git a/src/NUnitFramework/tests/SameFixture.cs b/src/NUnitFramework/tests/SameFixture.cs
index df09400..a16d16b 100644
--- a/src/NUnitFramework/tests/SameFixture.cs
+++ b/src/NUnitFramework/tests/SameFixture.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitFramework/tests/StringAssertTests.cs b/src/NUnitFramework/tests/StringAssertTests.cs
index eba5e8d..fc5e709 100644
--- a/src/NUnitFramework/tests/StringAssertTests.cs
+++ b/src/NUnitFramework/tests/StringAssertTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 
 namespace NUnit.Framework.Tests
@@ -26,7 +26,19 @@ namespace NUnit.Framework.Tests
             StringAssert.Contains("abc", "abxcdxbc");
 		}
 
-		[Test]
+        [Test]
+        public void DoesNotContain()
+        {
+            StringAssert.DoesNotContain("x", "abc");
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void DoesNotContainFails()
+        {
+            StringAssert.DoesNotContain("abc", "**abc**");
+        }
+
+        [Test]
 		public void StartsWith()
 		{
 			StringAssert.StartsWith( "abc", "abcdef" );
@@ -41,8 +53,20 @@ namespace NUnit.Framework.Tests
                 TextMessageWriter.Pfx_Actual + "\"abcxyz\"" + System.Environment.NewLine;
             StringAssert.StartsWith("xyz", "abcxyz");
 		}
-	
-		[Test]
+
+        [Test]
+        public void DoesNotStartWith()
+        {
+            StringAssert.DoesNotStartWith("x", "abc");
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void DoesNotStartWithFails()
+        {
+            StringAssert.DoesNotStartWith("abc", "abc**");
+        }
+
+        [Test]
 		public void EndsWith()
 		{
 			StringAssert.EndsWith( "abc", "abc" );
@@ -58,7 +82,19 @@ namespace NUnit.Framework.Tests
             StringAssert.EndsWith( "xyz", "abcdef" );
 		}
 
-		[Test]
+        [Test]
+        public void DoesNotEndWith()
+        {
+            StringAssert.DoesNotEndWith("x", "abc");
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void DoesNotEndWithFails()
+        {
+            StringAssert.DoesNotEndWith("abc", "***abc");
+        }
+
+        [Test]
 		public void CaseInsensitiveCompare()
 		{
 			StringAssert.AreEqualIgnoringCase( "name", "NAME" );
@@ -89,5 +125,15 @@ namespace NUnit.Framework.Tests
                 TextMessageWriter.Pfx_Actual + "\"12ab456\"" + System.Environment.NewLine;
             StringAssert.IsMatch("a?b*c", "12ab456");
 		}
+
+		[Test]
+		public void DifferentEncodingsOfSameStringAreNotEqual()
+		{
+			string input = "Hello World";
+			byte[] data = System.Text.Encoding.Unicode.GetBytes( input );
+			string garbage = System.Text.Encoding.UTF8.GetString( data );
+
+			Assert.AreNotEqual( input, garbage );
+		}
 	}
 }
diff --git a/src/NUnitFramework/tests/Syntax/AfterTests.cs b/src/NUnitFramework/tests/Syntax/AfterTests.cs
new file mode 100644
index 0000000..3ed571f
--- /dev/null
+++ b/src/NUnitFramework/tests/Syntax/AfterTests.cs
@@ -0,0 +1,178 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Threading;
+using System.Collections;
+
+namespace NUnit.Framework.Syntax
+{
+	public class AfterTest_SimpleConstraint : SyntaxTest
+	{
+		[SetUp]
+		public void SetUp()
+		{
+			parseTree = "<after 1000 <equal 10>>";
+			staticSyntax = Is.EqualTo(10).After(1000);
+			inheritedSyntax = Helper().EqualTo(10).After(1000);
+			builderSyntax = Builder().EqualTo(10).After(1000);
+		}
+	}
+
+	public class AfterTest_ProperyTest : SyntaxTest
+	{
+		[SetUp]
+		public void SetUp()
+		{
+			parseTree = "<after 1000 <property X <equal 10>>>";
+			staticSyntax = Has.Property("X").EqualTo(10).After(1000);
+			inheritedSyntax = Helper().Property("X").EqualTo(10).After(1000);
+			builderSyntax = Builder().Property("X").EqualTo(10).After(1000);
+		}
+	}
+
+	public class AfterTest_AndOperator : SyntaxTest
+	{
+		[SetUp]
+		public void SetUp()
+		{
+			parseTree = "<after 1000 <and <greaterthan 0> <lessthan 10>>>";
+			staticSyntax = Is.GreaterThan(0).And.LessThan(10).After(1000);
+			inheritedSyntax = Helper().GreaterThan(0).And.LessThan(10).After(1000);
+			builderSyntax = Builder().GreaterThan(0).And.LessThan(10).After(1000);
+		}
+	}
+
+#if NET_2_0
+    public abstract class AfterSyntaxTests
+    {
+        protected bool flag;
+        protected int num;
+        protected object ob1, ob2, ob3;
+        protected ArrayList list;
+        protected string greeting;
+
+        [SetUp]
+        public void InitializeValues()
+        {
+            this.flag = false;
+            this.num = 0;
+            this.ob1 = new object();
+            this.ob2 = new object();
+            this.ob3 = new object();
+            this.list = new ArrayList();
+            this.list.Add(1);
+            this.list.Add(2);
+            this.list.Add(3);
+            this.greeting = "hello";
+
+            new Thread(ModifyValuesAfterDelay).Start();
+        }
+
+        private void ModifyValuesAfterDelay()
+        {
+            Thread.Sleep(100);
+
+            this.flag = true;
+            this.num = 1;
+            this.ob1 = ob2;
+            this.ob3 = null;
+            this.list.Add(4);
+            this.greeting += "world";
+        }
+    }
+
+    public class AfterSyntaxUsingAnonymousDelegates : AfterSyntaxTests
+    {
+        [Test]
+        public void TrueTest()
+        {
+            Assert.That(delegate { return flag; }, Is.True.After(5000, 200));
+        }
+
+        [Test]
+        public void EqualToTest()
+        {
+            Assert.That(delegate { return num; }, Is.EqualTo(1).After(5000, 200));
+        }
+
+        [Test]
+        public void SameAsTest()
+        {
+            Assert.That(delegate { return ob1; }, Is.SameAs(ob2).After(5000, 200));
+        }
+
+        [Test]
+        public void GreaterTest()
+        {
+            Assert.That(delegate { return num; }, Is.GreaterThan(0).After(5000,200));
+        }
+
+        [Test]
+        public void HasMemberTest()
+        {
+            Assert.That(delegate { return list; }, Has.Member(4).After(5000, 200));
+        }
+
+        [Test]
+        public void NullTest()
+        {
+            Assert.That(delegate { return ob3; }, Is.Null.After(5000, 200));
+        }
+
+        [Test]
+        public void TextTest()
+        {
+            Assert.That(delegate { return greeting; }, Is.StringEnding("world").After(5000, 200));
+        }
+    }
+
+    public class AfterSyntaxUsingActualPassedByRef : AfterSyntaxTests
+    {
+        [Test]
+        public void TrueTest()
+        {
+            Assert.That(ref flag, Is.True.After(5000, 200));
+        }
+
+        [Test]
+        public void EqualToTest()
+        {
+            Assert.That(ref num, Is.EqualTo(1).After(5000, 200));
+        }
+
+        [Test]
+        public void SameAsTest()
+        {
+            Assert.That(ref ob1, Is.SameAs(ob2).After(5000, 200));
+        }
+
+        [Test]
+        public void GreaterTest()
+        {
+            Assert.That(ref num, Is.GreaterThan(0).After(5000, 200));
+        }
+
+        [Test]
+        public void HasMemberTest()
+        {
+            Assert.That(ref list, Has.Member(4).After(5000, 200));
+        }
+
+        [Test]
+        public void NullTest()
+        {
+            Assert.That(ref ob3, Is.Null.After(5000, 200));
+        }
+
+        [Test]
+        public void TextTest()
+        {
+            Assert.That(ref greeting, Is.StringEnding("world").After(5000, 200));
+        }
+    }
+#endif
+}
\ No newline at end of file
diff --git a/src/NUnitFramework/tests/Syntax/ArbitraryConstraintMatching.cs b/src/NUnitFramework/tests/Syntax/ArbitraryConstraintMatching.cs
new file mode 100644
index 0000000..4627a2d
--- /dev/null
+++ b/src/NUnitFramework/tests/Syntax/ArbitraryConstraintMatching.cs
@@ -0,0 +1,75 @@
+using System;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework.Syntax
+{
+    [TestFixture]
+    public class ArbitraryConstraintMatching
+    {
+        Constraint custom = new CustomConstraint();
+        Constraint another = new AnotherConstraint();
+
+        [Test]
+        public void CanMatchCustomConstraint()
+        {
+            IResolveConstraint constraint = new ConstraintExpression().Matches(custom);
+            Assert.That(constraint.Resolve().ToString(), Is.EqualTo("<custom>"));
+        }
+
+        [Test]
+        public void CanMatchCustomConstraintAfterPrefix()
+        {
+            IResolveConstraint constraint = Is.All.Matches(custom);
+            Assert.That(constraint.Resolve().ToString(), Is.EqualTo("<all <custom>>"));
+        }
+
+        [Test]
+        public void CanMatchCustomConstraintsUnderAndOperator()
+        {
+            IResolveConstraint constraint = Is.All.Matches(custom).And.Matches(another);
+            Assert.That(constraint.Resolve().ToString(), Is.EqualTo("<all <and <custom> <another>>>")); 
+        }
+
+#if NET_2_0
+        [Test]
+        public void CanMatchPredicate()
+        {
+            IResolveConstraint constraint = new ConstraintExpression().Matches(new Predicate<int>(IsEven));
+            Assert.That(constraint.Resolve().ToString(), Is.EqualTo("<predicate>"));
+            Assert.That(42, constraint);
+        }
+
+        bool IsEven(int num)
+        {
+            return (num & 1) == 0;
+        }
+
+#if CS_3_0
+        [Test]
+        public void CanMatchLambda()
+        {
+            IResolveConstraint constraint = new ConstraintExpression().Matches<int>( (x) => (x & 1) == 0);
+            Assert.That(constraint.Resolve().ToString(), Is.EqualTo("<predicate>"));
+            Assert.That(42, constraint);
+        }
+#endif
+#endif
+
+        class CustomConstraint : Constraint
+        {
+            public override bool Matches(object actual)
+            {
+                throw new NotImplementedException();
+            }
+
+            public override void WriteDescriptionTo(MessageWriter writer)
+            {
+                throw new NotImplementedException();
+            }
+        }
+
+        class AnotherConstraint : CustomConstraint
+        {
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/Syntax/CollectionTests.cs b/src/NUnitFramework/tests/Syntax/CollectionTests.cs
new file mode 100644
index 0000000..e592af3
--- /dev/null
+++ b/src/NUnitFramework/tests/Syntax/CollectionTests.cs
@@ -0,0 +1,259 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+#if NET_2_0
+using System.Collections.Generic;
+#endif
+using NUnit.Framework.Tests;
+
+namespace NUnit.Framework.Syntax
+{
+    public class UniqueTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<uniqueitems>";
+            staticSyntax = Is.Unique;
+            inheritedSyntax = Helper().Unique;
+            builderSyntax = Builder().Unique;
+        }
+    }
+
+    public class CollectionOrderedTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<ordered>";
+            staticSyntax = Is.Ordered;
+            inheritedSyntax = Helper().Ordered;
+            builderSyntax = Builder().Ordered;
+        }
+    }
+
+    public class CollectionOrderedTest_Descending : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<ordered descending>";
+            staticSyntax = Is.Ordered.Descending;
+            inheritedSyntax = Helper().Ordered.Descending;
+            builderSyntax = Builder().Ordered.Descending;
+        }
+    }
+
+    public class CollectionOrderedTest_Comparer : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            IComparer comparer = Comparer.Default;
+            parseTree = "<ordered System.Collections.Comparer>";
+            staticSyntax = Is.Ordered.Using(comparer);
+            inheritedSyntax = Helper().Ordered.Using(comparer);
+            builderSyntax = Builder().Ordered.Using(comparer);
+        }
+    }
+
+    public class CollectionOrderedTest_Comparer_Descending : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            IComparer comparer = Comparer.Default;
+            parseTree = "<ordered descending System.Collections.Comparer>";
+            staticSyntax = Is.Ordered.Using(comparer).Descending;
+            inheritedSyntax = Helper().Ordered.Using(comparer).Descending;
+            builderSyntax = Builder().Ordered.Using(comparer).Descending;
+        }
+    }
+
+    public class CollectionOrderedByTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<orderedby SomePropertyName>";
+            staticSyntax = Is.Ordered.By("SomePropertyName");
+            inheritedSyntax = Helper().Ordered.By("SomePropertyName");
+            builderSyntax = Builder().Ordered.By("SomePropertyName");
+        }
+    }
+
+    public class CollectionOrderedByTest_Descending : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<orderedby SomePropertyName descending>";
+            staticSyntax = Is.Ordered.By("SomePropertyName").Descending;
+            inheritedSyntax = Helper().Ordered.By("SomePropertyName").Descending;
+            builderSyntax = Builder().Ordered.By("SomePropertyName").Descending;
+        }
+    }
+
+    public class CollectionOrderedByTest_Comparer : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<orderedby SomePropertyName System.Collections.Comparer>";
+            staticSyntax = Is.Ordered.By("SomePropertyName").Using(Comparer.Default);
+            inheritedSyntax = Helper().Ordered.By("SomePropertyName").Using(Comparer.Default);
+            builderSyntax = Builder().Ordered.By("SomePropertyName").Using(Comparer.Default);
+        }
+    }
+
+    public class CollectionOrderedByTest_Comparer_Descending : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<orderedby SomePropertyName descending System.Collections.Comparer>";
+            staticSyntax = Is.Ordered.By("SomePropertyName").Using(Comparer.Default).Descending;
+            inheritedSyntax = Helper().Ordered.By("SomePropertyName").Using(Comparer.Default).Descending;
+            builderSyntax = Builder().Ordered.By("SomePropertyName").Using(Comparer.Default).Descending;
+        }
+    }
+
+    public class CollectionContainsTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<contains 42>";
+            staticSyntax = Contains.Item(42);
+            inheritedSyntax = Helper().Contains(42);
+            builderSyntax = Builder().Contains(42);
+        }
+    }
+
+    public class CollectionContainsTest_String : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<contains \"abc\">";
+            staticSyntax = Contains.Item("abc");
+            inheritedSyntax = Helper().Contains("abc");
+            builderSyntax = Builder().Contains("abc");
+        }
+    }
+
+    public class CollectionContainsTest_Comparer : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<contains 42>";
+            staticSyntax = Contains.Item(42).Using(Comparer.Default);
+            inheritedSyntax = Helper().Contains(42).Using(Comparer.Default);
+            builderSyntax = Builder().Contains(42).Using(Comparer.Default);
+        }
+
+		[Test]
+		public void ComparerIsCalled()
+		{
+			TestComparer comparer = new TestComparer();
+            Assert.That(new int[] { 1, 2, 3 }, 
+                Contains.Item(2).Using(comparer));
+			Assert.That(comparer.Called, "Comparer was not called");
+		}
+
+		[Test]
+		public void ComparerIsCalledInExpression()
+		{
+			TestComparer comparer = new TestComparer();
+            Assert.That(new int[] { 1, 2, 3 }, 
+                Has.Length.EqualTo(3).And.Contains(2).Using(comparer));
+			Assert.That(comparer.Called, "Comparer was not called");
+		}
+	}
+
+    public class CollectionContainsTest_Comparer_String : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<contains \"abc\">";
+            staticSyntax = Contains.Item("abc").Using(Comparer.Default);
+            inheritedSyntax = Helper().Contains("abc").Using(Comparer.Default);
+            builderSyntax = Builder().Contains("abc").Using(Comparer.Default);
+        }
+		
+		[Test]
+		public void ComparerIsCalled()
+		{
+			TestComparer comparer = new TestComparer();
+            Assert.That(new string[] { "Hello", "World" }, 
+                Contains.Item("World").Using(comparer));
+			Assert.That(comparer.Called, "Comparer was not called");
+		}
+
+		[Test]
+		public void ComparerIsCalledInExpression()
+		{
+			TestComparer comparer = new TestComparer();
+            Assert.That(new string[] { "Hello", "World" }, 
+                Has.Length.EqualTo(2).And.Contains("World").Using(comparer));
+			Assert.That(comparer.Called, "Comparer was not called");
+		}
+    }
+
+    public class CollectionMemberTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<contains 42>";
+            staticSyntax = Has.Member(42);
+            inheritedSyntax = Helper().Contains(42);
+            builderSyntax = Builder().Contains(42);
+        }
+    }
+
+    public class CollectionMemberTest_Comparer : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<contains 42>";
+            staticSyntax = Has.Member(42).Using(Comparer.Default);
+            inheritedSyntax = Helper().Contains(42).Using(Comparer.Default);
+            builderSyntax = Builder().Contains(42).Using(Comparer.Default);
+        }
+    }
+
+    public class CollectionSubsetTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            int[] ints = new int[] { 1, 2, 3 };
+            parseTree = "<subsetof System.Int32[]>";
+            staticSyntax = Is.SubsetOf(ints);
+            inheritedSyntax = Helper().SubsetOf(ints);
+            builderSyntax = Builder().SubsetOf(ints);
+        }
+    }
+
+    public class CollectionEquivalentTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            int[] ints = new int[] { 1, 2, 3 };
+            parseTree = "<equivalent System.Int32[]>";
+            staticSyntax = Is.EquivalentTo(ints);
+            inheritedSyntax = Helper().EquivalentTo(ints);
+            builderSyntax = Builder().EquivalentTo(ints);
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/Syntax/ComparisonTests.cs b/src/NUnitFramework/tests/Syntax/ComparisonTests.cs
new file mode 100644
index 0000000..358c9b9
--- /dev/null
+++ b/src/NUnitFramework/tests/Syntax/ComparisonTests.cs
@@ -0,0 +1,82 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Syntax
+{
+    public class GreaterThanTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<greaterthan 7>";
+            staticSyntax = Is.GreaterThan(7);
+            inheritedSyntax = Helper().GreaterThan(7);
+            builderSyntax = Builder().GreaterThan(7);
+        }
+    }
+
+    public class GreaterThanOrEqualTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<greaterthanorequal 7>";
+            staticSyntax = Is.GreaterThanOrEqualTo(7);
+            inheritedSyntax = Helper().GreaterThanOrEqualTo(7);
+            builderSyntax = Builder().GreaterThanOrEqualTo(7);
+        }
+    }
+
+    public class AtLeastTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<greaterthanorequal 7>";
+            staticSyntax = Is.AtLeast(7);
+            inheritedSyntax = Helper().AtLeast(7);
+            builderSyntax = Builder().AtLeast(7);
+        }
+    }
+
+    public class LessThanTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<lessthan 7>";
+            staticSyntax = Is.LessThan(7);
+            inheritedSyntax = Helper().LessThan(7);
+            builderSyntax = Builder().LessThan(7);
+        }
+    }
+
+    public class LessThanOrEqualTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<lessthanorequal 7>";
+            staticSyntax = Is.LessThanOrEqualTo(7);
+            inheritedSyntax = Helper().LessThanOrEqualTo(7);
+            builderSyntax = Builder().LessThanOrEqualTo(7);
+        }
+    }
+
+    public class AtMostTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<lessthanorequal 7>";
+            staticSyntax = Is.AtMost(7);
+            inheritedSyntax = Helper().AtMost(7);
+            builderSyntax = Builder().AtMost(7);
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/Syntax/EqualityTests.cs b/src/NUnitFramework/tests/Syntax/EqualityTests.cs
new file mode 100644
index 0000000..8187ca8
--- /dev/null
+++ b/src/NUnitFramework/tests/Syntax/EqualityTests.cs
@@ -0,0 +1,141 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+#if NET_2_0
+using System.Collections.Generic;
+#endif
+
+namespace NUnit.Framework.Syntax
+{
+    public class EqualToTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<equal 999>";
+            staticSyntax = Is.EqualTo(999);
+            inheritedSyntax = Helper().EqualTo(999);
+            builderSyntax = Builder().EqualTo(999);
+        }
+    }
+
+    public class EqualToTest_IgnoreCase : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = @"<equal ""X"">";
+            staticSyntax = Is.EqualTo("X").IgnoreCase;
+            inheritedSyntax = Helper().EqualTo("X").IgnoreCase;
+            builderSyntax = Builder().EqualTo("X").IgnoreCase;
+        }
+    }
+
+    public class EqualToTest_WithinTolerance : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<equal 0.7>";
+            staticSyntax = Is.EqualTo(0.7).Within(.005);
+            inheritedSyntax = Helper().EqualTo(0.7).Within(.005);
+            builderSyntax = Builder().EqualTo(0.7).Within(.005);
+        }
+    }
+
+    
+    public class EqualityTests
+    {
+        [Test]
+        public void SimpleEqualityTests()
+        {
+            int[] i3 = new int[] { 1, 2, 3 };
+            double[] d3 = new double[] { 1.0, 2.0, 3.0 };
+            int[] iunequal = new int[] { 1, 3, 2 };
+
+            Assert.That(2 + 2, Is.EqualTo(4));
+            Assert.That(2 + 2 == 4);
+            Assert.That(i3, Is.EqualTo(d3));
+            Assert.That(2 + 2, Is.Not.EqualTo(5));
+            Assert.That(i3, Is.Not.EqualTo(iunequal));
+#if NET_2_0
+            List<string> list = new List<string>();
+            list.Add("foo");
+            list.Add("bar");
+            Assert.That(list, Is.EqualTo(new string[] { "foo", "bar" }));
+#endif
+        }
+
+        [Test]
+        public void EqualityTestsWithTolerance()
+        {
+            Assert.That(4.99d, Is.EqualTo(5.0d).Within(0.05d));
+            Assert.That(4.0d, Is.Not.EqualTo(5.0d).Within(0.5d));
+            Assert.That(4.99f, Is.EqualTo(5.0f).Within(0.05f));
+            Assert.That(4.99m, Is.EqualTo(5.0m).Within(0.05m));
+            Assert.That(3999999999u, Is.EqualTo(4000000000u).Within(5u));
+            Assert.That(499, Is.EqualTo(500).Within(5));
+            Assert.That(4999999999L, Is.EqualTo(5000000000L).Within(5L));
+            Assert.That(5999999999ul, Is.EqualTo(6000000000ul).Within(5ul));
+        }
+
+        [Test]
+        public void EqualityTestsWithTolerance_MixedFloatAndDouble()
+        {
+            // Bug Fix 1743844
+            Assert.That(2.20492d, Is.EqualTo(2.2d).Within(0.01f),
+                "Double actual, Double expected, Single tolerance");
+            Assert.That(2.20492d, Is.EqualTo(2.2f).Within(0.01d),
+                "Double actual, Single expected, Double tolerance");
+            Assert.That(2.20492d, Is.EqualTo(2.2f).Within(0.01f),
+                "Double actual, Single expected, Single tolerance");
+            Assert.That(2.20492f, Is.EqualTo(2.2f).Within(0.01d),
+                "Single actual, Single expected, Double tolerance");
+            Assert.That(2.20492f, Is.EqualTo(2.2d).Within(0.01d),
+                "Single actual, Double expected, Double tolerance");
+            Assert.That(2.20492f, Is.EqualTo(2.2d).Within(0.01f),
+                "Single actual, Double expected, Single tolerance");
+        }
+
+        [Test]
+        public void EqualityTestsWithTolerance_MixingTypesGenerally()
+        {
+            // Extending tolerance to all numeric types
+            Assert.That(202d, Is.EqualTo(200d).Within(2),
+                "Double actual, Double expected, int tolerance");
+            Assert.That(4.87m, Is.EqualTo(5).Within(.25),
+                "Decimal actual, int expected, Double tolerance");
+            Assert.That(4.87m, Is.EqualTo(5ul).Within(1),
+                "Decimal actual, ulong expected, int tolerance");
+            Assert.That(487, Is.EqualTo(500).Within(25),
+                "int actual, int expected, int tolerance");
+            Assert.That(487u, Is.EqualTo(500).Within(25),
+                "uint actual, int expected, int tolerance");
+            Assert.That(487L, Is.EqualTo(500).Within(25),
+                "long actual, int expected, int tolerance");
+            Assert.That(487ul, Is.EqualTo(500).Within(25),
+                "ulong actual, int expected, int tolerance");
+        }
+
+        [Test]
+        public void EqualityTestsUsingDefaultFloatingPointTolerance()
+        {
+            GlobalSettings.DefaultFloatingPointTolerance = 0.05d;
+
+            try
+            {
+                Assert.That(4.99d, Is.EqualTo(5.0d));
+                Assert.That(4.0d, Is.Not.EqualTo(5.0d));
+                Assert.That(4.99f, Is.EqualTo(5.0f));
+            }
+            finally
+            {
+                GlobalSettings.DefaultFloatingPointTolerance = 0.0d;
+            }
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/Syntax/InvalidCodeTests.cs b/src/NUnitFramework/tests/Syntax/InvalidCodeTests.cs
new file mode 100644
index 0000000..2b80067
--- /dev/null
+++ b/src/NUnitFramework/tests/Syntax/InvalidCodeTests.cs
@@ -0,0 +1,78 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.CodeDom.Compiler;
+using NUnit.Framework.Constraints;
+#if NET_2_0
+using System.Collections.Generic;
+#endif
+
+namespace NUnit.Framework.Syntax
+{
+    [TestFixture]
+    public class InvalidCodeTests : AssertionHelper
+    {
+        static readonly string template1 =
+@"using System;
+using NUnit.Framework;
+using NUnit.Framework.Constraints;
+
+class SomeClass
+{
+    void SomeMethod()
+    {
+        object c = $FRAGMENT$;
+    }
+}";
+
+        [TestCase("Is.Null.Not")]
+        [TestCase("Is.Not.Null.GreaterThan(10))")]
+        [TestCase("Is.Null.All")]
+        [TestCase("Is.And")]
+        [TestCase("Is.All.And.And")]
+        [TestCase("Is.Null.And.Throws")]
+        public void CodeShouldNotCompile(string fragment)
+        {
+            string code = template1.Replace("$FRAGMENT$", fragment);
+            TestCompiler compiler = new TestCompiler(
+                new string[] { "system.dll", "nunit.framework.dll" },
+                "test.dll");
+            CompilerResults results = compiler.CompileCode(code);
+            if (results.NativeCompilerReturnValue == 0)
+                Assert.Fail("Code fragment \"" + fragment + "\" should not compile but it did");
+        }
+
+        static readonly string template2 =
+@"using System;
+using NUnit.Framework;
+using NUnit.Framework.Constraints;
+
+class SomeClass
+{
+    void SomeMethod()
+    {
+        Assert.That(42, $FRAGMENT$);
+    }
+}";
+
+        [TestCase("Is.Not")]
+        [TestCase("Is.All")]
+        [TestCase("Is.Not.All")]
+        [TestCase("Is.All.Not")]
+        public void CodeShouldNotCompileAsFinishedConstraint(string fragment)
+        {
+            string code = template2.Replace("$FRAGMENT$", fragment);
+            TestCompiler compiler = new TestCompiler(
+                new string[] { "system.dll", "nunit.framework.dll" },
+                "test.dll");
+            CompilerResults results = compiler.CompileCode(code);
+            if (results.NativeCompilerReturnValue == 0)
+                Assert.Fail("Code fragment \"" + fragment + "\" should not compile as a finished constraint but it did");
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/NUnitFramework/tests/Syntax/OperatorOverrides.cs b/src/NUnitFramework/tests/Syntax/OperatorOverrides.cs
new file mode 100644
index 0000000..fb0e904
--- /dev/null
+++ b/src/NUnitFramework/tests/Syntax/OperatorOverrides.cs
@@ -0,0 +1,67 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework.Syntax
+{
+    public class NotOperatorOverride : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<not <null>>";
+            staticSyntax = !Is.Null;
+            inheritedSyntax = !Helper().Null;
+            builderSyntax = !Builder().Null;
+        }
+    }
+
+    public class AndOperatorOverride : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<and <greaterthan 5> <lessthan 10>>";
+            staticSyntax = Is.GreaterThan(5) & Is.LessThan(10);
+            inheritedSyntax = Helper().GreaterThan(5) & Is.LessThan(10);
+            builderSyntax = Builder().GreaterThan(5) & Builder().LessThan(10);
+        }
+    }
+
+    public class OrOperatorOverride : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<or <lessthan 5> <greaterthan 10>>";
+            staticSyntax = Is.LessThan(5) | Is.GreaterThan(10);
+            inheritedSyntax = Helper().LessThan(5) | Is.GreaterThan(10);
+            builderSyntax = Builder().LessThan(5) | Is.GreaterThan(10);
+        }
+    }
+
+    public class MixedOperatorOverrides
+    {
+        [Test]
+        public void ComplexTests()
+        {
+            string expected = "<and <and <not <null>> <not <lessthan 5>>> <not <greaterthan 10>>>";
+
+            Constraint c =
+                Is.Not.Null & Is.Not.LessThan(5) & Is.Not.GreaterThan(10);
+            Assert.That(c.ToString(), Is.EqualTo(expected).NoClip);
+
+            c = !Is.Null & !Is.LessThan(5) & !Is.GreaterThan(10);
+            Assert.That(c.ToString(), Is.EqualTo(expected).NoClip);
+
+            Constraint x = null;
+            c = !x & !Is.LessThan(5) & !Is.GreaterThan(10);
+            Assert.That(c.ToString(), Is.EqualTo(expected).NoClip);
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/Syntax/OperatorTests.cs b/src/NUnitFramework/tests/Syntax/OperatorTests.cs
new file mode 100644
index 0000000..9dbedf8
--- /dev/null
+++ b/src/NUnitFramework/tests/Syntax/OperatorTests.cs
@@ -0,0 +1,254 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Syntax
+{
+    #region Not
+    public class NotTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<not <null>>";
+            staticSyntax = Is.Not.Null;
+            inheritedSyntax = Helper().Not.Null;
+            builderSyntax = Builder().Not.Null;
+        }
+    }
+
+    public class NotTest_Cascaded : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<not <not <not <null>>>>";
+            staticSyntax = Is.Not.Not.Not.Null;
+            inheritedSyntax = Helper().Not.Not.Not.Null;
+            builderSyntax = Builder().Not.Not.Not.Null;
+        }
+    }
+    #endregion
+
+    #region All
+    public class AllTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<all <greaterthan 0>>";
+            staticSyntax = Is.All.GreaterThan(0);
+            inheritedSyntax = Helper().All.GreaterThan(0);
+            builderSyntax = Builder().All.GreaterThan(0);
+        }
+    }
+    #endregion
+
+    #region Some
+    public class SomeTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<some <equal 3>>";
+            staticSyntax = Has.Some.EqualTo(3);
+            inheritedSyntax = Helper().Some.EqualTo(3);
+            builderSyntax = Builder().Some.EqualTo(3);
+        }
+    }
+
+    public class SomeTest_BeforeBinaryOperators : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<some <or <and <greaterthan 0> <lessthan 100>> <equal 999>>>";
+            staticSyntax = Has.Some.GreaterThan(0).And.LessThan(100).Or.EqualTo(999);
+            inheritedSyntax = Helper().Some.GreaterThan(0).And.LessThan(100).Or.EqualTo(999);
+            builderSyntax = Builder().Some.GreaterThan(0).And.LessThan(100).Or.EqualTo(999);
+        }
+    }
+
+    public class SomeTest_NestedSome : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<some <some <lessthan 100>>>";
+            staticSyntax = Has.Some.With.Some.LessThan(100);
+            inheritedSyntax = Helper().Some.With.Some.LessThan(100);
+            builderSyntax = Builder().Some.With.Some.LessThan(100);
+        }
+        
+    }
+
+    public class SomeTest_UseOfAndSome : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<and <some <greaterthan 0>> <some <lessthan 100>>>";
+            staticSyntax = Has.Some.GreaterThan(0).And.Some.LessThan(100);
+            inheritedSyntax = Helper().Some.GreaterThan(0).And.Some.LessThan(100);
+            builderSyntax = Builder().Some.GreaterThan(0).And.Some.LessThan(100);
+        }
+    }
+    #endregion
+
+    #region None
+    public class NoneTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<none <lessthan 0>>";
+            staticSyntax = Has.None.LessThan(0);
+            inheritedSyntax = Helper().None.LessThan(0);
+            builderSyntax = Builder().None.LessThan(0);
+        }
+    }
+    #endregion
+
+    #region And
+    public class AndTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<and <greaterthan 5> <lessthan 10>>";
+            staticSyntax = Is.GreaterThan(5).And.LessThan(10);
+            inheritedSyntax = Helper().GreaterThan(5).And.LessThan(10);
+            builderSyntax = Builder().GreaterThan(5).And.LessThan(10);
+        }
+    }
+
+    public class AndTest_ThreeAndsWithNot : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<and <not <null>> <and <not <lessthan 5>> <not <greaterthan 10>>>>";
+            staticSyntax = Is.Not.Null.And.Not.LessThan(5).And.Not.GreaterThan(10);
+            inheritedSyntax = Helper().Not.Null.And.Not.LessThan(5).And.Not.GreaterThan(10);
+            builderSyntax = Builder().Not.Null.And.Not.LessThan(5).And.Not.GreaterThan(10);
+        }
+    }
+    #endregion
+
+    #region Or
+    public class OrTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<or <lessthan 5> <greaterthan 10>>";
+            staticSyntax = Is.LessThan(5).Or.GreaterThan(10);
+            inheritedSyntax = Helper().LessThan(5).Or.GreaterThan(10);
+            builderSyntax = Builder().LessThan(5).Or.GreaterThan(10);
+        }
+    }
+
+    public class OrTest_ThreeOrs : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<or <lessthan 5> <or <greaterthan 10> <equal 7>>>";
+            staticSyntax = Is.LessThan(5).Or.GreaterThan(10).Or.EqualTo(7);
+            inheritedSyntax = Helper().LessThan(5).Or.GreaterThan(10).Or.EqualTo(7);
+            builderSyntax = Builder().LessThan(5).Or.GreaterThan(10).Or.EqualTo(7);
+        }
+    }
+    #endregion
+
+    #region Binary Operator Precedence
+    public class AndIsEvaluatedBeforeFollowingOr : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<or <and <lessthan 100> <greaterthan 0>> <equal 999>>";
+            staticSyntax = Is.LessThan(100).And.GreaterThan(0).Or.EqualTo(999);
+            inheritedSyntax = Helper().LessThan(100).And.GreaterThan(0).Or.EqualTo(999);
+            builderSyntax = Builder().LessThan(100).And.GreaterThan(0).Or.EqualTo(999);
+        }
+    }
+
+    public class AndIsEvaluatedBeforePrecedingOr : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<or <equal 999> <and <greaterthan 0> <lessthan 100>>>";
+            staticSyntax = Is.EqualTo(999).Or.GreaterThan(0).And.LessThan(100);
+            inheritedSyntax = Helper().EqualTo(999).Or.GreaterThan(0).And.LessThan(100);
+            builderSyntax = Builder().EqualTo(999).Or.GreaterThan(0).And.LessThan(100);
+        }
+    }
+    #endregion
+
+    public class OperatorPrecedenceTests
+    {
+        class A
+        {
+            B B
+            {
+                get { return new B(); }
+            }
+
+            string X
+            {
+                get { return "X in A"; }
+            }
+
+            string Y
+            {
+                get { return "Y in A"; }
+            }
+        }
+
+        class B
+        {
+            string X
+            {
+                get { return "X in B"; }
+            }
+
+            string Y
+            {
+                get { return "Y in B"; }
+            }
+        }
+
+        [Test]
+        public void WithTests()
+        {
+            A a = new A();
+            Assert.That(a, Has.Property("X").EqualTo("X in A")
+                          .And.Property("Y").EqualTo("Y in A"));
+            Assert.That(a, Has.Property("X").EqualTo("X in A")
+                          .And.Property("B").Property("X").EqualTo("X in B"));
+            Assert.That(a, Has.Property("X").EqualTo("X in A")
+                          .And.Property("B").With.Property("X").EqualTo("X in B"));
+            Assert.That(a, Has.Property("B").Property("X").EqualTo("X in B")
+                          .And.Property("B").Property("Y").EqualTo("Y in B"));
+            Assert.That(a, Has.Property("B").Property("X").EqualTo("X in B")
+                          .And.Property("B").With.Property("Y").EqualTo("Y in B"));
+            Assert.That(a, Has.Property("B").With.Property("X").EqualTo("X in B")
+                                            .And.Property("Y").EqualTo("Y in B"));
+        }
+
+        [Test]
+        public void SomeTests()
+        {
+            string[] array = new string[] { "a", "aa", "x", "xy", "xyz" };
+            //Assert.That(array, Has.Some.StartsWith("a").And.Some.Length.EqualTo(3));
+            Assert.That(array, Has.None.StartsWith("a").And.Length.EqualTo(3));
+            Assert.That(array, Has.Some.StartsWith("x").And.Length.EqualTo(3));
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/Syntax/PathConstraintTests.cs b/src/NUnitFramework/tests/Syntax/PathConstraintTests.cs
new file mode 100644
index 0000000..166bb13
--- /dev/null
+++ b/src/NUnitFramework/tests/Syntax/PathConstraintTests.cs
@@ -0,0 +1,155 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.IO;
+
+namespace NUnit.Framework.Syntax
+{
+    public class SamePathTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            string path = "/path/to/match";
+            string defaultCaseSensitivity = Path.DirectorySeparatorChar == '\\'
+                ? "ignorecase" : "respectcase";
+
+            parseTree = string.Format(@"<samepath ""{0}"" {1}>", path, defaultCaseSensitivity);
+            staticSyntax = Is.SamePath(path);
+            inheritedSyntax = Helper().SamePath(path);
+            builderSyntax = Builder().SamePath(path);
+        }
+    }
+
+    public class SamePathTest_IgnoreCase : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            string path = "/path/to/match";
+
+            parseTree = string.Format(@"<samepath ""{0}"" ignorecase>", path);
+            staticSyntax = Is.SamePath(path).IgnoreCase;
+            inheritedSyntax = Helper().SamePath(path).IgnoreCase;
+            builderSyntax = Builder().SamePath(path).IgnoreCase;
+        }
+    }
+
+    public class NotSamePathTest_IgnoreCase : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            string path = "/path/to/match";
+
+            parseTree = string.Format(@"<not <samepath ""{0}"" ignorecase>>", path);
+            staticSyntax = Is.Not.SamePath(path).IgnoreCase;
+            inheritedSyntax = Helper().Not.SamePath(path).IgnoreCase;
+            builderSyntax = Builder().Not.SamePath(path).IgnoreCase;
+        }
+    }
+
+    public class SamePathTest_RespectCase : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            string path = "/path/to/match";
+
+            parseTree = string.Format(@"<samepath ""{0}"" respectcase>", path);
+            staticSyntax = Is.SamePath(path).RespectCase;
+            inheritedSyntax = Helper().SamePath(path).RespectCase;
+            builderSyntax = Builder().SamePath(path).RespectCase;
+        }
+    }
+
+    public class NotSamePathTest_RespectCase : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            string path = "/path/to/match";
+
+            parseTree = string.Format(@"<not <samepath ""{0}"" respectcase>>", path);
+            staticSyntax = Is.Not.SamePath(path).RespectCase;
+            inheritedSyntax = Helper().Not.SamePath(path).RespectCase;
+            builderSyntax = Builder().Not.SamePath(path).RespectCase;
+        }
+    }
+
+    public class SamePathOrUnderTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            string path = "/path/to/match";
+            string defaultCaseSensitivity = Path.DirectorySeparatorChar == '\\'
+                ? "ignorecase" : "respectcase";
+
+            parseTree = string.Format(@"<samepathorunder ""{0}"" {1}>", path, defaultCaseSensitivity);
+            staticSyntax = Is.SamePathOrUnder(path);
+            inheritedSyntax = Helper().SamePathOrUnder(path);
+            builderSyntax = Builder().SamePathOrUnder(path);
+        }
+    }
+
+    public class SamePathOrUnderTest_IgnoreCase : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            string path = "/path/to/match";
+
+            parseTree = string.Format(@"<samepathorunder ""{0}"" ignorecase>", path);
+            staticSyntax = Is.SamePathOrUnder(path).IgnoreCase;
+            inheritedSyntax = Helper().SamePathOrUnder(path).IgnoreCase;
+            builderSyntax = Builder().SamePathOrUnder(path).IgnoreCase;
+        }
+    }
+
+    public class NotSamePathOrUnderTest_IgnoreCase : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            string path = "/path/to/match";
+
+            parseTree = string.Format(@"<not <samepathorunder ""{0}"" ignorecase>>", path);
+            staticSyntax = Is.Not.SamePathOrUnder(path).IgnoreCase;
+            inheritedSyntax = Helper().Not.SamePathOrUnder(path).IgnoreCase;
+            builderSyntax = Builder().Not.SamePathOrUnder(path).IgnoreCase;
+        }
+    }
+
+    public class SamePathOrUnderTest_RespectCase : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            string path = "/path/to/match";
+
+            parseTree = string.Format(@"<samepathorunder ""{0}"" respectcase>", path);
+            staticSyntax = Is.SamePathOrUnder(path).RespectCase;
+            inheritedSyntax = Helper().SamePathOrUnder(path).RespectCase;
+            builderSyntax = Builder().SamePathOrUnder(path).RespectCase;
+        }
+    }
+
+    public class NotSamePathOrUnderTest_RespectCase : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            string path = "/path/to/match";
+
+            parseTree = string.Format(@"<not <samepathorunder ""{0}"" respectcase>>", path);
+            staticSyntax = Is.Not.SamePathOrUnder(path).RespectCase;
+            inheritedSyntax = Helper().Not.SamePathOrUnder(path).RespectCase;
+            builderSyntax = Builder().Not.SamePathOrUnder(path).RespectCase;
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/Syntax/PropertyTests.cs b/src/NUnitFramework/tests/Syntax/PropertyTests.cs
new file mode 100644
index 0000000..535f663
--- /dev/null
+++ b/src/NUnitFramework/tests/Syntax/PropertyTests.cs
@@ -0,0 +1,114 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+
+namespace NUnit.Framework.Syntax
+{
+    public class PropertyExistsTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<propertyexists X>";
+            staticSyntax = Has.Property("X");
+            inheritedSyntax = Helper().Property("X");
+            builderSyntax = Builder().Property("X");
+        }
+    }
+
+    public class PropertyExistsTest_AndFollows : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<and <propertyexists X> <equal 7>>";
+            staticSyntax = Has.Property("X").And.EqualTo(7);
+            inheritedSyntax = Helper().Property("X").And.EqualTo(7);
+            builderSyntax = Builder().Property("X").And.EqualTo(7);
+        }
+    }
+
+    public class PropertyTest_ConstraintFollows : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<property X <greaterthan 5>>";
+            staticSyntax = Has.Property("X").GreaterThan(5);
+            inheritedSyntax = Helper().Property("X").GreaterThan(5);
+            builderSyntax = Builder().Property("X").GreaterThan(5);
+        }
+    }
+
+    public class PropertyTest_NotFollows : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<property X <not <greaterthan 5>>>";
+            staticSyntax = Has.Property("X").Not.GreaterThan(5);
+            inheritedSyntax = Helper().Property("X").Not.GreaterThan(5);
+            builderSyntax = Builder().Property("X").Not.GreaterThan(5);
+        }
+    }
+
+    public class LengthTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<property Length <greaterthan 5>>";
+            staticSyntax = Has.Length.GreaterThan(5);
+            inheritedSyntax = Helper().Length.GreaterThan(5);
+            builderSyntax = Builder().Length.GreaterThan(5);
+        }
+    }
+
+    public class CountTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<property Count <equal 5>>";
+            staticSyntax = Has.Count.EqualTo(5);
+            inheritedSyntax = Helper().Count.EqualTo(5);
+            builderSyntax = Builder().Count.EqualTo(5);
+        }
+    }
+
+    public class MessageTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = @"<property Message <startswith ""Expected"">>";
+            staticSyntax = Has.Message.StartsWith("Expected");
+            inheritedSyntax = Helper().Message.StartsWith("Expected");
+            builderSyntax = Builder().Message.StartsWith("Expected");
+        }
+    }
+
+    public class PropertySyntaxVariations
+    {
+        private readonly int[] ints = new int[] { 1, 2, 3 };
+
+        [Test]
+        public void ExistenceTest()
+        {
+            Assert.That(ints, Has.Property("Length"));
+            Assert.That(ints, Has.Length);
+        }
+
+        [Test]
+        public void SeparateConstraintTest()
+        {
+            Assert.That(ints, Has.Property("Length").EqualTo(3));
+            Assert.That(ints, Has.Length.EqualTo(3));
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/NUnitFramework/tests/Syntax/SerializableConstraints.cs b/src/NUnitFramework/tests/Syntax/SerializableConstraints.cs
new file mode 100644
index 0000000..4467ecc
--- /dev/null
+++ b/src/NUnitFramework/tests/Syntax/SerializableConstraints.cs
@@ -0,0 +1,34 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Framework.Syntax
+{
+    [TestFixture]
+    public class BinarySerializableTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<binaryserializable>";
+            staticSyntax = Is.BinarySerializable;
+            inheritedSyntax = Helper().BinarySerializable;
+            builderSyntax = Builder().BinarySerializable;
+        }
+    }
+
+    [TestFixture]
+    public class XmlSerializableTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<xmlserializable>";
+            staticSyntax = Is.XmlSerializable;
+            inheritedSyntax = Helper().XmlSerializable;
+            builderSyntax = Builder().XmlSerializable;
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/Syntax/SimpleConstraints.cs b/src/NUnitFramework/tests/Syntax/SimpleConstraints.cs
new file mode 100644
index 0000000..9645d6b
--- /dev/null
+++ b/src/NUnitFramework/tests/Syntax/SimpleConstraints.cs
@@ -0,0 +1,70 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Syntax
+{
+    public class NullTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<null>";
+            staticSyntax = Is.Null;
+            inheritedSyntax = Helper().Null;
+            builderSyntax = Builder().Null;
+        }
+    }
+
+    public class TrueTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<true>";
+            staticSyntax = Is.True;
+            inheritedSyntax = Helper().True;
+            builderSyntax = Builder().True;
+        }
+    }
+
+    public class FalseTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<false>";
+            staticSyntax = Is.False;
+            inheritedSyntax = Helper().False;
+            builderSyntax = Builder().False;
+        }
+    }
+
+    public class NaNTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<nan>";
+            staticSyntax = Is.NaN;
+            inheritedSyntax = Helper().NaN;
+            builderSyntax = Builder().NaN;
+        }
+    }
+
+    public class EmptyTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<empty>";
+            staticSyntax = Is.Empty;
+            inheritedSyntax = Helper().Empty;
+            builderSyntax = Builder().Empty;
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/Syntax/StringConstraints.cs b/src/NUnitFramework/tests/Syntax/StringConstraints.cs
new file mode 100644
index 0000000..5bcbecf
--- /dev/null
+++ b/src/NUnitFramework/tests/Syntax/StringConstraints.cs
@@ -0,0 +1,158 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Syntax
+{
+    public class SubstringTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = @"<substring ""X"">";
+            staticSyntax = Is.StringContaining("X");
+            inheritedSyntax = Helper().ContainsSubstring("X");
+            builderSyntax = Builder().ContainsSubstring("X");
+        }
+    }
+
+    [Obsolete]
+    public class TextContains : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = @"<substring ""X"">";
+            staticSyntax = Text.Contains("X");
+            inheritedSyntax = Helper().ContainsSubstring("X");
+            builderSyntax = Builder().ContainsSubstring("X");
+        }
+    }
+
+    public class SubstringTest_IgnoreCase : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = @"<substring ""X"">";
+            staticSyntax = Is.StringContaining("X").IgnoreCase;
+            inheritedSyntax = Helper().ContainsSubstring("X").IgnoreCase;
+            builderSyntax = Builder().ContainsSubstring("X").IgnoreCase;
+        }
+    }
+
+    public class StartsWithTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = @"<startswith ""X"">";
+            staticSyntax = Is.StringStarting("X");
+            inheritedSyntax = Helper().StartsWith("X");
+            builderSyntax = Builder().StartsWith("X");
+        }
+    }
+
+    [Obsolete]
+    public class TextStartsWithTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = @"<startswith ""X"">";
+            staticSyntax = Text.StartsWith("X");
+            inheritedSyntax = Helper().StartsWith("X");
+            builderSyntax = Builder().StartsWith("X");
+        }
+    }
+
+    public class StartsWithTest_IgnoreCase : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = @"<startswith ""X"">";
+            staticSyntax = Is.StringStarting("X").IgnoreCase;
+            inheritedSyntax = Helper().StartsWith("X").IgnoreCase;
+            builderSyntax = Builder().StartsWith("X").IgnoreCase;
+        }
+    }
+
+    public class EndsWithTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = @"<endswith ""X"">";
+            staticSyntax = Is.StringEnding("X");
+            inheritedSyntax = Helper().EndsWith("X");
+            builderSyntax = Builder().EndsWith("X");
+        }
+    }
+
+    [Obsolete]
+    public class TextEndsWithTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = @"<endswith ""X"">";
+            staticSyntax = Text.EndsWith("X");
+            inheritedSyntax = Helper().EndsWith("X");
+            builderSyntax = Builder().EndsWith("X");
+        }
+    }
+
+    public class EndsWithTest_IgnoreCase : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = @"<endswith ""X"">";
+            staticSyntax = Is.StringEnding("X").IgnoreCase;
+            inheritedSyntax = Helper().EndsWith("X").IgnoreCase;
+            builderSyntax = Builder().EndsWith("X").IgnoreCase;
+        }
+    }
+
+    public class RegexTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = @"<regex ""X"">";
+            staticSyntax = Is.StringMatching("X");
+            inheritedSyntax = Helper().Matches("X");
+            builderSyntax = Builder().Matches("X");
+        }
+    }
+
+    [Obsolete]
+    public class TextMatchesTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = @"<regex ""X"">";
+            staticSyntax = Text.Matches("X");
+            inheritedSyntax = Helper().Matches("X");
+            builderSyntax = Builder().Matches("X");
+        }
+    }
+
+    public class RegexTest_IgnoreCase : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = @"<regex ""X"">";
+            staticSyntax = Is.StringMatching("X").IgnoreCase;
+            inheritedSyntax = Helper().Matches("X").IgnoreCase;
+            builderSyntax = Builder().Matches("X").IgnoreCase;
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/Syntax/SyntaxTest.cs b/src/NUnitFramework/tests/Syntax/SyntaxTest.cs
new file mode 100644
index 0000000..8714aad
--- /dev/null
+++ b/src/NUnitFramework/tests/Syntax/SyntaxTest.cs
@@ -0,0 +1,53 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework.Syntax
+{
+    public abstract class SyntaxTest
+    {
+        protected string parseTree;
+        protected IResolveConstraint staticSyntax;
+        protected IResolveConstraint inheritedSyntax;
+        protected IResolveConstraint builderSyntax;
+
+        protected AssertionHelper Helper()
+        {
+            return new AssertionHelper();
+        }
+
+        protected ConstraintExpression Builder()
+        {
+            return new ConstraintExpression();
+        }
+
+        [Test]
+        public void SupportedByStaticSyntax()
+        {
+            Assert.That(
+                staticSyntax.Resolve().ToString(),
+                Is.EqualTo(parseTree).NoClip);
+        }
+
+        [Test]
+        public void SupportedByConstraintBuilder()
+        {
+            Assert.That(
+                builderSyntax.Resolve().ToString(),
+                Is.EqualTo(parseTree).NoClip);
+        }
+
+        [Test]
+        public void SupportedByInheritedSyntax()
+        {
+            Assert.That(
+                inheritedSyntax.Resolve().ToString(),
+                Is.EqualTo(parseTree).NoClip);
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/Syntax/TestCompiler.cs b/src/NUnitFramework/tests/Syntax/TestCompiler.cs
new file mode 100644
index 0000000..363a761
--- /dev/null
+++ b/src/NUnitFramework/tests/Syntax/TestCompiler.cs
@@ -0,0 +1,56 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.CodeDom.Compiler;
+
+namespace NUnit.Framework.Syntax
+{
+    class TestCompiler
+    {
+        Microsoft.CSharp.CSharpCodeProvider provider;
+#if !NET_2_0
+		ICodeCompiler compiler;
+#endif
+		CompilerParameters options;
+
+		public TestCompiler() : this( null, null ) { }
+
+		public TestCompiler( string[] assemblyNames ) : this( assemblyNames, null ) { }
+
+		public TestCompiler( string[] assemblyNames, string outputName )
+		{
+			this.provider = new Microsoft.CSharp.CSharpCodeProvider();
+#if !NET_2_0
+			this.compiler = provider.CreateCompiler();
+#endif
+			this.options = new CompilerParameters();
+
+			if ( assemblyNames != null && assemblyNames.Length > 0 )
+				options.ReferencedAssemblies.AddRange( assemblyNames );
+			if ( outputName != null )
+				options.OutputAssembly = outputName;
+
+			options.IncludeDebugInformation = false;
+			options.TempFiles = new TempFileCollection( ".", false );
+			options.GenerateInMemory = false;
+		}
+
+		public CompilerParameters Options
+		{
+			get { return options; }
+		}
+
+		public CompilerResults CompileCode( string code )
+		{
+#if NET_2_0
+			return provider.CompileAssemblyFromSource( options, code );
+#else
+            return compiler.CompileAssemblyFromSource(options, code);
+#endif
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/Syntax/ThrowsTests.cs b/src/NUnitFramework/tests/Syntax/ThrowsTests.cs
new file mode 100644
index 0000000..dbfddfa
--- /dev/null
+++ b/src/NUnitFramework/tests/Syntax/ThrowsTests.cs
@@ -0,0 +1,227 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework.Syntax
+{
+    [TestFixture]
+    public class ThrowsTests
+    {
+        [Test]
+        public void ThrowsException()
+        {
+            IResolveConstraint expr = Throws.Exception;
+            Assert.AreEqual(
+                "<throws>",
+                expr.Resolve().ToString());
+        }
+
+        [Test]
+        public void ThrowsExceptionWithConstraint()
+        {
+            IResolveConstraint expr = Throws.Exception.With.Property("ParamName").EqualTo("myParam");
+            Assert.AreEqual(
+                @"<throws <property ParamName <equal ""myParam"">>>",
+                expr.Resolve().ToString());
+        }
+
+        [Test]
+        public void ThrowsExceptionTypeOf()
+        {
+            IResolveConstraint expr = Throws.Exception.TypeOf(typeof(ArgumentException));
+            Assert.AreEqual(
+                "<throws <typeof System.ArgumentException>>",
+                expr.Resolve().ToString());
+        }
+
+        [Test]
+        public void ThrowsTypeOf()
+        {
+            IResolveConstraint expr = Throws.TypeOf(typeof(ArgumentException));
+            Assert.AreEqual(
+                "<throws <typeof System.ArgumentException>>",
+                expr.Resolve().ToString());
+        }
+
+        [Test]
+        public void ThrowsTypeOfAndConstraint()
+        {
+            IResolveConstraint expr = Throws.TypeOf(typeof(ArgumentException)).And.Property("ParamName").EqualTo("myParam");
+            Assert.AreEqual(
+                @"<throws <and <typeof System.ArgumentException> <property ParamName <equal ""myParam"">>>>",
+                expr.Resolve().ToString());
+        }
+
+        [Test]
+        public void ThrowsExceptionTypeOfAndConstraint()
+        {
+            IResolveConstraint expr = Throws.Exception.TypeOf(typeof(ArgumentException)).And.Property("ParamName").EqualTo("myParam");
+            Assert.AreEqual(
+                @"<throws <and <typeof System.ArgumentException> <property ParamName <equal ""myParam"">>>>",
+                expr.Resolve().ToString());
+        }
+
+        [Test]
+        public void ThrowsTypeOfWithConstraint()
+        {
+            IResolveConstraint expr = Throws.TypeOf(typeof(ArgumentException)).With.Property("ParamName").EqualTo("myParam");
+            Assert.AreEqual(
+                @"<throws <and <typeof System.ArgumentException> <property ParamName <equal ""myParam"">>>>",
+                expr.Resolve().ToString());
+        }
+
+        [Test]
+        public void ThrowsTypeofWithMessage()
+        {
+            IResolveConstraint expr = Throws.TypeOf(typeof(ArgumentException)).With.Message.EqualTo("my message");
+            Assert.AreEqual(
+                @"<throws <and <typeof System.ArgumentException> <property Message <equal ""my message"">>>>",
+                expr.Resolve().ToString());
+        }
+
+        [Test]
+        public void ThrowsInstanceOf()
+        {
+            IResolveConstraint expr = Throws.InstanceOf(typeof(ArgumentException));
+            Assert.AreEqual(
+                "<throws <instanceof System.ArgumentException>>",
+                expr.Resolve().ToString());
+        }
+
+        [Test]
+        public void ThrowsExceptionInstanceOf()
+        {
+            IResolveConstraint expr = Throws.Exception.InstanceOf(typeof(ArgumentException));
+            Assert.AreEqual(
+                "<throws <instanceof System.ArgumentException>>",
+                expr.Resolve().ToString());
+        }
+
+        [Test]
+        public void ThrowsInnerException()
+        {
+            IResolveConstraint expr = Throws.InnerException.TypeOf(typeof(ArgumentException));
+            Assert.AreEqual(
+                "<throws <property InnerException <typeof System.ArgumentException>>>",
+                expr.Resolve().ToString());
+        }
+
+        [Test]
+        public void ThrowsExceptionWithInnerException()
+        {
+            IResolveConstraint expr = Throws.Exception.With.InnerException.TypeOf(typeof(ArgumentException));
+            Assert.AreEqual(
+                "<throws <property InnerException <typeof System.ArgumentException>>>",
+                expr.Resolve().ToString());
+        }
+
+        [Test]
+        public void ThrowsTypeOfWithInnerException()
+        {
+            IResolveConstraint expr = Throws.TypeOf(typeof(System.Reflection.TargetInvocationException))
+                .With.InnerException.TypeOf(typeof(ArgumentException));
+            Assert.AreEqual(
+                "<throws <and <typeof System.Reflection.TargetInvocationException> <property InnerException <typeof System.ArgumentException>>>>",
+                expr.Resolve().ToString());
+        }
+
+        [Test]
+        public void ThrowsTargetInvocationExceptionWithInnerException()
+        {
+            IResolveConstraint expr = Throws.TargetInvocationException
+                .With.InnerException.TypeOf(typeof(ArgumentException));
+            Assert.AreEqual(
+                "<throws <and <typeof System.Reflection.TargetInvocationException> <property InnerException <typeof System.ArgumentException>>>>",
+                expr.Resolve().ToString());
+        }
+
+        [Test]
+        public void ThrowsArgumentException()
+        {
+            IResolveConstraint expr = Throws.ArgumentException;
+            Assert.AreEqual(
+                "<throws <typeof System.ArgumentException>>",
+                expr.Resolve().ToString());
+        }
+
+        [Test]
+        public void ThrowsInvalidOperationException()
+        {
+            IResolveConstraint expr = Throws.InvalidOperationException;
+            Assert.AreEqual(
+                "<throws <typeof System.InvalidOperationException>>",
+                expr.Resolve().ToString());
+        }
+
+        // TODO: Move these to AssertThat tests
+#if NET_2_0
+#if CS_3_0
+        [Test]
+        public void DelegateThrowsException()
+        {
+            Assert.That(
+                delegate { throw new ApplicationException(); },
+                Throws.Exception);
+        }
+
+        [Test]
+        public void LambdaThrowsExcepton()
+        {
+            Assert.That(
+                () => new MyClass(null),
+                Throws.InstanceOf<ArgumentNullException>());
+        }
+
+        [Test]
+        public void LambdaThrowsExceptionWithMessage()
+        {
+            Assert.That(
+                () => new MyClass(null),
+                Throws.InstanceOf<ArgumentNullException>()
+                .And.Message.Matches("null"));
+        }
+
+        internal class MyClass
+        {
+            public MyClass(string s)
+            {
+                if (s == null)
+                {
+                    throw new ArgumentNullException();
+                }
+            }
+        }
+
+        [Test]
+        public void LambdaThrowsNothing()
+        {
+            Assert.That(
+                () => null,
+                Throws.Nothing);
+        }
+#else
+        [Test]
+        public void DelegateThrowsException()
+        {
+            Assert.That(
+                delegate { Throw(); return; },
+                Throws.Exception);
+        }
+
+        // Encapsulate throw to trick compiler and
+        // avoid unreachable code warning. Can't
+        // use pragma because this is also compiled
+        // under the .NET 1.0 and 1.1 compilers.
+        private void Throw()
+        {
+            throw new ApplicationException();
+        }
+#endif
+#endif
+    }
+}
diff --git a/src/NUnitFramework/tests/Syntax/TypeConstraints.cs b/src/NUnitFramework/tests/Syntax/TypeConstraints.cs
new file mode 100644
index 0000000..d32bf7e
--- /dev/null
+++ b/src/NUnitFramework/tests/Syntax/TypeConstraints.cs
@@ -0,0 +1,181 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Syntax
+{
+    [TestFixture]
+    public class ExactTypeTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<typeof System.String>";
+            staticSyntax = Is.TypeOf(typeof(string));
+            inheritedSyntax = Helper().TypeOf(typeof(string));
+            builderSyntax = Builder().TypeOf(typeof(string));
+        }
+    }
+
+    [TestFixture]
+    public class InstanceOfTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<instanceof System.String>";
+            staticSyntax = Is.InstanceOf(typeof(string));
+            inheritedSyntax = Helper().InstanceOf(typeof(string));
+            builderSyntax = Builder().InstanceOf(typeof(string));
+        }
+    }
+
+    [TestFixture, Obsolete]
+    public class InstanceOfTypeTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<instanceof System.String>";
+            staticSyntax = Is.InstanceOfType(typeof(string));
+            inheritedSyntax = Helper().InstanceOfType(typeof(string));
+            builderSyntax = Builder().InstanceOfType(typeof(string));
+        }
+    }
+
+    [TestFixture]
+    public class AssignableFromTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<assignablefrom System.String>";
+            staticSyntax = Is.AssignableFrom(typeof(string));
+            inheritedSyntax = Helper().AssignableFrom(typeof(string));
+            builderSyntax = Builder().AssignableFrom(typeof(string));
+        }
+    }
+
+    [TestFixture]
+    public class AssignableToTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<assignableto System.String>";
+            staticSyntax = Is.AssignableTo(typeof(string));
+            inheritedSyntax = Helper().AssignableTo(typeof(string));
+            builderSyntax = Builder().AssignableTo(typeof(string));
+        }
+    }
+
+    [TestFixture]
+    public class AttributeTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<attributeexists NUnit.Framework.TestFixtureAttribute>";
+            staticSyntax = Has.Attribute(typeof(TestFixtureAttribute));
+            inheritedSyntax = Helper().Attribute(typeof(TestFixtureAttribute));
+            builderSyntax = Builder().Attribute(typeof(TestFixtureAttribute));
+        }
+    }
+
+    [TestFixture]
+    public class AttributeTestWithFollowingConstraint : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = @"<attribute NUnit.Framework.TestFixtureAttribute <property Description <not <null>>>>";
+            staticSyntax = Has.Attribute(typeof(TestFixtureAttribute)).Property("Description").Not.Null;
+            inheritedSyntax = Helper().Attribute(typeof(TestFixtureAttribute)).Property("Description").Not.Null;
+            builderSyntax = Builder().Attribute(typeof(TestFixtureAttribute)).Property("Description").Not.Null;
+        }
+    }
+
+#if NET_2_0
+    [TestFixture]
+    public class ExactTypeTest_Generic : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<typeof System.String>";
+            staticSyntax = Is.TypeOf<string>();
+            inheritedSyntax = Helper().TypeOf<string>();
+            builderSyntax = Builder().TypeOf<string>();
+        }
+    }
+
+    [TestFixture]
+    public class InstanceOfTest_Generic : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<instanceof System.String>";
+            staticSyntax = Is.InstanceOf<string>();
+            inheritedSyntax = Helper().InstanceOf<string>();
+            builderSyntax = Builder().InstanceOf<string>();
+        }
+    }
+
+    [TestFixture, Obsolete]
+    public class InstanceOfTypeTest_Generic : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<instanceof System.String>";
+            staticSyntax = Is.InstanceOfType<string>();
+            inheritedSyntax = Helper().InstanceOfType<string>();
+            builderSyntax = Builder().InstanceOfType<string>();
+        }
+    }
+
+    [TestFixture]
+    public class AssignableFromTest_Generic : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<assignablefrom System.String>";
+            staticSyntax = Is.AssignableFrom<string>();
+            inheritedSyntax = Helper().AssignableFrom<string>();
+            builderSyntax = Builder().AssignableFrom<string>();
+        }
+    }
+
+    [TestFixture]
+    public class AssignableToTest_Generic : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<assignableto System.String>";
+            staticSyntax = Is.AssignableTo<string>();
+            inheritedSyntax = Helper().AssignableTo<string>();
+            builderSyntax = Builder().AssignableTo<string>();
+        }
+    }
+
+    [TestFixture]
+    public class AttributeTest_Generic : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<attributeexists NUnit.Framework.TestFixtureAttribute>";
+            staticSyntax = Has.Attribute<TestFixtureAttribute>();
+            inheritedSyntax = Helper().Attribute<TestFixtureAttribute>();
+            builderSyntax = Builder().Attribute<TestFixtureAttribute>();
+        }
+    }
+#endif
+}
diff --git a/src/NUnitFramework/tests/TestDelegates.cs b/src/NUnitFramework/tests/TestDelegates.cs
new file mode 100644
index 0000000..efd477c
--- /dev/null
+++ b/src/NUnitFramework/tests/TestDelegates.cs
@@ -0,0 +1,40 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+using System;
+
+namespace NUnit.Framework.Tests
+{
+    public class TestDelegates
+    {
+        public static void ThrowsArgumentException()
+        {
+            throw new ArgumentException("myMessage", "myParam");
+        }
+
+        public static void ThrowsApplicationException()
+        {
+            throw new ApplicationException();
+        }
+
+        public static void ThrowsSystemException()
+        {
+            throw new Exception();
+        }
+
+        public static void ThrowsNothing()
+        {
+        }
+
+        public static void ThrowsDerivedApplicationException()
+        {
+            throw new DerivedApplicationException();
+        }
+
+        public class DerivedApplicationException : ApplicationException
+        {
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/TestFixtureAttributeTests.cs b/src/NUnitFramework/tests/TestFixtureAttributeTests.cs
new file mode 100644
index 0000000..f35c874
--- /dev/null
+++ b/src/NUnitFramework/tests/TestFixtureAttributeTests.cs
@@ -0,0 +1,74 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+using System;
+
+namespace NUnit.Framework.Tests
+{
+    public class TestFixtureAttributeTests
+    {
+        static object[] fixtureArgs = new object[] { 10, 20, "Charlie" };
+#if NET_2_0
+        static Type[] typeArgs = new Type[] { typeof(int), typeof(string) };
+        static object[] combinedArgs = new object[] { typeof(int), typeof(string), 10, 20, "Charlie" };
+#endif
+
+        [Test]
+        public void ConstructWithoutArguments()
+        {
+            TestFixtureAttribute attr = new TestFixtureAttribute();
+            Assert.That(attr.Arguments.Length == 0);
+#if NET_2_0
+            Assert.That(attr.TypeArgs.Length == 0);
+#endif
+        }
+
+        [Test]
+        public void ConstructWithFixtureArgs()
+        {
+            TestFixtureAttribute attr = new TestFixtureAttribute(fixtureArgs);
+            Assert.That(attr.Arguments, Is.EqualTo( fixtureArgs ) );
+#if NET_2_0
+            Assert.That(attr.TypeArgs.Length == 0 );
+#endif
+        }
+
+#if NET_2_0
+        [Test, Category("Generics")]
+        public void ConstructWithJustTypeArgs()
+        {
+            TestFixtureAttribute attr = new TestFixtureAttribute(typeArgs);
+            Assert.That(attr.Arguments.Length == 0);
+            Assert.That(attr.TypeArgs, Is.EqualTo(typeArgs));
+        }
+
+        [Test, Category("Generics")]
+        public void ConstructWithNoArgumentsAndSetTypeArgs()
+        {
+            TestFixtureAttribute attr = new TestFixtureAttribute();
+            attr.TypeArgs = typeArgs;
+            Assert.That(attr.Arguments.Length == 0);
+            Assert.That(attr.TypeArgs, Is.EqualTo(typeArgs));
+        }
+
+        [Test, Category("Generics")]
+        public void ConstructWithFixtureArgsAndSetTypeArgs()
+        {
+            TestFixtureAttribute attr = new TestFixtureAttribute(fixtureArgs);
+            attr.TypeArgs = typeArgs;
+            Assert.That(attr.Arguments, Is.EqualTo(fixtureArgs));
+            Assert.That(attr.TypeArgs, Is.EqualTo(typeArgs));
+        }
+
+        [Test, Category("Generics")]
+        public void ConstructWithCombinedArgs()
+        {
+            TestFixtureAttribute attr = new TestFixtureAttribute(combinedArgs);
+            Assert.That(attr.Arguments, Is.EqualTo(fixtureArgs));
+            Assert.That(attr.TypeArgs, Is.EqualTo(typeArgs));
+        }
+#endif
+	}
+}
diff --git a/src/NUnitFramework/tests/TextMessageWriterTests.cs b/src/NUnitFramework/tests/TextMessageWriterTests.cs
index f8b7e38..a0420f2 100644
--- a/src/NUnitFramework/tests/TextMessageWriterTests.cs
+++ b/src/NUnitFramework/tests/TextMessageWriterTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -72,7 +72,7 @@ namespace NUnit.Framework.Tests
             writer.WriteValue(0.33333333333333f);
             int digits = writer.ToString().Length - 3;   // 0.dddddddddf
             Expect(digits, EqualTo(9));
-			Expect(writer.ToString().Length, EqualTo(12));
+            Expect(writer.ToString().Length, EqualTo(12));
         }
 
         [Test]
@@ -107,7 +107,7 @@ namespace NUnit.Framework.Tests
 		public void DateTimeTest()
 		{
             writer.WriteValue(new DateTime(2007, 7, 4, 9, 15, 30, 123));
-			Expect(writer.ToString(), EqualTo("2007-07-04 09:15:30.123"));
+            Expect(writer.ToString(), EqualTo("2007-07-04 09:15:30.123"));
 		}
 
         [Test]
@@ -117,7 +117,7 @@ namespace NUnit.Framework.Tests
             string exp = "abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXY...";
 
             writer.DisplayStringDifferences(s72, "abcde", 5, false, true);
-            string message = writer.ToString();
+//            string message = writer.ToString();
             Expect(writer.ToString(), EqualTo(
                 TextMessageWriter.Pfx_Expected + Q(exp) + Environment.NewLine +
                 TextMessageWriter.Pfx_Actual + Q("abcde") + Environment.NewLine +
@@ -130,7 +130,7 @@ namespace NUnit.Framework.Tests
             string s72 = "abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
 
             writer.DisplayStringDifferences(s72, "abcde", 5, false, false);
-            string message = writer.ToString();
+//            string message = writer.ToString();
             Expect(writer.ToString(), EqualTo(
                 TextMessageWriter.Pfx_Expected + Q(s72) + Environment.NewLine +
                 TextMessageWriter.Pfx_Actual + Q("abcde") + Environment.NewLine +
diff --git a/src/NUnitFramework/tests/TypeAssertTest.cs b/src/NUnitFramework/tests/TypeAssertTest.cs
index 324b0b3..c259e7b 100644
--- a/src/NUnitFramework/tests/TypeAssertTest.cs
+++ b/src/NUnitFramework/tests/TypeAssertTest.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -28,56 +28,65 @@ namespace NUnit.Framework.Tests
 		}
 
 		[Test]
-		public void IsInstanceOfType()
+		public void IsInstanceOf()
 		{
-			Assert.IsInstanceOfType(typeof(System.Exception), new ApplicationException() );
+            ApplicationException ex = new ApplicationException();
+
+			Assert.IsInstanceOf(typeof(System.Exception), ex );
+            Expect( ex, InstanceOf(typeof(Exception)));
+#if NET_2_0
+            Assert.IsInstanceOf<Exception>( ex );
+#endif
 		}
 
 		[Test,ExpectedException(typeof(AssertionException))]
-		public void IsInstanceOfTypeFails()
+		public void IsInstanceOfFails()
 		{
 			expectedMessage =
 				"  Expected: instance of <System.Int32>" + System.Environment.NewLine + 
 				"  But was:  <System.String>" + System.Environment.NewLine;
-			Expect( "abc123", InstanceOfType( typeof(System.Int32) ) );
+			Expect( "abc123", InstanceOf( typeof(System.Int32) ) );
 		}
 
 		[Test]
-		public void IsNotInstanceOfType()
+		public void IsNotInstanceOf()
 		{
-			Assert.IsNotInstanceOfType(typeof(System.Int32), "abc123" );
-			Expect( "abc123", Not.InstanceOfType(typeof(System.Int32)) );
+			Assert.IsNotInstanceOf(typeof(System.Int32), "abc123" );
+			Expect( "abc123", Not.InstanceOf(typeof(System.Int32)) );
+#if NET_2_0
+			Assert.IsNotInstanceOf<System.Int32>("abc123");
+#endif
 		}
 
 		[Test,ExpectedException(typeof(AssertionException))]
-		public void IsNotInstanceOfTypeFails()
+		public void IsNotInstanceOfFails()
 		{
 			expectedMessage =
 				"  Expected: not instance of <System.Exception>" + System.Environment.NewLine + 
 				"  But was:  <System.ApplicationException>" + System.Environment.NewLine;
-			Assert.IsNotInstanceOfType( typeof(System.Exception), new ApplicationException() );
+			Assert.IsNotInstanceOf( typeof(System.Exception), new ApplicationException() );
 		}
 
-		[Test()]
-		public void IsAssignableFrom()
-		{
-			int [] array10 = new int [10];
-			int [] array2 = new int[2];
+        [Test()]
+        public void IsAssignableFrom()
+        {
+            int[] array10 = new int[10];
 
-			Assert.IsAssignableFrom(array2.GetType(),array10);
-			Assert.IsAssignableFrom(array2.GetType(),array10,"Type Failure Message");
-			Assert.IsAssignableFrom(array2.GetType(),array10,"Type Failure Message",null);
-			Expect( array10, AssignableFrom( array2.GetType() ) );
-		}
+            Assert.IsAssignableFrom(typeof(int[]), array10);
+            Expect(array10, AssignableFrom(typeof(int[])));
+#if NET_2_0
+            Assert.IsAssignableFrom<int[]>(array10);
+#endif
+        }
 
-		[Test,ExpectedException(typeof(AssertionException))]
+        [Test, ExpectedException(typeof(AssertionException))]
 		public void IsAssignableFromFails()
 		{
 			int [] array10 = new int [10];
 			int [,] array2 = new int[2,2];
 
 			expectedMessage =
-				"  Expected: Type assignable from <System.Int32[,]>" + System.Environment.NewLine + 
+				"  Expected: assignable from <System.Int32[,]>" + System.Environment.NewLine + 
 				"  But was:  <System.Int32[]>" + System.Environment.NewLine;
 			Expect( array10, AssignableFrom( array2.GetType() ) );
 		}
@@ -86,12 +95,12 @@ namespace NUnit.Framework.Tests
 		public void IsNotAssignableFrom()
 		{
 			int [] array10 = new int [10];
-			int [,] array2 = new int[2,2];
 
-			Assert.IsNotAssignableFrom(array2.GetType(),array10);
-			Assert.IsNotAssignableFrom(array2.GetType(),array10,"Type Failure Message");
-			Assert.IsNotAssignableFrom(array2.GetType(),array10,"Type Failure Message",null);
-			Expect( array10, Not.AssignableFrom( array2.GetType() ) );
+			Assert.IsNotAssignableFrom( typeof(int[,] ),array10);
+			Expect( array10, Not.AssignableFrom( typeof(int[,] ) ) );
+#if NET_2_0
+			Assert.IsNotAssignableFrom<int[,]>(array10);
+#endif
 		}
 
 		[Test,ExpectedException(typeof(AssertionException))]
@@ -101,7 +110,7 @@ namespace NUnit.Framework.Tests
 			int [] array2 = new int[2];
 
 			expectedMessage =
-				"  Expected: not Type assignable from <System.Int32[]>" + System.Environment.NewLine + 
+				"  Expected: not assignable from <System.Int32[]>" + System.Environment.NewLine + 
 				"  But was:  <System.Int32[]>" + System.Environment.NewLine;
 			Expect( array10, Not.AssignableFrom( array2.GetType() ) );
 		}
diff --git a/src/NUnitFramework/tests/ValuesAttributeTests.cs b/src/NUnitFramework/tests/ValuesAttributeTests.cs
new file mode 100644
index 0000000..6b1390c
--- /dev/null
+++ b/src/NUnitFramework/tests/ValuesAttributeTests.cs
@@ -0,0 +1,140 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Reflection;
+
+namespace NUnit.Framework.Tests
+{
+    public class ValuesAttributeTests
+    {
+        [Test]
+        public void ValuesAttributeProvidesSpecifiedValues()
+        {
+            CheckValues("MethodWithValues", 1, 2, 3);
+        }
+
+        private void MethodWithValues( [Values(1, 2, 3)] int x) { }
+
+        [Test]
+        public void CanConvertSmallIntsToShort([Values(5)]short x)
+        {
+        }
+
+        [Test]
+        public void CanConvertSmallIntsToByte([Values(5)]byte x)
+        {
+        }
+
+        [Test]
+        public void CanConvertSmallIntsToSByte([Values(5)]sbyte x)
+        {
+        }
+
+        [Test]
+        public void CanConvertIntToDecimal([Values(12)]decimal x)
+        {
+        }
+
+        [Test]
+        public void CanConverDoubleToDecimal([Values(12.5)]decimal x)
+        {
+        }
+
+        [Test]
+        public void CanConvertStringToDecimal([Values("12.5")]decimal x)
+        {
+        }
+
+        [Test]
+        public void RangeAttributeWithIntRange()
+        {
+            CheckValues("MethodWithIntRange", 11, 12, 13, 14, 15);
+        }
+
+        private void MethodWithIntRange([Range(11, 15)] int x) { }
+
+        [Test]
+        public void RangeAttributeWithIntRangeAndStep()
+        {
+            CheckValues("MethodWithIntRangeAndStep", 11, 13, 15);
+        }
+
+        private void MethodWithIntRangeAndStep([Range(11, 15, 2)] int x) { }
+
+        [Test]
+        public void RangeAttributeWithLongRangeAndStep()
+        {
+            CheckValues("MethodWithLongRangeAndStep", 11L, 13L, 15L);
+        }
+
+        private void MethodWithLongRangeAndStep([Range(11L, 15L, 2)] long x) { }
+
+        [Test]
+        public void RangeAttributeWithDoubleRangeAndStep()
+        {
+            CheckValuesWithinTolerance("MethodWithDoubleRangeAndStep", 0.7, 0.9, 1.1);
+        }
+
+        private void MethodWithDoubleRangeAndStep([Range(0.7, 1.2, 0.2)] double x) { }
+
+        [Test]
+        public void RangeAttributeWithFloatRangeAndStep()
+        {
+            CheckValuesWithinTolerance("MethodWithFloatRangeAndStep", 0.7f, 0.9f, 1.1f);
+        }
+
+        private void MethodWithFloatRangeAndStep([Range(0.7f, 1.2f, 0.2f)] float x) { }
+
+        [Test]
+        public void CanConvertIntRangeToShort([Range(1, 3)] short x) { }
+
+        [Test]
+        public void CanConvertIntRangeToByte([Range(1, 3)] byte x) { }
+
+        [Test]
+        public void CanConvertIntRangeToSByte([Range(1, 3)] sbyte x) { }
+
+        [Test]
+        public void CanConvertIntRangeToDecimal([Range(1, 3)] decimal x) { }
+
+        [Test]
+        public void CanConvertDoubleRangeToDecimal([Range(1.0, 1.3, 0.1)] decimal x) { }
+
+        [Test]
+        public void CanConvertRandomIntToShort([Random(1, 10, 3)] short x) { }
+
+        [Test]
+        public void CanConvertRandomIntToByte([Random(1, 10, 3)] byte x) { }
+
+        [Test]
+        public void CanConvertRandomIntToSByte([Random(1, 10, 3)] sbyte x) { }
+
+        [Test]
+        public void CanConvertRandomIntToDecimal([Random(1, 10, 3)] decimal x) { }
+        
+        [Test]
+        public void CanConvertRandomDoubleToDecimal([Random(1.0, 10.0, 3)] decimal x) { }
+
+        #region Helper Methods
+        private void CheckValues(string methodName, params object[] expected)
+        {
+            MethodInfo method = GetType().GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Instance);
+            ParameterInfo param = method.GetParameters()[0];
+            ValuesAttribute attr = param.GetCustomAttributes(typeof(ValuesAttribute), false)[0] as ValuesAttribute;
+            Assert.That(attr.GetData(param), Is.EqualTo(expected));
+        }
+
+        private void CheckValuesWithinTolerance(string methodName, params object[] expected)
+        {
+            MethodInfo method = GetType().GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Instance);
+            ParameterInfo param = method.GetParameters()[0];
+            ValuesAttribute attr = param.GetCustomAttributes(typeof(ValuesAttribute), false)[0] as ValuesAttribute;
+            Assert.That(attr.GetData(param), Is.EqualTo(expected).Within(0.000001));
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitFramework/tests/TestImage1.jpg b/src/NUnitFramework/tests/data/TestImage1.jpg
similarity index 100%
rename from src/NUnitFramework/tests/TestImage1.jpg
rename to src/NUnitFramework/tests/data/TestImage1.jpg
diff --git a/src/NUnitFramework/tests/TestImage2.jpg b/src/NUnitFramework/tests/data/TestImage2.jpg
similarity index 100%
rename from src/NUnitFramework/tests/TestImage2.jpg
rename to src/NUnitFramework/tests/data/TestImage2.jpg
diff --git a/src/NUnitFramework/tests/TestText1.txt b/src/NUnitFramework/tests/data/TestText1.txt
similarity index 100%
rename from src/NUnitFramework/tests/TestText1.txt
rename to src/NUnitFramework/tests/data/TestText1.txt
diff --git a/src/NUnitFramework/tests/TestText2.txt b/src/NUnitFramework/tests/data/TestText2.txt
similarity index 100%
rename from src/NUnitFramework/tests/TestText2.txt
rename to src/NUnitFramework/tests/data/TestText2.txt
diff --git a/src/NUnitFramework/tests/nunit.framework.tests.build b/src/NUnitFramework/tests/nunit.framework.tests.build
index 18d8d50..b23cab9 100644
--- a/src/NUnitFramework/tests/nunit.framework.tests.build
+++ b/src/NUnitFramework/tests/nunit.framework.tests.build
@@ -1,61 +1,102 @@
 <?xml version="1.0"?>
 <project name="NUnitFrameworkTests" default="build" basedir=".">
 
+  <patternset id="source-files">
+    <include name="Constraints/AfterConstraintTests.cs"/>
+    <include name="Constraints/AndTest.cs"/>
+    <include name="Constraints/BasicConstraintTests.cs"/>
+    <include name="Constraints/CollectionConstraintTests.cs"/>
+    <include name="Constraints/ComparerTests.cs"/>
+    <include name="Constraints/ComparisonConstraintTests.cs"/>
+    <include name="Constraints/ConstraintTestBase.cs"/>
+    <include name="Constraints/EmptyConstraintTest.cs"/>
+    <include name="Constraints/EqualTest.cs"/>
+    <include name="Constraints/FloatingPointNumericsTest.cs"/>
+    <include name="Constraints/MsgUtilTests.cs"/>
+    <include name="Constraints/NotTest.cs"/>
+    <include name="Constraints/NumericsTest.cs"/>
+    <include name="Constraints/OrTest.cs"/>
+    <include name="Constraints/PathConstraintTests.cs"/>
+    <include name="Constraints/PropertyTests.cs"/>
+    <include name="Constraints/ReusableConstraintTests.cs"/>
+    <include name="Constraints/SameAsTest.cs"/>
+    <include name="Constraints/SerializableConstraintTest.cs"/>
+    <include name="Constraints/StringConstraintTests.cs"/>
+    <include name="Constraints/ThrowsConstraintTests.cs"/>
+    <include name="Constraints/ToStringTests.cs"/>
+    <include name="Constraints/TypeConstraintTests.cs"/>
+    <include name="Syntax/AfterTests.cs"/>
+    <include name="Syntax/ArbitraryConstraintMatching.cs"/>
+    <include name="Syntax/CollectionTests.cs"/>
+    <include name="Syntax/ComparisonTests.cs"/>
+    <include name="Syntax/EqualityTests.cs"/>
+    <include name="Syntax/InvalidCodeTests.cs"/>
+    <include name="Syntax/OperatorOverrides.cs"/>
+    <include name="Syntax/OperatorTests.cs"/>
+    <include name="Syntax/PathConstraintTests.cs"/>
+    <include name="Syntax/PropertyTests.cs"/>
+    <include name="Syntax/SerializableConstraints.cs"/>
+    <include name="Syntax/SimpleConstraints.cs"/>
+    <include name="Syntax/StringConstraints.cs"/>
+    <include name="Syntax/SyntaxTest.cs"/>
+    <include name="Syntax/TestCompiler.cs"/>
+    <include name="Syntax/ThrowsTests.cs"/>
+    <include name="Syntax/TypeConstraints.cs"/>
+    <include name="ArrayEqualsFailureMessageFixture.cs"/>
+    <include name="ArrayEqualsFixture.cs"/>
+    <include name="ArrayNotEqualFixture.cs"/>
+    <include name="AssertThrowsTests.cs"/>
+    <include name="AssumeThatTests.cs"/>
+    <include name="CollectionAssertTest.cs"/>
+    <include name="CollectionAdapter.cs"/>
+    <include name="ConditionAssertTests.cs"/>
+    <include name="DirectoryAssertTests.cs"/>
+    <include name="EqualsFixture.cs"/>
+    <include name="FileAssertTests.cs"/>
+    <include name="GreaterEqualFixture.cs"/>
+    <include name="GreaterFixture.cs"/>
+    <include name="LessEqualFixture.cs"/>
+    <include name="LessFixture.cs"/>
+    <include name="ListContentsTests.cs"/>
+    <include name="MessageChecker.cs"/>
+    <include name="NotEqualFixture.cs"/>
+    <include name="NotSameFixture.cs"/>
+    <include name="NullableTypesTests.cs"/>
+    <include name="RandomizerTests.cs"/>
+    <include name="RangeTests.cs"/>
+    <include name="SameFixture.cs"/>
+    <include name="StringAssertTests.cs"/>
+    <include name="TestDelegates.cs"/>
+    <include name="TestFixtureAttributeTests.cs"/>
+    <include name="TextMessageWriterTests.cs"/>
+    <include name="TypeAssertTest.cs"/>
+    <include name="ValuesAttributeTests.cs"/>
+  </patternset>
+
+  <patternset id="resource-files">
+        <include name="data/TestImage1.jpg"/>
+        <include name="data/TestImage2.jpg"/>
+        <include name="data/TestText1.txt"/>
+        <include name="data/TestText2.txt"/>
+  </patternset>
+
   <target name="build">
     <csc target="library" 
-        output="${current.build.dir}/nunit.framework.tests.dll"
+        output="${current.test.dir}/nunit.framework.tests.dll"
         debug="${build.debug}" 
         define="${build.defines}">
       <nowarn>
         <warning number="618,672"/>
       </nowarn>
       <sources>
-        <include name="Constraints/AndTest.cs"/>
-        <include name="Constraints/CollectionConstraintTests.cs"/>
-        <include name="Constraints/ComparisonConstraintTests.cs"/>
-        <include name="Constraints/ConstraintTestBase.cs"/>
-        <include name="Constraints/EmptyTest.cs"/>
-        <include name="Constraints/EqualTest.cs"/>
-        <include name="Constraints/NotTest.cs"/>
-        <include name="Constraints/OrTest.cs"/>
-        <include name="Constraints/SameAsTest.cs"/>
-        <include name="Constraints/StringConstraintTests.cs"/>
-        <include name="Constraints/TypeConstraintTests.cs"/>
-        <include name="ArrayEqualsFailureMessageFixture.cs"/>
-        <include name="ArrayEqualsFixture.cs"/>
-        <include name="ArrayNotEqualFixture.cs"/>
-        <include name="AssertExtensionTests.cs"/>
-        <include name="AssertionTest.cs"/>
-        <include name="AssertSyntaxTests.cs"/>
-        <include name="CollectionAssertTest.cs"/>
-        <include name="CollectionAdapter.cs"/>
-        <include name="ConditionAssertTests.cs"/>
-        <include name="EqualsFixture.cs"/>
-        <include name="FailureMessageFixture.cs"/>
-        <include name="FileAssertTests.cs"/>
-        <include name="GreaterEqualFixture.cs"/>
-        <include name="GreaterFixture.cs"/>
-        <include name="LessEqualFixture.cs"/>
-        <include name="LessFixture.cs"/>
-        <include name="ListContentsTests.cs"/>
-        <include name="MessageChecker.cs"/>
-        <include name="MsgUtilTests.cs"/>
-        <include name="NotEqualFixture.cs"/>
-        <include name="NotSameFixture.cs"/>
-        <include name="SameFixture.cs"/>
-        <include name="StringAssertTests.cs"/>
-        <include name="TextMessageWriterTests.cs"/>
-        <include name="TypeAssertTest.cs"/>
-        <include name="../../CommonAssemblyInfo.cs"/>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
       </sources>
-      <resources prefix="NUnit.Framework.Tests">
-        <include name="TestImage1.jpg"/>
-        <include name="TestImage2.jpg"/>
-        <include name="TestText1.txt"/>
-        <include name="TestText2.txt"/>
+      <resources prefix="NUnit.Framework.Tests.data">
+        <patternset refid="resource-files"/>
       </resources>
-      <references basedir="${current.build.dir}">
-        <include name="nunit.framework.dll"/>
+      <references>
+        <include name="${current.framework.dir}/nunit.framework.dll"/>
         <include name="System.Data.dll"/>
         <include name="System.Drawing.dll"/>
       </references>
@@ -64,7 +105,12 @@
 
   <target name="package">
     <copy todir="${package.src.dir}/NUnitFramework/tests">
-      <fileset refid="source-files" />
+      <fileset>
+        <patternset refid="source-files"/>
+        <patternset refid="resource-files"/>
+        <include name="nunit.framework.tests.csproj"/>
+        <include name="nunit.framework.tests.build"/>
+      </fileset>
     </copy>
   </target>
 
diff --git a/src/NUnitFramework/tests/nunit.framework.tests.csproj b/src/NUnitFramework/tests/nunit.framework.tests.csproj
index 9909c41..33f1db0 100644
--- a/src/NUnitFramework/tests/nunit.framework.tests.csproj
+++ b/src/NUnitFramework/tests/nunit.framework.tests.csproj
@@ -1,307 +1,172 @@
-<VisualStudioProject>
-    <CSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{8C326431-AE57-4645-ACC1-A90A0B425129}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = ""
-                AssemblyKeyContainerName = ""
-                AssemblyName = "nunit.framework.tests"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "Library"
-                PreBuildEvent = ""
-                PostBuildEvent = ""
-                RootNamespace = "NUnit.Framework.Tests"
-                RunPostBuildEvent = "OnBuildSuccess"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "true"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = "618,672"
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-                <Config
-                    Name = "Release"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "false"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = "618,672"
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "System"
-                    AssemblyName = "System"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.dll"
-                />
-                <Reference
-                    Name = "System.XML"
-                    AssemblyName = "System.Xml"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.XML.dll"
-                />
-                <Reference
-                    Name = "nunit.framework.dll"
-                    Project = "{83DD7E12-A705-4DBA-9D71-09C8973D9382}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "System.Drawing"
-                    AssemblyName = "System.Drawing"
-                    HintPath = "C:\WINNT\Microsoft.NET\Framework\v1.1.4322\System.Drawing.dll"
-                />
-                <Reference
-                    Name = "System.Windows.Forms"
-                    AssemblyName = "System.Windows.Forms"
-                    HintPath = "C:\WINNT\Microsoft.NET\Framework\v1.1.4322\System.Windows.Forms.dll"
-                />
-                <Reference
-                    Name = "System.Data"
-                    AssemblyName = "System.Data"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Data.dll"
-                />
-            </References>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "ArrayEqualsFailureMessageFixture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ArrayEqualsFixture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ArrayNotEqualFixture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "AssertExtensionTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "AssertionTest.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "AssertSyntaxTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CollectionAdapter.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CollectionAssertTest.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CommonAssemblyInfo.cs"
-                    Link = "..\..\CommonAssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ConditionAssertTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "EqualsFixture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "FailureMessageFixture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "FileAssertTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "GreaterEqualFixture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "GreaterFixture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "LessEqualFixture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "LessFixture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ListContentsTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "MessageChecker.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "MsgUtilTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "NotEqualFixture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "NotSameFixture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SameFixture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "StringAssertTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestImage1.jpg"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "TestImage2.jpg"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "TestText1.txt"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "TestText2.txt"
-                    BuildAction = "EmbeddedResource"
-                />
-                <File
-                    RelPath = "TextMessageWriterTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TypeAssertTest.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Constraints\AndTest.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Constraints\CollectionConstraintTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Constraints\ComparisonConstraintTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Constraints\ConstraintTestBase.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Constraints\EmptyTest.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Constraints\EqualTest.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Constraints\NotTest.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Constraints\OrTest.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Constraints\SameAsTest.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Constraints\StringConstraintTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Constraints\TypeConstraintTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-            </Include>
-        </Files>
-    </CSHARP>
-</VisualStudioProject>
-
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{8C326431-AE57-4645-ACC1-A90A0B425129}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit.framework.tests</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.Framework.Tests</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG;NET_2_0,CS_3_0;MONO</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;NET_2_0;CSHARP_3_0;MONO</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>618,672</NoWarn>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Drawing">
+      <Name>System.Drawing</Name>
+    </Reference>
+    <Reference Include="System.Windows.Forms">
+      <Name>System.Windows.Forms</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\framework\nunit.framework.dll.csproj">
+      <Name>nunit.framework.dll</Name>
+      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="ArrayEqualsFailureMessageFixture.cs" />
+    <Compile Include="ArrayEqualsFixture.cs" />
+    <Compile Include="ArrayNotEqualFixture.cs" />
+    <Compile Include="AssertThrowsTests.cs" />
+    <Compile Include="AssumeThatTests.cs" />
+    <Compile Include="CollectionAdapter.cs" />
+    <Compile Include="CollectionAssertTest.cs" />
+    <Compile Include="ConditionAssertTests.cs" />
+    <Compile Include="Constraints\AfterConstraintTests.cs" />
+    <Compile Include="Constraints\AndTest.cs" />
+    <Compile Include="Constraints\BasicConstraintTests.cs" />
+    <Compile Include="Constraints\CollectionConstraintTests.cs" />
+    <Compile Include="Constraints\ComparerTests.cs" />
+    <Compile Include="Constraints\ComparisonConstraintTests.cs" />
+    <Compile Include="Constraints\ConstraintTestBase.cs" />
+    <Compile Include="Constraints\EmptyConstraintTest.cs" />
+    <Compile Include="Constraints\EqualTest.cs" />
+    <Compile Include="Constraints\FloatingPointNumericsTest.cs" />
+    <Compile Include="Constraints\MsgUtilTests.cs" />
+    <Compile Include="Constraints\NotTest.cs" />
+    <Compile Include="Constraints\NumericsTest.cs" />
+    <Compile Include="Constraints\OrTest.cs" />
+    <Compile Include="Constraints\PathConstraintTests.cs" />
+    <Compile Include="Constraints\PropertyTests.cs" />
+    <Compile Include="Constraints\ReusableConstraintTests.cs" />
+    <Compile Include="Constraints\SameAsTest.cs" />
+    <Compile Include="Constraints\SerializableConstraintTest.cs" />
+    <Compile Include="Constraints\StringConstraintTests.cs" />
+    <Compile Include="Constraints\ThrowsConstraintTests.cs" />
+    <Compile Include="Constraints\ToStringTests.cs" />
+    <Compile Include="Constraints\TypeConstraintTests.cs" />
+    <Compile Include="DirectoryAssertTests.cs" />
+    <Compile Include="EqualsFixture.cs" />
+    <Compile Include="FileAssertTests.cs" />
+    <Compile Include="GreaterEqualFixture.cs" />
+    <Compile Include="GreaterFixture.cs" />
+    <Compile Include="LessEqualFixture.cs" />
+    <Compile Include="LessFixture.cs" />
+    <Compile Include="ListContentsTests.cs" />
+    <Compile Include="MessageChecker.cs" />
+    <Compile Include="NotEqualFixture.cs" />
+    <Compile Include="NotSameFixture.cs" />
+    <Compile Include="NullableTypesTests.cs" />
+    <Compile Include="RandomizerTests.cs" />
+    <Compile Include="RangeTests.cs" />
+    <Compile Include="SameFixture.cs" />
+    <Compile Include="StringAssertTests.cs" />
+    <Compile Include="Syntax\AfterTests.cs" />
+    <Compile Include="Syntax\ArbitraryConstraintMatching.cs" />
+    <Compile Include="Syntax\CollectionTests.cs" />
+    <Compile Include="Syntax\ComparisonTests.cs" />
+    <Compile Include="Syntax\EqualityTests.cs" />
+    <Compile Include="Syntax\InvalidCodeTests.cs" />
+    <Compile Include="Syntax\OperatorOverrides.cs" />
+    <Compile Include="Syntax\OperatorTests.cs" />
+    <Compile Include="Syntax\PathConstraintTests.cs" />
+    <Compile Include="Syntax\PropertyTests.cs" />
+    <Compile Include="Syntax\SerializableConstraints.cs" />
+    <Compile Include="Syntax\SimpleConstraints.cs" />
+    <Compile Include="Syntax\StringConstraints.cs" />
+    <Compile Include="Syntax\SyntaxTest.cs" />
+    <Compile Include="Syntax\TestCompiler.cs" />
+    <Compile Include="Syntax\ThrowsTests.cs" />
+    <Compile Include="Syntax\TypeConstraints.cs" />
+    <Compile Include="TestDelegates.cs" />
+    <Compile Include="TestFixtureAttributeTests.cs" />
+    <Compile Include="TextMessageWriterTests.cs" />
+    <Compile Include="TypeAssertTest.cs" />
+    <Compile Include="ValuesAttributeTests.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="data\TestImage1.jpg" />
+    <EmbeddedResource Include="data\TestImage2.jpg" />
+    <EmbeddedResource Include="data\TestText1.txt" />
+    <EmbeddedResource Include="data\TestText2.txt" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit.framework.tests.build" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/NUnitFramework/tests/nunit.framework.tests.dll.config b/src/NUnitFramework/tests/nunit.framework.tests.dll.config
deleted file mode 100644
index 0e85c3e..0000000
--- a/src/NUnitFramework/tests/nunit.framework.tests.dll.config
+++ /dev/null
@@ -1,94 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<configuration>
-
-	<!--
-	 This is the configuration file for the NUnitTests.nunit test project. You may
-	 need to create a similar configuration file for your own test project. 
-	 
-	 In your own configuration file, the include any appSettings that you require.
-	 The <NUnit> section is only needed if you want to use a non-default value
-	 for any of the settings.
-	-->
-  <configSections>
-	<sectionGroup name="NUnit">
-		<section name="TestCaseBuilder" type="System.Configuration.NameValueSectionHandler"/>
-		<section name="TestRunner" type="System.Configuration.NameValueSectionHandler"/>
-	</sectionGroup>
-  </configSections>
-  
-  <appSettings>
-    <!--   User application and configured property settings go here.-->
-    <!--   Example: <add key="settingName" value="settingValue"/> -->
-    <add key="test.setting" value="54321" />
-  </appSettings>
-
-  <NUnit>
-    <TestCaseBuilder>
-        <!-- Set to true to recognize old style test 
-             cases starting with "Test..." -->
-		<add key="OldStyleTestCases" value="false" />
-    </TestCaseBuilder>
-	<TestRunner>
-		<!-- Valid values are STA,MTA. Others ignored. -->
-		<add key="ApartmentState" value="MTA" />
-		
-		<!-- See ThreadPriority enum for other valid values -->
-		<add key="ThreadPriority" value="Normal" />	
-	</TestRunner>
-  </NUnit>
-
-   <!--
-    The following <runtime> section allows running nunit tests under 
-    .NET 1.0 by redirecting assemblies. The appliesTo attribute
-    causes the section to be ignored except under .NET 1.0.
-   --> 
- <runtime>
-   
-    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
-			appliesTo="v1.0.3705">
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Data" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Drawing" 
-                          publicKeyToken="b03f5f7f11d50a3a" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Windows.Forms" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Xml" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-    </assemblyBinding>
-  
-  </runtime>
-
-</configuration> 
diff --git a/src/NUnitFramework/tests/nunit.framework.tests_VS2005.csproj b/src/NUnitFramework/tests/nunit.framework.tests_VS2005.csproj
deleted file mode 100644
index b6ae801..0000000
--- a/src/NUnitFramework/tests/nunit.framework.tests_VS2005.csproj
+++ /dev/null
@@ -1,139 +0,0 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>8.0.50727</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{8C326431-AE57-4645-ACC1-A90A0B425129}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ApplicationIcon>
-    </ApplicationIcon>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit.framework.tests</AssemblyName>
-    <AssemblyOriginatorKeyFile>
-    </AssemblyOriginatorKeyFile>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.Framework.Tests</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <StartupObject>
-    </StartupObject>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release2005|AnyCPU' ">
-    <OutputPath>bin\Release2005\</OutputPath>
-    <DefineConstants>TRACE;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <Optimize>true</Optimize>
-    <NoWarn>618,672</NoWarn>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug2005|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\Debug2005\</OutputPath>
-    <DefineConstants>TRACE;DEBUG;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <NoWarn>618,672</NoWarn>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Drawing" />
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-    <ProjectReference Include="..\framework\nunit.framework.dll_VS2005.csproj">
-      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
-      <Name>nunit.framework.dll_VS2005</Name>
-      <Private>True</Private>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="ArrayEqualsFailureMessageFixture.cs" />
-    <Compile Include="ArrayEqualsFixture.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="ArrayNotEqualFixture.cs" />
-    <Compile Include="AssertExtensionTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="AssertionTest.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="CollectionAdapter.cs" />
-    <Compile Include="CollectionAssertTest.cs" />
-    <Compile Include="ConditionAssertTests.cs" />
-    <Compile Include="Constraints\AndTest.cs" />
-    <Compile Include="Constraints\CollectionConstraintTests.cs" />
-    <Compile Include="Constraints\ComparisonConstraintTests.cs" />
-    <Compile Include="Constraints\ConstraintTestBase.cs" />
-    <Compile Include="Constraints\EmptyTest.cs" />
-    <Compile Include="Constraints\EqualTest.cs" />
-    <Compile Include="Constraints\NotTest.cs" />
-    <Compile Include="Constraints\OrTest.cs" />
-    <Compile Include="Constraints\SameAsTest.cs" />
-    <Compile Include="Constraints\StringConstraintTests.cs" />
-    <Compile Include="AssertSyntaxTests.cs" />
-    <Compile Include="Constraints\TypeConstraintTests.cs" />
-    <Compile Include="EqualsFixture.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="FailureMessageFixture.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="FileAssertTests.cs" />
-    <Compile Include="GreaterEqualFixture.cs" />
-    <Compile Include="GreaterFixture.cs" />
-    <Compile Include="LessEqualFixture.cs" />
-    <Compile Include="LessFixture.cs" />
-    <Compile Include="ListContentsTests.cs" />
-    <Compile Include="MessageChecker.cs" />
-    <Compile Include="TextMessageWriterTests.cs" />
-    <Compile Include="MsgUtilTests.cs" />
-    <Compile Include="NotEqualFixture.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="NotSameFixture.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="SameFixture.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="StringAssertTests.cs" />
-    <Compile Include="TypeAssertTest.cs" />
-    <None Include="..\..\NUnitCore\core\Results.xsd">
-      <Link>Results.xsd</Link>
-      <SubType>Designer</SubType>
-    </None>
-    <None Include="..\..\NUnitCore\core\Results.xsx">
-      <Link>Results.xsx</Link>
-      <DependentUpon>Results.xsd</DependentUpon>
-    </None>
-  </ItemGroup>
-  <ItemGroup>
-    <EmbeddedResource Include="TestImage1.jpg" />
-    <EmbeddedResource Include="TestImage2.jpg" />
-    <EmbeddedResource Include="TestText1.txt" />
-    <EmbeddedResource Include="TestText2.txt" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
-</Project>
\ No newline at end of file
diff --git a/src/NUnitMocks/mocks/AssemblyInfo.cs b/src/NUnitMocks/mocks/AssemblyInfo.cs
index 2e2ef5f..22fea6f 100644
--- a/src/NUnitMocks/mocks/AssemblyInfo.cs
+++ b/src/NUnitMocks/mocks/AssemblyInfo.cs
@@ -1,12 +1,12 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
 using System.Reflection;
 
 [assembly: AssemblyDelaySign(false)]
-[assembly: AssemblyKeyFile("../../../../nunit.snk")]
+[assembly: AssemblyKeyFile("../../nunit.snk")]
 [assembly: AssemblyKeyName("")]
diff --git a/src/NUnitMocks/mocks/DynamicMock.cs b/src/NUnitMocks/mocks/DynamicMock.cs
index b65b351..60a5eff 100644
--- a/src/NUnitMocks/mocks/DynamicMock.cs
+++ b/src/NUnitMocks/mocks/DynamicMock.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitMocks/mocks/ICall.cs b/src/NUnitMocks/mocks/ICall.cs
index c178dc7..c20fff8 100644
--- a/src/NUnitMocks/mocks/ICall.cs
+++ b/src/NUnitMocks/mocks/ICall.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitMocks/mocks/ICallHandler.cs b/src/NUnitMocks/mocks/ICallHandler.cs
index c844a0a..27550de 100644
--- a/src/NUnitMocks/mocks/ICallHandler.cs
+++ b/src/NUnitMocks/mocks/ICallHandler.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitMocks/mocks/IMethod.cs b/src/NUnitMocks/mocks/IMethod.cs
index 5d394bb..49abee5 100644
--- a/src/NUnitMocks/mocks/IMethod.cs
+++ b/src/NUnitMocks/mocks/IMethod.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitMocks/mocks/IMock.cs b/src/NUnitMocks/mocks/IMock.cs
index 43d1e09..2c770dc 100644
--- a/src/NUnitMocks/mocks/IMock.cs
+++ b/src/NUnitMocks/mocks/IMock.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitMocks/mocks/IVerify.cs b/src/NUnitMocks/mocks/IVerify.cs
index 53aaee8..e28f71a 100644
--- a/src/NUnitMocks/mocks/IVerify.cs
+++ b/src/NUnitMocks/mocks/IVerify.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitMocks/mocks/MethodSignature.cs b/src/NUnitMocks/mocks/MethodSignature.cs
index 9dd6226..d7cd486 100644
--- a/src/NUnitMocks/mocks/MethodSignature.cs
+++ b/src/NUnitMocks/mocks/MethodSignature.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitMocks/mocks/Mock.cs b/src/NUnitMocks/mocks/Mock.cs
index 534e6de..0f2c02c 100644
--- a/src/NUnitMocks/mocks/Mock.cs
+++ b/src/NUnitMocks/mocks/Mock.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -27,6 +27,8 @@ namespace NUnit.Mocks
 
 		private Exception lastException;
 
+        private ArrayList unexpected = new ArrayList();
+
 		#endregion
 
 		#region Properties
@@ -97,11 +99,14 @@ namespace NUnit.Mocks
 
 		#region IVerify Members
 
-		public virtual void Verify()
-		{
-			foreach( IMethod method in methods.Values )
-				method.Verify();
-		}
+        public virtual void Verify()
+        {
+            foreach (IMethod method in methods.Values)
+                method.Verify();
+
+            if (unexpected.Count > 0)
+                Assert.Fail("Unexpected call to " + (string)unexpected[0]);
+        }
 
 		#endregion
 
@@ -124,8 +129,11 @@ namespace NUnit.Mocks
 				}
 			}
 			else // methodName is not listed in methods
-			if ( Strict )
-				Assert.Fail( "Unexpected call to " + methodName );
+                if (Strict)
+                {
+                    unexpected.Add(methodName);
+                    Assert.Fail("Unexpected call to " + methodName);
+                }
 			
 			// not listed but Strict is not specified
 			return null;
diff --git a/src/NUnitMocks/mocks/MockCall.cs b/src/NUnitMocks/mocks/MockCall.cs
index 2d5ef7f..0c0df99 100644
--- a/src/NUnitMocks/mocks/MockCall.cs
+++ b/src/NUnitMocks/mocks/MockCall.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -38,8 +38,8 @@ namespace NUnit.Mocks
 
 				for( int i = 0; i < expectedArgs.Length; i++ )
 				{
-					if ( expectedArgs[i] is Constraint )
-						Assert.That( actualArgs[i], (Constraint)expectedArgs[i] );
+					if ( expectedArgs[i] is IResolveConstraint )
+						Assert.That( actualArgs[i], (IResolveConstraint)expectedArgs[i] );
 					else
 						Assert.AreEqual( expectedArgs[i], actualArgs[i] );
 				}
diff --git a/src/NUnitMocks/mocks/MockInterfaceHandler.cs b/src/NUnitMocks/mocks/MockInterfaceHandler.cs
index 1306517..fc3b44c 100644
--- a/src/NUnitMocks/mocks/MockInterfaceHandler.cs
+++ b/src/NUnitMocks/mocks/MockInterfaceHandler.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitMocks/mocks/MockMethod.cs b/src/NUnitMocks/mocks/MockMethod.cs
index c8799be..b775650 100644
--- a/src/NUnitMocks/mocks/MockMethod.cs
+++ b/src/NUnitMocks/mocks/MockMethod.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitMocks/mocks/nunit.mocks.build b/src/NUnitMocks/mocks/nunit.mocks.build
index d4dc543..f6ded90 100644
--- a/src/NUnitMocks/mocks/nunit.mocks.build
+++ b/src/NUnitMocks/mocks/nunit.mocks.build
@@ -1,11 +1,7 @@
 <?xml version="1.0"?>
 <project name="NUnitMocks" default="build" basedir=".">
 
-  <target name="build">
-    <csc target="library" 
-        output="${current.build.dir}/nunit.mocks.dll"
-        debug="${build.debug}" define="${build.defines}">
-      <sources>
+  <patternset id="source-files">
         <include name="AssemblyInfo.cs"/>
         <include name="DynamicMock.cs"/>
         <include name="ICall.cs"/>
@@ -18,12 +14,20 @@
         <include name="MockCall.cs"/>
         <include name="MockInterfaceHandler.cs"/>
         <include name="MockMethod.cs"/>
-        <include name="../../CommonAssemblyInfo.cs"/>
+  </patternset>
+
+  <target name="build">
+    <csc target="library" 
+        output="${current.framework.dir}/nunit.mocks.dll"
+        debug="${build.debug}" define="${build.defines}">
+      <sources>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
       </sources>
       <nowarn>
-        <warning number="1699" if="${runtime.version=='2.0'}"/>
+        <warning number="1699" if="${runtime.version>='2.0'}"/>
       </nowarn>
-      <references basedir="${current.build.dir}">
+      <references basedir="${current.framework.dir}">
         <include name="nunit.framework.dll"/>
       </references>
     </csc>
@@ -31,7 +35,11 @@
 
   <target name="package">
     <copy todir="${package.src.dir}/NUnitMocks/mocks">
-      <fileset refid="source-files" />
+      <fileset>
+        <patternset refid="source-files"/>
+        <include name="nunit.mocks.csproj"/>
+        <include name="nunit.mocks.build"/>
+      </fileset>
     </copy>
   </target>
 
diff --git a/src/NUnitMocks/mocks/nunit.mocks.csproj b/src/NUnitMocks/mocks/nunit.mocks.csproj
index 1f2943c..23f7ea8 100644
--- a/src/NUnitMocks/mocks/nunit.mocks.csproj
+++ b/src/NUnitMocks/mocks/nunit.mocks.csproj
@@ -1,161 +1,105 @@
-<VisualStudioProject>
-    <CSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = ""
-                AssemblyKeyContainerName = ""
-                AssemblyName = "nunit.mocks"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "Library"
-                PreBuildEvent = ""
-                PostBuildEvent = ""
-                RootNamespace = "NUnit.Mocks"
-                RunPostBuildEvent = "OnBuildSuccess"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "true"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-                <Config
-                    Name = "Release"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "false"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "System"
-                    AssemblyName = "System"
-                    HintPath = "c:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.dll"
-                />
-                <Reference
-                    Name = "System.Data"
-                    AssemblyName = "System.Data"
-                    HintPath = "c:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Data.dll"
-                />
-                <Reference
-                    Name = "System.XML"
-                    AssemblyName = "System.Xml"
-                    HintPath = "c:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.XML.dll"
-                />
-                <Reference
-                    Name = "nunit.framework.dll"
-                    Project = "{83DD7E12-A705-4DBA-9D71-09C8973D9382}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-            </References>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "AssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CommonAssemblyInfo.cs"
-                    Link = "..\..\CommonAssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "DynamicMock.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ICall.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ICallHandler.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "IMethod.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "IMock.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "IVerify.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "MethodSignature.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Mock.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "MockCall.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "MockInterfaceHandler.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "MockMethod.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-            </Include>
-        </Files>
-    </CSHARP>
-</VisualStudioProject>
-
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit.mocks</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.Mocks</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\framework\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>1699</NoWarn>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\framework\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>1699</NoWarn>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
+      <Name>nunit.framework.dll</Name>
+      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="AssemblyInfo.cs" />
+    <Compile Include="DynamicMock.cs" />
+    <Compile Include="ICall.cs" />
+    <Compile Include="ICallHandler.cs" />
+    <Compile Include="IMethod.cs" />
+    <Compile Include="IMock.cs" />
+    <Compile Include="IVerify.cs" />
+    <Compile Include="MethodSignature.cs" />
+    <Compile Include="Mock.cs" />
+    <Compile Include="MockCall.cs" />
+    <Compile Include="MockInterfaceHandler.cs" />
+    <Compile Include="MockMethod.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit.mocks.build" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/NUnitMocks/mocks/nunit.mocks_VS2005.csproj b/src/NUnitMocks/mocks/nunit.mocks_VS2005.csproj
deleted file mode 100644
index 557e98b..0000000
--- a/src/NUnitMocks/mocks/nunit.mocks_VS2005.csproj
+++ /dev/null
@@ -1,107 +0,0 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>8.0.50727</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ApplicationIcon>
-    </ApplicationIcon>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit.mocks</AssemblyName>
-    <AssemblyOriginatorKeyFile>
-    </AssemblyOriginatorKeyFile>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.Mocks</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <StartupObject>
-    </StartupObject>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release2005|AnyCPU' ">
-    <OutputPath>bin\Release2005\</OutputPath>
-    <DefineConstants>TRACE;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <Optimize>true</Optimize>
-    <NoWarn>1699</NoWarn>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug2005|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\Debug2005\</OutputPath>
-    <DefineConstants>TRACE;DEBUG;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <NoWarn>1699</NoWarn>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="AssemblyInfo.cs" />
-    <Compile Include="DynamicMock.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="ICall.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="ICallHandler.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="IMethod.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="IMock.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="IVerify.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="MethodSignature.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="Mock.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="MockCall.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="MockInterfaceHandler.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="MockMethod.cs">
-      <SubType>Code</SubType>
-    </Compile>
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll_VS2005.csproj">
-      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
-      <Name>nunit.framework.dll_VS2005</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
-</Project>
\ No newline at end of file
diff --git a/src/NUnitMocks/tests/DynamicMockTests.cs b/src/NUnitMocks/tests/DynamicMockTests.cs
index 77ccfe7..a6b7277 100644
--- a/src/NUnitMocks/tests/DynamicMockTests.cs
+++ b/src/NUnitMocks/tests/DynamicMockTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/NUnitMocks/tests/MockTests.cs b/src/NUnitMocks/tests/MockTests.cs
index 58a3d90..49ee5f3 100644
--- a/src/NUnitMocks/tests/MockTests.cs
+++ b/src/NUnitMocks/tests/MockTests.cs
@@ -1,12 +1,11 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
 using NUnit.Framework;
-using NUnit.Framework.SyntaxHelpers;
 
 namespace NUnit.Mocks.Tests
 {
@@ -58,7 +57,7 @@ namespace NUnit.Mocks.Tests
 			mock.Verify();
 		}
 
-		[Test, ExpectedException( typeof(AssertionException) )]
+		[Test, ExpectedException(typeof(AssertionException))]
 		public void MethodNotCalled()
 		{
 			mock.Expect( "x" );
@@ -275,18 +274,36 @@ namespace NUnit.Mocks.Tests
 			mock.Verify();
 		}
 
-		[Test, ExpectedException( typeof( AssertionException ) )]
-		public void StrictMode()
-		{
-			mock.Strict = true;
-			mock.Expect( "method1" );
-			mock.Expect( "method2" );
-			mock.Call( "method1" );
-			mock.Call( "method2" );
-			mock.Call( "method3" );
-		}
-
-		[Test]
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void StrictMode()
+        {
+            mock.Strict = true;
+            mock.Expect("method1");
+            mock.Expect("method2");
+            mock.Call("method1");
+            mock.Call("method2");
+            mock.Call("method3");
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void StrictMode_ExceptionsCaught()
+        {
+            mock.Strict = true;
+            mock.Expect("method1");
+            mock.Expect("method2");
+            try
+            {
+                mock.Call("method1");
+                mock.Call("method2");
+                mock.Call("method3");
+            }
+            catch(Exception)
+            {}
+
+            mock.Verify();
+        }
+
+        [Test]
 		public void ChangeFixedReturnToExpectAndReturn()
 		{
 			mock.SetReturnValue( "MyMethod", "x" );
diff --git a/src/NUnitMocks/tests/nunit.mocks.tests..build b/src/NUnitMocks/tests/nunit.mocks.tests..build
deleted file mode 100644
index ba66fa5..0000000
--- a/src/NUnitMocks/tests/nunit.mocks.tests..build
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0"?>
-<project name="NUnit.Mocks.Tests" default="build" basedir=".">
-
-
-</project>
\ No newline at end of file
diff --git a/src/NUnitMocks/tests/nunit.mocks.tests.build b/src/NUnitMocks/tests/nunit.mocks.tests.build
index 3eb128a..08b2c61 100644
--- a/src/NUnitMocks/tests/nunit.mocks.tests.build
+++ b/src/NUnitMocks/tests/nunit.mocks.tests.build
@@ -1,17 +1,21 @@
 <?xml version="1.0"?>
 <project name="NUnit.Mocks.Tests" default="build" basedir=".">
 
+  <patternset id="source-files">
+    <include name="AssemblyInfo.cs"/>
+    <include name="DynamicMockTests.cs"/>
+    <include name="MockTests.cs"/>
+  </patternset>
+
   <target name="build">
     <csc target="library"
-       output="${current.build.dir}/nunit.mocks.tests.dll" 
+       output="${current.test.dir}/nunit.mocks.tests.dll" 
        debug="${build.debug}" define="${build.defines}">
       <sources>
-        <include name="AssemblyInfo.cs"/>
-        <include name="DynamicMockTests.cs"/>
-        <include name="MockTests.cs"/>
-        <include name="../../CommonAssemblyInfo.cs"/>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
       </sources>
-      <references basedir="${current.build.dir}">
+      <references basedir="${current.framework.dir}">
         <include name="nunit.framework.dll"/>
         <include name="nunit.mocks.dll"/>
       </references>
@@ -20,7 +24,11 @@
 
   <target name="package">
     <copy todir="${package.src.dir}/NUnitMocks/tests">
-      <fileset refid="source-files" />
+      <fileset>
+        <patternset refid="source-files"/>
+        <include name="nunit.mocks.tests.csproj"/>
+        <include name="nunit.mocks.tests.build"/>
+      </fileset>
     </copy>
   </target>
 
diff --git a/src/NUnitMocks/tests/nunit.mocks.tests.csproj b/src/NUnitMocks/tests/nunit.mocks.tests.csproj
index 02deafe..f6e9f40 100644
--- a/src/NUnitMocks/tests/nunit.mocks.tests.csproj
+++ b/src/NUnitMocks/tests/nunit.mocks.tests.csproj
@@ -1,116 +1,97 @@
-<VisualStudioProject>
-    <CSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{8667C588-1A05-4773-A9E8-272EB302B8AB}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = ""
-                AssemblyKeyContainerName = ""
-                AssemblyName = "nunit.mocks.tests"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "Library"
-                PreBuildEvent = ""
-                PostBuildEvent = ""
-                RootNamespace = "NUnit.Mocks.Tests"
-                RunPostBuildEvent = "OnBuildSuccess"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "true"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-                <Config
-                    Name = "Release"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "false"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "System"
-                    AssemblyName = "System"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.dll"
-                />
-                <Reference
-                    Name = "System.Data"
-                    AssemblyName = "System.Data"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Data.dll"
-                />
-                <Reference
-                    Name = "System.XML"
-                    AssemblyName = "System.Xml"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.XML.dll"
-                />
-                <Reference
-                    Name = "nunit.framework.dll"
-                    Project = "{83DD7E12-A705-4DBA-9D71-09C8973D9382}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.mocks"
-                    Project = "{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-            </References>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "CommonAssemblyInfo.cs"
-                    Link = "..\..\CommonAssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "DynamicMockTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "MockTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-            </Include>
-        </Files>
-    </CSHARP>
-</VisualStudioProject>
-
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{8667C588-1A05-4773-A9E8-272EB302B8AB}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit.mocks.tests</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.Mocks.Tests</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
+      <Name>nunit.framework.dll</Name>
+      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\mocks\nunit.mocks.csproj">
+      <Name>nunit.mocks</Name>
+      <Project>{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="DynamicMockTests.cs" />
+    <Compile Include="MockTests.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit.mocks.tests.build" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/NUnitMocks/tests/nunit.mocks.tests.dll.config b/src/NUnitMocks/tests/nunit.mocks.tests.dll.config
deleted file mode 100644
index 3238c85..0000000
--- a/src/NUnitMocks/tests/nunit.mocks.tests.dll.config
+++ /dev/null
@@ -1,88 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<configuration>
-
-	<!--
-	 This is the configuration file for the NUnitTests.nunit test project. You may
-	 need to create a similar configuration file for your own test project. 
-	 
-	 In your own configuration file, the include any appSettings that you require.
-	 The <NUnit> section is only needed if you want to use a non-default value
-	 for any of the settings.
-	-->
-  <configSections>
-	<sectionGroup name="NUnit">
-		<section name="TestRunner" type="System.Configuration.NameValueSectionHandler"/>
-	</sectionGroup>
-  </configSections>
-  
-  <appSettings>
-    <!--   User application and configured property settings go here.-->
-    <!--   Example: <add key="settingName" value="settingValue"/> -->
-    <add key="test.setting" value="54321" />
-  </appSettings>
-
-  <NUnit>
-	<TestRunner>
-		<!-- Valid values are STA,MTA. Others ignored. -->
-		<add key="ApartmentState" value="MTA" />
-		
-		<!-- See ThreadPriority enum for other valid values -->
-		<add key="ThreadPriority" value="Normal" />
-	</TestRunner>
-  </NUnit>
-
-   <!--
-    The following <runtime> section allows running nunit tests under 
-    .NET 1.0 by redirecting assemblies. The appliesTo attribute
-    causes the section to be ignored except under .NET 1.0.
-   --> 
- <runtime>
-   
-    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
-			appliesTo="v1.0.3705">
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Data" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Drawing" 
-                          publicKeyToken="b03f5f7f11d50a3a" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Windows.Forms" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Xml" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-    </assemblyBinding>
-  
-  </runtime>
-
-</configuration> 
diff --git a/src/NUnitMocks/tests/nunit.mocks.tests_VS2005.csproj b/src/NUnitMocks/tests/nunit.mocks.tests_VS2005.csproj
deleted file mode 100644
index 49aa6d1..0000000
--- a/src/NUnitMocks/tests/nunit.mocks.tests_VS2005.csproj
+++ /dev/null
@@ -1,81 +0,0 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>8.0.50727</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{8667C588-1A05-4773-A9E8-272EB302B8AB}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ApplicationIcon>
-    </ApplicationIcon>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit.mocks.tests</AssemblyName>
-    <AssemblyOriginatorKeyFile>
-    </AssemblyOriginatorKeyFile>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.Mocks.Tests</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <StartupObject>
-    </StartupObject>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release2005|AnyCPU' ">
-    <OutputPath>bin\Release2005\</OutputPath>
-    <DefineConstants>TRACE;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <Optimize>true</Optimize>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug2005|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\Debug2005\</OutputPath>
-    <DefineConstants>TRACE;DEBUG;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="DynamicMockTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="MockTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll_VS2005.csproj">
-      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
-      <Name>nunit.framework.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\mocks\nunit.mocks_VS2005.csproj">
-      <Project>{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}</Project>
-      <Name>nunit.mocks_VS2005</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
-</Project>
\ No newline at end of file
diff --git a/src/NUnitTestServer/nunit-agent-exe/App.config b/src/NUnitTestServer/nunit-agent-exe/App.config
new file mode 100644
index 0000000..84c2906
--- /dev/null
+++ b/src/NUnitTestServer/nunit-agent-exe/App.config
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+  
+  <runtime>
+    <!-- We need this so test exceptions don't crash NUnit -->
+    <legacyUnhandledExceptionPolicy enabled="1" />
+
+    <!-- Look for addins in the addins directory for now -->
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+      <probing privatePath="lib;addins"/>
+   </assemblyBinding>
+
+    <!--
+    The following <assemblyBinding> section allows running nunit under 
+    .NET 1.0 by redirecting assemblies. The appliesTo attribute
+    causes the section to be ignored except under .NET 1.0
+    on a machine with only the .NET version 1.0 runtime installed.
+    If application and its tests were built for .NET 1.1 you will
+    also need to redirect system assemblies in the test config file,
+    which controls loading of the tests.
+   -->
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
+			appliesTo="v1.0.3705">
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Data" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Drawing" 
+                          publicKeyToken="b03f5f7f11d50a3a" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Windows.Forms" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Xml" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+    </assemblyBinding>
+  
+  </runtime>
+  
+</configuration>
\ No newline at end of file
diff --git a/src/NUnitTestServer/nunit-agent-exe/AssemblyInfo.cs b/src/NUnitTestServer/nunit-agent-exe/AssemblyInfo.cs
new file mode 100644
index 0000000..a4dcd49
--- /dev/null
+++ b/src/NUnitTestServer/nunit-agent-exe/AssemblyInfo.cs
@@ -0,0 +1,11 @@
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Reflection;
+
+[assembly: AssemblyTitle("NUnit-Agent")]
+[assembly: AssemblyDescription("")]
diff --git a/src/NUnitTestServer/nunit-agent-exe/Program.cs b/src/NUnitTestServer/nunit-agent-exe/Program.cs
new file mode 100644
index 0000000..8929632
--- /dev/null
+++ b/src/NUnitTestServer/nunit-agent-exe/Program.cs
@@ -0,0 +1,122 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Runtime.Remoting.Services;
+using System.Runtime.Remoting.Channels;
+using System.Runtime.Remoting.Channels.Tcp;
+using System.Diagnostics;
+using NUnit.Core;
+using NUnit.Util;
+
+namespace NUnit.Agent
+{
+	/// <summary>
+	/// Summary description for Program.
+	/// </summary>
+	public class NUnitTestAgent
+	{
+		static Logger log = InternalTrace.GetLogger(typeof(NUnitTestAgent));
+
+        static Guid AgentId;
+        static string AgencyUrl;
+        static TestAgency Agency;
+
+        /// <summary>
+        /// Channel used for communications with the agency
+        /// and with clients
+        /// </summary>
+        static TcpChannel Channel;
+
+        /// <summary>
+		/// The main entry point for the application.
+		/// </summary>
+		[STAThread]
+		public static int Main(string[] args)
+		{
+            AgentId = new Guid(args[0]);
+            AgencyUrl = args[1];
+
+#if DEBUG
+            if ( args.Length > 2 && args[2] == "--pause" )
+                System.Windows.Forms.MessageBox.Show( "Attach debugger if desired, then press OK", "NUnit-Agent");
+#endif
+
+            // Create SettingsService early so we know the trace level right at the start
+            SettingsService settingsService = new SettingsService(false);
+            InternalTrace.Initialize("nunit-agent_%p.log", (InternalTraceLevel)settingsService.GetSetting("Options.InternalTraceLevel", InternalTraceLevel.Default));
+
+			log.Info("Agent process {0} starting", Process.GetCurrentProcess().Id);
+            log.Info("Running under version {0}, {1}", 
+                Environment.Version, 
+                RuntimeFramework.CurrentFramework.DisplayName);
+
+			// Add Standard Services to ServiceManager
+            log.Info("Adding Services");
+            ServiceManager.Services.AddService(settingsService);
+            ServiceManager.Services.AddService(new ProjectService());
+			ServiceManager.Services.AddService( new DomainManager() );
+			//ServiceManager.Services.AddService( new RecentFilesService() );
+			//ServiceManager.Services.AddService( new TestLoader() );
+			ServiceManager.Services.AddService( new AddinRegistry() );
+			ServiceManager.Services.AddService( new AddinManager() );
+
+			// Initialize Services
+            log.Info("Initializing Services");
+            ServiceManager.Services.InitializeServices();
+
+            Channel = ServerUtilities.GetTcpChannel();
+
+            log.Info("Connecting to TestAgency at {0}", AgencyUrl);
+            try
+            {
+                Agency = Activator.GetObject(typeof(TestAgency), AgencyUrl) as TestAgency;
+            }
+            catch (Exception ex)
+            {
+                log.Error("Unable to connect", ex);
+            }
+
+            if (Channel != null)
+            {
+                log.Info("Starting RemoteTestAgent");
+                RemoteTestAgent agent = new RemoteTestAgent(AgentId, Agency);
+
+                try
+                {
+                    if (agent.Start())
+                    {
+                        log.Debug("Waiting for stopSignal");
+                        agent.WaitForStop();
+                        log.Debug("Stop signal received");
+                    }
+                    else
+                        log.Error("Failed to start RemoteTestAgent");
+                }
+                catch (Exception ex)
+                {
+                    log.Error("Exception in RemoteTestAgent", ex);
+                }
+
+                log.Info("Unregistering Channel");
+                try
+                {
+                    ChannelServices.UnregisterChannel(Channel);
+                }
+                catch (Exception ex)
+                {
+                    log.Error("ChannelServices.UnregisterChannel threw an exception", ex);
+                }
+            }
+
+            log.Info("Stopping all services");
+            ServiceManager.Services.StopAllServices();
+            log.Info("Agent process {0} exiting", Process.GetCurrentProcess().Id);
+            InternalTrace.Close();
+
+			return 0;
+		}
+	}
+}
diff --git a/src/NUnitTestServer/nunit-agent-exe/Ship.config b/src/NUnitTestServer/nunit-agent-exe/Ship.config
new file mode 100644
index 0000000..84c2906
--- /dev/null
+++ b/src/NUnitTestServer/nunit-agent-exe/Ship.config
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+  
+  <runtime>
+    <!-- We need this so test exceptions don't crash NUnit -->
+    <legacyUnhandledExceptionPolicy enabled="1" />
+
+    <!-- Look for addins in the addins directory for now -->
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+      <probing privatePath="lib;addins"/>
+   </assemblyBinding>
+
+    <!--
+    The following <assemblyBinding> section allows running nunit under 
+    .NET 1.0 by redirecting assemblies. The appliesTo attribute
+    causes the section to be ignored except under .NET 1.0
+    on a machine with only the .NET version 1.0 runtime installed.
+    If application and its tests were built for .NET 1.1 you will
+    also need to redirect system assemblies in the test config file,
+    which controls loading of the tests.
+   -->
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
+			appliesTo="v1.0.3705">
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Data" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Drawing" 
+                          publicKeyToken="b03f5f7f11d50a3a" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Windows.Forms" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Xml" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+    </assemblyBinding>
+  
+  </runtime>
+  
+</configuration>
\ No newline at end of file
diff --git a/src/NUnitTestServer/nunit-agent-exe/nunit-agent.exe.build b/src/NUnitTestServer/nunit-agent-exe/nunit-agent.exe.build
new file mode 100644
index 0000000..f458eb4
--- /dev/null
+++ b/src/NUnitTestServer/nunit-agent-exe/nunit-agent.exe.build
@@ -0,0 +1,64 @@
+<?xml version="1.0"?>
+<project name="NUnitAgentExe" default="build" basedir=".">
+
+  <patternset id="source-files">
+    <include name="Program.cs"/>
+    <include name="AssemblyInfo.cs"/>
+  </patternset>
+
+  <target name="build">
+
+    <csc target="winexe" 
+        output="${current.build.dir}/nunit-agent.exe"
+        debug="${build.debug}" define="${build.defines}">
+      <sources>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
+      </sources>
+      <references basedir="${current.lib.dir}">
+        <include name="System.Runtime.Remoting.dll"/>
+        <include name="System.Windows.Forms.dll"/>
+        <include name="nunit.core.interfaces.dll"/>
+        <include name="nunit.core.dll"/>
+        <include name="nunit.util.dll"/>
+      </references>
+    </csc>
+
+    <copy file="Ship.config"
+      tofile="${current.build.dir}/nunit-agent.exe.config"/>
+
+    <csc target="winexe" 
+        output="${current.build.dir}/nunit-agent-x86.exe"
+        debug="${build.debug}" define="${build.defines}"
+        platform="x86" if="${build.x86}">
+      <sources>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
+      </sources>
+      <references basedir="${current.lib.dir}">
+        <include name="System.Runtime.Remoting.dll"/>
+        <include name="System.Windows.Forms.dll"/>
+        <include name="nunit.core.interfaces.dll"/>
+        <include name="nunit.core.dll"/>
+        <include name="nunit.util.dll"/>
+      </references>
+    </csc>
+
+    <copy file="Ship.config" if="${build.x86}"
+      tofile="${current.build.dir}/nunit-agent-x86.exe.config"/>
+
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/NUnitTestServer/nunit-agent-exe">
+      <fileset>
+        <patternset refid="source-files" />
+        <include name="App.config" />
+        <include name="Ship.config"/>
+        <include name="nunit-agent.exe.csproj"/>
+        <include name="nunit-agent.exe.build"/>
+      </fileset>
+    </copy>
+  </target>
+
+</project>
\ No newline at end of file
diff --git a/src/NUnitTestServer/nunit-agent-exe/nunit-agent.exe.csproj b/src/NUnitTestServer/nunit-agent-exe/nunit-agent.exe.csproj
new file mode 100644
index 0000000..cd602e9
--- /dev/null
+++ b/src/NUnitTestServer/nunit-agent-exe/nunit-agent.exe.csproj
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{3E469CD9-FED2-4955-AE4C-669A74CA6767}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit-agent</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>WinExe</OutputType>
+    <RootNamespace>NUnit.Agent</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <NoWin32Manifest>true</NoWin32Manifest>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Drawing">
+      <Name>System.Drawing</Name>
+    </Reference>
+    <Reference Include="System.Runtime.Remoting" />
+    <Reference Include="System.Windows.Forms">
+      <Name>System.Windows.Forms</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
+      <Name>nunit.util.dll</Name>
+      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
+      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
+      <Name>nunit.core.dll</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
+      <Name>nunit.core.interfaces.dll</Name>
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
+    <None Include="nunit-agent.exe.build" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="AssemblyInfo.cs" />
+    <Compile Include="Program.cs" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/GuiRunner/nunit-gui/App.ico b/src/NUnitTestServer/nunit-server-exe/App.ico
similarity index 100%
rename from src/GuiRunner/nunit-gui/App.ico
rename to src/NUnitTestServer/nunit-server-exe/App.ico
diff --git a/src/NUnitTestServer/nunit-server-exe/TestServerConsoleApp.cs b/src/NUnitTestServer/nunit-server-exe/TestServerConsoleApp.cs
new file mode 100644
index 0000000..94dcd3c
--- /dev/null
+++ b/src/NUnitTestServer/nunit-server-exe/TestServerConsoleApp.cs
@@ -0,0 +1,42 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using NUnit.Util;
+
+namespace NUnit.TestServerApp
+{
+	/// <summary>
+	/// Summary description for Class1.
+	/// </summary>
+	class TestServerConsoleApp
+	{
+		/// <summary>
+		/// The main entry point for the application.
+		/// </summary>
+		[STAThread]
+		static void Main(string[] args)
+		{ 
+			Console.WriteLine( "Starting Server" );
+
+			string uri = "TestServer";
+			int port = 9000;
+
+			if ( args.Length > 0 )
+				uri = args[0];
+
+			if ( args.Length > 1 )
+				port = int.Parse( args[1] );
+
+			TestServer server = new TestServer( uri, port );
+			server.Start();
+
+			Console.WriteLine( "Waiting for Stop" );
+			server.WaitForStop();
+
+			Console.WriteLine( "Exiting" );
+		}
+	}
+}
diff --git a/src/NUnitTestServer/nunit-server-exe/nunit-server.exe.build b/src/NUnitTestServer/nunit-server-exe/nunit-server.exe.build
new file mode 100644
index 0000000..2d39b23
--- /dev/null
+++ b/src/NUnitTestServer/nunit-server-exe/nunit-server.exe.build
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<project name="NUnitServerExe" default="build" basedir=".">
+
+  <target name="build">
+    <csc target="winexe" 
+        output="${current.build.dir}/nunit-server.exe"
+        debug="${build.debug}" define="${build.defines}">
+      <sources>
+        <include name="TestServerConsoleApp.cs"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
+      </sources>
+      <references basedir="${current.lib.dir}">
+        <include name="nunit.core.interfaces.dll"/>
+        <include name="nunit.core.dll"/>
+        <include name="nunit.util.dll"/>
+      </references>
+    </csc>
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/NUnitTestServer/nunit-server-exe">
+      <fileset>
+        <include name="TestServerConsoleApp.cs"/>
+        <include name="App.ico"/>
+        <include name="App.config"/>
+        <include name="nunit-server.exe.csproj"/>
+        <include name="nunit-server.exe.build"/>
+      </fileset>
+    </copy>
+  </target>
+
+</project>
\ No newline at end of file
diff --git a/src/NUnitTestServer/nunit-server-exe/nunit-server.exe.csproj b/src/NUnitTestServer/nunit-server-exe/nunit-server.exe.csproj
new file mode 100644
index 0000000..09d6a86
--- /dev/null
+++ b/src/NUnitTestServer/nunit-server-exe/nunit-server.exe.csproj
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{6431BD41-67B9-4C62-8B7C-4D7527D2E8F0}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit-server</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>WinExe</OutputType>
+    <RootNamespace>NUnit.TestServer</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
+      <Name>nunit.util.dll</Name>
+      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
+      <Name>nunit.core.dll</Name>
+      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
+      <Name>nunit.core.interfaces.dll</Name>
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\tests\nunit.core.tests.csproj">
+      <Name>nunit.core.tests</Name>
+      <Project>{DD758D21-E5D5-4D40-9450-5F65A32F359C}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="App.ico" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="TestServerConsoleApp.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit-server.exe.build" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/PNUnit/agent.conf b/src/PNUnit/agent.conf
new file mode 100644
index 0000000..b4cf550
--- /dev/null
+++ b/src/PNUnit/agent.conf
@@ -0,0 +1,4 @@
+<AgentConfig>
+  <Port>8080</Port>
+  <PathToAssemblies>.</PathToAssemblies>
+</AgentConfig>
\ No newline at end of file
diff --git a/src/PNUnit/agent.log.conf b/src/PNUnit/agent.log.conf
new file mode 100644
index 0000000..d340cad
--- /dev/null
+++ b/src/PNUnit/agent.log.conf
@@ -0,0 +1,18 @@
+<log4net>
+	<!-- A1 is set to be a ConsoleAppender -->
+	<appender name="A1" type="log4net.Appender.ConsoleAppender">
+
+		<!-- A1 uses PatternLayout -->
+		<layout type="log4net.Layout.PatternLayout">
+			<!-- Print the date in ISO 8601 format -->
+			<conversionPattern value="%-5level %logger - %message%newline" />
+		</layout>
+	</appender>
+	
+	<!-- Set root logger level to DEBUG and its only appender to A1 -->
+	<root>
+		<level value="DEBUG" />
+		<appender-ref ref="A1" />
+	</root>
+
+</log4net>
diff --git a/src/PNUnit/agent/AgentConfig.cs b/src/PNUnit/agent/AgentConfig.cs
new file mode 100644
index 0000000..efdeb08
--- /dev/null
+++ b/src/PNUnit/agent/AgentConfig.cs
@@ -0,0 +1,25 @@
+using System;
+using System.IO;
+using System.Xml.Serialization;
+
+
+namespace PNUnit.Agent
+{
+	[Serializable]
+	public class AgentConfig
+	{
+		public int Port;
+		public string PathToAssemblies;
+	}
+
+	public class AgentConfigLoader
+	{
+		public static AgentConfig LoadFromFile(string file)
+		{
+			FileStream reader = new FileStream(file, FileMode.Open, FileAccess.Read);
+			XmlSerializer ser= new XmlSerializer(typeof(AgentConfig));
+			return (AgentConfig)ser.Deserialize(reader);
+		}
+	}
+
+}
diff --git a/src/PNUnit/agent/App.config b/src/PNUnit/agent/App.config
new file mode 100644
index 0000000..5ed5f7b
--- /dev/null
+++ b/src/PNUnit/agent/App.config
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<configuration>
+
+  <!-- Set the level for tracing NUnit itself -->
+  <!-- 0=Off 1=Error 2=Warning 3=Info 4=Debug -->
+  <system.diagnostics>
+	  <switches>
+      <add name="NTrace" value="0" />
+	  </switches>
+  </system.diagnostics>
+  
+  <runtime>
+    <!-- We need this so test exceptions don't crash NUnit -->
+    <legacyUnhandledExceptionPolicy enabled="1" />
+
+    <!-- Look for addins in the addins directory for now -->
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+      <probing privatePath="framework;lib;addins"/>
+   </assemblyBinding>
+
+    <!--
+    The following <assemblyBinding> section allows running nunit under 
+    .NET 1.0 by redirecting assemblies. The appliesTo attribute
+    causes the section to be ignored except under .NET 1.0
+    on a machine with only the .NET version 1.0 runtime installed.
+    If application and its tests were built for .NET 1.1 you will
+    also need to redirect system assemblies in the test config file,
+    which controls loading of the tests.
+   -->
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
+			appliesTo="v1.0.3705">
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Data" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Drawing" 
+                          publicKeyToken="b03f5f7f11d50a3a" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Windows.Forms" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Xml" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+    </assemblyBinding>
+  
+  </runtime>
+  
+</configuration>
\ No newline at end of file
diff --git a/src/ConsoleRunner/nunit-console-exe/App.ico b/src/PNUnit/agent/App.ico
similarity index 100%
copy from src/ConsoleRunner/nunit-console-exe/App.ico
copy to src/PNUnit/agent/App.ico
diff --git a/src/PNUnit/agent/AssemblyInfo.cs b/src/PNUnit/agent/AssemblyInfo.cs
new file mode 100644
index 0000000..7e0ae00
--- /dev/null
+++ b/src/PNUnit/agent/AssemblyInfo.cs
@@ -0,0 +1,58 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+//
+// La información general de un ensamblado se controla mediante el siguiente 
+// conjunto de atributos. Cambie estos atributos para modificar la información
+// asociada con un ensamblado.
+//
+[assembly: AssemblyTitle("")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]		
+
+//
+// La información de versión de un ensamblado consta de los siguientes cuatro valores:
+//
+//      Versión principal
+//      Versión secundaria 
+//      Versión de compilación
+//      Revisión
+//
+// Puede especificar todos los valores o usar los valores predeterminados (número de versión de compilación y de revisión) 
+// usando el símbolo '*' como se muestra a continuación:
+
+[assembly: AssemblyVersion("1.0.*")]
+
+//
+// Si desea firmar el ensamblado, debe especificar una clave para su uso. Consulte la documentación de 
+// Microsoft .NET Framework para obtener más información sobre la firma de ensamblados.
+//
+// Utilice los atributos siguientes para controlar qué clave desea utilizar para firmar. 
+//
+// Notas: 
+//   (*) Si no se especifica ninguna clave, el ensamblado no se firma.
+//   (*) KeyName se refiere a una clave instalada en el Proveedor de servicios
+//       de cifrado (CSP) en el equipo. KeyFile se refiere a un archivo que contiene
+//       una clave.
+//   (*) Si se especifican los valores KeyFile y KeyName, tendrá 
+//       lugar el siguiente proceso:
+//       (1) Si KeyName se puede encontrar en el CSP, se utilizará dicha clave.
+//       (2) Si KeyName no existe pero sí KeyFile, se instalará 
+//           y utilizará la clave de KeyFile en el CSP.
+//   (*) Para crear KeyFile, puede ejecutar la utilidad sn.exe (Strong Name).
+//       Cuando se especifica KeyFile, la ubicación de KeyFile debe ser
+//       relativa al directorio de resultados del proyecto, que es
+//       %Directorio del proyecto%\obj\<configuración>. Por ejemplo, si KeyFile
+//       se encuentra en el directorio del proyecto, el atributo AssemblyKeyFile se especifica 
+//       como [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
+//   (*) Firma retardada es una opción avanzada; consulte la documentación de
+//       Microsoft .NET Framework para obtener más información.
+//
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("")]
+[assembly: AssemblyKeyName("")]
diff --git a/src/PNUnit/agent/PNUnitTestRunner.cs b/src/PNUnit/agent/PNUnitTestRunner.cs
new file mode 100644
index 0000000..33aaba3
--- /dev/null
+++ b/src/PNUnit/agent/PNUnitTestRunner.cs
@@ -0,0 +1,381 @@
+using System;
+using System.IO;
+using System.Threading;
+using System.Collections.Specialized;
+using System.Diagnostics;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Reflection;
+using System.Resources;
+
+
+using PNUnit.Framework;
+
+using NUnit.Core;
+using NUnit.Util;
+#if NUNIT_2_5
+using TestInfo = PNUnit.Framework.TestInfo;
+using TestCaseResult = NUnit.Core.TestResult;
+using TestSuiteResult = NUnit.Core.TestResult;
+using TestCase = NUnit.Core.Test;
+#endif
+
+using log4net;
+
+namespace PNUnit.Agent
+{
+	public class PNUnitTestRunner: MarshalByRefObject, ITestConsoleAccess
+	{
+		private static readonly ILog log = LogManager.GetLogger(typeof(PNUnitTestRunner));
+		private TestInfo mTestInfo;
+		private Thread mThread;
+		private AgentConfig mConfig;
+		private static object obj = new object();
+
+		public PNUnitTestRunner(TestInfo info, AgentConfig config)
+		{
+			mConfig = config;
+			mTestInfo = info;
+		}
+
+		public void Run()
+		{
+			log.Info("Spawning a new thread");
+			mThread = new Thread(new ThreadStart(ThreadProc));
+			mThread.Start();
+		}
+
+		private void ThreadProc()
+		{
+			PNUnitTestResult result = null;
+			TestDomain testDomain = new TestDomain();
+
+			try
+			{
+				log.InfoFormat("Thread entered for Test {0}:{1} Assembly {2}",
+					mTestInfo.TestName, mTestInfo.TestToRun, mTestInfo.AssemblyName);
+				ConsoleWriter outStream = new ConsoleWriter(Console.Out);
+
+//				ConsoleWriter errorStream = new ConsoleWriter(Console.Error);                     
+          
+#if NUNIT_2_5
+                ITest test = MakeTest(testDomain, Path.Combine(mConfig.PathToAssemblies, mTestInfo.AssemblyName));
+#else
+				testDomain.ShadowCopyFiles = false;
+
+				Test test = MakeTest(testDomain, Path.Combine(mConfig.PathToAssemblies, mTestInfo.AssemblyName));
+#endif
+
+                if (test == null)
+				{
+					Console.Error.WriteLine("Unable to locate tests");
+                
+					mTestInfo.Services.NotifyResult(
+						mTestInfo.TestName, null);
+                
+					return;
+				}
+
+				Directory.SetCurrentDirectory(mConfig.PathToAssemblies); // test directory ?
+		
+				EventListener collector = new EventCollector( outStream );
+
+//				string savedDirectory = Environment.CurrentDirectory;
+
+				log.Info("Creating PNUnitServices in the AppDomain of the test");
+				object[] param = { mTestInfo, (ITestConsoleAccess)this }; 
+
+				testDomain.AppDomain.CreateInstanceAndUnwrap(
+					typeof(PNUnitServices).Assembly.FullName, 
+					typeof(PNUnitServices).FullName,
+					false, BindingFlags.Default, null, param, null, null, null);
+
+				log.Info("Running tests");
+
+				try
+				{
+#if NUNIT_2_5
+                    TestFilter filter = new NUnit.Core.Filters.SimpleNameFilter(mTestInfo.TestToRun);
+                    result = new PNUnitTestResult(testDomain.Run(collector, filter));
+#else
+                    result = new PNUnitTestResult(testDomain.Run(collector, new string[1] { mTestInfo.TestToRun })[0]);
+#endif
+                }
+				catch( Exception e )
+				{
+					result = new PNUnitTestResult(e);
+				}
+                
+			}
+			finally
+			{
+				log.Info("Notifying the results");
+				mTestInfo.Services.NotifyResult(
+					mTestInfo.TestName, result);
+				//Bug with framework
+				if (IsWindows())
+				{
+					lock(obj)
+					{
+						log.Info("Unloading test appdomain");
+						testDomain.Unload();
+						log.Info("Unloaded test appdomain");
+					}
+				}
+			}
+
+		}
+
+#if NUNIT_2_5
+        private ITest MakeTest(TestDomain testDomain, string assemblyName)
+        {
+            TestPackage package = new TestPackage(assemblyName);
+            package.Settings["ShadowCopyFiles"] = false;
+
+            return testDomain.Load(package) ? testDomain.Test : null;
+        }
+#else
+        private Test MakeTest(TestDomain testDomain, string assemblyName)
+		{
+			NUnitProject project;
+                
+			project = NUnitProject.FromAssembly(assemblyName);
+                                 
+			return testDomain.Load(project);
+        }
+#endif
+
+		#region MarshallByRefObject
+		// Lives forever
+		public override object InitializeLifetimeService()
+		{
+			return null;
+		}
+		#endregion
+
+
+		#region Nested Class to Handle Events
+
+#if NUNIT_2_5
+        private class EventCollector : MarshalByRefObject, EventListener
+#else
+        private class EventCollector : LongLivingMarshalByRefObject, EventListener
+#endif
+        {
+			private int testRunCount;
+			private int testIgnoreCount;
+			private int failureCount;
+			private int level;
+
+			private ConsoleWriter writer;
+
+			StringCollection messages = new StringCollection();
+		
+			private bool debugger = false;
+			private string currentTestName;
+
+			public EventCollector( ConsoleWriter writer )
+			{
+				debugger = Debugger.IsAttached;
+				level = 0;
+				this.writer = writer;
+				this.currentTestName = string.Empty;
+			}
+
+#if NUNIT_2_5
+            public void RunStarted(string name, int testCount)
+            {
+            }
+
+            public void RunFinished(TestResult result)
+            {
+            }
+#else
+			public void RunStarted(Test[] tests)
+			{
+			}
+
+			public void RunFinished(TestResult[] results)
+			{
+			}
+#endif
+
+			public void RunFinished(Exception exception)
+			{
+			}
+
+			public void TestFinished(TestCaseResult testResult)
+			{
+				if(testResult.Executed)
+				{
+					testRunCount++;
+					
+					if(testResult.IsFailure)
+					{	
+						failureCount++;
+						Console.Write("F");
+						if ( debugger )
+						{
+#if NUNIT_2_5
+                            messages.Add(string.Format("{0}) {1} :", failureCount, testResult.Test.TestName.FullName));
+#else
+							messages.Add( string.Format( "{0}) {1} :", failureCount, testResult.Test.FullName ) );
+#endif
+                            messages.Add(testResult.Message.Trim(Environment.NewLine.ToCharArray()));
+
+							string stackTrace = StackTraceFilter.Filter( testResult.StackTrace );
+							string[] trace = stackTrace.Split( System.Environment.NewLine.ToCharArray() );
+							foreach( string s in trace )
+							{
+								if ( s != string.Empty )
+								{
+									string link = Regex.Replace( s.Trim(), @".* in (.*):line (.*)", "$1($2)");
+									messages.Add( string.Format( "at\n{0}", link ) );
+								}
+							}
+						}
+					}
+				}
+				else
+				{
+					testIgnoreCount++;
+					Console.Write("N");
+				}
+
+
+				currentTestName = string.Empty;
+			}
+
+#if NUNIT_2_5
+			public void TestStarted(TestName testName)
+			{
+				currentTestName = testName.FullName;
+
+				//                if ( options.labels )
+				//                    writer.WriteLine("***** {0}", testCase.FullName );
+				//                else if ( !options.xmlConsole )
+				//                    Console.Write(".");
+			}
+
+			public void SuiteStarted(TestName testName) 
+			{
+				if ( debugger && level++ == 0 )
+				{
+					testRunCount = 0;
+					testIgnoreCount = 0;
+					failureCount = 0;
+					Trace.WriteLine( "################################ UNIT TESTS ################################" );
+					Trace.WriteLine( "Running tests in '" + testName.FullName + "'..." );
+				}
+			}
+#else
+			public void TestStarted(TestCase testCase)
+			{
+				currentTestName = testCase.FullName;
+
+				//                if ( options.labels )
+				//                    writer.WriteLine("***** {0}", testCase.FullName );
+				//                else if ( !options.xmlConsole )
+				//                    Console.Write(".");
+			}
+
+			public void SuiteStarted(TestSuite suite) 
+			{
+				if ( debugger && level++ == 0 )
+				{
+					testRunCount = 0;
+					testIgnoreCount = 0;
+					failureCount = 0;
+					Trace.WriteLine( "################################ UNIT TESTS ################################" );
+					Trace.WriteLine( "Running tests in '" + suite.FullName + "'..." );
+				}
+			}
+#endif
+
+			public void SuiteFinished(TestSuiteResult suiteResult) 
+			{
+				if ( debugger && --level == 0) 
+				{
+					Trace.WriteLine( "############################################################################" );
+
+					if (messages.Count == 0) 
+					{
+						Trace.WriteLine( "##############                 S U C C E S S               #################" );
+					}
+					else 
+					{
+						Trace.WriteLine( "##############                F A I L U R E S              #################" );
+						
+						foreach ( string s in messages ) 
+						{
+							Trace.WriteLine(s);
+						}
+					}
+
+					Trace.WriteLine( "############################################################################" );
+					Trace.WriteLine( "Executed tests : " + testRunCount );
+					Trace.WriteLine( "Ignored tests  : " + testIgnoreCount );
+					Trace.WriteLine( "Failed tests   : " + failureCount );
+					Trace.WriteLine( "Total time     : " + suiteResult.Time + " seconds" );
+					Trace.WriteLine( "############################################################################");
+				}
+			}
+
+			public void UnhandledException( Exception exception )
+			{
+				string msg = string.Format( "##### Unhandled Exception while running {0}", currentTestName );
+
+				// If we do labels, we already have a newline
+				//if ( !options.labels ) writer.WriteLine();
+				writer.WriteLine( msg );
+				writer.WriteLine( exception.ToString() );
+
+				if ( debugger )
+				{
+					Trace.WriteLine( msg );
+					Trace.WriteLine( exception.ToString() );
+				}
+			}
+            
+			public void TestOutput( TestOutput output)
+			{
+			}
+
+#if NUNIT_2_5
+            public override object InitializeLifetimeService()
+            {
+                return null;
+            }
+#endif
+		}
+
+		#endregion
+
+		public void WriteLine(string s)
+		{
+			Console.WriteLine(s);
+		}
+
+		public void Write(char[] buf)
+		{
+			Console.Write(buf);
+		}
+        
+		public void Write(char[] buf, int index, int count)
+		{
+			Console.Write(buf, index, count);
+		}
+
+		public static bool IsWindows()
+		{
+			switch (Environment.OSVersion.Platform)
+			{
+				case PlatformID.Win32Windows: 
+				case System.PlatformID.Win32S:
+				case PlatformID.Win32NT:
+					return true;
+			}
+			return false;
+		}
+	}
+}
diff --git a/src/PNUnit/agent/Ship.config b/src/PNUnit/agent/Ship.config
new file mode 100644
index 0000000..5ed5f7b
--- /dev/null
+++ b/src/PNUnit/agent/Ship.config
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<configuration>
+
+  <!-- Set the level for tracing NUnit itself -->
+  <!-- 0=Off 1=Error 2=Warning 3=Info 4=Debug -->
+  <system.diagnostics>
+	  <switches>
+      <add name="NTrace" value="0" />
+	  </switches>
+  </system.diagnostics>
+  
+  <runtime>
+    <!-- We need this so test exceptions don't crash NUnit -->
+    <legacyUnhandledExceptionPolicy enabled="1" />
+
+    <!-- Look for addins in the addins directory for now -->
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+      <probing privatePath="framework;lib;addins"/>
+   </assemblyBinding>
+
+    <!--
+    The following <assemblyBinding> section allows running nunit under 
+    .NET 1.0 by redirecting assemblies. The appliesTo attribute
+    causes the section to be ignored except under .NET 1.0
+    on a machine with only the .NET version 1.0 runtime installed.
+    If application and its tests were built for .NET 1.1 you will
+    also need to redirect system assemblies in the test config file,
+    which controls loading of the tests.
+   -->
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
+			appliesTo="v1.0.3705">
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Data" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Drawing" 
+                          publicKeyToken="b03f5f7f11d50a3a" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Windows.Forms" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Xml" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+    </assemblyBinding>
+  
+  </runtime>
+  
+</configuration>
\ No newline at end of file
diff --git a/src/PNUnit/agent/agent.cs b/src/PNUnit/agent/agent.cs
new file mode 100644
index 0000000..f1fac64
--- /dev/null
+++ b/src/PNUnit/agent/agent.cs
@@ -0,0 +1,146 @@
+using System;
+using System.IO;
+using System.Collections;
+using System.Runtime.Remoting;
+using System.Runtime.Remoting.Channels;
+using System.Runtime.Remoting.Channels.Tcp;
+using System.Runtime.Serialization.Formatters;
+using System.Reflection;
+
+using log4net;
+using log4net.Config;
+
+using PNUnit.Framework;
+
+#if NUNIT_2_5
+using NUnit.Util;
+#endif
+
+namespace PNUnit.Agent
+{
+	class Agent
+	{
+		[STAThread]
+		static void Main(string[] args)
+		{
+			AgentConfig config = new AgentConfig();
+
+#if NUNIT_2_5
+            // Start required services
+            ServiceManager.Services.AddService(new SettingsService());
+            ServiceManager.Services.AddService(new DomainManager());
+            // TODO: We use ProjectService in DomainManager - try to eliminate
+            ServiceManager.Services.AddService(new ProjectService());
+#endif
+
+			// Load the test configuration file
+			if( args.Length != 1 && args.Length != 2)
+			{
+				Console.WriteLine("Usage: agent [configfile | port path_to_assemblies]");
+				return;
+			}
+			else if (args.Length == 1) 
+			{
+
+				string configfile = args[0];
+                        
+				config = AgentConfigLoader.LoadFromFile(configfile);
+      
+				if( config == null )
+				{
+					Console.WriteLine("No agent.conf file found");
+				}
+			}
+			else if (args.Length == 2)
+			{
+				config.Port = int.Parse(args[0]);
+				config.PathToAssemblies = args[1];
+			}
+            
+			ConfigureLogging();
+
+			PNUnitAgent agent = new PNUnitAgent();
+			agent.Run(config);
+		}
+
+		private static void ConfigureLogging()
+		{
+			string log4netpath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "agent.log.conf");
+			Console.WriteLine(log4netpath);
+			XmlConfigurator.Configure(new FileInfo(log4netpath));
+		}
+	}
+
+	public class PNUnitAgent: MarshalByRefObject, IPNUnitAgent
+	{
+
+
+		private AgentConfig mConfig;
+		private static readonly ILog log = LogManager.GetLogger(typeof(PNUnitAgent));
+
+		#region IPNUnitAgent
+
+		public void RunTest(TestInfo info)
+		{
+			log.InfoFormat("RunTest called for Test {0}, AssemblyName {1}, TestToRun {2}",
+				info.TestName, info.AssemblyName, info.TestToRun);
+
+			new PNUnitTestRunner(info, mConfig).Run();
+		}
+
+		#endregion
+
+		#region MarshallByRefObject
+		// Lives forever
+		public override object InitializeLifetimeService()
+		{
+			return null;
+		}
+		#endregion
+
+		public void Run(AgentConfig config)
+		{
+			mConfig = config;
+			// init remoting
+			BinaryClientFormatterSinkProvider clientProvider = 
+				new BinaryClientFormatterSinkProvider();
+			BinaryServerFormatterSinkProvider serverProvider = 
+				new BinaryServerFormatterSinkProvider();
+			serverProvider.TypeFilterLevel = 
+				System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;
+                
+			IDictionary props = new Hashtable();
+			props["port"] = mConfig.Port;
+			string s = System.Guid.NewGuid().ToString();
+			props["name"] = s;
+			props["typeFilterLevel"] = TypeFilterLevel.Full;
+			try
+			{
+
+				TcpChannel chan = new TcpChannel(
+					props,clientProvider,serverProvider);
+    
+				log.InfoFormat("Registering channel on port {0}", mConfig.Port);
+#if NET_2_0
+                ChannelServices.RegisterChannel(chan, false);
+#else
+				ChannelServices.RegisterChannel(chan);
+#endif
+            }
+			catch( Exception e )
+			{
+				log.InfoFormat("Can't register channel.\n{0}", e.Message);
+				return;
+			}
+
+			// publish
+			RemotingServices.Marshal(this, PNUnit.Framework.Names.PNUnitAgentServiceName);
+
+			// wait for a key to finish
+			Console.ReadLine();
+
+			RemotingServices.Disconnect(this);
+		}
+	}
+
+}
diff --git a/src/PNUnit/agent/pnunit-agent.build b/src/PNUnit/agent/pnunit-agent.build
new file mode 100644
index 0000000..355a66c
--- /dev/null
+++ b/src/PNUnit/agent/pnunit-agent.build
@@ -0,0 +1,48 @@
+<?xml version="1.0"?>
+<project name="PNUnitAgent" default="build" basedir=".">
+
+  <patternset id="source-files">
+        <include name="agent.cs"/>
+        <include name="AgentConfig.cs"/>
+        <include name="AssemblyInfo.cs"/>
+        <include name="PNUnitTestRunner.cs"/>
+  </patternset>
+
+  <target name="build">
+
+    <csc target="exe"
+        output="${current.build.dir}/pnunit-agent.exe"
+        debug="${build.debug}" 
+        define="${build.defines};NUNIT_2_5">
+      <sources basedir=".">
+        <patternset refid="source-files"/>
+      </sources>
+      <references>
+        <include name="System.Runtime.Remoting.dll"/>
+	<include name="${current.framework.dir}/pnunit.framework.dll"/>
+        <include name="${current.lib.dir}/nunit.core.dll"/>
+        <include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
+        <include name="${current.lib.dir}/nunit.util.dll"/>
+        <include name="${current.lib.dir}/log4net.dll"/>
+      </references>
+    </csc>
+
+    <copy file="Ship.config"
+      tofile="${current.build.dir}/pnunit-agent.exe.config"/>
+
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/PNUnit/agent">
+      <fileset>
+        <patternset refid="source-files"/>
+        <include name="App.ico"/>
+        <include name="App.config"/>
+        <include name="Ship.config"/>
+        <include name="pnunit-agent.csproj"/>
+        <include name="pnunit-agent.build"/>
+      </fileset>
+    </copy>
+  </target>
+
+</project>
diff --git a/src/PNUnit/agent/pnunit-agent.csproj b/src/PNUnit/agent/pnunit-agent.csproj
new file mode 100644
index 0000000..6d6ebbc
--- /dev/null
+++ b/src/PNUnit/agent/pnunit-agent.csproj
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{7521B6A2-35C2-4BD4-9304-29FB186638F2}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>pnunit-agent</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Exe</OutputType>
+    <RootNamespace>agent</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <NoWin32Manifest>true</NoWin32Manifest>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG;NET_2_0;NUNIT_2_5</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <UseVSHostingProcess>false</UseVSHostingProcess>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;NET_2_0;NUNIT_2_5</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\lib\log4net.dll</HintPath>
+    </Reference>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Runtime.Remoting">
+      <Name>System.Runtime.Remoting</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
+      <Name>nunit.util.dll</Name>
+      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
+      <Name>nunit.core.dll</Name>
+      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
+      <Name>nunit.core.interfaces.dll</Name>
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
+      <Name>nunit.framework.dll</Name>
+      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\pnunit.framework\pnunit.framework.csproj">
+      <Name>pnunit.framework</Name>
+      <Project>{1AE4D3A7-DA37-45C0-B300-AB7B84DFF216}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="agent.cs" />
+    <Compile Include="AgentConfig.cs" />
+    <Compile Include="AssemblyInfo.cs" />
+    <Compile Include="PNUnitTestRunner.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config" />
+    <None Include="pnunit-agent.build" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="App.ico" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/PNUnit/launcher.log.conf b/src/PNUnit/launcher.log.conf
new file mode 100644
index 0000000..d340cad
--- /dev/null
+++ b/src/PNUnit/launcher.log.conf
@@ -0,0 +1,18 @@
+<log4net>
+	<!-- A1 is set to be a ConsoleAppender -->
+	<appender name="A1" type="log4net.Appender.ConsoleAppender">
+
+		<!-- A1 uses PatternLayout -->
+		<layout type="log4net.Layout.PatternLayout">
+			<!-- Print the date in ISO 8601 format -->
+			<conversionPattern value="%-5level %logger - %message%newline" />
+		</layout>
+	</appender>
+	
+	<!-- Set root logger level to DEBUG and its only appender to A1 -->
+	<root>
+		<level value="DEBUG" />
+		<appender-ref ref="A1" />
+	</root>
+
+</log4net>
diff --git a/src/PNUnit/launcher/App.config b/src/PNUnit/launcher/App.config
new file mode 100644
index 0000000..5ed5f7b
--- /dev/null
+++ b/src/PNUnit/launcher/App.config
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<configuration>
+
+  <!-- Set the level for tracing NUnit itself -->
+  <!-- 0=Off 1=Error 2=Warning 3=Info 4=Debug -->
+  <system.diagnostics>
+	  <switches>
+      <add name="NTrace" value="0" />
+	  </switches>
+  </system.diagnostics>
+  
+  <runtime>
+    <!-- We need this so test exceptions don't crash NUnit -->
+    <legacyUnhandledExceptionPolicy enabled="1" />
+
+    <!-- Look for addins in the addins directory for now -->
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+      <probing privatePath="framework;lib;addins"/>
+   </assemblyBinding>
+
+    <!--
+    The following <assemblyBinding> section allows running nunit under 
+    .NET 1.0 by redirecting assemblies. The appliesTo attribute
+    causes the section to be ignored except under .NET 1.0
+    on a machine with only the .NET version 1.0 runtime installed.
+    If application and its tests were built for .NET 1.1 you will
+    also need to redirect system assemblies in the test config file,
+    which controls loading of the tests.
+   -->
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
+			appliesTo="v1.0.3705">
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Data" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Drawing" 
+                          publicKeyToken="b03f5f7f11d50a3a" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Windows.Forms" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Xml" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+    </assemblyBinding>
+  
+  </runtime>
+  
+</configuration>
\ No newline at end of file
diff --git a/src/ConsoleRunner/nunit-console-exe/App.ico b/src/PNUnit/launcher/App.ico
similarity index 100%
copy from src/ConsoleRunner/nunit-console-exe/App.ico
copy to src/PNUnit/launcher/App.ico
diff --git a/src/PNUnit/launcher/AssemblyInfo.cs b/src/PNUnit/launcher/AssemblyInfo.cs
new file mode 100644
index 0000000..7e0ae00
--- /dev/null
+++ b/src/PNUnit/launcher/AssemblyInfo.cs
@@ -0,0 +1,58 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+//
+// La información general de un ensamblado se controla mediante el siguiente 
+// conjunto de atributos. Cambie estos atributos para modificar la información
+// asociada con un ensamblado.
+//
+[assembly: AssemblyTitle("")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]		
+
+//
+// La información de versión de un ensamblado consta de los siguientes cuatro valores:
+//
+//      Versión principal
+//      Versión secundaria 
+//      Versión de compilación
+//      Revisión
+//
+// Puede especificar todos los valores o usar los valores predeterminados (número de versión de compilación y de revisión) 
+// usando el símbolo '*' como se muestra a continuación:
+
+[assembly: AssemblyVersion("1.0.*")]
+
+//
+// Si desea firmar el ensamblado, debe especificar una clave para su uso. Consulte la documentación de 
+// Microsoft .NET Framework para obtener más información sobre la firma de ensamblados.
+//
+// Utilice los atributos siguientes para controlar qué clave desea utilizar para firmar. 
+//
+// Notas: 
+//   (*) Si no se especifica ninguna clave, el ensamblado no se firma.
+//   (*) KeyName se refiere a una clave instalada en el Proveedor de servicios
+//       de cifrado (CSP) en el equipo. KeyFile se refiere a un archivo que contiene
+//       una clave.
+//   (*) Si se especifican los valores KeyFile y KeyName, tendrá 
+//       lugar el siguiente proceso:
+//       (1) Si KeyName se puede encontrar en el CSP, se utilizará dicha clave.
+//       (2) Si KeyName no existe pero sí KeyFile, se instalará 
+//           y utilizará la clave de KeyFile en el CSP.
+//   (*) Para crear KeyFile, puede ejecutar la utilidad sn.exe (Strong Name).
+//       Cuando se especifica KeyFile, la ubicación de KeyFile debe ser
+//       relativa al directorio de resultados del proyecto, que es
+//       %Directorio del proyecto%\obj\<configuración>. Por ejemplo, si KeyFile
+//       se encuentra en el directorio del proyecto, el atributo AssemblyKeyFile se especifica 
+//       como [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
+//   (*) Firma retardada es una opción avanzada; consulte la documentación de
+//       Microsoft .NET Framework para obtener más información.
+//
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("")]
+[assembly: AssemblyKeyName("")]
diff --git a/src/PNUnit/launcher/Barrier.cs b/src/PNUnit/launcher/Barrier.cs
new file mode 100644
index 0000000..0d8428a
--- /dev/null
+++ b/src/PNUnit/launcher/Barrier.cs
@@ -0,0 +1,50 @@
+using System;
+using System.Threading;
+
+namespace PNUnit.Launcher
+{
+	public class Barrier
+	{
+		private int mCount;
+		private int mMaxCount;
+		private Object mLock = new Object();
+
+		public Barrier(int maxCount)
+		{
+			mCount = 0;
+			mMaxCount = maxCount;
+
+		}
+
+		public void Enter()
+		{
+			lock( mLock )
+			{
+				++mCount;
+				if( mCount >= mMaxCount )
+				{                    
+					mCount = 0;
+					Monitor.PulseAll(mLock);
+				}
+				else
+					Monitor.Wait(mLock);
+			}
+		}
+
+		public void Abandon()
+		{
+			lock( mLock )
+			{
+				--mMaxCount;
+				if( mCount >= mMaxCount )
+				{                    
+					mCount = 0;
+					Monitor.PulseAll(mLock);
+				}
+                
+			}
+		}
+
+	}
+
+}
diff --git a/src/PNUnit/launcher/Runner.cs b/src/PNUnit/launcher/Runner.cs
new file mode 100644
index 0000000..66a8120
--- /dev/null
+++ b/src/PNUnit/launcher/Runner.cs
@@ -0,0 +1,280 @@
+using System;
+using System.Collections;
+using System.Threading;
+
+using System.Runtime.Remoting;
+using System.Runtime.Remoting.Lifetime;
+
+using log4net;
+
+using NUnit.Core;
+
+using PNUnit.Framework;
+
+#if NUNIT_2_5
+using TestInfo = PNUnit.Framework.TestInfo;
+#endif
+
+namespace PNUnit.Launcher
+{
+	public class Runner: MarshalByRefObject, IPNUnitServices
+	{
+
+		private static readonly ILog log = LogManager.GetLogger(typeof(Runner));
+		private const string agentkey = "_AGENT";
+
+		private ParallelTest mTestGroup;
+		private Thread mThread = null;
+		private IList mResults = null;
+		private Object mResultLock = new Object();
+		private ManualResetEvent mFinish;
+		private Hashtable mBarriers;
+		private int mLaunchedTests;
+		private Hashtable mBarriersOfTests;
+
+		public Runner(ParallelTest test)
+		{
+			mTestGroup = test;
+			mResults = new ArrayList();
+		}
+
+		public string TestGroupName
+		{
+			get{ return mTestGroup.Name; }
+		}
+
+		public void Run()
+		{
+			if( mTestGroup.Tests.Length == 0 )
+			{
+				log.Fatal("No tests to run, exiting");
+				return;
+			}
+			mThread = new Thread(new ThreadStart(ThreadProc));
+			mThread.Start();
+		}
+
+		public void Join()
+		{
+			if( mThread != null )
+				mThread.Join();
+		}
+
+		private void ThreadProc()
+		{
+			log.DebugFormat("Thread created for TestGroup {0} with {1} tests", mTestGroup.Name, mTestGroup.Tests.Length);
+			mFinish = new ManualResetEvent(false);
+			mBarriers = new Hashtable();
+			mBarriersOfTests = new Hashtable();
+
+			RemotingServices.Marshal(this, mTestGroup.Name);
+
+			mLaunchedTests = 0;
+			foreach( TestConf test in mTestGroup.Tests )
+			{
+				if (test.Machine.StartsWith(agentkey))
+					test.Machine = mTestGroup.Agents[int.Parse(test.Machine.Substring(agentkey.Length))-1];
+
+				log.InfoFormat("Starting {0} test {1} on {2}", mTestGroup.Name, test.Name, test.Machine);
+				// contact the machine
+				try
+				{
+					IPNUnitAgent agent = (IPNUnitAgent)
+						Activator.GetObject(
+						typeof(IPNUnitAgent), 
+						string.Format(
+						"tcp://{0}/{1}", 
+						test.Machine, 
+						PNUnit.Framework.Names.PNUnitAgentServiceName));
+
+					lock( mResultLock )
+					{
+						++mLaunchedTests;
+					}
+                                    
+					agent.RunTest(new TestInfo(test.Name, test.Assembly, test.TestToRun, test.TestParams, this));
+				}
+				catch( Exception e )
+				{
+					log.ErrorFormat(
+						"An error occurred trying to contact {0} [{1}]", 
+						test.Machine, e.Message);
+
+					lock( mResultLock )
+					{
+						--mLaunchedTests;
+					}
+				}
+			}
+            
+			log.DebugFormat("Thread going to wait for results for TestGroup {0}", mTestGroup.Name);
+			if( HasToWait() )
+				// wait for all tests to end
+				mFinish.WaitOne();
+
+			log.DebugFormat("Thread going to wait for NotifyResult to finish for TestGroup {0}", mTestGroup.Name);
+			Thread.Sleep(500); // wait for the NotifyResult call to finish
+			RemotingServices.Disconnect(this);
+			log.DebugFormat("Thread going to finish for TestGroup {0}", mTestGroup.Name);
+		}
+        
+		private bool HasToWait()
+		{
+			lock( mResultLock )
+			{
+				return (mLaunchedTests > 0) && (mResults.Count < mLaunchedTests);
+			}
+		}
+
+		public PNUnitTestResult[] GetTestResults()
+		{
+			lock(mResultLock)
+			{
+				PNUnitTestResult[] result = new PNUnitTestResult[mResults.Count];
+				int i = 0;
+				foreach( PNUnitTestResult res in mResults )
+					result[i++] = res;
+                
+				return result;
+			}
+		}
+
+		#region MarshallByRefObject
+		// Lives forever
+		public override object InitializeLifetimeService()
+		{
+			return null;
+		}
+		#endregion
+
+		#region IPNUnitServices
+
+		public void NotifyResult(string TestName, PNUnitTestResult result)
+		{   
+			log.DebugFormat("NotifyResult called for TestGroup {0}, Test {1}",
+				mTestGroup.Name, TestName);
+			lock(mResultLock)
+			{
+				log.DebugFormat("NotifyResult lock entered for TestGroup {0}, Test {1}",
+					mTestGroup.Name, TestName);
+                
+				mResults.Add(result);
+				if( mResults.Count == mLaunchedTests )
+				{
+					log.DebugFormat("All the tests notified the results, waking up. mResults.Count == {0}",
+						mResults.Count);
+					mFinish.Set();
+				}
+
+			}   
+			lock( mBarriers )
+			{
+				if( mBarriersOfTests.Contains(TestName) )
+				{
+					log.DebugFormat("Going to abandon barriers of test {0}", TestName);
+					IList list = (IList) mBarriersOfTests[TestName];
+					foreach( string barrier in list )
+					{
+						log.DebugFormat("Abandoning barrier {0}", barrier);
+						((Barrier)mBarriers[barrier]).Abandon();
+					}
+				}
+			}
+			log.DebugFormat("NotifyResult finishing for TestGroup {0}, Test {1}.",
+				mTestGroup.Name, TestName); 
+			log.InfoFormat("Result for TestGroup {0}, Test {1}: {2}",
+				mTestGroup.Name, TestName, result.IsSuccess ? "PASS" : "FAIL");
+		}
+
+		public void InitBarrier(string TestName, string barrier, int Max)
+		{
+			lock( mBarriers )
+			{
+				if( ! mBarriers.Contains(barrier) )
+				{
+					mBarriers.Add(barrier, new Barrier(Max));
+				}
+
+				if( mBarriersOfTests.Contains(TestName) )
+				{
+					IList listofbarriers = (IList) mBarriersOfTests[TestName];
+					listofbarriers.Add(barrier);
+					log.DebugFormat("Adding barrier {0} to {1}", barrier, TestName);
+				}
+				else
+				{
+					ArrayList list = new ArrayList();
+					list.Add(barrier);
+					log.DebugFormat("Adding barrier {0} to {1}", barrier, TestName);
+					mBarriersOfTests.Add(TestName, list);
+				}
+
+                
+			}
+		}
+
+		public void InitBarrier(string TestName, string barrier)
+		{
+			InitBarrier(TestName, barrier, mTestGroup.Tests.Length);
+		}
+
+		private const int indexStartBarrier = 2;
+		private const int indexEndBarrier = 3;
+
+		public void InitBarriers (string TestName)
+		{
+			Hashtable barriers = new Hashtable();
+			for (int i=1; i< mTestGroup.Tests.Length; i++)
+			{
+				string sb = mTestGroup.Tests[i].TestParams[indexStartBarrier];
+				string eb = mTestGroup.Tests[i].TestParams[indexEndBarrier];
+
+				if (sb.Trim() != "") 
+				{
+					if(barriers.Contains(sb))
+						barriers[sb] = (int)barriers[sb]+1;
+					else
+						barriers[sb] = 1;
+				}
+
+				if (eb.Trim() != "") 
+				{
+					if(barriers.Contains(eb))
+						barriers[eb] = (int)barriers[eb]+1;
+					else
+						barriers[eb] = 1;
+				}
+
+			}
+
+			foreach (string key in barriers.Keys)
+			{
+				if (!key.Equals(Names.ServerBarrier) && !key.Equals(Names.EndBarrier))
+					InitBarrier (TestName, key, (int)barriers[key]);
+                
+				InitBarrier (TestName, Names.ServerBarrier);
+				InitBarrier (TestName, Names.EndBarrier);
+			}
+		}
+
+		public void EnterBarrier(string barrier)
+		{
+			log.DebugFormat("Entering Barrier {0}", barrier);
+			((Barrier)mBarriers[barrier]).Enter();
+		}
+
+		#endregion
+	}
+
+	/*    public class TestResult
+		{
+			public string TestName;
+			public string Result;
+
+			public TestResult(string name, string result)
+			{
+				TestName = name;
+				Result = result;
+			}
+		}*/
+}
diff --git a/src/PNUnit/launcher/Ship.config b/src/PNUnit/launcher/Ship.config
new file mode 100644
index 0000000..5ed5f7b
--- /dev/null
+++ b/src/PNUnit/launcher/Ship.config
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<configuration>
+
+  <!-- Set the level for tracing NUnit itself -->
+  <!-- 0=Off 1=Error 2=Warning 3=Info 4=Debug -->
+  <system.diagnostics>
+	  <switches>
+      <add name="NTrace" value="0" />
+	  </switches>
+  </system.diagnostics>
+  
+  <runtime>
+    <!-- We need this so test exceptions don't crash NUnit -->
+    <legacyUnhandledExceptionPolicy enabled="1" />
+
+    <!-- Look for addins in the addins directory for now -->
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+      <probing privatePath="framework;lib;addins"/>
+   </assemblyBinding>
+
+    <!--
+    The following <assemblyBinding> section allows running nunit under 
+    .NET 1.0 by redirecting assemblies. The appliesTo attribute
+    causes the section to be ignored except under .NET 1.0
+    on a machine with only the .NET version 1.0 runtime installed.
+    If application and its tests were built for .NET 1.1 you will
+    also need to redirect system assemblies in the test config file,
+    which controls loading of the tests.
+   -->
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
+			appliesTo="v1.0.3705">
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Data" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Drawing" 
+                          publicKeyToken="b03f5f7f11d50a3a" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Windows.Forms" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Xml" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+    </assemblyBinding>
+  
+  </runtime>
+  
+</configuration>
\ No newline at end of file
diff --git a/src/PNUnit/launcher/TestConf.cs b/src/PNUnit/launcher/TestConf.cs
new file mode 100644
index 0000000..b6e2ff2
--- /dev/null
+++ b/src/PNUnit/launcher/TestConf.cs
@@ -0,0 +1,43 @@
+using System;
+using System.IO;
+using System.Xml.Serialization;
+
+
+namespace PNUnit.Launcher
+{
+	[Serializable]
+	public class TestGroup
+	{
+		public ParallelTest[] ParallelTests;
+	}
+
+	[Serializable]
+	public class ParallelTest
+	{
+		public string Name;
+		public string[]Agents;
+		public TestConf[] Tests;
+	}
+
+
+	[Serializable]
+	public class TestConf
+	{
+		public string Name;
+		public string Assembly;
+		public string TestToRun;
+		public string Machine;
+		public string[] TestParams;
+	}
+
+	public class TestConfLoader
+	{
+		public static TestGroup LoadFromFile(string file)
+		{
+			FileStream reader = new FileStream(file, FileMode.Open, FileAccess.Read);
+			XmlSerializer ser= new XmlSerializer(typeof(TestGroup));
+			return (TestGroup)ser.Deserialize(reader);
+		}
+	}
+
+}
diff --git a/src/PNUnit/launcher/launcher.cs b/src/PNUnit/launcher/launcher.cs
new file mode 100644
index 0000000..e79de7f
--- /dev/null
+++ b/src/PNUnit/launcher/launcher.cs
@@ -0,0 +1,163 @@
+using System;
+using System.Collections;
+using System.IO;
+using System.Runtime.Remoting;
+using System.Runtime.Remoting.Channels;
+using System.Runtime.Remoting.Channels.Tcp;
+using System.Runtime.Serialization.Formatters;
+
+using NUnit.Core;
+
+using PNUnit.Framework;
+
+using log4net;
+using log4net.Config;
+
+
+namespace PNUnit.Launcher
+{
+	class Launcher
+	{
+		[STAThread]
+		static void Main(string[] args)
+		{   
+			// Load the test configuration file
+			if( args.Length == 0 )
+			{
+				Console.WriteLine("Usage: launcher configfile");
+				return;
+			}
+
+			string configfile = args[0];
+
+			TestGroup group = TestConfLoader.LoadFromFile(configfile);
+
+			if( (group == null) || (group.ParallelTests.Length == 0) )
+			{
+				Console.WriteLine("No tests to run");
+				return;
+			}
+                        
+			ConfigureLogging();
+            
+			ConfigureRemoting();
+
+			// Each parallel test is launched sequencially...
+			Runner[] runners = new Runner[group.ParallelTests.Length];
+			int i = 0;
+			DateTime beginTimestamp = DateTime.Now;
+			foreach( ParallelTest test in group.ParallelTests )
+			{
+				Console.WriteLine("Test {0} of {1}", i + 1, group.ParallelTests.Length);
+				Runner runner = new Runner(test);
+				runner.Run();
+				runners[i++] = runner;                
+				// Wait to finish
+				runner.Join();
+			}
+
+			DateTime endTimestamp = DateTime.Now;
+           
+			// Print the results
+			double TotalBiggerTime = 0;
+			int TotalTests = 0;
+			int TotalExecutedTests = 0;
+			int TotalFailedTests = 0;
+			int TotalSuccessTests = 0;
+			foreach( Runner runner in runners )
+			{
+				int ExecutedTests = 0;
+				int FailedTests = 0;
+				int SuccessTests = 0;
+				double BiggerTime = 0;
+				PNUnitTestResult[] results = runner.GetTestResults();
+				Console.WriteLine("==== Tests Results for Parallel TestGroup {0} ===", runner.TestGroupName);
+                
+				i = 0;
+				foreach( PNUnitTestResult res in results )
+				{
+					if( res.Executed )
+						++ExecutedTests;
+					if( res.IsFailure )
+						++FailedTests;
+					if( res.IsSuccess )
+						++SuccessTests;                    
+
+					PrintResult(++i, res);
+					if( res.Time > BiggerTime )
+						BiggerTime = res.Time;
+				}
+				Console.WriteLine();
+				Console.WriteLine("Summary:");
+				Console.WriteLine("\tTotal: {0}\n\tExecuted: {1}\n\tFailed: {2}\n\tSuccess: {3}\n\t% Success: {4}\n\tBiggest Execution Time: {5} s\n",
+					results.Length, ExecutedTests, FailedTests, SuccessTests, 
+					results.Length > 0 ? 100 * SuccessTests / results.Length : 0,
+					BiggerTime);
+
+				TotalTests += results.Length;
+				TotalExecutedTests += ExecutedTests;
+				TotalFailedTests += FailedTests;
+				TotalSuccessTests += SuccessTests;
+				TotalBiggerTime += BiggerTime;
+			}           
+
+			if( runners.Length > 1 )
+			{
+				Console.WriteLine();
+				Console.WriteLine("Summary for all the parallel tests:");
+				Console.WriteLine("\tTotal: {0}\n\tExecuted: {1}\n\tFailed: {2}\n\tSuccess: {3}\n\t% Success: {4}\n\tBiggest Execution Time: {5} s\n",
+					TotalTests, TotalExecutedTests, TotalFailedTests, TotalSuccessTests, 
+					TotalTests > 0 ? 100 * TotalSuccessTests / TotalTests : 0,
+					TotalBiggerTime);
+			}
+
+			TimeSpan elapsedTime = endTimestamp.Subtract(beginTimestamp);
+			Console.WriteLine("Launcher execution time: {0} seconds", elapsedTime.TotalSeconds);
+		}
+
+		private static void ConfigureRemoting()
+		{
+			BinaryClientFormatterSinkProvider clientProvider = null;
+			BinaryServerFormatterSinkProvider serverProvider = 
+				new BinaryServerFormatterSinkProvider();
+			serverProvider.TypeFilterLevel = 
+				System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;
+                
+			IDictionary props = new Hashtable();
+			props["port"] = 8090;
+			props["typeFilterLevel"] = TypeFilterLevel.Full;
+			TcpChannel chan = new TcpChannel(
+				props,clientProvider,serverProvider);
+
+#if NET_2_0
+            ChannelServices.RegisterChannel(chan, false);
+#else
+			ChannelServices.RegisterChannel(chan);
+#endif
+        }
+
+
+		private static void PrintResult(int testNumber, PNUnitTestResult res)
+		{   
+			Console.WriteLine(
+				"({0})Name: {1}\n  Result: {2,-12} Assert Count: {3,-2} Time: {4,5}", 
+				testNumber,
+				res.Name, 
+				res.IsSuccess ? "SUCCESS" : (res.IsFailure ? "FAILURE" : (! res.Executed ? "NOT EXECUTED": "UNKNOWN")),
+				res.AssertCount,
+				res.Time);
+			if( !res.IsSuccess )
+				Console.WriteLine("\nMessage: {0}\nStack Trace:\n{1}\n\n",
+					res.Message, res.StackTrace);
+
+		}
+
+		private static void ConfigureLogging()
+		{
+			string log4netpath = "launcher.log.conf";
+			XmlConfigurator.Configure(new FileInfo(log4netpath));
+		}
+
+
+	}
+}
diff --git a/src/PNUnit/launcher/pnunit-launcher.build b/src/PNUnit/launcher/pnunit-launcher.build
new file mode 100644
index 0000000..f1e1792
--- /dev/null
+++ b/src/PNUnit/launcher/pnunit-launcher.build
@@ -0,0 +1,47 @@
+<?xml version="1.0"?>
+<project name="PNUnitLauncher" default="build" basedir=".">
+
+  <patternset id="source-files">
+        <include name="AssemblyInfo.cs"/>
+        <include name="Barrier.cs"/>
+        <include name="launcher.cs"/>
+        <include name="Runner.cs"/>
+        <include name="TestConf.cs"/>
+  </patternset>
+
+  <target name="build">
+    <csc target="exe"
+        output="${current.build.dir}/pnunit-launcher.exe"
+        debug="${build.debug}" 
+        define="${build.defines};NUNIT_2_5">
+      <sources basedir=".">
+        <patternset refid="source-files"/>
+      </sources>
+      <references>
+        <include name="System.Runtime.Remoting.dll"/>
+        <include name="${current.framework.dir}/pnunit.framework.dll"/>
+        <include name="${current.lib.dir}/nunit.core.dll"/>
+        <include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
+        <include name="${current.lib.dir}/log4net.dll"/>
+      </references>
+    </csc>
+
+    <copy file="Ship.config"
+      tofile="${current.build.dir}/pnunit-launcher.exe.config"/>
+
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/PNUnit/launcher">
+      <fileset>
+        <patternset refid="source-files"/>
+        <include name="App.ico"/>
+        <include name="App.config"/>
+        <include name="Ship.config"/>
+        <include name="pnunit-launcher.csproj"/>
+        <include name="pnunit-launcher.build"/>
+      </fileset>
+    </copy>
+  </target>
+
+</project>
\ No newline at end of file
diff --git a/src/PNUnit/launcher/pnunit-launcher.csproj b/src/PNUnit/launcher/pnunit-launcher.csproj
new file mode 100644
index 0000000..452547f
--- /dev/null
+++ b/src/PNUnit/launcher/pnunit-launcher.csproj
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{5E0C72D1-A2A5-4836-BB97-57FF91055B64}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>pnunit-launcher</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Exe</OutputType>
+    <RootNamespace>launcher</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <NoWin32Manifest>true</NoWin32Manifest>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG;NET_2_0;NUNIT_2_5</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;NET_2_0;NUNIT_2_5</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\lib\log4net.dll</HintPath>
+    </Reference>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Runtime.Remoting">
+      <Name>System.Runtime.Remoting</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
+      <Name>nunit.core.dll</Name>
+      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
+      <Name>nunit.core.interfaces.dll</Name>
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
+      <Name>nunit.framework.dll</Name>
+      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\pnunit.framework\pnunit.framework.csproj">
+      <Name>pnunit.framework</Name>
+      <Project>{1AE4D3A7-DA37-45C0-B300-AB7B84DFF216}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config" />
+    <None Include="pnunit-launcher.build" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AssemblyInfo.cs" />
+    <Compile Include="Barrier.cs" />
+    <Compile Include="launcher.cs" />
+    <Compile Include="Runner.cs" />
+    <Compile Include="TestConf.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="App.ico" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/PNUnit/pnunit.framework/AssemblyInfo.cs b/src/PNUnit/pnunit.framework/AssemblyInfo.cs
new file mode 100644
index 0000000..7e0ae00
--- /dev/null
+++ b/src/PNUnit/pnunit.framework/AssemblyInfo.cs
@@ -0,0 +1,58 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+//
+// La información general de un ensamblado se controla mediante el siguiente 
+// conjunto de atributos. Cambie estos atributos para modificar la información
+// asociada con un ensamblado.
+//
+[assembly: AssemblyTitle("")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]		
+
+//
+// La información de versión de un ensamblado consta de los siguientes cuatro valores:
+//
+//      Versión principal
+//      Versión secundaria 
+//      Versión de compilación
+//      Revisión
+//
+// Puede especificar todos los valores o usar los valores predeterminados (número de versión de compilación y de revisión) 
+// usando el símbolo '*' como se muestra a continuación:
+
+[assembly: AssemblyVersion("1.0.*")]
+
+//
+// Si desea firmar el ensamblado, debe especificar una clave para su uso. Consulte la documentación de 
+// Microsoft .NET Framework para obtener más información sobre la firma de ensamblados.
+//
+// Utilice los atributos siguientes para controlar qué clave desea utilizar para firmar. 
+//
+// Notas: 
+//   (*) Si no se especifica ninguna clave, el ensamblado no se firma.
+//   (*) KeyName se refiere a una clave instalada en el Proveedor de servicios
+//       de cifrado (CSP) en el equipo. KeyFile se refiere a un archivo que contiene
+//       una clave.
+//   (*) Si se especifican los valores KeyFile y KeyName, tendrá 
+//       lugar el siguiente proceso:
+//       (1) Si KeyName se puede encontrar en el CSP, se utilizará dicha clave.
+//       (2) Si KeyName no existe pero sí KeyFile, se instalará 
+//           y utilizará la clave de KeyFile en el CSP.
+//   (*) Para crear KeyFile, puede ejecutar la utilidad sn.exe (Strong Name).
+//       Cuando se especifica KeyFile, la ubicación de KeyFile debe ser
+//       relativa al directorio de resultados del proyecto, que es
+//       %Directorio del proyecto%\obj\<configuración>. Por ejemplo, si KeyFile
+//       se encuentra en el directorio del proyecto, el atributo AssemblyKeyFile se especifica 
+//       como [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
+//   (*) Firma retardada es una opción avanzada; consulte la documentación de
+//       Microsoft .NET Framework para obtener más información.
+//
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("")]
+[assembly: AssemblyKeyName("")]
diff --git a/src/PNUnit/pnunit.framework/Interfaces.cs b/src/PNUnit/pnunit.framework/Interfaces.cs
new file mode 100644
index 0000000..702e94f
--- /dev/null
+++ b/src/PNUnit/pnunit.framework/Interfaces.cs
@@ -0,0 +1,110 @@
+using System;
+
+using NUnit.Core;
+
+namespace PNUnit.Framework
+{
+
+	public class Names
+	{
+		public const string PNUnitAgentServiceName = "IPNUnitAgent";
+		public const string ServerBarrier = "SERVERSTART";
+		public const string EndBarrier = "ENDBARRIER";
+	}
+
+	public interface ITestConsoleAccess
+	{
+		void WriteLine(string s);
+		void Write(char[] buf);
+		void Write(char[] buf, int index, int count);
+	}
+
+	public interface IPNUnitServices
+	{
+		void NotifyResult(string TestName, PNUnitTestResult result);
+
+		void InitBarriers(string TestName);
+		void InitBarrier(string TestName, string barrier);
+		void InitBarrier(string TestName, string barrier, int Max);
+		void EnterBarrier(string barrier);
+	}
+
+	[Serializable]
+	public class TestInfo
+	{
+		public string TestName;
+		public string AssemblyName;
+		public string TestToRun;
+		public string[] TestParams;
+		public IPNUnitServices Services;
+
+		public TestInfo(string TestName, string AssemblyName, 
+			string TestToRun, string[] TestParams, IPNUnitServices Services)
+		{
+			this.TestName = TestName;
+			this.AssemblyName = AssemblyName;
+			this.TestToRun = TestToRun;
+			this.TestParams = TestParams;
+			this.Services = Services;
+		}
+
+	}
+
+	public interface IPNUnitAgent
+	{
+		void RunTest(TestInfo info);
+	}
+
+	[Serializable]
+	public class PNUnitTestResult
+	{
+		public bool Executed;
+#if !NUNIT_2_5
+        public bool AllTestsExecuted;
+#endif
+		public string Name;
+		public bool IsSuccess;
+		public bool IsFailure;
+		public string Description;
+		public double Time;
+		public string Message;
+		public string StackTrace;
+		public int AssertCount;
+
+		public PNUnitTestResult(TestResult result)
+		{
+			if( result == null )
+				return;
+			this.Executed = result.Executed;
+#if !NUNIT_2_5
+            this.AllTestsExecuted = result.AllTestsExecuted;
+#endif
+			this.Name = result.Name;
+			this.IsSuccess = result.IsSuccess;
+			this.IsFailure = result.IsFailure;
+			this.Description = result.Description;
+			this.Time = result.Time;
+			this.Message = result.Message;
+			this.StackTrace = result.StackTrace;
+			this.AssertCount  = result.AssertCount;                        
+		}
+
+		public PNUnitTestResult(Exception e)
+		{
+			this.Executed = false;
+#if !NUNIT_2_5
+			this.AllTestsExecuted = false;
+#endif
+			this.AssertCount = 0;
+			this.Description = "Not controlled exception raised";
+			this.StackTrace = e.StackTrace;
+			this.Name = "";
+			this.IsSuccess = false;
+			this.IsFailure = true;
+			this.Time = 0;
+			this.Message = e.Message;
+		}
+	}
+
+}
+
diff --git a/src/PNUnit/pnunit.framework/PNUnitServices.cs b/src/PNUnit/pnunit.framework/PNUnitServices.cs
new file mode 100644
index 0000000..1024330
--- /dev/null
+++ b/src/PNUnit/pnunit.framework/PNUnitServices.cs
@@ -0,0 +1,99 @@
+using System;
+
+namespace PNUnit.Framework
+{
+	[Serializable]
+	public class PNUnitServices
+	{
+		private TestInfo mInfo = null;
+		private ITestConsoleAccess mConsole = null;
+		private static PNUnitServices mInstance = null;
+
+		// To be used only by the runner
+		public PNUnitServices(object info, object consoleaccess)
+		{            
+			mInfo = info as TestInfo;
+			mConsole = consoleaccess as ITestConsoleAccess;
+			mInstance = this;            
+		}
+
+		public static PNUnitServices Get()
+		{
+			if( mInstance == null )
+			{
+				throw new Exception("mInstance is null");
+			}
+			return mInstance;
+		}
+
+		private void CheckInfo()
+		{
+			if( mInfo == null )
+				throw new Exception("TestInfo not initialized");
+		}
+
+		// IPNUnitServices
+
+		public void InitBarriers()
+		{
+			CheckInfo();
+			mInfo.Services.InitBarriers(mInfo.TestName);
+		}
+
+		public void InitBarrier(string barrier)
+		{
+			CheckInfo();
+			mInfo.Services.InitBarrier(mInfo.TestName, barrier);
+		}
+
+		public void InitBarrier(string barrier, int Max)
+		{
+			CheckInfo();
+			mInfo.Services.InitBarrier(mInfo.TestName, barrier, Max);
+		}
+        
+		public void EnterBarrier(string barrier)
+		{
+			CheckInfo();
+			mConsole.WriteLine(
+				string.Format(">>>Test {0} entering barrier {1}", 
+				mInfo.TestName, barrier));
+			mInfo.Services.EnterBarrier(barrier);
+			mConsole.WriteLine(
+				string.Format("<<<Test {0} leaving barrier {1}", 
+				mInfo.TestName, barrier));
+		}
+
+		public string GetTestName()
+		{
+			CheckInfo();
+			return mInfo.TestName;
+		}
+
+		public string[] GetTestParams()
+		{
+			CheckInfo();
+			return mInfo.TestParams;
+		}
+
+		public void WriteLine(string s)
+		{
+			if( mConsole != null )
+				mConsole.WriteLine(s);
+		}
+
+		public void Write(char[] buf)
+		{
+			if( mConsole != null )
+				mConsole.Write(buf);
+		}
+
+		public void Write(char[] buf, int index, int count)
+		{
+			if( mConsole != null )
+				mConsole.Write(buf, index, count);
+		}
+
+	}
+
+}
diff --git a/src/PNUnit/pnunit.framework/pnunit.framework.build b/src/PNUnit/pnunit.framework/pnunit.framework.build
new file mode 100644
index 0000000..263abe5
--- /dev/null
+++ b/src/PNUnit/pnunit.framework/pnunit.framework.build
@@ -0,0 +1,41 @@
+<?xml version="1.0"?>
+<project name="PNUnitFramework" default="build" basedir=".">
+
+  <patternset id="source-files">
+        <include name="AssemblyInfo.cs"/>
+        <include name="Interfaces.cs"/>
+        <include name="PNUnitServices.cs"/>
+  </patternset>
+
+  <target name="build">
+
+    <csc target="library"
+        output="${current.framework.dir}/pnunit.framework.dll"
+        debug="${build.debug}" 
+        define="${build.defines};NUNIT_2_5">
+      <sources basedir=".">
+        <patternset refid="source-files"/>
+      </sources>
+      <references>
+        <include name="${current.lib.dir}/nunit.core.dll"/>
+        <include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
+      </references>
+    </csc>
+
+    <!-- Needed in base dir by pnunit tests -->
+    <copy file="${current.framework.dir}/pnunit.framework.dll"
+      todir="${current.build.dir}"/>
+
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/PNUnit/pnunit.framework">
+      <fileset>
+        <patternset refid="source-files"/>
+        <include name="pnunit.framework.csproj"/>
+        <include name="pnunit.framework.build"/>
+      </fileset>
+    </copy>
+  </target>
+
+</project>
\ No newline at end of file
diff --git a/src/PNUnit/pnunit.framework/pnunit.framework.csproj b/src/PNUnit/pnunit.framework/pnunit.framework.csproj
new file mode 100644
index 0000000..c85efe0
--- /dev/null
+++ b/src/PNUnit/pnunit.framework/pnunit.framework.csproj
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{1AE4D3A7-DA37-45C0-B300-AB7B84DFF216}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>pnunit.framework</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>pnunit.framework</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\framework\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG;NUNIT_2_5</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\framework\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;NUNIT_2_5</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
+      <Name>nunit.core.dll</Name>
+      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
+      <Name>nunit.core.interfaces.dll</Name>
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AssemblyInfo.cs" />
+    <Compile Include="Interfaces.cs" />
+    <Compile Include="PNUnitServices.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="pnunit.framework.build" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/PNUnit/runpnunit.bat b/src/PNUnit/runpnunit.bat
new file mode 100644
index 0000000..6efc8b4
--- /dev/null
+++ b/src/PNUnit/runpnunit.bat
@@ -0,0 +1,2 @@
+start pnunit-agent agent.conf
+pnunit-launcher test.conf
\ No newline at end of file
diff --git a/src/PNUnit/test.conf b/src/PNUnit/test.conf
new file mode 100644
index 0000000..a35e718
--- /dev/null
+++ b/src/PNUnit/test.conf
@@ -0,0 +1,24 @@
+<TestGroup>
+    <ParallelTests>
+
+        <ParallelTest>
+            <Name>Testing</Name>
+            <Tests>
+                <TestConf>
+                    <Name>Testing</Name>
+                    <Assembly>pnunit.tests.dll</Assembly>
+                    <TestToRun>TestLibraries.Testing.EqualTo19</TestToRun>
+                    <Machine>localhost:8080</Machine>
+                    <TestParams>
+                        <string>..\server</string> <!-- server dir -->
+			<string></string> <!-- database server -->
+			<string></string><!-- conn string -->
+                    </TestParams>                                                                                
+                </TestConf>
+
+            </Tests>
+        </ParallelTest>
+
+
+    </ParallelTests>
+</TestGroup>
\ No newline at end of file
diff --git a/src/PNUnit/tests/AssemblyInfo.cs b/src/PNUnit/tests/AssemblyInfo.cs
new file mode 100644
index 0000000..e6f9900
--- /dev/null
+++ b/src/PNUnit/tests/AssemblyInfo.cs
@@ -0,0 +1,19 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+[assembly: AssemblyTitle("")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]		
+
+
+[assembly: AssemblyVersion("1.0.*")]
+
+//
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("")]
+[assembly: AssemblyKeyName("")]
diff --git a/src/PNUnit/tests/Cmp.cs b/src/PNUnit/tests/Cmp.cs
new file mode 100644
index 0000000..ff9412a
--- /dev/null
+++ b/src/PNUnit/tests/Cmp.cs
@@ -0,0 +1,15 @@
+using System;
+
+namespace TestLibraries
+{
+
+	public class Cmp
+	{
+		public static int Add(int a, int b)
+		{
+			int result;
+			result = a + b;
+			return result;
+		}
+	}
+}
diff --git a/src/PNUnit/tests/Testing.cs b/src/PNUnit/tests/Testing.cs
new file mode 100644
index 0000000..d0c61cd
--- /dev/null
+++ b/src/PNUnit/tests/Testing.cs
@@ -0,0 +1,46 @@
+using System;
+using System.Threading;
+
+using NUnit.Framework;
+
+using PNUnit.Framework;
+
+namespace TestLibraries
+{
+	
+	[TestFixture]
+	public class Testing
+	{
+		[Test]
+		public void EqualTo19()
+		{
+			Assert.AreEqual(19, Cmp.Add(15,4));
+		}
+
+
+		[Test]
+		public void Server()
+		{
+			PNUnitServices.Get().InitBarrier("BARRIER");
+			PNUnitServices.Get().WriteLine("Server started");
+
+			Thread.Sleep(10000);
+
+			PNUnitServices.Get().EnterBarrier("BARRIER");                
+			Assert.IsTrue(false, "The test failed");        
+		}
+
+		[Test]
+		public void Client()
+		{   
+			PNUnitServices.Get().WriteLine("The client should wait until the server starts");
+			PNUnitServices.Get().InitBarrier("BARRIER");                
+			
+			PNUnitServices.Get().EnterBarrier("BARRIER");
+
+			Console.WriteLine("Server should be started now");
+			Assert.IsTrue(true, "The test failed");                
+
+		}
+	}
+}
diff --git a/src/PNUnit/tests/pnunit.tests.build b/src/PNUnit/tests/pnunit.tests.build
new file mode 100644
index 0000000..ab2bbc4
--- /dev/null
+++ b/src/PNUnit/tests/pnunit.tests.build
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<project name="PNUnitTests" default="build" basedir=".">
+
+  <patternset id="source-files">
+        <include name="AssemblyInfo.cs"/>
+        <include name="Cmp.cs"/>
+        <include name="Testing.cs"/>
+  </patternset>
+
+  <target name="build">
+    <csc target="library"
+        output="${current.build.dir}/pnunit.tests.dll"
+        debug="${build.debug}" 
+        define="${build.defines}">
+      <sources basedir=".">
+        <patternset refid="source-files"/>
+      </sources>
+      <references>
+        <include name="${current.framework.dir}/nunit.framework.dll"/>
+        <include name="${current.framework.dir}/pnunit.framework.dll"/>
+      </references>
+    </csc>
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/PNUnit/tests">
+      <fileset>
+        <patternset refid="source-files"/>
+        <include name="pnunit.tests.csproj"/>
+        <include name="pnunit.tests.build"/>
+      </fileset>
+    </copy>
+  </target>
+
+</project>
\ No newline at end of file
diff --git a/src/PNUnit/tests/pnunit.tests.csproj b/src/PNUnit/tests/pnunit.tests.csproj
new file mode 100644
index 0000000..c632c84
--- /dev/null
+++ b/src/PNUnit/tests/pnunit.tests.csproj
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{319B9238-76BE-4335-9B4D-F8E43C4B124F}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>pnunit.tests</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>TestLibraries</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
+      <Name>nunit.core.interfaces.dll</Name>
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
+      <Name>nunit.framework.dll</Name>
+      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\pnunit.framework\pnunit.framework.csproj">
+      <Name>pnunit.framework</Name>
+      <Project>{1AE4D3A7-DA37-45C0-B300-AB7B84DFF216}</Project>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AssemblyInfo.cs" />
+    <Compile Include="Cmp.cs" />
+    <Compile Include="Testing.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="pnunit.tests.build" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/clr.bat b/src/clr.bat
deleted file mode 100644
index 8291f26..0000000
--- a/src/clr.bat
+++ /dev/null
@@ -1,96 +0,0 @@
- at echo off
-rem Run a program under a particular version of the .Net framework
-rem by setting the COMPLUS_Version environment variable.
-rem
-rem This command was written by Charlie Poole for the NUnit project.
-rem You may use it separately from NUnit at your own risk.
-
-if "%1"=="/?" goto help
-if "%1"=="?" goto help
-if "%1"=="" goto GetVersion
-if /I "%1"=="off" goto RemoveVersion
-if "%2"=="" goto SetVersion
-goto main
-
-:help
-echo Control the version of the .Net framework that is used. The
-echo command has several forms:
-echo.
-echo CLR
-echo   Reports the version of the CLR that has been set
-echo.
-echo CLR version
-echo   Sets the local shell environment to use a specific
-echo   version of the CLR for subsequent commands.
-echo.
-echo CLR version command [arguments]
-echo   Executes a single command using the specified CLR version.
-echo.
-echo CLR off
-echo   Turns off specific version selection for commands
-echo.
-echo The CLR version may be specified as vn.n.n or n.n.n. In addition,
-echo the following shortcuts are recognized:
-echo   net-1.0, 1.0           For version 1.0.3705
-echo   net-1.1, 1.1           For version 1.1.4322
-echo   beta2                  For version 2.0.50215
-echo   net-2.0, 2.0           For version 2.0.50727
-echo.
-echo NOTE:
-echo   Any specific settings for required or supported runtime in 
-echo   the ^<startup^> section of a program's config file will 
-echo   override the version specified by this command, and the
-echo   command will have no effect.
-echo.
-goto done
-
-:main
-
-setlocal
-set CMD=
-call :SetVersion %1
-shift /1
-
-:loop 'Copy remaining arguments to form the command
-if "%1"=="" goto run
-set CMD=%CMD% %1
-shift /1
-goto :loop
-
-:run 'Execute the command
-%CMD%
-endlocal
-goto done
-
-:SetVersion
-set COMPLUS_Version=%1
-
-rem Substitute proper format for certain names
-if /I "%COMPLUS_Version:~0,1%"=="v"    goto useit
-if /I "%COMPLUS_Version%"=="net-1.0"   set COMPLUS_Version=v1.0.3705&goto report
-if /I "%COMPLUS_Version%"=="1.0"       set COMPLUS_Version=v1.0.3705&goto report
-if /I "%COMPLUS_Version%"=="net-1.1"   set COMPLUS_Version=v1.1.4322&goto report
-if /I "%COMPLUS_Version%"=="1.1"       set COMPLUS_Version=v1.1.4322&goto report
-if /I "%COMPLUS_Version%"=="beta2"     set COMPLUS_Version=v2.0.50215&goto report
-if /I "%COMPLUS_Version%"=="net-2.0"   set COMPLUS_Version=v2.0.50727&goto report
-if /I "%COMPLUS_Version%"=="2.0"       set COMPLUS_Version=v2.0.50727&goto report
-
-rem Add additional substitutions here, branching to report
-
-rem assume it's a version number without 'v'
-set COMPLUS_Version=v%COMPLUS_Version% 
-
-:report
-echo Setting CLR version to %COMPLUS_Version%
-goto done
-
-:GetVersion
-if "%COMPLUS_Version%"=="" echo CLR version is not set
-if NOT "%COMPLUS_Version%"=="" echo CLR version is set to %COMPLUS_Version%
-goto done
-
-:RemoveVersion
-set COMPLUS_Version=
-echo CLR version is no longer set
-
-:done
\ No newline at end of file
diff --git a/src/install/NUnit.wxs b/src/install/NUnit.wxs
deleted file mode 100644
index d4a0e67..0000000
--- a/src/install/NUnit.wxs
+++ /dev/null
@@ -1,146 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Wix xmlns="http://schemas.microsoft.com/wix/2003/01/wi">
-  <Product UpgradeCode="009074FF-2CEC-4b0c-9951-B07186F9ED3A" 
-      Name="NUnit $(var.NominalVersion)" 
-      Id="2F481221-3D31-412d-96A9-5AFDD67E005D" 
-      Version="$(var.ProductVersion)"
-      Manufacturer="nunit.org" 
-      Language="1033">
-  
-    <Package Id="????????-????-????-????-????????????" 
-        Comments="NUnit $(var.ProductVersion)" 
-	Manufacturer="nunit.org" 
-        InstallerVersion="200" 
-        Platforms="Intel" 
-	Languages="1033" 
-        Compressed="yes" 
-        SummaryCodepage="1252" />
-			 
-    <Property Id="FRAMEWORK10">
-      <RegistrySearch Id='Framework10Registry' Type='raw'
-        Root='HKLM' Key='Software\Microsoft\.NETFramework\policy\v1.0' Name='3705' />
-    </Property>
-
-    <Property Id="FRAMEWORK11">
-      <RegistrySearch Id='Framework11Registry' Type='raw'
-        Root='HKLM' Key='Software\Microsoft\.NETFramework\policy\v1.1' Name='4322' />
-    </Property>
-
-    <Property Id="FRAMEWORK20">
-      <RegistrySearch Id='Framework20Registry' Type='raw'
-        Root='HKLM' Key='Software\Microsoft\.NETFramework\policy\v2.0' Name='50727' />
-    </Property>
-	
-	<Property Id="MONODEFAULTCLR">
-	  <RegistrySearch Id="MonoDefaultClr" Type='raw'
-	    Root='HKLM' Key='Software\Novell\Mono' Name='DefaultCLR' />
-	</Property>
-	
-	<Property Id="MONODIRECTORY">
-	  <RegistrySearch Id="MonoDirectory" Type='directory'
-	    Root='HKLM' Key='Software\Novell\Mono\[MONODEFAULTCLR]' Name='SDKInstallRoot' />
-	</Property>
-
-    <!-- Define all directories used in the install -->
-	<Directory Id="TARGETDIR" Name="SourceDir">
-	  <Directory Id='ProgramFilesFolder' Name='PFiles'>
-		
-		<!-- Target locations for NUnit Files -->
-		<Directory Id='INSTALLDIR' Name='NUnit' LongName="NUnit $(var.NominalVersion)"> 
-		  <!-- <Directory Id='Assemblies' Name='AF' LongName='Assemblies' /> -->
-		  <Directory Id='bin' Name='bin'>
-		    <Directory Id='addins' Name='addins' />
-		  </Directory>
-		  <Directory Id='doc' Name='doc'>
-		    <Directory Id='files' Name='files' />
-			<Directory Id='img' Name='img' />
-		  </Directory>
-		  <Directory Id='samples' Name='samples'>
-			<Directory Id='csharp' Name='csharp' />
-			<Directory Id='jsharp' Name='jsharp' />
-			<Directory Id='vb' Name='vb' />
-			<Directory Id='cpp' Name='cpp' />
-			<Directory Id='extensibility' Name='EXTENSIB' LongName='Extensibility' />
-		  </Directory>		
-		</Directory>
-		
-	  </Directory>
-
-      <!-- Desktop Folder Directory for our Desktop Shortcut -->
-	  <Directory Id="DesktopFolder" Name="." SourceName="DESKTOP" LongSource="User's Desktop" />
-      
-      <!-- Program Menu Folder and our subfolders for Shortcuts -->
-	  <Directory Id="ProgramMenuFolder" Name="." SourceName="PROGRAMS" LongSource="User's Program Menu">
-        <Directory Id="NUnitMenu" Name="NUnit" LongName="NUnit $(var.NominalVersion)" >
-		  <Directory Id="SamplesMenu" Name="Samples" />
-		</Directory>
-      </Directory>
-      
-    </Directory>
-    
-	<!-- Top Level File Components -->
-	<DirectoryRef Id="INSTALLDIR">
-	
-      <Component Id="C__LOGO" Guid="99080421-75CC-4DFC-0987-AA16B7E68659">
-        <File Id="_LOGO" Name="Logo.ico" Source="Logo.ico" Vital="yes" KeyPath="yes" DiskId="1" />
-		<RemoveFile Id="RF_thumbs.db" Name="Thumbs.db" On="uninstall" />
-      </Component>
-      
-      <Component Id="C__LICENSE" Guid="7D03AE6B-15A7-16E0-0D21-D65708B2FA79">
-        <File Id="_LICENSE" Name="license.txt" Source="license.txt" 
-			  Vital="yes" KeyPath="yes" DiskId="1" />
-      </Component>
-	  
-      <Component Id="C__FIT_LICENSE" Guid="6C47563D-CDCD-4a65-BD89-A37F3A3C681D">
-        <File Id="fit_license.txt" Name="FITLICNS.TXT" LongName="fit-license.txt" Source="fit-license.txt" 
-			  Vital="yes" KeyPath="yes" DiskId="1" />
-      </Component>
-	  
-      <Component Id="C__ROWTEST_LICENSE" Guid="D394F6E1-C2D5-4d37-8E77-4941EDB3FC5D">
-        <File Id="rowtest_license" Name="ROWTSTLI.TXT" LongName="rowtest-license.txt"
-Source="rowtest-license.txt" 
-			  Vital="yes" KeyPath="yes" DiskId="1" />
-      </Component>
-	  
-	</DirectoryRef>
-      
-    <!-- Define the NUnit base feature it's contents and reference 
-		 sub-features defined in other files -->
-	<Feature Id="BaseFeature" Level="1" ConfigurableDirectory="INSTALLDIR"
-		Title="NUnit $(var.NominalVersion)" Display='expand'
-		Description="Base NUnit assemblies required to write and run tests using the NUnit-Console runner.">
-      
-        <!-- Defined above -->
-		<ComponentRef Id="C__LICENSE" />
-		<ComponentRef Id="C__FIT_LICENSE" />
-		<ComponentRef Id="C__LOGO" />
-                <ComponentRef Id="C__ROWTEST_LICENSE"/>
-
-		<!-- Defined in bin.wxs -->
-		<ComponentRef Id="C__NUnitBase" />
-		<ComponentRef Id="C__NUnitRegistry" />
-		<ComponentRef Id="C__Addins" />
-		
-		<!-- Defined in nunit-gui.wxs -->
-		<FeatureRef Id="GuiFeature" />
-		
-		<!-- Defined in doc.wxs -->
-		<FeatureRef Id="DocFeature" />
-		
-		<!-- Defined in samples.wxs -->
-		<FeatureRef Id="SamplesFeature" />
-		
-		<!-- Defined in tests.wxs -->
-		<FeatureRef Id="TestsFeature" />
-		     
-    </Feature>
-   
-	<!-- The NUnit files are all in a single cab file that is embedded in the MSI -->
-	<Media Id="1" EmbedCab="yes" Cabinet="nunit.cab" />
-
-	<!-- Define our GUI using the standard WiX UI FeatureTree set-->
-	<UIRef Id="WixUI_FeatureTree" />
-    <UIRef Id="WixUI_ErrorProgressText" /> 
-	
-  </Product>
-</Wix>
\ No newline at end of file
diff --git a/src/install/bin.wxs b/src/install/bin.wxs
deleted file mode 100644
index c63b6b1..0000000
--- a/src/install/bin.wxs
+++ /dev/null
@@ -1,69 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Wix xmlns="http://schemas.microsoft.com/wix/2003/01/wi">
-  <Fragment>
-  
-    <DirectoryRef Id="bin" FileSource="bin">
-         
-        <Component Id="C__NUnitBase" DiskId="1" Guid="15222234-C43E-4f31-B2C3-E83995627A68">
-          <File Id="console.exe" Name="CONSOLE.EXE" LongName="nunit-console.exe" />
-          <File Id="console.config" Name="CONSOLE.CFG" LongName="nunit-console.exe.config" />
-
-<?if $(var.RuntimeVersion) = 2.0 ?>
-          <File Id="consolex86.exe" Name="CONSOL86.EXE" LongName="nunit-console-x86.exe" />
-          <File Id="consolex86.config" Name="CONSOL86.CFG" LongName="nunit-console-x86.exe.config" />
-<?endif?>
-
-          <File Id="console.dll" Name="CONSOLE.DLL" LongName="nunit-console-runner.dll" />
-          <File Id="nunit.core" Name="CORE.DLL" LongName="nunit.core.dll" />
-          <File Id="nunit.core.interfaces" Name="IFACES.DLL" LongName="nunit.core.interfaces.dll" />
-          <File Id="nunit.framework" Name="FRAMEWRK.DLL" LongName="nunit.framework.dll" />
-          <File Id="nunit.framework.xml" Name="FRAMEWRK.XML" LongName="nunit.framework.xml" />
-          <File Id="nunit.mocks" Name="MOCKS.DLL" LongName="nunit.mocks.dll" />
-          <File Id="nunit.util" Name="UTIL.DLL" LongName="nunit.util.dll" />
-          <File Id="nunit.core.extensions" Name="CORE_EX.DLL" LongName="nunit.core.extensions.dll" />
-          <File Id="nunit.framework.extensions" Name="FRAME_EX.DLL" LongName="nunit.framework.extensions.dll" />
-        </Component>
-        
-		<!--<Component Id="NUnitServer" DiskId="1" Guid="Need Guid">
-          <File Id="F__nunit_server_exe" Name="NUS.EXE" LongName="nunit-server.exe" Source="nunit-server.exe" />
-          <File Id="F__nunit_test_server_dll" Name="NUNTS.DLL" LongName="nunit-test-server.dll" Source="nunit-test-server.dll" /> 
-		</Component>-->
-	  
-	  	<Component Id="C__NUnitRegistry" Guid="36AE84ED-5510-40eb-A3B1-D821AC06259C">
-			<Registry Id="R__INSTALLDIR" Root="HKMU" Key="Software\[Manufacturer]\NUnit\$(var.NominalVersion)" Name="InstallDir" 
-				Action="write" Type="string" Value="[INSTALLDIR]" />
-			<Registry Id="R__ProductVersion" Root="HKMU" Key="Software\[Manufacturer]\NUnit\$(var.NominalVersion)" Name="ProductVersion" 
-				Action="write" Type="string" Value="[ProductVersion]" />
-			<Registry Id="R__Assemblies" Root="HKMU"
-				Key="Software\Microsoft\.NETFramework\AssemblyFolders\NUnit [ProductVersion]" 
-				Action="write" Type="string" Value="[bin]" />
-			<Registry Id="R__OpenDllWith" Root="HKCR" Key=".dll\OpenWithList\nunit.exe"/>
-			<Registry Id="R__OpenDll_1" Root="HKCR" Key="dllfile\shell\OpenWithNUnit"
-				Action="write" Type="string" Value="Run &Tests" />
-			<Registry Id="R__OpenDll_2" Root="HKCR" Key="dllfile\shell\OpenWithNUnit\command"
-				Action="write" Type="string" Value='"[!nunit.exe]" "%1"' />
-			<Registry Id="R__OpenNUnit_1" Root="HKCR" Key=".nunit"
-				Action="write" Type="string" Value="NUnitTestProject" />
-			<Registry Id="R__OpenNUnit_2" Root="HKCR" Key="NUnitTestProject"
-				Action="write" Type="string" Value="NUnit Test Project" />
-			<Registry Id="R__OpenNUnit_3" Root="HKCR" Key="NUnitTestProject\DefaultIcon"
-				Action="write" Type="string" Value="[INSTALLDIR]\bin\nunit.exe,0" />
-			<Registry Id="R__OpenNUnit_4" Root="HKCR" Key="NUnitTestProject\shell\Open"
-				Action="write" Type="string" Value="&Open" />
-			<Registry Id="R__OpenNUnit_5" Root="HKCR" Key="NUnitTestProject\shell\Open\command"
-				Action="write" Type="string" Value='"[INSTALLDIR]\bin\nunit.exe" "%1"' />
-	  </Component>
-				
-	</DirectoryRef>
-	
-	<DirectoryRef Id="addins">
-	
-        <Component Id="C__Addins" DiskId="1" Guid="5DBAEF2B-DF1A-4582-9036-1261B3421EE8">
-		  <CreateFolder />
-		  <RemoveFile Id="RemoveOldAddins" Name="*.*" On="uninstall" />
-		</Component>
-		
-	</DirectoryRef>
-	
-  </Fragment>
-</Wix>
\ No newline at end of file
diff --git a/src/install/doc.wxs b/src/install/doc.wxs
deleted file mode 100644
index 2d172dc..0000000
--- a/src/install/doc.wxs
+++ /dev/null
@@ -1,129 +0,0 @@
-<Wix xmlns="http://schemas.microsoft.com/wix/2003/01/wi">
-  <Fragment>
-  
-    <Feature Id="DocFeature" Level="1"
-		Title='Documentation' Display='expand'
-		Description="HTML documentation for NUNit">
-      <ComponentRef Id="C__doc" />
-      <ComponentRef Id="C__doc_files" />
-      <ComponentRef Id="C__doc_img" />
-    </Feature>
-      
-    <DirectoryRef Id="doc" FileSource="doc">
-      <Component Id="C__doc" DiskId="1" Guid="6d9faf90-1ff2-11db-a98b-0800200c9a66">
-        <File Id="nunit.css" Name="nunit.css" />
-        <File Id="codeFuncs.js" Name="CODEFNCS.JS" LongName="codeFuncs.js" />
-        <File Id="favicon.ico" Name="favicon.ico" />
-        <File Id="addinsDialog.html" Name="ADDINDLG.HTM" LongName="addinsDialog.html" />
-        <File Id="assertions.html" Name="ASSERT_1.HTM" LongName="assertions.html" />
-        <File Id="attributes.html" Name="ATTRIB_1.HTM" LongName="attributes.html" />
-        <File Id="category.html" Name="CATEGO_1.HTM" LongName="category.html" />
-        <File Id="classicModel.html" Name="CLASSIC.HTM" LongName="classicModel.html" />
-        <File Id="collectionAssert.html" Name="COLLEC_1.HTM" LongName="collectionAssert.html" />
-        <File Id="collectionConstraints.html" Name="COLLEC_2.HTM" LongName="collectionConstraints.html" />
-        <File Id="comparisonAsserts.html" Name="COMPAR_1.HTM" LongName="comparisonAsserts.html" />
-        <File Id="comparisonConstraints.html" Name="COMPAR_2.HTM" LongName="comparisonConstraints.html" />
-        <File Id="compoundConstraints.html" Name="COMPOUND.HTM"
-LongName="compoundConstraints.html" />
-        <File Id="conditionAsserts.html" Name="CONDIT_1.HTM" LongName="conditionAsserts.html" />
-        <File Id="conditionConstraints.html" Name="CONDIT_2.HTM"
-LongName="conditionConstraints.html" />
-        <File Id="configEditor.html" Name="CONFIG_1.HTM" LongName="configEditor.html" />
-        <File Id="configFiles.html" Name="CONFIG_2.HTM" LongName="configFiles.html" />
-        <File Id="consoleCommandLine.html" Name="CONSOL_1.HTM" LongName="consoleCommandLine.html" />
-        <File Id="constraintModel.html" Name="CON_MODL.HTM" LongName="constraintModel.html" />
-        <File Id="contextMenu.html" Name="CONTEX_1.HTM" LongName="contextMenu.html" />
-        <File Id="culture.html" Name="CULTURE.HTM" LongName="culture.html" />
-        <File Id="customAsserts.html" Name="CUSTOM_1.HTM" LongName="customAsserts.html" />
-        <File Id="customConstraints.html" Name="CUSTOM_2.HTM"
-LongName="customConstraints.html" />
-        <File Id="description.html" Name="DESCRIP.HTM" LongName="description.html" />
-        <File Id="equalConstraint.html" Name="EQUALCON.HTM" LongName="equalConstraint.html" />
-        <File Id="equalityAsserts.html" Name="EQUALI_1.HTM" LongName="equalityAsserts.html" />
-        <File Id="exception.html" Name="EXCEPT_1.HTM" LongName="exception.html" />
-        <File Id="explicit.html" Name="EXPLIC_1.HTM" LongName="explicit.html" />
-        <File Id="extensibility.html" Name="EXTENSBL.HTM" LongName="extensibility.html" />
-        <File Id="features.html" Name="FEATUR_1.HTM" LongName="features.html" />
-        <File Id="fileAssert.html" Name="FILEAS_1.HTM" LongName="fileAssert.html" />
-        <File Id="fixtureSetup.html" Name="FIXTUR_1.HTM" LongName="fixtureSetup.html" />
-        <File Id="fixtureTeardown.html" Name="FIXTUR_2.HTM" LongName="fixtureTeardown.html" />
-        <File Id="getStarted.html" Name="GETSTA_1.HTM" LongName="getStarted.html" />
-        <File Id="guiCommandLine.html" Name="GUICOM_1.HTM" LongName="guiCommandLine.html" />
-        <File Id="identityAsserts" Name="IDENTI_1.HTM" LongName="identityAsserts.html" />
-        <File Id="ignore.html" Name="IGNORE_1.HTM" LongName="ignore.html" />
-        <File Id="index.html" Name="INDEX_1.HTM" LongName="index.html" >
-          <Shortcut Id="S__docs" Directory="NUnitMenu" Name="SDOCS" LongName="Documentation" Show="normal" WorkingDirectory="D__doc" />
-        </File>
-        <File Id="installation.html" Name="INSTAL_1.HTM" LongName="installation.html" />
-        <File Id="license.html" Name="LICENS_1.HTM" LongName="license.html" />
-        <File Id="listMapper.html" Name="LISTMAP.HTM" LongName="listMapper.html" />
-        <File Id="mainMenu.html" Name="MAINME_1.HTM" LongName="mainMenu.html" />
-        <File Id="multiAssembly.html" Name="MULTIA_1.HTM" LongName="multiAssembly.html" />
-        <File Id="nunit_console.html" Name="NUNIT-_1.HTM" LongName="nunit-console.html" />
-        <File Id="nunit_gui.html" Name="NUNIT-_2.HTM" LongName="nunit-gui.html" />
-        <File Id="nunitAddins.html" Name="ADDINS.HTM" LongName="nunitAddins.html" />
-        <File Id="optionsDialog.html" Name="OPTION_1.HTM" LongName="optionsDialog.html" />
-        <File Id="platform.html" Name="PLATFO_1.HTM" LongName="platform.html" />
-        <File Id="platformSupport.html" Name="PLATFO_2.HTM" LongName="platformSupport.html" />
-        <File Id="projectEditor.html" Name="PROJEC_1.HTM" LongName="projectEditor.html" />
-        <File Id="property.html" Name="PROPER_1.HTM" LongName="property.html" />
-        <File Id="propertyConstraint.html" Name="PROPER_2.HTM" LongName="propertyConstraint.html" />
-        <File Id="quickstart.html" Name="QUICKS_1.HTM" LongName="quickStart.html" />
-        <File Id="releaseNotes.html" Name="RELEAS_1.HTM" LongName="releaseNotes.html" />
-        <File Id="sameasConstraint.html" Name="SAMEAS.HTM" LongName="sameasConstraint.html" />
-        <File Id="samples.html" Name="SAMPLE_1.HTM" LongName="samples.html" />
-        <File Id="setCulture.html" Name="SETCULTR.HTM" LongName="setCulture.html" />
-        <File Id="setup.html" Name="SETUP_1.HTM" LongName="setup.html" />
-        <File Id="setupFixture.html" Name="SETUPF_1.HTM" LongName="setupFixture.html" />
-        <File Id="stringAssert.html" Name="STRING_1.HTM" LongName="stringAssert.html" />
-        <File Id="stringConstraints.html" Name="STRING_2.HTM" LongName="stringConstraints.html" />
-        <File Id="suite.html" Name="SUITE_1.HTM" LongName="suite.html" />
-        <File Id="teardown.html" Name="TEARDO_1.HTM" LongName="teardown.html" />
-        <File Id="test.html" Name="TEST.HTM" LongName="test.html" />
-        <File Id="testFixture.html" Name="TESTFI_1.HTM" LongName="testFixture.html" />
-        <File Id="testProperties.html" Name="TESTPR_1.HTM" LongName="testProperties.html" />
-        <File Id="typeAsserts.html" Name="TYPEAS_1.HTM" LongName="typeAsserts.html" />
-        <File Id="typeConstraints.html" Name="TYPECON.HTM" LongName="typeConstraints.html" />
-        <File Id="upgrade.html" Name="UPGRAD_1.HTM" LongName="upgrade.html" />
-        <File Id="utilityAsserts.html" Name="UTILIT_1.HTM" LongName="utilityAsserts.html" />
-        <File Id="vsSupport.html" Name="VSSUPP_1.HTM" LongName="vsSupport.html" />
-	<RemoveFile Id="RF_doc_thumbs.db" Name="thumbs.db" On="uninstall" />
-      </Component>
-    </DirectoryRef>
-		
-    <DirectoryRef Id="files" FileSource="doc\files" >
-      <Component Id="C__doc_files" DiskId="1" Guid="757c2ae0-1ff2-11db-a98b-0800200c9a66">
-        <File Id="F__doc_file70" Name="QUICKS_2.DOC" LongName="QuickStart.doc" />
-        <File Id="F__doc_file71" Name="QUICKS_1.DOC" LongName="QuickStart.Spanish.doc" />
-        <File Id="F__doc_file72" Name="Results.xsd" />
-        <File Id="F__doc_file73" Name="SUMMAR_1.XSL" LongName="Summary.xslt" />
-        <File Id="F__doc_file75" Name="TESTRE_1.XML" LongName="TestResult.xml" />
-        <RemoveFile Id="RF_doc_files_thumbs.db" Name="thumbs.db" On="uninstall" />
-      </Component>
-    </DirectoryRef>
-		
-    <DirectoryRef Id="img" FileSource="doc\img">
-      <Component Id="C__doc_img" DiskId="1" Guid="7bb6dd10-1ff2-11db-a98b-0800200c9a66">
-        <File Id="addinsDialog.jpg" Name="ADDINDLG.JPG" LongName="addinsDialog.jpg" />
-        <File Id="F__doc_file83" Name="ASSEMB_1.JPG" LongName="assembliesTab.jpg" />
-        <File Id="F__doc_file84" Name="BULLET_1.GIF" LongName="bulletOff.gif" />
-        <File Id="F__doc_file85" Name="bulletOn.gif" />
-        <File Id="F__doc_file86" Name="CONFIG_1.JPG" LongName="configEditor.jpg" />
-        <File Id="F__doc_file87" Name="CONSOL_1.JPG" LongName="console-mock.jpg" />
-        <File Id="F__doc_file89" Name="GENERA_1.JPG" LongName="generalTab.jpg" />
-        <File Id="F__doc_file90" Name="GUI-SC_1.JPG" LongName="gui-screenshot.jpg" />
-        <File Id="F__doc_file91" Name="GUI-VE_1.JPG" LongName="gui-verify.jpg" />
-        <File Id="F__doc_file93" Name="LANGFI_1.GIF" LongName="langFilter.gif" />
-        <File Id="F__doc_file94" Name="logo.gif" />
-        <File Id="F__doc_file96" Name="miniGui.jpg" />
-        <File Id="F__doc_file97" Name="OPTION_1.JPG" LongName="optionsDialog.jpg" />
-        <File Id="F__doc_file103" Name="TESTPR_1.JPG" LongName="testProperties.jpg" />
-        <File Id="generalOptions.jpg" Name="GENOPTS.JPG" LongName="generalOptions.jpg" />
-        <File Id="testOutputOptions.jpg" Name="OUTOPTS.JPG" LongName="testOutputOptions.jpg" />
-        <File Id="testLoadOptions.jpg" Name="LOADOPTS.JPG" LongName="testLoadOptions.jpg" />
-        <RemoveFile Id="RF_doc_img_thumbs.db" Name="thumbs.db" On="uninstall" />
-      </Component>
-    </DirectoryRef>
-	
-  </Fragment>
-</Wix>
\ No newline at end of file
diff --git a/src/install/nunit-gui.wxs b/src/install/nunit-gui.wxs
deleted file mode 100644
index 0af70a1..0000000
--- a/src/install/nunit-gui.wxs
+++ /dev/null
@@ -1,102 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Wix xmlns="http://schemas.microsoft.com/wix/2003/01/wi">
-  <Fragment>
-  
-    <Feature Id="GuiFeature" Level="1"
-		Title='NUnit Gui' Display='expand'
-		Description="Windows GUI runner for NUnit tests">
-		
-		<ComponentRef Id="C__NUnitExe" />
-		<ComponentRef Id="C__ClrBat" />
-		<ComponentRef Id="C__GuiRunner" />
-		<ComponentRef Id="C__GuiComponents" />
-<?if $(var.RuntimeVersion) != 2.0 ?>
-		<ComponentRef Id="C__Shortcut_1.0" />
-		<ComponentRef Id="C__Shortcut_1.1" />
-<?endif?>
-		<ComponentRef Id="C__Shortcut_2.0" />
-		<ComponentRef Id="C__Shortcut_Mono" />
-		
-    </Feature>
-    
-    <DirectoryRef Id="bin" FileSource="bin">
-         
-        <Component Id="C__NUnitExe" DiskId="1" Guid="8F677B87-1379-4721-B527-6EC53A3613F4">
-		  <File Id="nunit.exe" Name="nunit.exe">
-		      <Shortcut Id="DesktopShortcut" Directory="DesktopFolder" 
-			    Name="SNUNITDT" LongName="NUnit $(var.NominalVersion)" 
-				Icon="nunit_icon.exe" IconIndex="0" Show="normal" 
-				Advertise="no" WorkingDirectory="bin" />
-		  </File>
-          <File Id="nunit.config" Name="NUNIT.CFG" LongName="nunit.exe.config" />
-
-<?if $(var.RuntimeVersion) = 2.0 ?>
-          <File Id="nunitx86.exe" Name="NUNITX86.EXE" LongName="nunit-x86.exe" />
-          <File Id="nunitx86.config" Name="NUNITX86.CFG" LongName="nunit-x86.exe.config" />
-<?endif?>
-
-		</Component>
-        <Component Id="C__ClrBat" DiskId="1" Guid="EEA6FC05-A7D3-45d4-B7F1-71627BAFC6F6">
-          <File Id="clr.bat" Name="clr.bat" KeyPath="yes" DiskId="1" />
-		</Component>
-<?if $(var.RuntimeVersion) != 2.0 ?>
-        <Component Id="C__Shortcut_1.0" DiskId="1" Guid="2B9915B2-3C65-45fa-B6DB-7CB47F19EEA0">
-		  <Shortcut Id="Shortcut_1.0" Target="[!clr.bat]" Arguments="1.0 start nunit.exe" Directory="NUnitMenu" 
-		    Name="SNUNIT10" LongName="NUnit GUI (.NET 1.0)"  Advertise="no"
-			Icon="nunit_icon.exe" IconIndex="0" Show="minimized" 
-			WorkingDirectory="bin" />
-    		<Condition>
-      		  FRAMEWORK10 = "3321-3705"
-			</Condition>
-		</Component>
-        <Component Id="C__Shortcut_1.1" DiskId="1" Guid="BC64C9F2-8CA8-4cc1-BD86-1B036DDC1E26">
-		  <Shortcut Id="Shortcut_1.1" Target="[!clr.bat]" Arguments="1.1 start nunit.exe" Advertise="no"
-		    Directory="NUnitMenu" Name="SNUNIT11" LongName="NUnit GUI (.NET 1.1)" 
-			Icon="nunit_icon.exe" IconIndex="0" Show="minimized" 
-			WorkingDirectory="bin" />
-    		<Condition>
-      		  FRAMEWORK11 = "3706-4322"
-			</Condition>
-		</Component>
-<?endif?>
-        <Component Id="C__Shortcut_2.0" DiskId="1" Guid="A771FB75-2488-4f2c-BA22-1F4C85D64AC7">
-		  <Shortcut Id="Shortcut_2.0" Target="[!clr.bat]" Arguments="2.0 start nunit.exe"  Advertise="no"
-		    Directory="NUnitMenu" Name="SNUNIT20" LongName="NUnit GUI (.NET 2.0)" 
-			Icon="nunit_icon.exe" IconIndex="0" Show="minimized" 
-			WorkingDirectory="bin" />
-    		<Condition>
-      		  FRAMEWORK20 = "50727-50727"
-			</Condition>
-		</Component>
-        <Component Id="C__Shortcut_Mono" DiskId="1" Guid="CDCB0BAA-0C50-4e41-A2B8-5C15027843DF">
-<?if $(var.RuntimeVersion) != 2.0 ?>
-		  <Shortcut Id="Shortcut_Mono_1_0" Target="[MONODIRECTORY]bin\mono.exe" Arguments="nunit.exe"  Advertise="no"
-		    Directory="NUnitMenu" Name="SNUNITMO" LongName="NUnit GUI (Mono 1.0 Profile)" 
-			Icon="nunit_icon.exe" IconIndex="0" Show="normal" 
-			WorkingDirectory="bin" />
-<?endif?>
-		  <Shortcut Id="Shortcut_Mono_20" Target="[MONODIRECTORY]bin\mono.exe" Arguments="--runtime=v2.0.50727 nunit.exe"  Advertise="no"
-		    Directory="NUnitMenu" Name="SNUNITMO" LongName="NUnit GUI (Mono 2.0 Profile)" 
-			Icon="nunit_icon.exe" IconIndex="0" Show="normal" 
-			WorkingDirectory="bin" />
-    		<Condition>
-      		  MONODIRECTORY
-			</Condition>
-		</Component>
-        <Component Id="C__GuiRunner" DiskId="1" Guid="7A62D7B2-1D0D-4cb4-9C52-00DBBBDAA0A2">
-          <File Id="nunit.gui.dll" Name="GUI.DLL" LongName="nunit-gui-runner.dll" />
-		</Component>
-        <Component Id="C__GuiComponents" DiskId="1" Guid="5B256DDD-668C-4bdd-AC91-7EF0D961F6E6">
-          <File Id="nunit.uikit" Name="UIKIT.DLL" LongName="nunit.uikit.dll" />
-		  <File Id="success.jpg" Name="SUCCESS.JPG" LongName="success.jpg" />
-		  <File Id="failure.jpg" Name="FAILURE.JPG" LongName="failure.jpg" />
-		  <File Id="ignored.jpg" Name="IGNORED.JPG" LongName="ignored.jpg" />
-		  <RemoveFile Id="thumbs.db" On="uninstall" Name="THUMBS.DB" LongName="thumbs.db" />
-		</Component>
-				
-	</DirectoryRef>
-	
-    <Icon Id="nunit_icon.exe" SourceFile="bin\nunit.exe" />
-	
-  </Fragment>
-</Wix>
\ No newline at end of file
diff --git a/src/install/samples.wxs b/src/install/samples.wxs
deleted file mode 100644
index a427eb3..0000000
--- a/src/install/samples.wxs
+++ /dev/null
@@ -1,296 +0,0 @@
-<Wix xmlns="http://schemas.microsoft.com/wix/2003/01/wi">
-  <Fragment>
-
-    <!-- Feature to install sample code -->
-	<Feature Id="SamplesFeature" Level="1"
-		Title='Samples' Description='Sample code showing the use of NUnit' Display='expand'>
-		
-	  <ComponentRef Id="C__SamplesReadme" />
-	  <ComponentRef Id="C__SampleShortcuts" />
-
-	  <!-- C# Samples -->
-          <ComponentRef Id="C__CSharp_Samples" />
-	  <ComponentRef Id="C__CSharp_Failures" />
-	  <ComponentRef Id="C__CSharp_Money" />
-	  <ComponentRef Id="C__CSharp_Money_Port" />
-	  <ComponentRef Id="C__CSharp_Syntax" />
-		
-      <!-- J# Sample -->
-          <ComponentRef Id="C__JSharp_Samples" />
-	  <ComponentRef Id="C__JSharp_Failures" />
-
-      <!-- Managed C++ Samples -->
-	  <ComponentRef Id="C__CPP_Managed_Samples" />
-	  <ComponentRef Id="C__CPP_Managed_Failures" />
-
-      <!-- C++/CLI Samples -->
-	  <ComponentRef Id="C__CPP_CLI_Samples" />
-	  <ComponentRef Id="C__CPP_CLI_Failures" />
-	  <ComponentRef Id="C__CPP_CLI_Syntax" />
-
-      <!-- VB Sample -->
-	  <ComponentRef Id="C__VB_Samples" />
-	  <ComponentRef Id="C__VB_Failures" />
-	  <ComponentRef Id="C__VB_Money" />
-          <ComponentRef Id="C__VB_Syntax" />
-			
-      <!-- Core Extensibility Samples -->
-          <ComponentRef Id="C__CoreExtensibility" />
-	  <ComponentRef Id="C__MinimalAddin" />
-	  <ComponentRef Id="C__SampleSuiteExtension" />
-	  <ComponentRef Id="C__SampleSuiteExtension_Tests" />
-	  <ComponentRef Id="C__SampleFixtureExtension" />
-	  <ComponentRef Id="C__SampleFixtureExtension_Tests" />
-          <ComponentRef Id="C__MaxTimeDecorator" />
-          <ComponentRef Id="C__MaxTimeDecoratorTests" />
-
-    </Feature>
-	
-	<!-- Menu Shortcuts to samples -->
-	<DirectoryRef Id="samples" FileSource="samples">
-        <Component Id="C__SampleShortcuts" DiskId="1" Guid="CCDAEC65-EED0-4794-89D0-363EB1AC3CC9">
-          <Shortcut Id="S__csharp" Target="[csharp]" Directory="SamplesMenu" Name="SCSHARP" LongName="C#" Show="normal" />
-          <Shortcut Id="S__jsharp" Target="[jsharp]" Directory="SamplesMenu" Name="SJSHARP" LongName="J#" Show="normal" />
-          <Shortcut Id="S__cpp" Target="[cpp]" Directory="SamplesMenu" Name="SCPP" LongName="C++" Show="normal" />
-          <Shortcut Id="S__vb" Target="[vb]" Directory="SamplesMenu" Name="SVB" LongName="VB" Show="normal" />
-          <Shortcut Id="S__extensibility" Target="[extensibility]" Directory="SamplesMenu" Name="SEXTENSI" LongName="Extensibility" Show="normal" />
-	    </Component>
-		<Component Id="C__SamplesReadme" DiskId="1" Guid="9FBE1436-920F-450b-9E7E-D85473E727B4">
-		  <File Id="ReadMe.txt" Name="ReadMe.txt" />
-		</Component>
-	</DirectoryRef>
-
-    <!-- C# Samples -->	
-    <DirectoryRef Id="csharp" FileSource="samples\csharp">
-
-        <Component Id="C__CSharp_Samples" DiskId="1" Guid="16E59CB4-B8E0-46ac-9FE0-D08581D349EA">
-          <File Id="CSharp.sln" Name="CSharp.sln" />
-        </Component>
-	
-        <Directory Id="csharp_failures" Name="failures">
-            <Component Id="C__CSharp_Failures" DiskId="1" Guid="5613D9D2-7F4B-4d49-A0C3-AEF43CF08C5B">
-              <File Id="CS_Failures.csproj" Name="CS-FAIL.CSP" LongName="cs-failures.csproj" />
-              <File Id="CS_Failures.build" Name="CS-FAIL.BLD" LongName="cs-failures.build" />
-              <File Id="CSharpTest.cs" Name="CS-FAIL.CS" LongName="CSharpTest.cs" />
-              <File Id="CS_Failures_AssemblyInfo.cs" Name="ASSEMB_1.CS" LongName="AssemblyInfo.cs" />
-            </Component>
-        </Directory>
-        
-        <Directory Id="csharp_money" Name="money">
-            <Component Id="C__CSharp_Money" DiskId="1" Guid="F7B5ED7B-7478-43d3-B376-06FE70EADF1B">
-              <File Id="CS_Money.cs" Name="Money.cs" />
-              <File Id="CS_MoneyTest.cs" Name="MONEYTST.CS" LongName="MoneyTest.cs" />
-              <File Id="CS_MoneyBag.cs" Name="MoneyBag.cs" />
-              <File Id="CS_Money_AssemblyInfo.cs" Name="ASSEMB_1.CS" LongName="AssemblyInfo.cs" />
-              <File Id="CS_Money.csproj" Name="MONEY.CSP" LongName="cs-money.csproj" />
-              <File Id="CS_Money.build" Name="MONEY.BLD" LongName="cs-money.build" />
-              <File Id="CS_IMoney.cs" Name="IMoney.cs" />
-            </Component>
-        </Directory>
-        
-	<Directory Id="csharp_money_port" Name="MONEY-_1" LongName="money-port">
-            <Component Id="C__CSharp_Money_Port" DiskId="1" Guid="CE86795C-1A55-4d82-BBA7-8B73668B94D1">
-              <File Id="CS_Money_Port_MoneyBag.cs" Name="MoneyBag.cs" />
-              <File Id="CS_Money_Port_Money.cs" Name="Money.cs" />
-              <File Id="CS_Money_Port_AssemblyInfo.cs" Name="ASSEMB_1.CS" LongName="AssemblyInfo.cs" />
-              <File Id="CS_Money_Port.dll.config" Name="MONEY-_1.CON" LongName="cs-money-port.dll.config" />
-              <File Id="CS_Money_Port_IMoney.cs" Name="IMoney.cs" />
-              <File Id="CS_Money_Port_MoneyTest.cs" Name="MONEYTST.CS" LongName="MoneyTest.cs" />
-              <File Id="CS_Money_Port.csproj" Name="MONYPORT.CSP" LongName="cs-money-port.csproj" />
-              <File Id="CS_Money_Port.build" Name="MONYPORT.BLD" LongName="cs-money-port.build" />
-            </Component>
-        </Directory>
-		
-        <Directory Id="csharp_syntax" Name="syntax">
-            <Component Id="C__CSharp_Syntax" DiskId="1" Guid="5613D9D2-7F4B-4d49-A0C3-AEF43CF08C5B">
-              <File Id="CS_Syntax.csproj" Name="CS-SYNT.CSP" LongName="cs-syntax.csproj" />
-              <File Id="CS_Syntax.build" Name="CS-SYNT.BLD" LongName="cs-syntax.build" />
-              <File Id="CS_AssertSyntaxTests.cs" Name="CS-SYNT.CS" LongName="AssertSyntaxTests.cs" />
-              <File Id="CS_Syntax_AssemblyInfo.cs" Name="ASSEMB_1.CS" LongName="AssemblyInfo.cs" />
-            </Component>
-        </Directory>
-        
-    </DirectoryRef>
-		
-    <!-- J# Sample -->
-    <DirectoryRef Id="jsharp" FileSource="samples\jsharp" >
-
-        <Component Id="C__JSharp_Samples" DiskId="1" Guid="14ECAA49-AFA8-4198-A093-B1A893445CF2">
-            <File Id="jsharp.sln" Name="jsharp.sln" />
-        </Component>
-
-        <Directory Id="jsharp_failures" Name="failures">
-          <Component Id="C__JSharp_Failures" DiskId="1" Guid="500ED4A5-E644-473d-904E-CD43D423531B">
-            <File Id="JS_Failures.vjsproj" Name="JS-FAIL.VJS" LongName="jsharp-failures.vjsproj" />
-            <File Id="JS_Failures.build" Name="JS-FAIL.BLD" LongName="jsharp-failures.build" />
-            <File Id="JS_JSharpTest.jsl" Name="JS-FAIL.JSL" LongName="JSharpTest.jsl" />
-            <File Id="JS_Failures_AssemblyInfo.jsl" Name="ASSEMB_1.JSL" LongName="AssemblyInfo.jsl" />
-          </Component>
-        </Directory>
-
-    </DirectoryRef>
-		
-    <!-- C++ Samples -->
-    <DirectoryRef Id="cpp" FileSource="samples\cpp" >
-
-    <!-- Managed C++ -->
-    <Directory Id="cpp_managed" Name="managed">
-
-        <Component Id="C__CPP_Managed_Samples" DiskId="1" Guid ="FBD98E2B-FBF4-487a-850F-E133CA863706">
-            <File Id="managed_cpp.sln" Name="MNGDCPP.SLN" LongName="managed-cpp.sln" />
-        </Component>
-
-        <Directory Id="cpp_managed_failures" Name="failures">
-          <Component Id="C__CPP_Managed_Failures" DiskId="1" Guid="A32EB24D-F996-4fc6-9614-D6CD17D0EAC6">
-            <File Id="F__samples_file46" Name="CPP-FAIL.H" LongName="cppsample.h" />
-            <File Id="F__samples_file47" Name="CPP-FAIL.CPP" LongName="cppsample.cpp" />
-            <File Id="CPP_Failures.vcproj" Name="CPP-FAIL.VCP" LongName="cpp-managed-failures.vcproj" />
-            <File Id="CPP_Failures.build" Name="CPP-FAIL.BLD" LongName="cpp-managed-failures.build" />
-            <File Id="F__samples_file50" Name="ASSEMB_1.CPP" LongName="AssemblyInfo.cpp" />
-          </Component>
-        </Directory>
-
-    </Directory>
-
-    <!-- C++/CLI -->  
-    <Directory Id="cpp_cli" Name="cpp-cli">
-
-        <Component Id="C__CPP_CLI_Samples" DiskId="1" Guid="AF5FDFF2-594C-45cd-9913-3EC14D243A1A">
-            <File Id="CPP_CLI.sln" Name="cpp-cli.sln" />
-        </Component>
-
-        <Directory Id="cpp_cli_failures" Name="failures">
-          <Component Id="C__CPP_CLI_Failures" DiskId="1" Guid="30A34CDA-7A71-48dd-8DC9-6D18EAECB49C">
-            <File Id="CPP_CLI_Failures.h" Name="CPP-FAIL.H" LongName="cppsample.h" />
-            <File Id="CPP_CLI_Failures.cpp" Name="CPP-FAIL.CPP" LongName="cppsample.cpp" />
-            <File Id="CPP_CLI_Failures.vcproj" Name="CPP-FAIL.VCP" LongName="cpp-cli-failures.vcproj" />
-            <File Id="CPP_CLI_Failures.build" Name="CPP-FAIL.BLD" LongName="cpp-cli-failures.build" />
-            <File Id="CPP_CLI_Failures_AssemblyInfo" Name="ASSEMB_1.CPP" LongName="AssemblyInfo.cpp" />
-          </Component>
-        </Directory>
-
-        <Directory Id="cpp_cli_syntax" Name="syntax">
-          <Component Id="C__CPP_CLI_Syntax" DiskId="1" Guid="30A34CDA-7A71-48dd-8DC9-6D18EAECB49C">
-            <File Id="CPP_CLI_Syntax.cpp" Name="CPP-SYN.CPP" LongName="cpp-cli-syntax.cpp" />
-            <File Id="CPP_CLI_Syntax.vcproj" Name="CPP-SYN.VCP" LongName="cpp-cli-syntax.vcproj" />
-            <File Id="CPP_CLI_Syntax.build" Name="CPP-SYN.BLD" LongName="cpp-cli-syntax.build" />
-            <File Id="CPP_CLI_Syntax_AssemblyInfo" Name="ASSEMB_1.CPP" LongName="AssemblyInfo.cpp" />
-          </Component>
-        </Directory>
-
-    </Directory>
-	  
-    </DirectoryRef>
-		
-    <!-- VB Samples -->
-    <DirectoryRef Id="vb" FileSource="samples\vb" >
-
-        <Component Id="C__VB_Samples" DiskId="1" Guid="D89C7A16-556C-4ff8-8FF3-E00DB2C4A45E">
-            <File Id="vb_samples.sln" Name="VB-SAMP.SLN" LongName="vb-samples.sln" />
-        </Component>
-	
-        <Directory Id="vb_failures" Name="failures">
-          <Component Id="C__VB_Failures" DiskId="1" Guid="05434C61-C0AC-47cb-8189-B1232CA3B5FB">
-            <File Id="vb_failures.vbproj" Name="VB-FAIL.VBP" LongName="vb-failures.vbproj" />
-            <File Id="vb_failures.build" Name="VB-FAIL.BLD" LongName="vb-failures.build" />
-            <File Id="vb_failures.vb" Name="VB-FAIL.VB" LongName="SimpleVBTest.vb" />
-            <File Id="vb_failures_assemblyinfo.vb" Name="ASSEMB_1.VB" LongName="AssemblyInfo.vb" />
-          </Component>
-        </Directory>
-	  
-        <Directory Id="vb_money" Name="money">
-            <Component Id="C__VB_Money" DiskId="1" Guid="AB0D542C-670D-473c-9034-1D277466E60A">
-              <File Id="Money.vbproj" Name="MONEY.VBP" LongName="vb-money.vbproj" />
-              <File Id="VB_Money.build" Name="MONEY.VBP" LongName="vb-money.build" />
-              <File Id="Money.vb" Name="Money.vb" />
-              <File Id="MoneyTest.vb" Name="MONEYTST.VB" LongName="MoneyTest.vb" />
-              <File Id="MoneyBag.vb" Name="MoneyBag.vb" />
-              <File Id="Money_AssemblyInfo.vb" Name="ASSEMB_1.VB" LongName="AssemblyInfo.vb" />
-              <File Id="IMoney.vb" Name="IMoney.vb" />
-            </Component>
-        </Directory>
-
-        <Directory Id="vb_syntax" Name="syntax">
-            <Component Id="C__VB_Syntax" DiskId="1" Guid="036CD103-788B-40c4-8AA3-467F9975E0E0">
-              <File Id="VB_Syntax.vbproj" Name="VB-SYNT.CSP" LongName="vb-syntax.vbproj" />
-              <File Id="VB_Syntax.build" Name="VB-SYNT.BLD" LongName="vb-syntax.build" />
-              <File Id="VB_AssertSyntaxTests.vb" Name="VB-SYNT.CS" LongName="AssertSyntaxTests.vb" />
-              <File Id="VB_Syntax_AssemblyInfo.vb" Name="ASSEMB_1.VB" LongName="AssemblyInfo.vb" />
-            </Component>
-        </Directory>
-        
-    </DirectoryRef>
-	
-    <!-- Extensibility Samples -->
-    <DirectoryRef Id="extensibility" FileSource="samples\Extensibility" >
-
-        <Directory Id="core_extensibility" Name="Core">
-
-            <Component Id="C__CoreExtensibility" DiskId="1" Guid="523B3117-5694-4dc2-9D8E-32CD1B843793">
-	        <File Id="Install.bat" Name="Install.bat" />
-                <File Id="CoreExtensibility.sln" Name="COREXTNS.SLN" LongName="CoreExtensibility.sln" />
-	    </Component>
-
-        <Directory Id="Minimal" Name="Minimal">
-          <Component Id="C__MinimalAddin" DiskId="1" Guid="7C9C8B34-5318-450b-8DCC-6D256C1259A1">
-            <File Id="Minimal.csproj" Name="MINIMAL.CSP" LongName="Minimal.csproj" />
-            <File Id="Minimal.build" Name="MINIMAL.BLD" LongName="Minimal.build" />
-            <File Id="Minimal.cs" Name="Minimal.cs" />
-          </Component>
-        </Directory>
-
-        <Directory Id="samplesuiteextension" Name="SAMPLE_1" LongName="SampleSuiteExtension">
-          <Component Id="C__SampleSuiteExtension" DiskId="1" Guid="2EDC393E-B725-406f-A9BC-824E3B72EE84">
-            <File Id="SSX_Addin.cs" Name="Addin.cs" />
-              <File Id="SampleSuiteExtensionBuilder.cs" Name="SSX.CS" LongName="SampleSuiteExtensionBuilder.cs" />
-              <File Id="SampleSuiteExtension.csproj" Name="SSX.CSP" LongName="SampleSuiteExtension.csproj" />
-              <File Id="SampleSuiteExtension.build" Name="SSX.BLD" LongName="SampleSuiteExtension.build" />
-              <File Id="SampleSuiteExtensionAttribute.cs" Name="SSX_ATTR.CS" LongName="SampleSuiteExtensionAttribute.cs" />
-              <File Id="SSX_AssemblyInfo.cs" Name="ASSEMBLY.CS" LongName="AssemblyInfo.cs" />
-              <File Id="SampleSuiteExtension.cs" Name="SSX.CS" LongName="SampleSuiteExtension.cs" />
-          </Component>
-          <Directory Id="samplesuiteextention_tests" Name="Tests">
-              <Component Id="C__SampleSuiteExtension_Tests" DiskId="1" Guid="0E72B102-06A7-448d-938E-3EDD83BA496C">
-                <File Id="SampleSuiteExtensionTests.csproj" Name="SSXTESTS.CSP" LongName="SampleSuiteExtensionTests.csproj" />
-                <File Id="SampleSuiteExtensionTests.cs" Name="SSXTESTS.CS" LongName="SampleSuiteExtensionTests.cs" />
-              </Component>
-            </Directory>
-          </Directory>
-
-          <Directory Id="samplefixtureextension" Name="SAMPLE_2" LongName="SampleFixtureExtension">
-            <Component Id="C__SampleFixtureExtension" DiskId="1" Guid="4C209669-C278-4fc7-8D61-3E36E263AADF">
-              <File Id="SampleFixtureExtensionBuilder.cs" Name="SFXBLDR.CS" LongName="SampleFixtureExtensionBuilder.cs" />
-              <File Id="SampleFixtureExtension.cs" Name="SFX.CS" LongName="SampleFixtureExtension.cs" />
-              <File Id="SampleFixtureExtensionAttribute.cs" Name="SFXATTR.CS" LongName="SampleFixtureExtensionAttribute.cs" />
-              <File Id="SampleFixtureExtension.csproj" Name="SFX.CSP" LongName="SampleFixtureExtension.csproj" />
-              <File Id="SampleFixtureExtension.build" Name="SFX.BLD" LongName="SampleFixtureExtension.build" />
-			  <File Id="SFX_AssemblyInfo.cs" Name="ASSEMBLY.CS" LongName="AssemblyInfo.cs" />
-            </Component>
-            <Directory Id="SFX_Tests" Name="Tests">
-              <Component Id="C__SampleFixtureExtension_Tests" DiskId="1" Guid="7A8AF9BF-EE33-462f-AE7F-2CEF2084866F">
-                <File Id="SampleFixtureExtensionTests.cs" Name="SFXTESTS.CS" LongName="SampleFixtureExtensionTests.cs" />
-                <File Id="SampleFixtureExtensionTests.csproj" Name="SFXTESTS.CSP" LongName="SampleFixtureExtensionTests.csproj" />
-              </Component>
-            </Directory>
-          </Directory>
-		  <Directory Id="maxtimedecorator" Name="MAXTIME" LongName="MaxTimeDecorator">
-		    <Component Id="C__MaxTimeDecorator" DiskId="1" Guid="D291A2AB-CC2D-4f67-BE2E-30ACBF5EA18F">
-			  <File Id="MTD_AssemblyInfo.cs" Name="ASSEMBLY.CS" LongName="AssemblyInfo.cs" />
-			  <File Id="MaxTimeAttribute.cs" Name="MTATTR.cs" LongName="MaxTimeAttribute.cs" />
-			  <File Id="MaxTimeDecorator.cs" Name="MTD.CS" LongName="MaxTimeDecorator.cs" />
-			  <File Id="MaxTimeTestCase.cs" Name="MTTC.CS" LongName="MaxTimeTestCase.cs" />
-			  <File Id="MaxTimeDecorator.csproj" Name="MTD.CSP" LongName="MaxTimeDecorator.csproj" />
-			  <File Id="MaxTimeDecorator.build" Name="MTD.BLD" LongName="MaxTimeDecorator.build" />
-			</Component>
-			<Directory Id="MTD_Tests" Name="Tests">
-			  <Component Id="C__MaxTimeDecoratorTests" DiskId="1" Guid="D50F4831-CC6C-4624-A419-307637F0BE9A">
-			    <File Id="MTD_Tests_AssemblyInfo.cs" Name="ASSMINFO.CS" LongName="AssemblyInfo.cs" />			    <File Id="MaxTimeDecoratorTests.cs" Name="MTDTESTS.CS" LongName="MaxTimeDecoratorTests.cs" />
-			    <File Id="MaxTimeDecoratorTests.csproj" Name="MTDTESTS.CSP" LongName="MaxTimeDecoratorTests.csproj" />
-			  </Component>
-			</Directory>
-		  </Directory>
-        </Directory>
-    </DirectoryRef>
-		
-  </Fragment>
-</Wix>
\ No newline at end of file
diff --git a/src/install/tests.wxs b/src/install/tests.wxs
deleted file mode 100644
index de907ab..0000000
--- a/src/install/tests.wxs
+++ /dev/null
@@ -1,61 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Wix xmlns="http://schemas.microsoft.com/wix/2003/01/wi">
-  <Fragment>
-  
-    <!-- Feature to install the NUnit tests -->
-	<Feature Id="TestsFeature" Level="1"
-		Title='Unit Tests' Description='Unit tests for NUnit' Display='expand'>
-		<ComponentRef Id="base_tests" />
-		<ComponentRef Id="gui_tests" />
-                <ComponentRef Id="fit_tests" />
-    </Feature>
-    
-	<DirectoryRef Id="bin" FileSource="bin">
-      
-        <Component Id="base_tests" DiskId="1" Guid="85DD0370-9E05-4e9a-8AB4-02A6C24986AB">
-          <File Id="testutilities" Name="TESTUTIL.DLL" LongName="test-utilities.dll" />
-          <File Id="testassembly" Name="TESTDATA.DLL" LongName="test-assembly.dll" />		
-          <File Id="loadtestassembly" Name="LOADTEST.DLL" LongName="loadtest-assembly.dll" />		
-          <File Id="mockassembly" Name="MOCKASM.DLL" LongName="mock-assembly.dll" />
-          <File Id="nonamespaceassembly" Name="NONAMESP.DLL" LongName="nonamespace-assembly.dll" />
-          <File Id="notestfixturesassembly" Name="NOTESTS.DLL" LongName="notestfixtures-assembly.dll" />
-          
-		  <File Id="timingtests" Name="TIMING.DLL" LongName="timing-tests.dll" />
-          
-		  <File Id="nunit.util.tests" Name="TESTUTIL.DLL" LongName="nunit.util.tests.dll" />
-          
-		  <File Id="nunit.framework.tests" Name="TESTFRAM.DLL" LongName="nunit.framework.tests.dll" />
-          
-		  <File Id="nunit.mocks.tests" Name="TESTMOCK.DLL" LongName="nunit.mocks.tests.dll" />
-          
-		  <File Id="console.tests" Name="TESTCONS.DLL" LongName="nunit-console.tests.dll" />
-          
-		  <File Id="NUnitTests.config" Name="ALLTESTS.CFG" LongName="NUnitTests.config" />
-          <File Id="NUnitTests.nunit" Name="ALLTESTS.NUN" LongName="NUnitTests.nunit" />
-			
-          <File Id="nunit.extensions.tests" Name="TESTEXTN.DLL"	LongName="nunit.extensions.tests.dll" />
-          
-		  <File Id="nunit.core.tests" Name="TESTCORE.DLL" LongName="nunit.core.tests.dll" />
-          
-          <!-- <File Id="F__nunit_server_tests_dll" Name="NUST.DLL" LongName="nunit-server.tests.dll" /> -->
-        </Component>
-          
-        <Component Id="gui_tests" DiskId="1" Guid="C7E0B8E5-DE60-455a-B247-B204A4C28677">
-		  <File Id="nunit.uikit.tests" Name="TESTUIKI.DLL" LongName="nunit.uikit.tests.dll" />
-          
-		  <File Id="gui.tests" Name="GUITESTS.DLL" LongName="nunit-gui.tests.dll" />
-        </Component>
-
-        <Component Id="fit_tests" DiskId="1" Guid="33E1C9B4-254D-4aaa-8BF5-FB18DAE3220E" >
-          <File Id="nunit.fixtures.dll" Name="FIXTURES.DLL" LongName="nunit.fixtures.dll" />
-          <File Id="nunit.fixtures.tests.dll" Name="FIXTESTS.DLL" LongName="nunit.fixtures.tests.dll" />
-          <File Id="NUnitFitTests.html" Name="FITTESTS.HTM" LongName="NUnitFitTests.html" />
-          <File Id="fit.dll" Name="fit.dll"/>
-          <File Id="runFile.exe" Name="runFile.exe"/>
-          <File Id="runFile.exe.config" Name="runFile.cfg" LongName="runFile.exe.config" />
-        </Component>
-
-	</DirectoryRef>
-	
-  </Fragment>
-</Wix>
\ No newline at end of file
diff --git a/src/license.rtf b/src/license.rtf
deleted file mode 100644
index b8f1486..0000000
--- a/src/license.rtf
+++ /dev/null
@@ -1,41 +0,0 @@
-{\rtf1\ansi\ansicpg1252\uc1\deff0\stshfdbch13\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}
-{\f2\fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}{\f13\fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ????\'a1\'a7???};}{\f37\fnil\fcharset134\fprq2{\*\panose 02010600030101010101}@SimSun;}
-{\f38\froman\fcharset238\fprq2 Times New Roman CE;}{\f39\froman\fcharset204\fprq2 Times New Roman Cyr;}{\f41\froman\fcharset161\fprq2 Times New Roman Greek;}{\f42\froman\fcharset162\fprq2 Times New Roman Tur;}
-{\f43\froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f44\froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f45\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f46\froman\fcharset163\fprq2 Times New Roman (Vietnamese);}
-{\f58\fmodern\fcharset238\fprq1 Courier New CE;}{\f59\fmodern\fcharset204\fprq1 Courier New Cyr;}{\f61\fmodern\fcharset161\fprq1 Courier New Greek;}{\f62\fmodern\fcharset162\fprq1 Courier New Tur;}{\f63\fmodern\fcharset177\fprq1 Courier New (Hebrew);}
-{\f64\fmodern\fcharset178\fprq1 Courier New (Arabic);}{\f65\fmodern\fcharset186\fprq1 Courier New Baltic;}{\f66\fmodern\fcharset163\fprq1 Courier New (Vietnamese);}{\f170\fnil\fcharset0\fprq2 SimSun Western{\*\falt ????\'a1\'a7???};}
-{\f410\fnil\fcharset0\fprq2 @SimSun Western;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;
-\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 
-\fs24\lang1033\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp1033\langfenp2052 \snext0 Normal;}{\*\cs10 \additive \ssemihidden Default Paragraph Font;}{\*
-\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv 
-\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang1024\langfe1024\loch\f0\hich\af0\dbch\af13\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}{
-\s15\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang1033\langfe2052\loch\f2\hich\af2\dbch\af13\cgrid\langnp1033\langfenp2052 \sbasedon0 \snext15 \styrsid9332467 Plain Text;}}{\*\latentstyles\lsdstimax156\lsdlockeddef0}
-{\*\rsidtbl \rsid610709\rsid818068\rsid5008211\rsid7476632\rsid8721477\rsid9332467\rsid10426157\rsid11172945\rsid11871043\rsid15552035\rsid16677168}{\*\generator Microsoft Word 11.0.6568;}{\info{\title Copyright (c) 2002 James W}{\author James Newkirk}
-{\operator Charlie Poole}{\creatim\yr2002\mo9\dy11\hr14\min43}{\revtim\yr2007\mo2\dy18\hr17\min58}{\version8}{\edmins15}{\nofpages1}{\nofwords166}{\nofchars950}{\*\company Nascent Software, Inc.}{\nofcharsws1114}{\vern24579}}\margl1319\margr1319 
-\widowctrl\ftnbj\aenddoc\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1319\dgvorigin1440\dghshow1\dgvshow1
-\jexpand\viewkind1\viewscale120\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct\asianbrkrule\rsidroot15552035 \fet0\sectd 
-\linex0\endnhere\sectlinegrid360\sectdefaultcl\sectrsid9332467\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}
-{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang 
-{\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain 
-\s15\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid9332467 \fs20\lang1033\langfe2052\loch\af2\hich\af2\dbch\af13\cgrid\langnp1033\langfenp2052 {\insrsid16677168\charrsid9332467 \hich\af2\dbch\af13\loch\f2 Copyright }{
-\insrsid16677168 \loch\af2\dbch\af13\hich\f2 \'a9\loch\f2  \hich\af2\dbch\af13\loch\f2 2002-2007 Charlie Poole
-\par }{\insrsid610709\charrsid9332467 \hich\af2\dbch\af13\loch\f2 Copyright }{\insrsid10426157 \loch\af2\dbch\af13\hich\f2 \'a9\loch\f2  }{\insrsid610709\charrsid9332467 \hich\af2\dbch\af13\loch\f2 2002}{\insrsid8721477 \hich\af2\dbch\af13\loch\f2 -200}{
-\insrsid11871043 \hich\af2\dbch\af13\loch\f2 4}{\insrsid610709\charrsid9332467 \hich\af2\dbch\af13\loch\f2  James W. Newkirk, Mich}{\insrsid7476632 \hich\af2\dbch\af13\loch\f2 ael C. Two, Alexei A. Vorontsov
-\par }{\insrsid16677168 \hich\af2\dbch\af13\loch\f2 \hich\f2 Copyright \'a9\loch\f2  2000-2002}{\insrsid610709\charrsid9332467 \hich\af2\dbch\af13\loch\f2  Philip A. Craig
-\par 
-\par \hich\af2\dbch\af13\loch\f2 This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.
-\par 
-\par \hich\af2\dbch\af13\loch\f2 Permission is granted to anyone to use this software for any purpose, including \hich\af2\dbch\af13\loch\f2 commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:
-\par 
-\par \hich\af2\dbch\af13\loch\f2 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a p\hich\af2\dbch\af13\loch\f2 
-roduct, an acknowledgment (see the following) in the product documentation is required.
-\par 
-\par \hich\af2\dbch\af13\loch\f2 Portions }{\insrsid16677168\charrsid9332467 \hich\af2\dbch\af13\loch\f2 Copyright }{\insrsid16677168 \loch\af2\dbch\af13\hich\f2 \'a9\loch\f2  2002\hich\af2\dbch\af13\loch\f2 -2007 Charlie Poole or\hich\af2\dbch\af13\loch\f2  }
-{\insrsid16677168\charrsid9332467 \hich\af2\dbch\af13\loch\f2 Copyright }{\insrsid16677168 \loch\af2\dbch\af13\hich\f2 \'a9\loch\f2  2002\hich\af2\dbch\af13\loch\f2 -2004\hich\af2\dbch\af13\loch\f2  }{\insrsid10426157 \hich\af2\dbch\af13\loch\f2 
-James W. Newkirk, }{\insrsid610709\charrsid9332467 \hich\af2\dbch\af13\loch\f2 Michae}{\insrsid16677168 \hich\af2\dbch\af13\loch\f2 l C. Two, Alexei A. Vorontsov}{\insrsid610709\charrsid9332467 \hich\af2\dbch\af13\loch\f2  or Copyright }{\insrsid10426157 
-\loch\af2\dbch\af13\hich\f2 \'a9}{\insrsid5008211 \hich\af2\dbch\af13\loch\f2  2000-2002}{\insrsid610709\charrsid9332467 \hich\af2\dbch\af13\loch\f2  Philip A. Craig
-\par 
-\par \hich\af2\dbch\af13\loch\f2 2. Altered source version\hich\af2\dbch\af13\loch\f2 s must be plainly marked as such, and must not be misrepresented as being the original software.
-\par 
-\par \hich\af2\dbch\af13\loch\f2 3. This notice may not be removed or altered from any source distribution.}{\insrsid9332467 
-\par }}
\ No newline at end of file
diff --git a/src/nunit.build b/src/nunit.build
deleted file mode 100644
index 6a19822..0000000
--- a/src/nunit.build
+++ /dev/null
@@ -1,561 +0,0 @@
-<?xml version="1.0"?>
-<project name="NUnit" default="help" basedir=".">
-
-<!-- ***************************************************************** -->
-<!-- This script has been tested using NAnt 0.85. At least             -->
-<!-- one of the supported runtimes and sdk must be installed. In       -->
-<!-- order to build the msi, WiX 2.0 and the WiX tasks for NAnt        -->
-<!-- are required. To run the test coverage target, NCover is          -->
-<!-- required.                                                         -->
-<!--                                                                   -->
-<!-- Limitations:                                                      -->
-<!-- 1. Currently, the .NET 1.0 builds of the GUI runner cannot be     -->
-<!--    run successfully. The .NET 1.1 builds may be run under         -->
-<!--    .NET 1.0, however.                                             -->
-<!--                                                                   -->
-<!-- 2. Running the GUI under Mono is still experimental. We have      -->
-<!--    tested under Mono 1.2.2 and seen some stability issues.        -->
-<!--    Later releases of Mono may resolve these problems.             -->
-<!-- ***************************************************************** -->
-
-<!-- ***************************************************************** -->
-<!-- ***                 Default Help Target                       *** -->
-<!-- ***************************************************************** -->
-
-<target name="help" description="Displays additional help information">
-  <echo>
-    This build file will build NUnitLite for any of the supported
-    runtime frameworks which are actually installed. To add or
-    support for a framework, edit this script
-
-    Running on the current system, the following runtime frameworks
-    are available for building and testing NUnit:
-  </echo>
-
-  <foreach item="String" delim="," 
-      property="framework" in="${installed.frameworks}">
-    <echo message="        ${string::pad-right(framework,15,' ')}${framework::get-description(framework)}"/>
-  </foreach>
-
-  <echo>
-    The default build target is the ${default.runtime} debug config.
-    Generic runtime targets use the following defaults:
-        net           ${default.net.runtime}
-        mono          ${default.mono.runtime}
-
-    Note that targets that set the build configuration or runtime
-    to be used must come before action targets. For example:
-
-        nant net-1.1 release build
-        nant build-all
-        nant debug clean build
-
-    Use   nant -projecthelp to see a full list of targets.
-  </echo>
-</target>
-
-<!-- ***************************************************************** -->
-<!-- ********* Common properties that control the build ************** -->
-<!-- ***************************************************************** -->
- 
-  <!-- Project name - used as a prefix for packages -->
-  <property name="project.name" value="NUnit"/>
-
-  <!-- NUnit version for packaging -->
-  <property name="package.version" value="2.4.7"/>
-
-  <!-- Additional suffix used to distinguish files with the same version -->
-  <property name="package.suffix" value=""/>
-
-  <!-- Nominal version used for install directory and program
-       files menu. Normally the same as the package version, 
-       but may differ when we are in alpha or beta. -->
-  <property name="nominal.version" value="2.4.7" />
-
-  <!-- Frameworks supported by this build script. The first
-         installed framework found is the default for builds. 
-         The first .NET and Mono frameworks found are the
-         respective net and mono defaults. -->
-  <property name="supported.frameworks" 
-    value="net-1.1,net-2.0,net-1.0,mono-1.0,mono-2.0"/>
-
-  <!-- Framework versions for which packages are normally created -->
-  <property name="standard.packages"
-    value="net-1.1,net-2.0" />
-
-  <!-- Additional internal properties are set in the include file -->
-  <include buildfile="nunit.build.include"/>
-
-<!-- ***************************************************************** -->
-<!-- ***          Targets that set the build configuration         *** -->
-<!-- ***     These must come before actions like build or test     *** -->
-<!-- ***************************************************************** -->
-
-  <target name="debug" description="Set config to debug for commands that follow">
-    <call target="set-debug-build-config" />
-  </target>
-
-  <target name="release" description="Set config to release for commands that follow">
-    <call target="set-release-build-config" />
-  </target>
-
-<!-- ***************************************************************** -->
-<!-- ***         Targets that set the runtime configuration        *** -->
-<!-- ***     These must come before actions like build or test     *** -->
-<!-- ***************************************************************** -->
-
-  <target name="net" 
-      description="Set runtime to .NET 1.1 for commands that follow">
-    <call target="set-default-dot-net-runtime-config"/>
-  </target>
-
-  <target name="net-1.0" 
-    description="Set runtime to .NET 1.0 for commands that follow">
-    <call target="set-net-1.0-runtime-config"/>
-  </target>
-
-  <target name="net-1.1" 
-    description="Set runtime to .NET 1.1 for commands that follow"
-    depends="set-net-1.1-runtime-config"/>
-      
-  <target name="net-2.0" 
-    description="Set runtime to .NET 2.0 for commands that follow"
-    depends="set-net-2.0-runtime-config"/>
-      
-  <target name="mono" description="Set runtime to Mono 1.0 for commands that follow">
-    <call target="set-default-mono-runtime-config"/>
-  </target>
-
-  <target name="mono-1.0" description="Set runtime to Mono 1.0 for commands that follow">
-    <call target="set-mono-1.0-runtime-config"/>
-  </target>
-  
-  <target name="mono-2.0" description="Set runtime to Mono 2.0 for commands that follow">
-    <call target="set-mono-2.0-runtime-config"/>
-  </target>
-
-<!-- ***************************************************************** -->
-<!-- ***             Targets that clean directories                *** -->
-<!-- ***************************************************************** -->
-
-  <target name="clean" depends="set-build-dir"
-      description="Removes the current build directory">
-    <delete dir="${current.build.dir}" 
-      if="${directory::exists( current.build.dir )}"/>
-  </target>
-
-  <target name="clean-all" description="Removes all build directories">
-    <delete dir="${project.build.dir}" 
-      if="${directory::exists( project.build.dir )}"/>
-  </target>
-
-  <target name="clean-package-dir" depends="set-package-config"
-    description="Removes the current package working directory">
-        <delete dir="${package.working.dir}" 
-            if="${directory::exists( package.working.dir )}"/>
-  </target>
-
-  <target name="clean-source-dirs">
-    <delete>
-      <fileset>
-        <include name="*/*/obj/**/*"/>
-        <include name="*/*/bin/**/*"/>
-      </fileset>
-    </delete>
-  </target>
-.
-<!-- ***************************************************************** -->
-<!-- ***              Targets that perform builds                  *** -->
-<!-- ***************************************************************** -->
-
-
-  <target name="rebuild" depends="clean,build"
-    description="Rebuild NUnit for default runtime version and config"/>
-
-  <target name="build" depends="make-build-dir"
-    description="Build NUnit for default runtime version and config">
-
-    <echo message="*"/>
-    <echo message="* Starting ${runtime.config} ${build.config} build"/>
-    <echo message="*"/>
-
-    <!-- Copy key file to base directory, so build can access it -->
-    <copy file="nunit.snk" todir="${project.build.dir}"/>
-
-    <!-- Copy external libraries -->
-<!-- Currently none to copy
-    <copy todir="${current.build.dir}">
-      <fileset basedir="${project.base.dir}/lib">
-      </fileset>
-    </copy>
--->
-    <!-- Build NUnit components and tests -->
-    <nant target="build">
-      <buildfiles refid="project.buildfiles" />
-    </nant>
-
-    <!-- Copy files for running tests -->
-    <copy todir="${current.build.dir}">
-      <fileset>
-        <include name="NUnitTests.nunit" />
-        <include name="NUnitTests.config" />
-        <include name="NUnitFitTests.html" />
-        <include name="clr.bat" />
-      </fileset>
-    </copy>
-
-  </target>
-
-  <target name="rebuild-all" depends="clean-all,build-all"
-      description="Rebuild current config for all available runtimes"/>
-
-  <target name="build-all"
-      description="Build current config for all available runtime">
-
-    <foreach item="String" delim="," 
-        property="framework" in="${installed.frameworks}">
-
-      <call target="set-${framework}-runtime-config"/>
-      <call target="build"/>
-
-    </foreach>
-
-  </target>
-
-<!-- ***************************************************************** -->
-<!-- ***                 Targets for running tests                 *** -->
-<!-- ***************************************************************** -->
-
-  <target name="test" depends="build,run-test"
-    description="Build and run tests for selected config and runtime"/>
-
-  <target name="run-test"
-      description="Run tests for selected config and runtime (no rebuild)">
-
-    <echo message="*"/>
-    <echo message="* Testing ${runtime.config} ${build.config} build"/>
-    <echo message="*    Running under ${nant.settings.currentframework}"/>
-    <echo message="*"/>
-
-    <!-- We use exec rather than the nunit2 task because we are testing
-         a new build of NUnit which is likely not to be included in the Nant build -->
-    <!-- Mono currently has a SIGSEGV fault if we run in a single AppDomain -->
-
-    <property name="nunit.test.assemblies" 
-      value="${nunit.base.tests} ${nunit.gui.tests}" if="${build.gui}"/>
-    <property name="nunit.test.assemblies" 
-      value="${nunit.base.tests}" unless="${build.gui}"/>
-    <property name="result.file" 
-      value="TestResult-${nant.settings.currentframework}"/>
-    <exec basedir="${current.build.dir}"
-      workingdir="${current.build.dir}" 
-	  program="${nunit.console.name}" 
-      managed="strict"
-	  commandline="NUnitTests.nunit ${nunit.options} /xml:${result.file}.xml" />
-
-  </target>
-
-  <target name="test-coverage" depends="build"
-    description="Run tests for a build under NCover to get coverage results">
-
-    <echo message="*"/>
-    <echo message="* Starting ${runtime.config} ${build.config} test coverage run"/>
-    <echo message="*"/>
-
-    <!-- We use exec rather than the nunit2 task because we are testing
-         a new build of NUnit which is likely not to be included in the Nant build -->
-    <exec basedir="${ncover.dir}"
-          workingdir="${current.build.dir}" 
-	  program="${ncover.console.name}" 
-      managed="strict"
-	  commandline="${nunit.console.name} ${nunit.project.name} ${nunit.options} ${ncover.options}"
-	if="${build.win32}" />
-
-    <!-- Mono currently has a SIGSEGV fault if we run in a single AppDomain -->
-         a new build of NUnit which is likely not to be included in the Nant build -->
-    <exec basedir="${ncover.dir}"
-          workingdir="${current.build.dir}" 
-	  program="${ncover.console.name}" 
-          managed="strict"
-	  commandline="${nunit.console.name} ${nunit.test.assemblies} ${nunit.options}"
-	unless="${build.win32}" />
-
-  </target>
-
-  <target name="test-all"
-      description="Build and test all runtimes for current config">
-
-    <foreach item="String" delim="," 
-        property="framework" in="${installed.frameworks}">
-
-      <call target="set-${framework}-runtime-config"/>
-      <call target="test" />
-
-    </foreach>
-
-  </target>
-
-  <target name="test-each-runtime" depends="build"
-      description="Run tests for the current build under each runtime">
-
-    <foreach item="String" delim=","
-        property="framework" in="${test.platforms}">
-
-      <property name="nant.settings.currentframework" value="${framework}" />
-      <call target="run-test" failonerror="false" />
-
-    </foreach>
-
-    <property name="nant.settings.currentframework" value="${runtime.config}" />
-
-    <echo message="*" />
-    <echo message="* Restored runtime to ${nant.settings.currentframework}" />
-    <echo message="*" />
-
-  </target>
-
-  <target name="test-all-under-each"
-      description="Build all runtimes and test the builds under each runtime.">
-
-    <call target="set-release-build-config"/>
-
-    <foreach item="String" delim="," 
-        property="framework" in="${installed.frameworks}">
-
-      <call target="set-${framework}-runtime-config"/>
-      <call target="test-each-runtime" failonerror="false"/>
-
-    </foreach>
-
-  </target>
-
-  <target name="nunit2-test" depends="build"
-    description="Run tests for a build using the nunit2 task">
-
-    <echo message="*"/>
-    <echo message="* Starting ${runtime.config} ${build.config} test run"/>
-    <echo message="*"/>
-
-    <nunit2>
-      <formatter type="Plain"/>
-      <test assemblyname="${current.build.dir}/nunit.framework.tests.dll"/>
-    </nunit2>
-  </target>
-
-  <target name="timing-test" depends="build"
-    description="Run timing tests (long)">
-
-    <echo message="*"/>
-    <echo message="* Starting ${runtime.config} ${build.config} timing tests"/>
-    <echo message="*"/>
-    <echo message="* WARNING: Test may take some time to run"/>
-    <echo message="*"/>
-
-    <exec basedir="${current.build.dir}" 
-      workingdir="${current.build.dir}" 
-      program="${nunit.console.name}" 
-      commandline="timing-tests.dll"/>
-
-  </target>
-
-  <target name="gui-test" depends="build"
-    description="Run tests for a build using gui runner">
-
-    <echo message="*"/>
-    <echo message="* Starting ${runtime.config} ${build.config} gui test run"/>
-    <echo message="*"/>
-
-    <exec basedir="${current.build.dir}" 
-      workingdir="${current.build.dir}" 
-      program="${nunit.gui.name}" 
-      managed="strict"
-      commandline="NUnitTests.nunit -run"/>
-
-  </target>
-
-  <target name="fit-tests" depends="build"
-    description="Run Fit Acceptance tests on the build">
-
-    <echo message="*"/>
-    <echo message="* Starting ${runtime.config} ${build.config} Fit Tests"/>
-    <echo message="*"/>
-
-    <exec basedir="${current.build.dir}" 
-      workingdir="${current.build.dir}" 
-      program="${fit.executable}" 
-      managed="strict"
-      commandline="NUnitFitTests.html TestResults.html ." />
-
-  </target>
-
-
-<!-- ***************************************************************** -->
-<!-- *       Build the NUnit samples - not part of normal build    *** -->
-<!-- ***************************************************************** -->
-
-  <target name="clean-samples" description="Removes the samples build directory">
-    <delete dir="${samples.bin.dir}" />
-  </target>
-
-  <target name="build-samples" depends="build"
-     description="Build the NUnit samples">
-    
-    <mkdir dir="${samples.bin.dir}" unless="${directory::exists(samples.bin.dir)}" />
-
-    <copy todir="${samples.bin.dir}"
-      file="${path::combine(current.build.dir,'nunit.framework.dll')}" />
-    <copy todir="${samples.bin.dir}"
-      file="${path::combine(current.build.dir,'nunit.core.interfaces.dll')}" />
-    <copy todir="${samples.bin.dir}"
-      file="${path::combine(current.build.dir,'nunit.core.dll')}" />
-
-    <nant target="build">
-      <buildfiles refid="sample.buildfiles" />
-    </nant>
-
-  </target>
-
-  <target name="rebuild-samples" depends="clean-samples,build-samples" 
-      description="Rebuild the NUnit samples"/>
-
-<!-- ***************************************************************** -->
-<!-- ***         Targets for packaging the NUnit distribution      *** -->
-<!-- ***************************************************************** -->
-
-  <!-- Produce all the standard packages for a release -->
-  <target name="package-release"
-      description="Create standard packages for distribution">
-      
-    <call target="package-src"/>
-
-    <call target="package-docs"/>
-
-    <call target="set-release-build-config"/>
-
-    <foreach item="String" delim="," 
-        property="framework" in="${standard.packages}">
-
-      <if test="${framework::sdk-exists( framework )}">
-        <call target="set-${framework}-runtime-config"/>
-        <call target="package"/>
-      </if>
-
-    </foreach>
-
-  </target>
-
-  <!-- Package the current build -->
-  <target name="package" depends="build-install-image"
-      description="Create both binary and msi packages for current build" >
-
-    <call target="create-zip" />
-
-    <if test="${platform::is-win32() and build.win32}" >
-      <call target="create-msi" 
-        if="${wix.installed}" />
-      <echo message="MSI was not built - WiX is not installed"
-        unless="${wix.installed}" />
-    </if>
-
-  </target>
-  
-  <!-- Package current config as a zip --> 
-  <target name="package-zip" depends="build-install-image,create-zip"
-    description="Create zip binary distribution package" />
-
-  <target name="package-src" depends="clean-package-dir"
-    description="Create full source package for developer use">
-
-    <call target="copy-docs"/>
-    <call target="copy-samples"/>
-    <call target="copy-src"/>
-    <call target="copy-tools" />
-
-    <copy file="../license.txt" todir="${package.working.dir}" />
-
-    <!-- Create the zip file -->
-    <zip zipfile="${project.package.dir}/${zipped.src.file.name}" ziplevel="9">
-      <fileset basedir="${package.working.dir}">
-        <include name="**"/>
-      </fileset>
-    </zip>
-  </target>
-
-  <target name="package-docs" depends="clean-package-dir">
-
-    <call target="copy-docs"/>
-
-    <!-- Create the zip file -->
-    <zip zipfile="${project.package.dir}/${zipped.doc.file.name}" ziplevel="9">
-      <fileset basedir="${package.working.dir}">
-        <include name="**"/>
-      </fileset>
-    </zip>
-    
-  </target>
-  
-  <target name="package-resources" depends="clean-package-dir">
-
-    <copy todir="${package.resource.dir}/nunit-gui-runner">
-      <fileset basedir="GuiRunner/nunit-gui/obj/Release">
-        <include name="*.resources"/>
-      </fileset>
-    </copy>
-
-    <copy todir="${package.resource.dir}/nunit.uikit">
-      <fileset basedir="GuiComponents/UiKit/obj/Release">
-        <include name="NUnit.UiKit.AddConfigurationDialog.resources"/>
-        <include name="NUnit.UiKit.AssemblyPathDialog.resources"/>
-        <include name="NUnit.UiKit.ConfigurationEditor.resources"/>
-        <include name="NUnit.UiKit.RenameConfigurationDialog.resources"/>
-        <include name="NUnit.UiKit.TestPropertiesDialog.resources"/>
-        <include name="NUnit.UiKit.TestTree.resources"/>
-      </fileset>
-    </copy>
-
-    <copy todir="${package.working.dir}">
-      <fileset basedir="../tools/localization">
-        <include name="*.*"/>
-      </fileset>
-    </copy>
-
-    <if test="${property::exists('localize')}">
-    <foreach property="culture" item="String" delim="," 
-        in="${localize}">
-    <foreach property="folder" item="Folder" 
-        in="${package.working.dir}/resources">
-      <property name="proj" 
-        value="${path::get-file-name(folder)}"/>
-      <property name="projdir" 
-        value="${package.working.dir}/${culture}/${proj}"/>
-    <foreach property="file" item="File" in="${folder}">
-      <property name="filename"
-        value="${path::get-file-name-without-extension(file)}"/>
-      <copy file="${file}" 
-        tofile="${projdir}/${filename}.${culture}.resources"/>"/>
-    </foreach>
-    </foreach>
-    </foreach>   
-    </if>
-
-    <zip zipfile="${project.package.dir}/${zipped.resource.file.name}" ziplevel="9">
-      <fileset basedir="${package.working.dir}">
-        <include name="**"/>
-      </fileset>
-    </zip>
-
-  </target>
-
-  <target name="package-msi" depends="build-install-image,create-msi"
-    description="Build msi file and deploy it to the package dir" />
-
-<!-- ***************************************************************** -->
-<!-- ***        Targets for installing the NUnit distribution      *** -->
-<!-- ***************************************************************** -->
-
-  <target name="install" depends="build-install-image"
-      description="Install NUnit directly from the build">
-
-  </target>
-
-</project>
diff --git a/src/nunit.build.include b/src/nunit.build.include
deleted file mode 100644
index c7c2743..0000000
--- a/src/nunit.build.include
+++ /dev/null
@@ -1,690 +0,0 @@
-<?xml version="1.0"?>
-<project name="NUnit" default="build" basedir=".">
-
-<!-- ***************************************************************** -->
-<!-- **********Set Properties used by Various targets **************** -->
-<!-- ***************************************************************** -->
-
-  <!-- OS Platform in Use -->
-  <property name="os.platform" value="other"/>
-  <if test="${platform::is-win32()}">
-    <property name="os.platform" value="win32"/>
-  </if>
-  <if test="${platform::is-unix()}">
-    <property name="os.platform" value="linux"/>
-  </if>
-
-  <!-- NUnit executables and arguments -->
-  <property name="nunit.gui.name" value="nunit.exe"/>
-  <property name="nunit.gui.name.x86" value="nunit-x86.exe"/>
-  <property name="nunit.console.name" value="nunit-console.exe"/>
-  <property name="nunit.console.name.x86" value="nunit-console-x86.exe"/>
-  <property name="nunit.project.name" value="NUnitTests.nunit"/>
-  <property name="nunit.base.tests" value="nunit.framework.tests.dll nunit.core.tests.dll nunit.extensions.tests.dll nunit.util.tests.dll nunit.mocks.tests.dll nunit-console.tests.dll nunit.fixtures.tests.dll"/>
-  <property name="nunit.gui.tests" value="nunit.uikit.tests.dll nunit-gui.tests.dll"/>
-  <property name="nunit.options" value=""/>
-
-  <!-- NCover executable and arguments -->
-  <property name="ncover.console.name" value="NCover.Console.exe"/>
-  <property name="ncover.options" 
-    value="//a nunit.framework;nunit.core;nunit.extensions;nunit.util;nunit.console;nunit.uikit;nunit-gui-runner"/>
-
-  <!-- Fit Executable and DLL-->
-  <property name="fit.executable" value="runFile.exe" />
-  <property name="fit.dll" value="fit.dll" />
-
-  <!-- Project src dir is nant project base dir -->
-  <property name="project.src.dir"
-    value="${project::get-base-directory()}"/>
-
-  <!-- Project base dir is the src dir's parent -->
-  <property name="project.base.dir"
-    value="${path::get-directory-name(project.src.dir)}"/>
-
-  <!-- Other directories are derived from src and base -->
-  <property name="project.build.dir" 
-    value="${path::combine(project.base.dir,'build')}"/>
-  <property name="project.package.dir" 
-    value="${path::combine(project.base.dir,'package')}"/>
-  <property name="project.doc.dir"
-    value="${path::combine(project.base.dir,'doc')}"/>
-  <property name="project.samples.dir"
-    value="${path::combine(project.base.dir,'samples')}"/>
-  <property name="project.tools.dir"
-    value="${path::combine(project.base.dir,'tools')}"/>
-  <property name="project.install.dir"
-    value="${path::combine(project.src.dir, 'install')}"/>
-  <property name="samples.bin.dir"
-    value="${path::combine(project.samples.dir, 'bin')}"/>
-
-  <!-- Individual Tool Directories -->
-  <property name="wix.dir" 
-    value="${path::combine(project.tools.dir,'WiX')}"/>
-  <property name="wix.installed" 
-    value="${file::exists(path::combine(wix.dir,'candle.exe'))}"/>
-  <property name="ncover.dir" 
-    value="${path::combine(project.tools.dir,'ncover')}"/>
-  <property name="ncover.installed"
-    value="${file::exists(path::combine(ncover.dir,ncover.console.name))}"/>
-  <property name="fit.dir"
-    value="${path::combine(project.tools.dir,'fit')}"/>
-  <property name="fit.installed"
-    value="${file::exists(path::combine(fit.dir,fit.dll))}"/>
-
-  <!-- Visual Studio locations -->
-  <if test="${platform::is-win32()}">
-    <readregistry property="vs.2002.path" 
-      key="Software\Microsoft\VisualStudio\7.0\InstallDir" 
-      hive="LocalMachine" failonerror="false"/>
-    <readregistry property="vs.2003.path" 
-      key="Software\Microsoft\VisualStudio\7.1\InstallDir" 
-      hive="LocalMachine" failonerror="false"/>
-    <readregistry property="vs.2005.path" 
-      key="Software\Microsoft\VisualStudio\8.0\InstallDir" 
-      hive="LocalMachine" failonerror="false"/>
-  </if>
-
-  <!-- Root of the package file name -->
-  <property name="package.name" 
-    value="${project.name}-${package.version}${package.suffix}"/>
-
-  <!-- Package directories -->
-  <property name="package.working.dir" 
-    value="${path::combine(project.package.dir,package.name)}"/>
-  <property name="package.bin.dir" 
-    value="${path::combine(package.working.dir,'bin')}"/>
-  <property name="package.doc.dir" 
-    value="${path::combine(package.working.dir,'doc')}"/>
-  <property name="package.samples.dir" 
-    value="${path::combine(package.working.dir,'samples')}"/>
-  <property name="package.src.dir" 
-    value="${path::combine(package.working.dir,'src')}"/>
-  <property name="package.tools.dir"
-    value="${path::combine(package.working.dir,'tools')}"/>
-  <property name="package.fit.dir"
-    value="${path::combine(package.working.dir,'fit')}"/>
-  <property name="package.resource.dir"
-    value="${path::combine(package.working.dir, 'resources')}"/>
-  <property name="wix.work.dir"
-    value="${path::combine(project.package.dir, 'wixobj')}"/>
-
-  <!-- Default build configuration -->
-  <property name="build.config" value="debug"/>
-  <property name="build.defines" value=""/>
-
-  <!-- Default runtime configuration -->
-  <foreach item="String" delim="," 
-      property="framework" in="${supported.frameworks}">
-    <if test="${framework::sdk-exists( framework )}">
-      <property name="installed.frameworks" value="${installed.frameworks},${framework}"
-        if="${property::exists('installed.frameworks')}"/>
-      <property name="installed.frameworks" value="${framework}"
-        unless="${property::exists('installed.frameworks')}"/>
-      <property name="default.runtime" value="${framework}"
-        unless="${property::exists('default.runtime')}"/>
-      <property name="default.net.runtime" value="${framework}"
-        if="${string::starts-with(framework,'net')}"
-        unless="${property::exists('default.net.runtime')}"/>
-      <property name="default.mono.runtime" value="${framework}"
-        if="${string::starts-with(framework,'mono')}"
-        unless="${property::exists('default.mono.runtime')}"/>
-    </if>
-  </foreach>
-
-  <call target="set-${default.runtime}-runtime-config" />
-
-<!-- ***************************************************************** -->
-<!-- *********      FileSets Used by Various Targets       *********** -->
-<!-- ***************************************************************** -->
-
-  <!-- Buildfiles for all NUnit components - in build order -->
-  <fileset id="project.buildfiles">
-
-    <!-- NUnit Base -->
-    <include name="NUnitFramework/framework/nunit.framework.build" />
-    <include name="NUnitCore/interfaces/nunit.core.interfaces.build" />
-    <include name="NUnitCore/core/nunit.core.build" />
-    <include name="NUnitExtensions/framework/nunit.framework.extensions.build" />
-    <include name="NUnitExtensions/core/nunit.core.extensions.build" />
-    <include name="NUnitMocks/mocks/nunit.mocks.build" />
-    <include name="ClientUtilities/util/nunit.util.build" />
-
-    <!-- Console Runner -->
-    <include name="ConsoleRunner/nunit-console/nunit-console.build" />
-    <include name="ConsoleRunner/nunit-console-exe/nunit-console.exe.build" />
-
-    <!-- Gui Runner -->
-    <include name="GuiComponents/UiKit/nunit.uikit.build" if="${build.gui}" />
-    <include name="GuiRunner/nunit-gui/nunit-gui.build" if="${build.gui}" />
-    <include name="GuiRunner/nunit-gui-exe/nunit-gui.exe.build" if="${build.gui}" />
-
-    <!-- Test Utilities and Dummy Projects -->
-    <include name="tests/mock-assembly/mock-assembly.build" />
-    <include name="tests/nonamespace-assembly/nonamespace-assembly.build" />
-    <include name="tests/notestfixtures-assembly/notestfixtures-assembly.build" />
-    <include name="tests/test-assembly/test-assembly.build" />
-    <include name="tests/test-utilities/test-utilities.build" />
-    <include name="tests/loadtest-assembly/loadtest-assembly.build" />
-    <include name="tests/timing-tests/timing-tests.build" />
-
-    <!-- NUnit Base Tests -->
-    <include name="NUnitFramework/tests/nunit.framework.tests.build" />
-    <include name="NUnitCore/tests/nunit.core.tests.build" />
-    <include name="NUnitExtensions/tests/nunit.extensions.tests.build" />
-    <include name="NUnitMocks/tests/nunit.mocks.tests.build" />
-    <include name="ClientUtilities/tests/nunit.util.tests.build" />
-
-    <!-- Console Runner Tests -->
-    <include name="ConsoleRunner/tests/nunit-console.tests.build" />
-
-    <!-- GUI Tests -->
-    <include name="GuiComponents/tests/nunit.uikit.tests.build" if="${build.gui}" />
-    <include name="GuiRunner/tests/nunit-gui.tests.build" if="${build.gui}" />
-
-    <!-- FIT Tests -->
-    <include name="NUnitFixtures/fixtures/nunit.fixtures.build" />
-    <include name="NUnitFixtures/tests/nunit.fixtures.tests.build" />
-  </fileset>
-
-  <!-- BuildFiles for Samples -->
-  <fileset id="sample.buildfiles" basedir="../samples">
-
-    <!-- CSharp Samples -->
-    <include name="csharp/failures/cs-failures.build" />
-    <include name="csharp/money/cs-money.build" />
-    <include name="csharp/money-port/cs-money-port.build" />
-    <include name="csharp/syntax/cs-syntax.build" />
-
-    <!-- JSharp Samples -->
-    <include name="jsharp/failures/jsharp-failures.build"
-      if="${task::exists('vjc')}" />
-
-    <!-- VB Samples -->
-    <include name="vb/failures/vb-failures.build"
-      if="${task::exists('vbc')}" />
-    <include name="vb/money/vb-money.build"
-      if="${task::exists('vbc')}" />
-    <include name="vb/syntax/vb-syntax.build"
-      if="${task::exists('vbc')}" />
-
-    <!-- Managed C++ Samples -->
-    <include name="cpp/managed/failures/cpp-managed-failures.build"
-      if="${property::exists('vs.2003.path')}" />
-
-    <!-- C++/CLI Samples -->
-    <include name="cpp/cpp-cli/failures/cpp-cli-failures.build"
-      if="${property::exists('vs.2005.path')}" />
-    <include name="cpp/cpp-cli/syntax/cpp-cli-syntax.build"
-      if="${property::exists('vs.2005.path')}" />
-
-    <!-- Extensibility Samples -->
-    <include name="Extensibility/Core/Minimal/Minimal.build" />
-    <include name="Extensibility/Core/SampleFixtureExtension/SampleFixtureExtension.build" />
-    <include name="Extensibility/Core/SampleSuiteExtension/SampleSuiteExtension.build" />
-    <include name="Extensibility/Core/MaxTimeDecorator/MaxTimeDecorator.build" />
-  </fileset>
-
-  <!-- Files to be copied to source directories -->
-  <fileset id="source-files" >
-        <include name="**/*.sln" />
-        <include name="**/*.csproj" />
-        <include name="**/*.config" />
-        <include name="**/*.build" />
-        <include name="**/*.cs" />
-        <include name="**/*.xsd" />
-        <include name="**/*.xslt" />
-        <include name="**/*.resx" />
-        <include name="**/*.jpg" />
-        <include name="**/*.gif" />
-        <include name="**/*.ico" />
-        <include name="**/*.txt" />
-        <include name="**/resources/*" />
-
-        <exclude name="**/CVS/**" />
-        <exclude name="**/bin/**" />
-        <exclude name="**/obj/**" />
-        <exclude name="**/Debug/**" />
-        <exclude name="**/Release/**" />
-  </fileset>
-
-<!-- ***************************************************************** -->
-<!-- ********* Targets for setting the build configuration *********** -->
-<!-- ***************************************************************** -->
-
-  <target name="set-build-config">
-    <call target="set-${build.config}-build-config"/>
-  </target>
-
-  <target name="set-debug-build-config">
-    <property name="build.config" value="debug"/>
-    <property name="build.debug" value="true"/>
-    <property name="build.defines" value="DEBUG,TRACE,${runtime.defines}"
-        dynamic="true"/>
-    <property name="zip.build.suffix" value="-dbg"/>
-    <property name="msi.build.suffix" value="-dbg"/>
-  </target>
-	
-  <target name="set-release-build-config">
-    <property name="build.config" value="release"/>
-    <property name="build.debug" value="false"/>
-    <property name="build.defines" value="TRACE,${runtime.defines}"
-	dynamic="true"/>
-    <property name="zip.build.suffix" value=""/>
-    <property name="msi.build.suffix" value=""/>
-  </target>
-
-<!-- ***************************************************************** -->
-<!-- ***    Targets for setting the runtime configuration          *** -->
-<!-- ***************************************************************** -->
-
-  <target name="set-runtime-config">   
-    <call target="set-${runtime.config}-runtime-config"/>
-  </target>
-  
-  <target name="set-default-dot-net-runtime-config">
-    <fail unless="${property::exists( 'default.net.runtime' )}"
-      message="No versions of the .NET SDK were found"/>
-
-    <call target="set-${default.net.runtime}-runtime-config" />
-  </target>
-
-  <target name="set-default-mono-runtime-config">
-    <fail unless="${property::exists( 'default.mono.runtime' )}"
-      message="No versions of the Mono runtime were found"/>
-
-    <call target="set-${default.mono.runtime}-runtime-config" />
-  </target>
-
-  <target name="set-net-1.0-runtime-config">
-    <fail unless="${framework::sdk-exists( 'net-1.0' )}"
-      message="The .NET 1.0 SDK is not configured or not installed"/>
-
-    <property name="runtime.platform" value="net"/>
-    <property name="runtime.version" value="1.0"/>
-    <property name="runtime.config" value="net-1.0"/>
-    <property name="runtime.defines" value="NET,NET_1_0"/>
-    <property name="build.mono" value="false"/>
-    <property name="build.win32" value="true"/>
-    <property name="build.gui" value="false"/>
-    <property name="build.x86" value="false"/>
-    <property name="nant.settings.currentframework" 
-      value="net-1.0"/>
-    <property name="zip.runtime.suffix" value="-net-1.0"/>
-    <property name="msi.runtime.suffix" value="-net-1.0"/>
-    <property name="supported.test.platforms" 
-      value="net-1.0,net-1.1,net-2.0,mono-1.0,mono-2.0"/>
-    <call target="set-test-platforms"/>
-  </target>
-	
-  <target name="set-net-1.1-runtime-config">
-    <property name="runtime.platform" value="net"/>
-    <fail unless="${framework::sdk-exists( 'net-1.1' )}"
-      message="The .NET 1.1 SDK is not configured or not installed"/>
-
-    <property name="runtime.platform" value="net"/>
-    <property name="runtime.version" value="1.1"/>
-    <property name="runtime.config" value="net-1.1"/>
-    <property name="runtime.defines" value="NET,NET_1_1"/>
-    <property name="build.mono" value="false"/>
-    <property name="build.win32" value="true"/>
-    <property name="build.gui" value="true"/>
-    <property name="build.x86" value="false"/>
-    <property name="nant.settings.currentframework" 
-      value="net-1.1"/>
-    <property name="zip.runtime.suffix" value="-net-1.1"/>
-    <property name="msi.runtime.suffix" value="-net-1.1"/>
-    <property name="supported.test.platforms"
-      value="net-1.0,net-1.1,net-2.0,mono-1.0,mono-2.0"/>
-    <call target="set-test-platforms"/>
-  </target>
-	
-  <target name="set-net-2.0-runtime-config">
-    <fail unless="${framework::sdk-exists( 'net-2.0' )}"
-      message="The .NET 2.0 SDK is not configured or not installed"/>
-
-    <property name="runtime.platform" value="net"/>
-    <property name="runtime.version" value="2.0"/>
-    <property name="runtime.config" value="net-2.0"/>
-    <property name="runtime.defines" value="NET,NET_2_0"/>
-    <property name="build.mono" value="false"/>
-    <property name="build.win32" value="true"/>
-    <property name="build.gui" value="true"/>
-    <property name="build.x86" value="true"/>
-    <property name="nant.settings.currentframework" 
-      value="net-2.0"/>
-    <property name="zip.runtime.suffix" value="-net-2.0"/>
-    <property name="msi.runtime.suffix" value="-net-2.0"/>
-    <property name="supported.test.platforms" value="net-2.0,mono-2.0"/>
-    <call target="set-test-platforms"/>
-  </target>
-	
-  <target name="set-mono-1.0-runtime-config">
-    <fail unless="${framework::sdk-exists( 'mono-1.0' )}"
-      message="The Mono 1.0 SDK is not configured or not installed"/>
-
-    <property name="runtime.platform" value="mono"/>
-    <property name="runtime.version" value="1.0"/>
-    <property name="runtime.config" value="mono-1.0"/>
-    <property name="runtime.defines" value="MONO,MONO_1_0"/>
-    <property name="build.mono" value="true"/>
-    <property name="build.win32" value="false"/>
-    <property name="build.gui" value="true"/>
-    <property name="build.x86" value="false"/>
-    <property name="nant.settings.currentframework" 
-      value="mono-1.0"/>
-    <property name="zip.runtime.suffix" value="-mono-1.0"/>
-    <property name="msi.runtime.suffix" value="-mono-1.0"/>
-    <property name="supported.test.platforms"
-      value="mono-1.0,mono-2.0,net-1.0,net-1.1,net-2.0"/>
-    <call target="set-test-platforms"/>
-  </target>
-
-  <target name="set-mono-2.0-runtime-config">
-    <fail unless="${framework::sdk-exists( 'mono-2.0' )}"
-      message="The Mono 2.0 SDK is not configured or not installed"/>
-
-    <property name="runtime.platform" value="mono"/>
-    <property name="runtime.version" value="2.0"/>
-    <property name="runtime.config" value="mono-2.0"/>
-    <property name="runtime.defines" value="MONO,MONO_2_0"/>
-    <property name="build.mono" value="true"/>
-    <property name="build.win32" value="false"/>
-    <property name="build.gui" value="true"/>
-    <property name="build.x86" value="true"/>
-    <property name="nant.settings.currentframework" 
-      value="mono-2.0"/>
-    <property name="zip.runtime.suffix" value="-mono-2.0"/>
-    <property name="msi.runtime.suffix" value="-mono-2.0"/>
-    <property name="supported.test.platforms" value="mono-2.0,net-2.0"/>
-    <call target="set-test-platforms"/>
-  </target>
-
-  <target name="set-test-platforms">
-
-    <property name="test.platforms" value=""/>
-
-    <foreach item="String" delim=","
-        property="framework" in="${supported.test.platforms}">
-
-      <if test="${framework::exists( framework )}">
-        <property name="test.platforms" value="${test.platforms},${framework}"
-          unless="${test.platforms==''}"/>
-        <property name="test.platforms" value="${framework}"
-          if="${test.platforms==''}"/>
-      </if>
-
-    </foreach>
-    
-  </target>
-
-<!-- ***************************************************************** -->
-<!-- **************** Internally used targets ************************ -->
-<!-- ***************************************************************** -->
-
-  <!-- Set up the build directory -->
-  <target name="set-build-dir"
-    depends="set-build-config,set-runtime-config">
-    <property name="os.platform.dir"
-      value="${path::combine(project.build.dir,os.platform)}"/>
-    <property name="runtime.platform.dir"
-      value="${path::combine(os.platform.dir,runtime.platform)}"/>
-    <property name="runtime.version.dir"
-      value="${path::combine(runtime.platform.dir,runtime.version)}"/>
-    <property name="current.build.dir" 
-      value="${path::combine(runtime.version.dir,build.config)}"/>
-  </target>
-  
-  <target name="make-build-dir" depends="set-build-dir">
-    <mkdir dir="${current.build.dir}"
-      unless="${directory::exists(current.build.dir)}"/>
-  </target>
-
-  <!-- Setup the package configuration info -->
-  <target name="set-package-config"
-    depends="set-build-config,set-runtime-config">
-    <property name="zip.file.name" 
-      value="${package.name}${zip.runtime.suffix}${zip.build.suffix}.zip"/>
-    <property name="msi.file.name"
-      value="${package.name}${msi.runtime.suffix}${msi.build.suffix}.msi"/>
-    <property name="zipped.src.file.name"
-      value="${package.name}-src.zip"/>
-    <property name="zipped.doc.file.name"
-      value="${package.name}-doc.zip"/>
-    <property name="zipped.resource.file.name"
-      value="${package.name}-resources.zip"/>
-  </target>
-
-  <target name="build-install-image" depends="clean-package-dir">
-
-    <call target="copy-bins" />
-    <call target="copy-docs" />
-    <call target="copy-samples" />
-
-    <copy file="../license.txt" todir="${package.working.dir}" />
-    <copy file="../tools/fit/license.txt"
-          tofile="${package.working.dir}/fit-license.txt" />
-    <copy file="GuiRunner/nunit-gui/Logo.ico" todir="${package.working.dir}" />
-    <copy file="NUnitFitTests.html" todir="${package.bin.dir}" />
-    <copy file="NUnitExtensions\docs\RowTest\License.txt" 
-          tofile="${package.working.dir}/rowtest-license.txt" />
-
-  </target>
-
-  <target name="create-zip" description="Create zip from existing image">
-    <!-- Create the zip file -->
-    <zip zipfile="${project.package.dir}/${zip.file.name}" ziplevel="9">
-      <fileset basedir="${package.working.dir}">
-        <include name="**"/>
-      </fileset>
-    </zip>
-  </target>
-
-  <target name="create-msi" description="Create msi from existing install image">
-  
-    <fail message="MSI can only be built on the Win32 platform" unless="${platform::is-win32()}"/>
-    <fail message="MSI can only be built for a Win32 runtime" unless="${build.win32}"/>
-    <fail message="MSI can not be built - WiX is not installed" unless="${wix.installed}"/>
-
-    <property name="wix.work.dir"
-      value="${package.working.dir}"/>
-
-    <candle out="${wix.work.dir}/" exedir="${wix.dir}">
-      <defines>
-        <define name="ProductVersion" value="${package.version}" />
-        <define name="NominalVersion" value="${nominal.version}" />
-        <define name="RuntimeVersion" value="${runtime.version}" />
-      </defines>
-      <sources basedir="${project.install.dir}">
-        <include name="bin.wxs" />
-        <include name="nunit-gui.wxs" />
-        <include name="doc.wxs" />
-        <include name="tests.wxs" />
-        <include name="samples.wxs" />
-        <include name="NUnit.wxs" />
-      </sources>
-    </candle>
-
-    <light exedir="${wix.dir}"
-      out="${project.package.dir}/${msi.file.name}" 
-      locfile="${wix.dir}/WixUI_en-us.wxl">
-      <sources>
-        <include name="${wix.work.dir}/NUnit.wixobj" />
-        <include name="${wix.work.dir}/bin.wixobj" />
-        <include name="${wix.work.dir}/nunit-gui.wixobj" />
-        <include name="${wix.work.dir}/doc.wixobj" />
-        <include name="${wix.work.dir}/samples.wixobj" />
-        <include name="${wix.work.dir}/tests.wixobj" />
-        <include name="${wix.dir}/wixui.wixlib" />
-      </sources>
-    </light>
-
-  </target>
-
-  <target name="copy-bins" depends="build">
-    <mkdir dir="${package.bin.dir}"/>
-    <copy todir="${package.bin.dir}">
-      <fileset basedir="${current.build.dir}">
-        <include name="*"/>
-        <exclude name="*.wixobj"/>
-        <exclude name="nunit-server.*"/>
-        <exclude name="nunit-test-server.*"/>
-      </fileset>
-    </copy>
-  </target>
-  
-  <target name="copy-docs">
-    <mkdir dir="${package.doc.dir}"/>
-    <copy todir="${package.doc.dir}">
-      <fileset basedir="${project.doc.dir}">
-        <include name="*.html"/>
-	<include name="nunit.css"/>
-        <include name="codeFuncs.js"/>
-        <include name="favicon.ico"/>
-	<include name="files/*"/>
-	<include name="img/*"/>
-        <exclude name="img/thumbs.db"/>
-      </fileset>
-    </copy>
-  </target>
-
-  <target name="copy-samples">
-
-    <mkdir dir="${package.samples.dir}"/>
-
-    <!-- Copy files that are not part of an individual project -->
-    <copy todir="${package.samples.dir}">
-      <fileset basedir="${project.samples.dir}">
-        <include name="ReadMe.txt" />
-        <include name="csharp/CSharp.sln" />
-        <include name="jsharp/jsharp.sln" />
-        <include name="vb/vb-samples.sln" />
-        <include name="cpp/managed/managed-cpp.sln" />
-        <include name="cpp/cpp-cli/cpp-cli.sln" />
-        <include name="Extensibility/Core/CoreExtensibility.sln" />
-        <include name="Extensibility/Core/Install.bat" />
-      </fileset>
-    </copy>
-
-    <!-- Copy each project's files -->
-    <nant target="package">
-      <buildfiles refid="sample.buildfiles" />
-    </nant>
-
-  </target>
-
-  <target name="copy-src">
-    <delete dir="${package.src.dir}" />
-    <mkdir dir="${package.src.dir}"/>
-
-    <!-- Copy top level src files -->
-    <copy todir="${package.src.dir}">
-      <fileset basedir=".">
-        <include name="license.rtf"/>
-        <include name="nunit.build"/>
-        <include name="nunit.build.include"/>
-        <include name="nunit.sln"/>
-        <include name="nunit_VS2005.sln"/>
-        <include name="nunit.snk"/>
-        <include name="nunit20under21.config"/>
-        <include name="nunit20under22.config"/>
-        <include name="nunit21under22.config"/>
-        <include name="NUnitBinTests.config"/>
-        <include name="NUnitBinTests.nunit"/>
-        <include name="NUnitDevTests.config"/>
-        <include name="NUnitDevTests.nunit"/>
-        <include name="NUnitFitTests.html"/>
-        <include name="CommonAssemblyInfo.cs"/>
-        <include name="clr.bat"/>
-        <include name="install/bin.wxs" />
-        <include name="install/nunit-gui.wxs" />
-        <include name="install/doc.wxs" />
-        <include name="install/tests.wxs" />
-        <include name="install/samples.wxs" />
-        <include name="install/NUnit.wxs"/>
-        <include name="NUnitExtensions/docs/RowTest/License.txt"/>
-        <include name="NUnitExtensions/docs/RowTest/Release Notes.txt"/>
-      </fileset>
-    </copy>
-
-    <!-- Copy individual projects -->
-    <nant target="package" inheritrefs="true">
-      <buildfiles refid="project.buildfiles" />
-    </nant>
-
-  </target>
-
-  <target name="copy-tools">
-
-    <mkdir dir="${package.tools.dir}" />
-
-    <copy todir="${package.tools.dir}">
-      <fileset basedir="${project.tools.dir}">
-        <include name="fit/fit.dll"/>
-        <include name="fit/runFile.exe"/>
-        <include name="fit/runFile.exe.config"/>
-        <include name="fit/license.txt"/>
-      </fileset>
-    </copy>
-
-  </target>
-
-<!-- ***************************************************************** -->
-<!-- ***           Dump configuration settings for debugging       *** -->
-<!-- ***************************************************************** -->
-
-  <target name="dump-settings" depends="set-build-dir,set-package-config">
-
-    <echo>Project Directories</echo>
-    <echo>  Base:      ${project.base.dir}</echo>
-    <echo>   Doc:      ${project.doc.dir}</echo>
-    <echo>   Samples:  ${project.samples.dir}</echo>
-    <echo>   Source:   ${project.src.dir}</echo>
-    <echo>    Install: ${project.install.dir}</echo>
-    <echo>   Build:    ${project.build.dir}</echo>
-    <echo>   Package:  ${project.package.dir}</echo>
-    <echo>   Tools:    ${project.tools.dir}</echo>
-    <echo if="${wix.installed}">    WiX:     ${wix.dir}</echo>
-    <echo unless="${wix.installed}">    WiX:     Not Installed</echo>
-    <echo if="${ncover.installed}">    nCover:  ${ncover.dir}</echo>
-    <echo unless="${ncover.installed}">    nCover:  Not Installed</echo>
-    <echo></echo>
-    <echo>Runtime Versions</echo>
-    <echo>  Supported: ${supported.frameworks}</echo>
-    <echo>  Installed: ${installed.frameworks}</echo>
-    <echo>  Default:   ${default.runtime}</echo>
-    <echo>    .Net:    ${default.net.runtime}</echo>
-    <echo>    Mono:    ${default.mono.runtime}</echo>
-    <echo></echo>
-    <echo>Current Build Settings</echo>
-    <echo>  Config:    ${build.config}</echo>
-    <echo>  Runtime:   ${runtime.config}</echo>
-    <echo>  Build Dir: ${current.build.dir}</echo>
-    <echo>  Defines:   ${build.defines}</echo>
-    <echo></echo>
-    <echo>Test Platforms for Current Build</echo>
-    <echo>  Supported: ${supported.test.platforms}</echo>
-    <echo>  Installed: ${test.platforms}</echo>
-    <echo></echo>
-    <echo>Packaging</echo>
-    <echo>  Name:      ${package.name}</echo>
-    <echo>  Version:   ${package.version}</echo>
-    <echo>  Zip file:  ${zip.file.name}</echo>
-    <echo>  Msi file:  ${msi.file.name}</echo>
-    <echo>  Source:    ${zipped.src.file.name}</echo>
-    <echo>  Work Dir:  ${package.working.dir}</echo>
-    <echo>   Bin:      ${package.bin.dir}</echo>
-    <echo>   Doc:      ${package.doc.dir}</echo>
-    <echo>   Samples:  ${package.samples.dir}</echo>
-    <echo>   Source:   ${package.src.dir}</echo>
-    <echo></echo>
-    <echo>Current Framework and SDK Directories</echo>
-    <echo>  ${framework::get-framework-directory(framework::get-target-framework())}</echo>
-    <echo>  ${framework::get-sdk-directory(framework::get-target-framework())}</echo>
-    <echo></echo>
-    <echo>Visual Studio Directories</echo>
-    <echo if="${property::exists('vs.2002.path')}">  ${vs.2002.path}</echo>
-    <echo if="${property::exists('vs.2003.path')}">  ${vs.2003.path}</echo>
-    <echo if="${property::exists('vs.2005.path')}">  ${vs.2005.path}</echo>
-  </target>
-
-</project>
\ No newline at end of file
diff --git a/src/nunit.sln b/src/nunit.sln
deleted file mode 100644
index 568c943..0000000
--- a/src/nunit.sln
+++ /dev/null
@@ -1,258 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 8.00
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-gui", "GuiRunner\nunit-gui\nunit-gui.csproj", "{3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.mocks", "NUnitMocks\mocks\nunit.mocks.csproj", "{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.uikit.dll", "GuiComponents\UiKit\nunit.uikit.dll.csproj", "{27531BBF-183D-4C3A-935B-D840B9F1A3A4}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.util.dll", "ClientUtilities\util\nunit.util.dll.csproj", "{61CE9CE5-943E-44D4-A381-814DC1406767}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.framework.dll", "NUnitFramework\framework\nunit.framework.dll.csproj", "{83DD7E12-A705-4DBA-9D71-09C8973D9382}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.mocks.tests", "NUnitMocks\tests\nunit.mocks.tests.csproj", "{8667C588-1A05-4773-A9E8-272EB302B8AB}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.uikit.tests", "GuiComponents\tests\nunit.uikit.tests.csproj", "{63EC3999-FA6B-4C5B-8805-5A88AF4CBD7B}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-console.exe", "ConsoleRunner\nunit-console-exe\nunit-console.exe.csproj", "{53BF8787-CB9C-4BB8-AFB4-605DD3A5CA0E}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-console.tests", "ConsoleRunner\tests\nunit-console.tests.csproj", "{8597D2C6-804D-48CB-BFC7-ED2404D389B0}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.util.tests", "ClientUtilities\tests\nunit.util.tests.csproj", "{74EF7165-117E-48ED-98EA-068EAE438E53}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.framework.tests", "NUnitFramework\tests\nunit.framework.tests.csproj", "{8C326431-AE57-4645-ACC1-A90A0B425129}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-gui.exe", "GuiRunner\nunit-gui-exe\nunit-gui.exe.csproj", "{AAB186A4-FA3D-404D-AD78-7EB5BB861655}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-gui.tests", "GuiRunner\tests\nunit-gui.tests.csproj", "{AAD27267-DE1F-4F61-A1FB-D1680A5B8001}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.extensions.tests", "NUnitExtensions\tests\nunit.extensions.tests.csproj", "{92961F10-EB6D-4C91-AD4F-B4F27BA571B2}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.core.extensions.dll", "NUnitExtensions\core\nunit.core.extensions.dll.csproj", "{98B10E98-003C-45A0-9587-119142E39986}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.core.dll", "NUnitCore\core\nunit.core.dll.csproj", "{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.core.tests", "NUnitCore\tests\nunit.core.tests.csproj", "{DD758D21-E5D5-4D40-9450-5F65A32F359C}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "test-assembly", "tests\test-assembly\test-assembly.csproj", "{1960CAC4-9A82-47C5-A9B3-55BC37572C3C}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.framework.extensions.dll", "NUnitExtensions\framework\nunit.framework.extensions.dll.csproj", "{486C498D-B9F8-477F-ACA7-CED9245BBFCF}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.core.interfaces.dll", "NUnitCore\interfaces\nunit.core.interfaces.dll.csproj", "{435428F8-5995-4CE4-8022-93D595A8CC0F}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mock-assembly", "tests\mock-assembly\mock-assembly.csproj", "{2E368281-3BA8-4050-B05E-0E0E43F8F446}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nonamespace-assembly", "tests\nonamespace-assembly\nonamespace-assembly.csproj", "{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "notestfixtures-assembly", "tests\notestfixtures-assembly\notestfixtures-assembly.csproj", "{8D330DE4-B980-4A57-9F07-E9F7A7A33F4F}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "test-utilities", "tests\test-utilities\test-utilities.csproj", "{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "timing-tests", "tests\timing-tests\timing-tests.csproj", "{F16DED73-A2AD-4711-BC1B-5DDFC2BF8667}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-console", "ConsoleRunner\nunit-console\nunit-console.csproj", "{9367EC89-6A38-42BA-9607-0DC288E4BC3A}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.fixtures", "NUnitFixtures\fixtures\nunit.fixtures.csproj", "{A8D36198-BE2F-44E5-AC4F-4E052AFCCF78}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.fixtures.tests", "NUnitFixtures\tests\nunit.fixtures.tests.csproj", "{55F2D231-743C-48DD-B79A-00E5A7236CBE}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "loadtest-assembly", "tests\loadtest-assembly\loadtest-assembly.csproj", "{34734263-6F6C-403D-AD8C-CE3F8E340EA9}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Global
-	GlobalSection(SolutionConfiguration) = preSolution
-		Debug = Debug
-		Release = Release
-	EndGlobalSection
-	GlobalSection(ProjectConfiguration) = postSolution
-		{3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}.Debug.ActiveCfg = Debug|.NET
-		{3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}.Debug.Build.0 = Debug|.NET
-		{3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}.Release.ActiveCfg = Release|.NET
-		{3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}.Release.Build.0 = Release|.NET
-		{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}.Debug.ActiveCfg = Debug|.NET
-		{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}.Debug.Build.0 = Debug|.NET
-		{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}.Release.ActiveCfg = Release|.NET
-		{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}.Release.Build.0 = Release|.NET
-		{27531BBF-183D-4C3A-935B-D840B9F1A3A4}.Debug.ActiveCfg = Debug|.NET
-		{27531BBF-183D-4C3A-935B-D840B9F1A3A4}.Debug.Build.0 = Debug|.NET
-		{27531BBF-183D-4C3A-935B-D840B9F1A3A4}.Release.ActiveCfg = Release|.NET
-		{27531BBF-183D-4C3A-935B-D840B9F1A3A4}.Release.Build.0 = Release|.NET
-		{61CE9CE5-943E-44D4-A381-814DC1406767}.Debug.ActiveCfg = Debug|.NET
-		{61CE9CE5-943E-44D4-A381-814DC1406767}.Debug.Build.0 = Debug|.NET
-		{61CE9CE5-943E-44D4-A381-814DC1406767}.Release.ActiveCfg = Release|.NET
-		{61CE9CE5-943E-44D4-A381-814DC1406767}.Release.Build.0 = Release|.NET
-		{83DD7E12-A705-4DBA-9D71-09C8973D9382}.Debug.ActiveCfg = Debug|.NET
-		{83DD7E12-A705-4DBA-9D71-09C8973D9382}.Debug.Build.0 = Debug|.NET
-		{83DD7E12-A705-4DBA-9D71-09C8973D9382}.Release.ActiveCfg = Release|.NET
-		{83DD7E12-A705-4DBA-9D71-09C8973D9382}.Release.Build.0 = Release|.NET
-		{8667C588-1A05-4773-A9E8-272EB302B8AB}.Debug.ActiveCfg = Debug|.NET
-		{8667C588-1A05-4773-A9E8-272EB302B8AB}.Debug.Build.0 = Debug|.NET
-		{8667C588-1A05-4773-A9E8-272EB302B8AB}.Release.ActiveCfg = Release|.NET
-		{8667C588-1A05-4773-A9E8-272EB302B8AB}.Release.Build.0 = Release|.NET
-		{63EC3999-FA6B-4C5B-8805-5A88AF4CBD7B}.Debug.ActiveCfg = Debug|.NET
-		{63EC3999-FA6B-4C5B-8805-5A88AF4CBD7B}.Debug.Build.0 = Debug|.NET
-		{63EC3999-FA6B-4C5B-8805-5A88AF4CBD7B}.Release.ActiveCfg = Release|.NET
-		{63EC3999-FA6B-4C5B-8805-5A88AF4CBD7B}.Release.Build.0 = Release|.NET
-		{53BF8787-CB9C-4BB8-AFB4-605DD3A5CA0E}.Debug.ActiveCfg = Debug|.NET
-		{53BF8787-CB9C-4BB8-AFB4-605DD3A5CA0E}.Debug.Build.0 = Debug|.NET
-		{53BF8787-CB9C-4BB8-AFB4-605DD3A5CA0E}.Release.ActiveCfg = Release|.NET
-		{53BF8787-CB9C-4BB8-AFB4-605DD3A5CA0E}.Release.Build.0 = Release|.NET
-		{8597D2C6-804D-48CB-BFC7-ED2404D389B0}.Debug.ActiveCfg = Debug|.NET
-		{8597D2C6-804D-48CB-BFC7-ED2404D389B0}.Debug.Build.0 = Debug|.NET
-		{8597D2C6-804D-48CB-BFC7-ED2404D389B0}.Release.ActiveCfg = Release|.NET
-		{8597D2C6-804D-48CB-BFC7-ED2404D389B0}.Release.Build.0 = Release|.NET
-		{74EF7165-117E-48ED-98EA-068EAE438E53}.Debug.ActiveCfg = Debug|.NET
-		{74EF7165-117E-48ED-98EA-068EAE438E53}.Debug.Build.0 = Debug|.NET
-		{74EF7165-117E-48ED-98EA-068EAE438E53}.Release.ActiveCfg = Release|.NET
-		{74EF7165-117E-48ED-98EA-068EAE438E53}.Release.Build.0 = Release|.NET
-		{8C326431-AE57-4645-ACC1-A90A0B425129}.Debug.ActiveCfg = Debug|.NET
-		{8C326431-AE57-4645-ACC1-A90A0B425129}.Debug.Build.0 = Debug|.NET
-		{8C326431-AE57-4645-ACC1-A90A0B425129}.Release.ActiveCfg = Release|.NET
-		{8C326431-AE57-4645-ACC1-A90A0B425129}.Release.Build.0 = Release|.NET
-		{AAB186A4-FA3D-404D-AD78-7EB5BB861655}.Debug.ActiveCfg = Debug|.NET
-		{AAB186A4-FA3D-404D-AD78-7EB5BB861655}.Debug.Build.0 = Debug|.NET
-		{AAB186A4-FA3D-404D-AD78-7EB5BB861655}.Release.ActiveCfg = Release|.NET
-		{AAB186A4-FA3D-404D-AD78-7EB5BB861655}.Release.Build.0 = Release|.NET
-		{AAD27267-DE1F-4F61-A1FB-D1680A5B8001}.Debug.ActiveCfg = Debug|.NET
-		{AAD27267-DE1F-4F61-A1FB-D1680A5B8001}.Debug.Build.0 = Debug|.NET
-		{AAD27267-DE1F-4F61-A1FB-D1680A5B8001}.Release.ActiveCfg = Release|.NET
-		{AAD27267-DE1F-4F61-A1FB-D1680A5B8001}.Release.Build.0 = Release|.NET
-		{92961F10-EB6D-4C91-AD4F-B4F27BA571B2}.Debug.ActiveCfg = Debug|.NET
-		{92961F10-EB6D-4C91-AD4F-B4F27BA571B2}.Debug.Build.0 = Debug|.NET
-		{92961F10-EB6D-4C91-AD4F-B4F27BA571B2}.Release.ActiveCfg = Release|.NET
-		{92961F10-EB6D-4C91-AD4F-B4F27BA571B2}.Release.Build.0 = Release|.NET
-		{98B10E98-003C-45A0-9587-119142E39986}.Debug.ActiveCfg = Debug|.NET
-		{98B10E98-003C-45A0-9587-119142E39986}.Debug.Build.0 = Debug|.NET
-		{98B10E98-003C-45A0-9587-119142E39986}.Release.ActiveCfg = Release|.NET
-		{98B10E98-003C-45A0-9587-119142E39986}.Release.Build.0 = Release|.NET
-		{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}.Debug.ActiveCfg = Debug|.NET
-		{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}.Debug.Build.0 = Debug|.NET
-		{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}.Release.ActiveCfg = Release|.NET
-		{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}.Release.Build.0 = Release|.NET
-		{DD758D21-E5D5-4D40-9450-5F65A32F359C}.Debug.ActiveCfg = Debug|.NET
-		{DD758D21-E5D5-4D40-9450-5F65A32F359C}.Debug.Build.0 = Debug|.NET
-		{DD758D21-E5D5-4D40-9450-5F65A32F359C}.Release.ActiveCfg = Release|.NET
-		{DD758D21-E5D5-4D40-9450-5F65A32F359C}.Release.Build.0 = Release|.NET
-		{1960CAC4-9A82-47C5-A9B3-55BC37572C3C}.Debug.ActiveCfg = Debug|.NET
-		{1960CAC4-9A82-47C5-A9B3-55BC37572C3C}.Debug.Build.0 = Debug|.NET
-		{1960CAC4-9A82-47C5-A9B3-55BC37572C3C}.Release.ActiveCfg = Release|.NET
-		{1960CAC4-9A82-47C5-A9B3-55BC37572C3C}.Release.Build.0 = Release|.NET
-		{486C498D-B9F8-477F-ACA7-CED9245BBFCF}.Debug.ActiveCfg = Debug|.NET
-		{486C498D-B9F8-477F-ACA7-CED9245BBFCF}.Debug.Build.0 = Debug|.NET
-		{486C498D-B9F8-477F-ACA7-CED9245BBFCF}.Release.ActiveCfg = Release|.NET
-		{486C498D-B9F8-477F-ACA7-CED9245BBFCF}.Release.Build.0 = Release|.NET
-		{435428F8-5995-4CE4-8022-93D595A8CC0F}.Debug.ActiveCfg = Debug|.NET
-		{435428F8-5995-4CE4-8022-93D595A8CC0F}.Debug.Build.0 = Debug|.NET
-		{435428F8-5995-4CE4-8022-93D595A8CC0F}.Release.ActiveCfg = Release|.NET
-		{435428F8-5995-4CE4-8022-93D595A8CC0F}.Release.Build.0 = Release|.NET
-		{2E368281-3BA8-4050-B05E-0E0E43F8F446}.Debug.ActiveCfg = Debug|.NET
-		{2E368281-3BA8-4050-B05E-0E0E43F8F446}.Debug.Build.0 = Debug|.NET
-		{2E368281-3BA8-4050-B05E-0E0E43F8F446}.Release.ActiveCfg = Release|.NET
-		{2E368281-3BA8-4050-B05E-0E0E43F8F446}.Release.Build.0 = Release|.NET
-		{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}.Debug.ActiveCfg = Debug|.NET
-		{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}.Debug.Build.0 = Debug|.NET
-		{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}.Release.ActiveCfg = Release|.NET
-		{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}.Release.Build.0 = Release|.NET
-		{8D330DE4-B980-4A57-9F07-E9F7A7A33F4F}.Debug.ActiveCfg = Debug|.NET
-		{8D330DE4-B980-4A57-9F07-E9F7A7A33F4F}.Debug.Build.0 = Debug|.NET
-		{8D330DE4-B980-4A57-9F07-E9F7A7A33F4F}.Release.ActiveCfg = Release|.NET
-		{8D330DE4-B980-4A57-9F07-E9F7A7A33F4F}.Release.Build.0 = Release|.NET
-		{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}.Debug.ActiveCfg = Debug|.NET
-		{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}.Debug.Build.0 = Debug|.NET
-		{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}.Release.ActiveCfg = Release|.NET
-		{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}.Release.Build.0 = Release|.NET
-		{F16DED73-A2AD-4711-BC1B-5DDFC2BF8667}.Debug.ActiveCfg = Debug|.NET
-		{F16DED73-A2AD-4711-BC1B-5DDFC2BF8667}.Debug.Build.0 = Debug|.NET
-		{F16DED73-A2AD-4711-BC1B-5DDFC2BF8667}.Release.ActiveCfg = Release|.NET
-		{F16DED73-A2AD-4711-BC1B-5DDFC2BF8667}.Release.Build.0 = Release|.NET
-		{9367EC89-6A38-42BA-9607-0DC288E4BC3A}.Debug.ActiveCfg = Debug|.NET
-		{9367EC89-6A38-42BA-9607-0DC288E4BC3A}.Debug.Build.0 = Debug|.NET
-		{9367EC89-6A38-42BA-9607-0DC288E4BC3A}.Release.ActiveCfg = Release|.NET
-		{9367EC89-6A38-42BA-9607-0DC288E4BC3A}.Release.Build.0 = Release|.NET
-		{A8D36198-BE2F-44E5-AC4F-4E052AFCCF78}.Debug.ActiveCfg = Debug|.NET
-		{A8D36198-BE2F-44E5-AC4F-4E052AFCCF78}.Debug.Build.0 = Debug|.NET
-		{A8D36198-BE2F-44E5-AC4F-4E052AFCCF78}.Release.ActiveCfg = Release|.NET
-		{A8D36198-BE2F-44E5-AC4F-4E052AFCCF78}.Release.Build.0 = Release|.NET
-		{55F2D231-743C-48DD-B79A-00E5A7236CBE}.Debug.ActiveCfg = Debug|.NET
-		{55F2D231-743C-48DD-B79A-00E5A7236CBE}.Debug.Build.0 = Debug|.NET
-		{55F2D231-743C-48DD-B79A-00E5A7236CBE}.Release.ActiveCfg = Release|.NET
-		{55F2D231-743C-48DD-B79A-00E5A7236CBE}.Release.Build.0 = Release|.NET
-		{34734263-6F6C-403D-AD8C-CE3F8E340EA9}.Debug.ActiveCfg = Debug|.NET
-		{34734263-6F6C-403D-AD8C-CE3F8E340EA9}.Debug.Build.0 = Debug|.NET
-		{34734263-6F6C-403D-AD8C-CE3F8E340EA9}.Release.ActiveCfg = Release|.NET
-		{34734263-6F6C-403D-AD8C-CE3F8E340EA9}.Release.Build.0 = Release|.NET
-	EndGlobalSection
-	GlobalSection(SolutionItems) = postSolution
-		clr.bat = clr.bat
-		CommonAssemblyInfo.cs = CommonAssemblyInfo.cs
-		license.rtf = license.rtf
-		nunit.build = nunit.build
-		nunit.snk = nunit.snk
-		NUnitDevTests.nunit = NUnitDevTests.nunit
-		NUnitFitTests.html = NUnitFitTests.html
-		NUnitTests.config = NUnitTests.config
-		NUnitTests.nunit = NUnitTests.nunit
-	EndGlobalSection
-	GlobalSection(ExtensibilityGlobals) = postSolution
-	EndGlobalSection
-	GlobalSection(ExtensibilityAddIns) = postSolution
-	EndGlobalSection
-EndGlobal
diff --git a/src/nunit_VS2005.sln b/src/nunit_VS2005.sln
deleted file mode 100644
index 882ec9a..0000000
--- a/src/nunit_VS2005.sln
+++ /dev/null
@@ -1,217 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "test-utilities_VS2005", "tests\test-utilities\test-utilities_VS2005.csproj", "{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}"
-	ProjectSection(ProjectDependencies) = postProject
-		{83DD7E12-A705-4DBA-9D71-09C8973D9382} = {83DD7E12-A705-4DBA-9D71-09C8973D9382}
-		{2E368281-3BA8-4050-B05E-0E0E43F8F446} = {2E368281-3BA8-4050-B05E-0E0E43F8F446}
-		{98B10E98-003C-45A0-9587-119142E39986} = {98B10E98-003C-45A0-9587-119142E39986}
-		{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D} = {5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}
-		{61CE9CE5-943E-44D4-A381-814DC1406767} = {61CE9CE5-943E-44D4-A381-814DC1406767}
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mock-assembly_VS2005", "tests\mock-assembly\mock-assembly_VS2005.csproj", "{2E368281-3BA8-4050-B05E-0E0E43F8F446}"
-	ProjectSection(ProjectDependencies) = postProject
-		{83DD7E12-A705-4DBA-9D71-09C8973D9382} = {83DD7E12-A705-4DBA-9D71-09C8973D9382}
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nonamespace-assembly_VS2005", "tests\nonamespace-assembly\nonamespace-assembly_VS2005.csproj", "{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}"
-	ProjectSection(ProjectDependencies) = postProject
-		{83DD7E12-A705-4DBA-9D71-09C8973D9382} = {83DD7E12-A705-4DBA-9D71-09C8973D9382}
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "timing-tests_VS2005", "tests\timing-tests\timing-tests_VS2005.csproj", "{F16DED73-A2AD-4711-BC1B-5DDFC2BF8667}"
-	ProjectSection(ProjectDependencies) = postProject
-		{83DD7E12-A705-4DBA-9D71-09C8973D9382} = {83DD7E12-A705-4DBA-9D71-09C8973D9382}
-		{2E368281-3BA8-4050-B05E-0E0E43F8F446} = {2E368281-3BA8-4050-B05E-0E0E43F8F446}
-		{61CE9CE5-943E-44D4-A381-814DC1406767} = {61CE9CE5-943E-44D4-A381-814DC1406767}
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "notestfixtures-assembly_VS2005", "tests\notestfixtures-assembly\notestfixtures-assembly_VS2005.csproj", "{8D330DE4-B980-4A57-9F07-E9F7A7A33F4F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-console_VS2005", "ConsoleRunner\nunit-console\nunit-console_VS2005.csproj", "{9367EC89-6A38-42BA-9607-0DC288E4BC3A}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-gui_VS2005", "GuiRunner\nunit-gui\nunit-gui_VS2005.csproj", "{3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.mocks_VS2005", "NUnitMocks\mocks\nunit.mocks_VS2005.csproj", "{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.uikit.dll_VS2005", "GuiComponents\UiKit\nunit.uikit.dll_VS2005.csproj", "{27531BBF-183D-4C3A-935B-D840B9F1A3A4}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.util.dll_VS2005", "ClientUtilities\util\nunit.util.dll_VS2005.csproj", "{61CE9CE5-943E-44D4-A381-814DC1406767}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.framework.dll_VS2005", "NUnitFramework\framework\nunit.framework.dll_VS2005.csproj", "{83DD7E12-A705-4DBA-9D71-09C8973D9382}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.mocks.tests_VS2005", "NUnitMocks\tests\nunit.mocks.tests_VS2005.csproj", "{8667C588-1A05-4773-A9E8-272EB302B8AB}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.uikit.tests_VS2005", "GuiComponents\tests\nunit.uikit.tests_VS2005.csproj", "{63EC3999-FA6B-4C5B-8805-5A88AF4CBD7B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-console.exe_VS2005", "ConsoleRunner\nunit-console-exe\nunit-console.exe_VS2005.csproj", "{53BF8787-CB9C-4BB8-AFB4-605DD3A5CA0E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-console.tests_VS2005", "ConsoleRunner\tests\nunit-console.tests_VS2005.csproj", "{8597D2C6-804D-48CB-BFC7-ED2404D389B0}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.util.tests_VS2005", "ClientUtilities\tests\nunit.util.tests_VS2005.csproj", "{74EF7165-117E-48ED-98EA-068EAE438E53}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.framework.tests_VS2005", "NUnitFramework\tests\nunit.framework.tests_VS2005.csproj", "{8C326431-AE57-4645-ACC1-A90A0B425129}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-gui.exe_VS2005", "GuiRunner\nunit-gui-exe\nunit-gui.exe_VS2005.csproj", "{AAB186A4-FA3D-404D-AD78-7EB5BB861655}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-gui.tests_VS2005", "GuiRunner\tests\nunit-gui.tests_VS2005.csproj", "{AAD27267-DE1F-4F61-A1FB-D1680A5B8001}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.extensions.tests_VS2005", "NUnitExtensions\tests\nunit.extensions.tests_VS2005.csproj", "{92961F10-EB6D-4C91-AD4F-B4F27BA571B2}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.core.extensions.dll_VS2005", "NUnitExtensions\core\nunit.core.extensions.dll_VS2005.csproj", "{98B10E98-003C-45A0-9587-119142E39986}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{3EE8FF35-CFD4-474A-B122-68F5E8EE0C7D}"
-	ProjectSection(SolutionItems) = preProject
-		clr.bat = clr.bat
-		CommonAssemblyInfo.cs = CommonAssemblyInfo.cs
-		license.rtf = license.rtf
-		nunit.snk = nunit.snk
-		NUnitDevTests.nunit = NUnitDevTests.nunit
-		NUnitFitTests.html = NUnitFitTests.html
-		NUnitTests.config = NUnitTests.config
-		NUnitTests.nunit = NUnitTests.nunit
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.core.dll_VS2005", "NUnitCore\core\nunit.core.dll_VS2005.csproj", "{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.core.tests_VS2005", "NUnitCore\tests\nunit.core.tests_VS2005.csproj", "{DD758D21-E5D5-4D40-9450-5F65A32F359C}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "test-assembly_VS2005", "tests\test-assembly\test-assembly_VS2005.csproj", "{1960CAC4-9A82-47C5-A9B3-55BC37572C3C}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.framework.extensions.dll_VS2005", "NUnitExtensions\framework\nunit.framework.extensions.dll_VS2005.csproj", "{486C498D-B9F8-477F-ACA7-CED9245BBFCF}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.core.interfaces.dll_VS2005", "NUnitCore\interfaces\nunit.core.interfaces.dll_VS2005.csproj", "{DCC88998-255A-4247-B658-71DD932E9873}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.fixtures_VS2005", "NUnitFixtures\fixtures\nunit.fixtures_VS2005.csproj", "{67D6949E-F4D2-4821-B02B-4AAFC3F18B52}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.fixtures.tests_VS2005", "NUnitFixtures\tests\nunit.fixtures.tests_VS2005.csproj", "{55F2D231-743C-48DD-B79A-00E5A7236CBE}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "loadtest-assembly_VS2005", "tests\loadtest-assembly\loadtest-assembly_VS2005.csproj", "{34734263-6F6C-403D-AD8C-CE3F8E340EA9}"
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug2005|Any CPU = Debug2005|Any CPU
-		Release2005|Any CPU = Release2005|Any CPU
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}.Debug2005|Any CPU.ActiveCfg = Debug2005|Any CPU
-		{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}.Debug2005|Any CPU.Build.0 = Debug2005|Any CPU
-		{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}.Release2005|Any CPU.ActiveCfg = Release2005|Any CPU
-		{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}.Release2005|Any CPU.Build.0 = Release2005|Any CPU
-		{2E368281-3BA8-4050-B05E-0E0E43F8F446}.Debug2005|Any CPU.ActiveCfg = Debug2005|Any CPU
-		{2E368281-3BA8-4050-B05E-0E0E43F8F446}.Debug2005|Any CPU.Build.0 = Debug2005|Any CPU
-		{2E368281-3BA8-4050-B05E-0E0E43F8F446}.Release2005|Any CPU.ActiveCfg = Release2005|Any CPU
-		{2E368281-3BA8-4050-B05E-0E0E43F8F446}.Release2005|Any CPU.Build.0 = Release2005|Any CPU
-		{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}.Debug2005|Any CPU.ActiveCfg = Debug2005|Any CPU
-		{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}.Debug2005|Any CPU.Build.0 = Debug2005|Any CPU
-		{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}.Release2005|Any CPU.ActiveCfg = Release2005|Any CPU
-		{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}.Release2005|Any CPU.Build.0 = Release2005|Any CPU
-		{F16DED73-A2AD-4711-BC1B-5DDFC2BF8667}.Debug2005|Any CPU.ActiveCfg = Debug2005|Any CPU
-		{F16DED73-A2AD-4711-BC1B-5DDFC2BF8667}.Debug2005|Any CPU.Build.0 = Debug2005|Any CPU
-		{F16DED73-A2AD-4711-BC1B-5DDFC2BF8667}.Release2005|Any CPU.ActiveCfg = Release2005|Any CPU
-		{F16DED73-A2AD-4711-BC1B-5DDFC2BF8667}.Release2005|Any CPU.Build.0 = Release2005|Any CPU
-		{8D330DE4-B980-4A57-9F07-E9F7A7A33F4F}.Debug2005|Any CPU.ActiveCfg = Debug2005|Any CPU
-		{8D330DE4-B980-4A57-9F07-E9F7A7A33F4F}.Debug2005|Any CPU.Build.0 = Debug2005|Any CPU
-		{8D330DE4-B980-4A57-9F07-E9F7A7A33F4F}.Release2005|Any CPU.ActiveCfg = Release2005|Any CPU
-		{8D330DE4-B980-4A57-9F07-E9F7A7A33F4F}.Release2005|Any CPU.Build.0 = Release2005|Any CPU
-		{9367EC89-6A38-42BA-9607-0DC288E4BC3A}.Debug2005|Any CPU.ActiveCfg = Debug2005|Any CPU
-		{9367EC89-6A38-42BA-9607-0DC288E4BC3A}.Debug2005|Any CPU.Build.0 = Debug2005|Any CPU
-		{9367EC89-6A38-42BA-9607-0DC288E4BC3A}.Release2005|Any CPU.ActiveCfg = Release2005|Any CPU
-		{9367EC89-6A38-42BA-9607-0DC288E4BC3A}.Release2005|Any CPU.Build.0 = Release2005|Any CPU
-		{3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}.Debug2005|Any CPU.ActiveCfg = Debug2005|Any CPU
-		{3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}.Debug2005|Any CPU.Build.0 = Debug2005|Any CPU
-		{3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}.Release2005|Any CPU.ActiveCfg = Release2005|Any CPU
-		{3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}.Release2005|Any CPU.Build.0 = Release2005|Any CPU
-		{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}.Debug2005|Any CPU.ActiveCfg = Debug2005|Any CPU
-		{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}.Debug2005|Any CPU.Build.0 = Debug2005|Any CPU
-		{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}.Release2005|Any CPU.ActiveCfg = Release2005|Any CPU
-		{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}.Release2005|Any CPU.Build.0 = Release2005|Any CPU
-		{27531BBF-183D-4C3A-935B-D840B9F1A3A4}.Debug2005|Any CPU.ActiveCfg = Debug2005|Any CPU
-		{27531BBF-183D-4C3A-935B-D840B9F1A3A4}.Debug2005|Any CPU.Build.0 = Debug2005|Any CPU
-		{27531BBF-183D-4C3A-935B-D840B9F1A3A4}.Release2005|Any CPU.ActiveCfg = Release2005|Any CPU
-		{27531BBF-183D-4C3A-935B-D840B9F1A3A4}.Release2005|Any CPU.Build.0 = Release2005|Any CPU
-		{61CE9CE5-943E-44D4-A381-814DC1406767}.Debug2005|Any CPU.ActiveCfg = Debug2005|Any CPU
-		{61CE9CE5-943E-44D4-A381-814DC1406767}.Debug2005|Any CPU.Build.0 = Debug2005|Any CPU
-		{61CE9CE5-943E-44D4-A381-814DC1406767}.Release2005|Any CPU.ActiveCfg = Release2005|Any CPU
-		{61CE9CE5-943E-44D4-A381-814DC1406767}.Release2005|Any CPU.Build.0 = Release2005|Any CPU
-		{83DD7E12-A705-4DBA-9D71-09C8973D9382}.Debug2005|Any CPU.ActiveCfg = Debug2005|Any CPU
-		{83DD7E12-A705-4DBA-9D71-09C8973D9382}.Debug2005|Any CPU.Build.0 = Debug2005|Any CPU
-		{83DD7E12-A705-4DBA-9D71-09C8973D9382}.Release2005|Any CPU.ActiveCfg = Release2005|Any CPU
-		{83DD7E12-A705-4DBA-9D71-09C8973D9382}.Release2005|Any CPU.Build.0 = Release2005|Any CPU
-		{8667C588-1A05-4773-A9E8-272EB302B8AB}.Debug2005|Any CPU.ActiveCfg = Debug2005|Any CPU
-		{8667C588-1A05-4773-A9E8-272EB302B8AB}.Debug2005|Any CPU.Build.0 = Debug2005|Any CPU
-		{8667C588-1A05-4773-A9E8-272EB302B8AB}.Release2005|Any CPU.ActiveCfg = Release2005|Any CPU
-		{8667C588-1A05-4773-A9E8-272EB302B8AB}.Release2005|Any CPU.Build.0 = Release2005|Any CPU
-		{63EC3999-FA6B-4C5B-8805-5A88AF4CBD7B}.Debug2005|Any CPU.ActiveCfg = Debug2005|Any CPU
-		{63EC3999-FA6B-4C5B-8805-5A88AF4CBD7B}.Debug2005|Any CPU.Build.0 = Debug2005|Any CPU
-		{63EC3999-FA6B-4C5B-8805-5A88AF4CBD7B}.Release2005|Any CPU.ActiveCfg = Release2005|Any CPU
-		{63EC3999-FA6B-4C5B-8805-5A88AF4CBD7B}.Release2005|Any CPU.Build.0 = Release2005|Any CPU
-		{53BF8787-CB9C-4BB8-AFB4-605DD3A5CA0E}.Debug2005|Any CPU.ActiveCfg = Debug2005|Any CPU
-		{53BF8787-CB9C-4BB8-AFB4-605DD3A5CA0E}.Debug2005|Any CPU.Build.0 = Debug2005|Any CPU
-		{53BF8787-CB9C-4BB8-AFB4-605DD3A5CA0E}.Release2005|Any CPU.ActiveCfg = Release2005|Any CPU
-		{53BF8787-CB9C-4BB8-AFB4-605DD3A5CA0E}.Release2005|Any CPU.Build.0 = Release2005|Any CPU
-		{8597D2C6-804D-48CB-BFC7-ED2404D389B0}.Debug2005|Any CPU.ActiveCfg = Debug2005|Any CPU
-		{8597D2C6-804D-48CB-BFC7-ED2404D389B0}.Debug2005|Any CPU.Build.0 = Debug2005|Any CPU
-		{8597D2C6-804D-48CB-BFC7-ED2404D389B0}.Release2005|Any CPU.ActiveCfg = Release2005|Any CPU
-		{8597D2C6-804D-48CB-BFC7-ED2404D389B0}.Release2005|Any CPU.Build.0 = Release2005|Any CPU
-		{74EF7165-117E-48ED-98EA-068EAE438E53}.Debug2005|Any CPU.ActiveCfg = Debug2005|Any CPU
-		{74EF7165-117E-48ED-98EA-068EAE438E53}.Debug2005|Any CPU.Build.0 = Debug2005|Any CPU
-		{74EF7165-117E-48ED-98EA-068EAE438E53}.Release2005|Any CPU.ActiveCfg = Release2005|Any CPU
-		{74EF7165-117E-48ED-98EA-068EAE438E53}.Release2005|Any CPU.Build.0 = Release2005|Any CPU
-		{8C326431-AE57-4645-ACC1-A90A0B425129}.Debug2005|Any CPU.ActiveCfg = Debug2005|Any CPU
-		{8C326431-AE57-4645-ACC1-A90A0B425129}.Debug2005|Any CPU.Build.0 = Debug2005|Any CPU
-		{8C326431-AE57-4645-ACC1-A90A0B425129}.Release2005|Any CPU.ActiveCfg = Release2005|Any CPU
-		{8C326431-AE57-4645-ACC1-A90A0B425129}.Release2005|Any CPU.Build.0 = Release2005|Any CPU
-		{AAB186A4-FA3D-404D-AD78-7EB5BB861655}.Debug2005|Any CPU.ActiveCfg = Debug2005|Any CPU
-		{AAB186A4-FA3D-404D-AD78-7EB5BB861655}.Debug2005|Any CPU.Build.0 = Debug2005|Any CPU
-		{AAB186A4-FA3D-404D-AD78-7EB5BB861655}.Release2005|Any CPU.ActiveCfg = Release2005|Any CPU
-		{AAB186A4-FA3D-404D-AD78-7EB5BB861655}.Release2005|Any CPU.Build.0 = Release2005|Any CPU
-		{AAD27267-DE1F-4F61-A1FB-D1680A5B8001}.Debug2005|Any CPU.ActiveCfg = Debug2005|Any CPU
-		{AAD27267-DE1F-4F61-A1FB-D1680A5B8001}.Debug2005|Any CPU.Build.0 = Debug2005|Any CPU
-		{AAD27267-DE1F-4F61-A1FB-D1680A5B8001}.Release2005|Any CPU.ActiveCfg = Release2005|Any CPU
-		{AAD27267-DE1F-4F61-A1FB-D1680A5B8001}.Release2005|Any CPU.Build.0 = Release2005|Any CPU
-		{92961F10-EB6D-4C91-AD4F-B4F27BA571B2}.Debug2005|Any CPU.ActiveCfg = Debug2005|Any CPU
-		{92961F10-EB6D-4C91-AD4F-B4F27BA571B2}.Debug2005|Any CPU.Build.0 = Debug2005|Any CPU
-		{92961F10-EB6D-4C91-AD4F-B4F27BA571B2}.Release2005|Any CPU.ActiveCfg = Release2005|Any CPU
-		{92961F10-EB6D-4C91-AD4F-B4F27BA571B2}.Release2005|Any CPU.Build.0 = Release2005|Any CPU
-		{98B10E98-003C-45A0-9587-119142E39986}.Debug2005|Any CPU.ActiveCfg = Debug2005|Any CPU
-		{98B10E98-003C-45A0-9587-119142E39986}.Debug2005|Any CPU.Build.0 = Debug2005|Any CPU
-		{98B10E98-003C-45A0-9587-119142E39986}.Release2005|Any CPU.ActiveCfg = Release2005|Any CPU
-		{98B10E98-003C-45A0-9587-119142E39986}.Release2005|Any CPU.Build.0 = Release2005|Any CPU
-		{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}.Debug2005|Any CPU.ActiveCfg = Debug2005|Any CPU
-		{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}.Debug2005|Any CPU.Build.0 = Debug2005|Any CPU
-		{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}.Release2005|Any CPU.ActiveCfg = Release2005|Any CPU
-		{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}.Release2005|Any CPU.Build.0 = Release2005|Any CPU
-		{DD758D21-E5D5-4D40-9450-5F65A32F359C}.Debug2005|Any CPU.ActiveCfg = Debug2005|Any CPU
-		{DD758D21-E5D5-4D40-9450-5F65A32F359C}.Debug2005|Any CPU.Build.0 = Debug2005|Any CPU
-		{DD758D21-E5D5-4D40-9450-5F65A32F359C}.Release2005|Any CPU.ActiveCfg = Release2005|Any CPU
-		{DD758D21-E5D5-4D40-9450-5F65A32F359C}.Release2005|Any CPU.Build.0 = Release2005|Any CPU
-		{1960CAC4-9A82-47C5-A9B3-55BC37572C3C}.Debug2005|Any CPU.ActiveCfg = Debug2005|Any CPU
-		{1960CAC4-9A82-47C5-A9B3-55BC37572C3C}.Debug2005|Any CPU.Build.0 = Debug2005|Any CPU
-		{1960CAC4-9A82-47C5-A9B3-55BC37572C3C}.Release2005|Any CPU.ActiveCfg = Release2005|Any CPU
-		{1960CAC4-9A82-47C5-A9B3-55BC37572C3C}.Release2005|Any CPU.Build.0 = Release2005|Any CPU
-		{486C498D-B9F8-477F-ACA7-CED9245BBFCF}.Debug2005|Any CPU.ActiveCfg = Debug2005|Any CPU
-		{486C498D-B9F8-477F-ACA7-CED9245BBFCF}.Debug2005|Any CPU.Build.0 = Debug2005|Any CPU
-		{486C498D-B9F8-477F-ACA7-CED9245BBFCF}.Release2005|Any CPU.ActiveCfg = Release2005|Any CPU
-		{486C498D-B9F8-477F-ACA7-CED9245BBFCF}.Release2005|Any CPU.Build.0 = Release2005|Any CPU
-		{DCC88998-255A-4247-B658-71DD932E9873}.Debug2005|Any CPU.ActiveCfg = Debug2005|Any CPU
-		{DCC88998-255A-4247-B658-71DD932E9873}.Debug2005|Any CPU.Build.0 = Debug2005|Any CPU
-		{DCC88998-255A-4247-B658-71DD932E9873}.Release2005|Any CPU.ActiveCfg = Release2005|Any CPU
-		{DCC88998-255A-4247-B658-71DD932E9873}.Release2005|Any CPU.Build.0 = Release2005|Any CPU
-		{67D6949E-F4D2-4821-B02B-4AAFC3F18B52}.Debug2005|Any CPU.ActiveCfg = Debug2005|Any CPU
-		{67D6949E-F4D2-4821-B02B-4AAFC3F18B52}.Debug2005|Any CPU.Build.0 = Debug2005|Any CPU
-		{67D6949E-F4D2-4821-B02B-4AAFC3F18B52}.Release2005|Any CPU.ActiveCfg = Release2005|Any CPU
-		{67D6949E-F4D2-4821-B02B-4AAFC3F18B52}.Release2005|Any CPU.Build.0 = Release2005|Any CPU
-		{55F2D231-743C-48DD-B79A-00E5A7236CBE}.Debug2005|Any CPU.ActiveCfg = Debug2005|Any CPU
-		{55F2D231-743C-48DD-B79A-00E5A7236CBE}.Debug2005|Any CPU.Build.0 = Debug2005|Any CPU
-		{55F2D231-743C-48DD-B79A-00E5A7236CBE}.Release2005|Any CPU.ActiveCfg = Release2005|Any CPU
-		{55F2D231-743C-48DD-B79A-00E5A7236CBE}.Release2005|Any CPU.Build.0 = Release2005|Any CPU
-		{34734263-6F6C-403D-AD8C-CE3F8E340EA9}.Debug2005|Any CPU.ActiveCfg = Debug2005|Any CPU
-		{34734263-6F6C-403D-AD8C-CE3F8E340EA9}.Debug2005|Any CPU.Build.0 = Debug2005|Any CPU
-		{34734263-6F6C-403D-AD8C-CE3F8E340EA9}.Release2005|Any CPU.ActiveCfg = Release2005|Any CPU
-		{34734263-6F6C-403D-AD8C-CE3F8E340EA9}.Release2005|Any CPU.Build.0 = Release2005|Any CPU
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-EndGlobal
diff --git a/src/tests/loadtest-assembly/AAA/Class1.cs b/src/tests/loadtest-assembly/AAA/Class1.cs
index b895b72..af14776 100644
--- a/src/tests/loadtest-assembly/AAA/Class1.cs
+++ b/src/tests/loadtest-assembly/AAA/Class1.cs
@@ -1,3 +1,8 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using NUnit.Framework;
 
@@ -7,7 +12,7 @@ namespace NUnit.Tests.Assemblies.AAA
 	/// Summary description for Class1.
 	/// </summary>
 	[TestFixture]
-	public class Class1
+	public class Class1 : BaseClass
 	{
 		[Test]
 		public void Test1() { }
diff --git a/src/tests/loadtest-assembly/AAA/Class2.cs b/src/tests/loadtest-assembly/AAA/Class2.cs
index fc89506..7e94f5c 100644
--- a/src/tests/loadtest-assembly/AAA/Class2.cs
+++ b/src/tests/loadtest-assembly/AAA/Class2.cs
@@ -1,3 +1,8 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using NUnit.Framework;
 
@@ -7,7 +12,7 @@ namespace NUnit.Tests.Assemblies.AAA
 	/// Summary description for Class1.
 	/// </summary>
 	[TestFixture]
-	public class Class2
+    public class Class2 : BaseClass
 	{
 		[Test]
 		public void Test1() { }
diff --git a/src/tests/loadtest-assembly/AAA/Class3.cs b/src/tests/loadtest-assembly/AAA/Class3.cs
index ec79802..531b032 100644
--- a/src/tests/loadtest-assembly/AAA/Class3.cs
+++ b/src/tests/loadtest-assembly/AAA/Class3.cs
@@ -1,3 +1,8 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using NUnit.Framework;
 
@@ -7,7 +12,7 @@ namespace NUnit.Tests.Assemblies.AAA
 	/// Summary description for Class1.
 	/// </summary>
 	[TestFixture]
-	public class Class3
+    public class Class3 : BaseClass
 	{
 		[Test]
 		public void Test1() { }
diff --git a/src/tests/loadtest-assembly/AAA/Class4.cs b/src/tests/loadtest-assembly/AAA/Class4.cs
index 9d49787..a56505f 100644
--- a/src/tests/loadtest-assembly/AAA/Class4.cs
+++ b/src/tests/loadtest-assembly/AAA/Class4.cs
@@ -1,3 +1,8 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using NUnit.Framework;
 
@@ -7,7 +12,7 @@ namespace NUnit.Tests.Assemblies.AAA
 	/// Summary description for Class1.
 	/// </summary>
 	[TestFixture]
-	public class Class4
+    public class Class4 : BaseClass
 	{
 		[Test]
 		public void Test1() { }
diff --git a/src/tests/loadtest-assembly/AAA/Class5.cs b/src/tests/loadtest-assembly/AAA/Class5.cs
index 3f4c681..d8f020b 100644
--- a/src/tests/loadtest-assembly/AAA/Class5.cs
+++ b/src/tests/loadtest-assembly/AAA/Class5.cs
@@ -1,3 +1,8 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using NUnit.Framework;
 
@@ -7,7 +12,7 @@ namespace NUnit.Tests.Assemblies.AAA
 	/// Summary description for Class1.
 	/// </summary>
 	[TestFixture]
-	public class Class5
+    public class Class5 : BaseClass
 	{
 		[Test]
 		public void Test1() { }
diff --git a/src/tests/loadtest-assembly/AssemblyInfo.cs b/src/tests/loadtest-assembly/AssemblyInfo.cs
deleted file mode 100644
index 177a4f0..0000000
--- a/src/tests/loadtest-assembly/AssemblyInfo.cs
+++ /dev/null
@@ -1,58 +0,0 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-
-//
-// General Information about an assembly is controlled through the following 
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-//
-[assembly: AssemblyTitle("")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("")]
-[assembly: AssemblyCopyright("")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]		
-
-//
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version 
-//      Build Number
-//      Revision
-//
-// You can specify all the values or you can default the Revision and Build Numbers 
-// by using the '*' as shown below:
-
-[assembly: AssemblyVersion("1.0.*")]
-
-//
-// In order to sign your assembly you must specify a key to use. Refer to the 
-// Microsoft .NET Framework documentation for more information on assembly signing.
-//
-// Use the attributes below to control which key is used for signing. 
-//
-// Notes: 
-//   (*) If no key is specified, the assembly is not signed.
-//   (*) KeyName refers to a key that has been installed in the Crypto Service
-//       Provider (CSP) on your machine. KeyFile refers to a file which contains
-//       a key.
-//   (*) If the KeyFile and the KeyName values are both specified, the 
-//       following processing occurs:
-//       (1) If the KeyName can be found in the CSP, that key is used.
-//       (2) If the KeyName does not exist and the KeyFile does exist, the key 
-//           in the KeyFile is installed into the CSP and used.
-//   (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
-//       When specifying the KeyFile, the location of the KeyFile should be
-//       relative to the project output directory which is
-//       %Project Directory%\obj\<configuration>. For example, if your KeyFile is
-//       located in the project directory, you would specify the AssemblyKeyFile 
-//       attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
-//   (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
-//       documentation for more information on this.
-//
-[assembly: AssemblyDelaySign(false)]
-[assembly: AssemblyKeyFile("")]
-[assembly: AssemblyKeyName("")]
diff --git a/src/tests/loadtest-assembly/BBB/Class1.cs b/src/tests/loadtest-assembly/BBB/Class1.cs
index 6eef36b..477c817 100644
--- a/src/tests/loadtest-assembly/BBB/Class1.cs
+++ b/src/tests/loadtest-assembly/BBB/Class1.cs
@@ -1,3 +1,8 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using NUnit.Framework;
 
@@ -7,7 +12,7 @@ namespace NUnit.Tests.Assemblies.BBB
 	/// Summary description for Class1.
 	/// </summary>
 	[TestFixture]
-	public class Class1
+    public class Class1 : BaseClass
 	{
 		[Test]
 		public void Test1() { }
diff --git a/src/tests/loadtest-assembly/BBB/Class2.cs b/src/tests/loadtest-assembly/BBB/Class2.cs
index 7b91d44..aa923e1 100644
--- a/src/tests/loadtest-assembly/BBB/Class2.cs
+++ b/src/tests/loadtest-assembly/BBB/Class2.cs
@@ -1,3 +1,8 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using NUnit.Framework;
 
@@ -7,7 +12,7 @@ namespace NUnit.Tests.Assemblies.BBB
 	/// Summary description for Class1.
 	/// </summary>
 	[TestFixture]
-	public class Class2
+    public class Class2 : BaseClass
 	{
 		[Test]
 		public void Test1() { }
diff --git a/src/tests/loadtest-assembly/BBB/Class3.cs b/src/tests/loadtest-assembly/BBB/Class3.cs
index d9bacde..f63788f 100644
--- a/src/tests/loadtest-assembly/BBB/Class3.cs
+++ b/src/tests/loadtest-assembly/BBB/Class3.cs
@@ -1,3 +1,8 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using NUnit.Framework;
 
@@ -7,7 +12,7 @@ namespace NUnit.Tests.Assemblies.BBB
 	/// Summary description for Class1.
 	/// </summary>
 	[TestFixture]
-	public class Class3
+    public class Class3 : BaseClass
 	{
 		[Test]
 		public void Test1() { }
diff --git a/src/tests/loadtest-assembly/BBB/Class4.cs b/src/tests/loadtest-assembly/BBB/Class4.cs
index 553c589..2360a59 100644
--- a/src/tests/loadtest-assembly/BBB/Class4.cs
+++ b/src/tests/loadtest-assembly/BBB/Class4.cs
@@ -1,3 +1,8 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using NUnit.Framework;
 
@@ -7,7 +12,7 @@ namespace NUnit.Tests.Assemblies.BBB
 	/// Summary description for Class1.
 	/// </summary>
 	[TestFixture]
-	public class Class4
+    public class Class4 : BaseClass
 	{
 		[Test]
 		public void Test1() { }
diff --git a/src/tests/loadtest-assembly/BBB/Class5.cs b/src/tests/loadtest-assembly/BBB/Class5.cs
index 067c96e..848c518 100644
--- a/src/tests/loadtest-assembly/BBB/Class5.cs
+++ b/src/tests/loadtest-assembly/BBB/Class5.cs
@@ -1,3 +1,8 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using NUnit.Framework;
 
@@ -7,7 +12,7 @@ namespace NUnit.Tests.Assemblies.BBB
 	/// Summary description for Class1.
 	/// </summary>
 	[TestFixture]
-	public class Class5
+    public class Class5 : BaseClass
 	{
 		[Test]
 		public void Test1() { }
diff --git a/src/tests/loadtest-assembly/BaseClass.cs b/src/tests/loadtest-assembly/BaseClass.cs
new file mode 100644
index 0000000..a6a1597
--- /dev/null
+++ b/src/tests/loadtest-assembly/BaseClass.cs
@@ -0,0 +1,160 @@
+using System;
+using NUnit.Framework;
+
+namespace NUnit.Tests.Assemblies
+{
+    [TestFixture]
+    public class BaseClass
+    {
+        [Test]
+        public void SharedTest1() { }
+
+        [Test]
+        public void SharedTest2() { }
+
+        [Test]
+        public void SharedTest3() { }
+
+        [Test]
+        public void SharedTest4() { }
+
+        [Test]
+        public void SharedTest5() { }
+
+        [Test]
+        public void SharedTest6() { }
+
+        [Test]
+        public void SharedTest7() { }
+
+        [Test]
+        public void SharedTest8() { }
+
+        [Test]
+        public void SharedTest9() { }
+
+        [Test]
+        public void SharedTest10() { }
+
+        [Test]
+        public void SharedTest11() { }
+
+        [Test]
+        public void SharedTest12() { }
+
+        [Test]
+        public void SharedTest13() { }
+
+        [Test]
+        public void SharedTest14() { }
+
+        [Test]
+        public void SharedTest15() { }
+
+        [Test]
+        public void SharedTest16() { }
+
+        [Test]
+        public void SharedTest17() { }
+
+        [Test]
+        public void SharedTest18() { }
+
+        [Test]
+        public void SharedTest19() { }
+
+        [Test]
+        public void SharedTest20() { }
+
+        [Test]
+        public void SharedTest21() { }
+
+        [Test]
+        public void SharedTest22() { }
+
+        [Test]
+        public void SharedTest23() { }
+
+        [Test]
+        public void SharedTest24() { }
+
+        [Test]
+        public void SharedTest25() { }
+
+        [Test]
+        public void SharedTest26() { }
+
+        [Test]
+        public void SharedTest27() { }
+
+        [Test]
+        public void SharedTest28() { }
+
+        [Test]
+        public void SharedTest29() { }
+
+        [Test]
+        public void SharedTest30() { }
+
+        [Test]
+        public void SharedTest31() { }
+
+        [Test]
+        public void SharedTest32() { }
+
+        [Test]
+        public void SharedTest33() { }
+
+        [Test]
+        public void SharedTest34() { }
+
+        [Test]
+        public void SharedTest35() { }
+
+        [Test]
+        public void SharedTest36() { }
+
+        [Test]
+        public void SharedTest37() { }
+
+        [Test]
+        public void SharedTest38() { }
+
+        [Test]
+        public void SharedTest39() { }
+
+        [Test]
+        public void SharedTest40() { }
+
+        [Test]
+        public void SharedTest41() { }
+
+        [Test]
+        public void SharedTest42() { }
+
+        [Test]
+        public void SharedTest43() { }
+
+        [Test]
+        public void SharedTest44() { }
+
+        [Test]
+        public void SharedTest45() { }
+
+        [Test]
+        public void SharedTest46() { }
+
+        [Test]
+        public void SharedTest47() { }
+
+        [Test]
+        public void SharedTest48() { }
+
+        [Test]
+        public void SharedTest49() { }
+
+        [Test]
+        public void SharedTest50() { }
+
+    }
+}
diff --git a/src/tests/loadtest-assembly/CCC/Class1.cs b/src/tests/loadtest-assembly/CCC/Class1.cs
index 7a7af0b..974ddf4 100644
--- a/src/tests/loadtest-assembly/CCC/Class1.cs
+++ b/src/tests/loadtest-assembly/CCC/Class1.cs
@@ -1,3 +1,8 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using NUnit.Framework;
 
@@ -7,7 +12,7 @@ namespace NUnit.Tests.Assemblies.CCC
 	/// Summary description for Class1.
 	/// </summary>
 	[TestFixture]
-	public class Class1
+    public class Class1 : BaseClass
 	{
 		[Test]
 		public void Test1() { }
diff --git a/src/tests/loadtest-assembly/CCC/Class2.cs b/src/tests/loadtest-assembly/CCC/Class2.cs
index cad9188..8b6d202 100644
--- a/src/tests/loadtest-assembly/CCC/Class2.cs
+++ b/src/tests/loadtest-assembly/CCC/Class2.cs
@@ -1,3 +1,8 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using NUnit.Framework;
 
@@ -7,7 +12,7 @@ namespace NUnit.Tests.Assemblies.CCC
 	/// Summary description for Class1.
 	/// </summary>
 	[TestFixture]
-	public class Class2
+    public class Class2 : BaseClass
 	{
 		[Test]
 		public void Test1() { }
diff --git a/src/tests/loadtest-assembly/CCC/Class3.cs b/src/tests/loadtest-assembly/CCC/Class3.cs
index 50a6510..3d71897 100644
--- a/src/tests/loadtest-assembly/CCC/Class3.cs
+++ b/src/tests/loadtest-assembly/CCC/Class3.cs
@@ -1,3 +1,8 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using NUnit.Framework;
 
@@ -7,7 +12,7 @@ namespace NUnit.Tests.Assemblies.CCC
 	/// Summary description for Class1.
 	/// </summary>
 	[TestFixture]
-	public class Class3
+    public class Class3 : BaseClass
 	{
 		[Test]
 		public void Test1() { }
diff --git a/src/tests/loadtest-assembly/CCC/Class4.cs b/src/tests/loadtest-assembly/CCC/Class4.cs
index 3b4784b..e50073b 100644
--- a/src/tests/loadtest-assembly/CCC/Class4.cs
+++ b/src/tests/loadtest-assembly/CCC/Class4.cs
@@ -1,3 +1,8 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using NUnit.Framework;
 
@@ -7,7 +12,7 @@ namespace NUnit.Tests.Assemblies.CCC
 	/// Summary description for Class1.
 	/// </summary>
 	[TestFixture]
-	public class Class4
+    public class Class4 : BaseClass
 	{
 		[Test]
 		public void Test1() { }
diff --git a/src/tests/loadtest-assembly/CCC/Class5.cs b/src/tests/loadtest-assembly/CCC/Class5.cs
index 0c4e155..27db264 100644
--- a/src/tests/loadtest-assembly/CCC/Class5.cs
+++ b/src/tests/loadtest-assembly/CCC/Class5.cs
@@ -1,3 +1,8 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using NUnit.Framework;
 
@@ -7,7 +12,7 @@ namespace NUnit.Tests.Assemblies.CCC
 	/// Summary description for Class1.
 	/// </summary>
 	[TestFixture]
-	public class Class5
+    public class Class5 : BaseClass
 	{
 		[Test]
 		public void Test1() { }
diff --git a/src/tests/loadtest-assembly/DDD/Class1.cs b/src/tests/loadtest-assembly/DDD/Class1.cs
index b43c65a..e33d7a4 100644
--- a/src/tests/loadtest-assembly/DDD/Class1.cs
+++ b/src/tests/loadtest-assembly/DDD/Class1.cs
@@ -1,3 +1,8 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using NUnit.Framework;
 
@@ -7,7 +12,7 @@ namespace NUnit.Tests.Assemblies.DDD
 	/// Summary description for Class1.
 	/// </summary>
 	[TestFixture]
-	public class Class1
+    public class Class1 : BaseClass
 	{
 		[Test]
 		public void Test1() { }
diff --git a/src/tests/loadtest-assembly/DDD/Class2.cs b/src/tests/loadtest-assembly/DDD/Class2.cs
index 8bb2a0b..13e7697 100644
--- a/src/tests/loadtest-assembly/DDD/Class2.cs
+++ b/src/tests/loadtest-assembly/DDD/Class2.cs
@@ -1,3 +1,8 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using NUnit.Framework;
 
@@ -7,7 +12,7 @@ namespace NUnit.Tests.Assemblies.DDD
 	/// Summary description for Class1.
 	/// </summary>
 	[TestFixture]
-	public class Class2
+    public class Class2 : BaseClass
 	{
 		[Test]
 		public void Test1() { }
diff --git a/src/tests/loadtest-assembly/DDD/Class3.cs b/src/tests/loadtest-assembly/DDD/Class3.cs
index f29d1bc..2a55dca 100644
--- a/src/tests/loadtest-assembly/DDD/Class3.cs
+++ b/src/tests/loadtest-assembly/DDD/Class3.cs
@@ -1,3 +1,8 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using NUnit.Framework;
 
@@ -7,7 +12,7 @@ namespace NUnit.Tests.Assemblies.DDD
 	/// Summary description for Class1.
 	/// </summary>
 	[TestFixture]
-	public class Class3
+    public class Class3 : BaseClass
 	{
 		[Test]
 		public void Test1() { }
diff --git a/src/tests/loadtest-assembly/DDD/Class4.cs b/src/tests/loadtest-assembly/DDD/Class4.cs
index 99ff7d8..7361ba4 100644
--- a/src/tests/loadtest-assembly/DDD/Class4.cs
+++ b/src/tests/loadtest-assembly/DDD/Class4.cs
@@ -1,3 +1,8 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using NUnit.Framework;
 
@@ -7,7 +12,7 @@ namespace NUnit.Tests.Assemblies.DDD
 	/// Summary description for Class1.
 	/// </summary>
 	[TestFixture]
-	public class Class4
+    public class Class4 : BaseClass
 	{
 		[Test]
 		public void Test1() { }
diff --git a/src/tests/loadtest-assembly/DDD/Class5.cs b/src/tests/loadtest-assembly/DDD/Class5.cs
index 17949bb..26433c5 100644
--- a/src/tests/loadtest-assembly/DDD/Class5.cs
+++ b/src/tests/loadtest-assembly/DDD/Class5.cs
@@ -1,3 +1,8 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using NUnit.Framework;
 
@@ -7,7 +12,7 @@ namespace NUnit.Tests.Assemblies.DDD
 	/// Summary description for Class1.
 	/// </summary>
 	[TestFixture]
-	public class Class5
+    public class Class5 : BaseClass
 	{
 		[Test]
 		public void Test1() { }
diff --git a/src/tests/loadtest-assembly/loadtest-assembly.build b/src/tests/loadtest-assembly/loadtest-assembly.build
index 9ba3717..92f45d4 100644
--- a/src/tests/loadtest-assembly/loadtest-assembly.build
+++ b/src/tests/loadtest-assembly/loadtest-assembly.build
@@ -1,9 +1,9 @@
 <?xml version="1.0"?>
-<project name="TestAssembly" default="build" basedir=".">
+<project name="LoadTestAssembly" default="build" basedir=".">
 
   <target name="build">
     <csc target="library" 
-        output="${current.build.dir}/loadtest-assembly.dll" 
+        output="${current.test.dir}/loadtest-assembly.dll" 
         debug="${build.debug}" define="${build.defines}">
       <sources>
         <include name="**/*.cs"/>
@@ -11,7 +11,7 @@
       <nowarn>
         <warning number="618,672"/>
       </nowarn>
-      <references basedir="${current.build.dir}">
+      <references basedir="${current.framework.dir}">
         <include name="nunit.framework.dll"/>
       </references>
     </csc>
@@ -19,7 +19,11 @@
 
   <target name="package">
     <copy todir="${package.src.dir}/tests/loadtest-assembly">
-      <fileset refid="source-files" />
+      <fileset>
+        <include name="**/*.cs"/>
+        <include name="loadtest-assembly.csproj"/>
+        <include name="loadtest-assembly.build"/>
+      </fileset>
     </copy>
   </target>
 
diff --git a/src/tests/loadtest-assembly/loadtest-assembly.csproj b/src/tests/loadtest-assembly/loadtest-assembly.csproj
index f05f32a..45f23fb 100644
--- a/src/tests/loadtest-assembly/loadtest-assembly.csproj
+++ b/src/tests/loadtest-assembly/loadtest-assembly.csproj
@@ -1,185 +1,86 @@
-<VisualStudioProject>
-    <CSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{34734263-6F6C-403D-AD8C-CE3F8E340EA9}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = ""
-                AssemblyKeyContainerName = ""
-                AssemblyName = "loadtest-assembly"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "Library"
-                PreBuildEvent = ""
-                PostBuildEvent = ""
-                RootNamespace = "NUnit.Tests.TimingTests"
-                RunPostBuildEvent = "OnBuildSuccess"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "true"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-                <Config
-                    Name = "Release"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "false"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "nunit.framework.dll"
-                    Project = "{83DD7E12-A705-4DBA-9D71-09C8973D9382}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-            </References>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "AssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "AAA\Class1.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "AAA\Class2.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "AAA\Class3.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "AAA\Class4.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "AAA\Class5.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "BBB\Class1.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "BBB\Class2.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "BBB\Class3.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "BBB\Class4.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "BBB\Class5.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CCC\Class1.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CCC\Class2.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CCC\Class3.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CCC\Class4.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CCC\Class5.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "DDD\Class1.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "DDD\Class2.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "DDD\Class3.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "DDD\Class4.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "DDD\Class5.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-            </Include>
-        </Files>
-    </CSHARP>
-</VisualStudioProject>
-
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{20ABDB3C-EA46-468A-A574-0552299A32DB}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>loadtest_assembly</RootNamespace>
+    <AssemblyName>loadtest-assembly</AssemblyName>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\bin\Release\tests\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AAA\Class1.cs" />
+    <Compile Include="AAA\Class2.cs" />
+    <Compile Include="AAA\Class3.cs" />
+    <Compile Include="AAA\Class4.cs" />
+    <Compile Include="AAA\Class5.cs" />
+    <Compile Include="BaseClass.cs" />
+    <Compile Include="BBB\Class1.cs" />
+    <Compile Include="BBB\Class2.cs" />
+    <Compile Include="BBB\Class3.cs" />
+    <Compile Include="BBB\Class4.cs" />
+    <Compile Include="BBB\Class5.cs" />
+    <Compile Include="CCC\Class1.cs" />
+    <Compile Include="CCC\Class2.cs" />
+    <Compile Include="CCC\Class3.cs" />
+    <Compile Include="CCC\Class4.cs" />
+    <Compile Include="CCC\Class5.cs" />
+    <Compile Include="DDD\Class1.cs" />
+    <Compile Include="DDD\Class2.cs" />
+    <Compile Include="DDD\Class3.cs" />
+    <Compile Include="DDD\Class4.cs" />
+    <Compile Include="DDD\Class5.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
+      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
+      <Name>nunit.framework.dll</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="loadtest-assembly.build" />
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="Properties\" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
diff --git a/src/tests/loadtest-assembly/loadtest-assembly_VS2005.csproj b/src/tests/loadtest-assembly/loadtest-assembly_VS2005.csproj
deleted file mode 100644
index c606751..0000000
--- a/src/tests/loadtest-assembly/loadtest-assembly_VS2005.csproj
+++ /dev/null
@@ -1,138 +0,0 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>8.0.50727</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{34734263-6F6C-403D-AD8C-CE3F8E340EA9}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ApplicationIcon>
-    </ApplicationIcon>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>loadtest-assembly</AssemblyName>
-    <AssemblyOriginatorKeyFile>
-    </AssemblyOriginatorKeyFile>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.Tests.Assemblies</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <StartupObject>
-    </StartupObject>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug2005|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\Debug2005\</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <DebugType>full</DebugType>
-    <PlatformTarget>AnyCPU</PlatformTarget>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release2005|AnyCPU' ">
-    <OutputPath>bin\Release2005\</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <Optimize>true</Optimize>
-    <DebugType>
-    </DebugType>
-    <PlatformTarget>AnyCPU</PlatformTarget>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.XML">
-      <Name>System.XML</Name>
-    </Reference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="AAA\Class1.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="AAA\Class2.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="AAA\Class3.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="AAA\Class4.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="AAA\Class5.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="AssemblyInfo.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="BBB\Class1.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="BBB\Class2.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="BBB\Class3.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="BBB\Class4.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="BBB\Class5.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="CCC\Class1.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="CCC\Class2.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="CCC\Class3.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="CCC\Class4.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="CCC\Class5.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="DDD\Class1.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="DDD\Class2.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="DDD\Class3.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="DDD\Class4.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="DDD\Class5.cs">
-      <SubType>Code</SubType>
-    </Compile>
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll_VS2005.csproj">
-      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
-      <Name>nunit.framework.dll_VS2005</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
-</Project>
\ No newline at end of file
diff --git a/src/tests/mock-assembly/MockAssembly.cs b/src/tests/mock-assembly/MockAssembly.cs
index 1351fe0..24c147c 100644
--- a/src/tests/mock-assembly/MockAssembly.cs
+++ b/src/tests/mock-assembly/MockAssembly.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 using System;
 using NUnit.Framework;
@@ -16,58 +16,53 @@ namespace NUnit.Tests
 		/// </summary>
 		public class MockAssembly
 		{
-			public static int Fixtures = 5; 
+#if NET_2_0
+            public static int Classes = 9;
+#else
+            public static int Classes = 8;
+#endif
+            public static int NamespaceSuites = 6; // assembly, NUnit, Tests, Assemblies, Singletons, TestAssembly
 
-			public static int NamespaceSuites = 6; // assembly, NUnit, Tests, Assemblies, Singletons, TestAssembly
-
-			public static int Suites = Fixtures + NamespaceSuites;
-
-			public static int ExplicitFixtures = 1;
-
-			public static int Tests
-			{
-				get 
-				{ 
-					return MockTestFixture.Tests 
+			public static int Tests = MockTestFixture.Tests 
 						+ Singletons.OneTestCase.Tests 
 						+ TestAssembly.MockTestFixture.Tests 
 						+ IgnoredFixture.Tests
-						+ ExplicitFixture.Tests;
-				}
-			}
-
-			public static int Ignored
-			{
-				get { return MockTestFixture.Ignored + IgnoredFixture.Tests; }
-			}
+						+ ExplicitFixture.Tests
+						+ BadFixture.Tests
+						+ FixtureWithTestCases.Tests
+						+ ParameterizedFixture.Tests
+						+ GenericFixtureConstants.Tests;
+			
+            public static int Suites = MockTestFixture.Suites 
+						+ Singletons.OneTestCase.Suites
+						+ TestAssembly.MockTestFixture.Suites 
+						+ IgnoredFixture.Suites
+						+ ExplicitFixture.Suites
+						+ BadFixture.Suites
+						+ FixtureWithTestCases.Suites
+						+ ParameterizedFixture.Suites
+						+ GenericFixtureConstants.Suites
+						+ NamespaceSuites;
+			
+			public static readonly int Nodes = Tests + Suites;
+			
+			public static int ExplicitFixtures = 1;
+			public static int SuitesRun = Suites - ExplicitFixtures;
 
-			public static int Explicit
-			{
-				get { return MockTestFixture.Explicit + ExplicitFixture.Tests; }
-			}
+			public static int Ignored = MockTestFixture.Ignored + IgnoredFixture.Tests;
+			public static int Explicit = MockTestFixture.Explicit + ExplicitFixture.Tests;
+			public static int NotRunnable = MockTestFixture.NotRunnable + BadFixture.Tests;
+			public static int NotRun = Ignored + Explicit + NotRunnable;
+		    public static int TestsRun = Tests - NotRun;
+			public static int ResultCount = Tests - Explicit;
 
-			public static int NotRun
-			{
-				get { return Ignored + Explicit; }
-			}
+			public static int Errors = MockTestFixture.Errors;
+            public static int Failures = MockTestFixture.Failures;
+			public static int ErrorsAndFailures = Errors + Failures;
 
-			public static int Nodes
-			{
-				get 
-				{ 
-					return MockTestFixture.Nodes 
-						+ Singletons.OneTestCase.Nodes
-						+ TestAssembly.MockTestFixture.Nodes 
-						+ IgnoredFixture.Nodes
-						+ ExplicitFixture.Nodes
-						+ 6;  // assembly, NUnit, Tests, Assemblies, Singletons, TestAssembly 
-				}
-			}
+			public static int Categories = MockTestFixture.Categories;
 
-			public static int Categories
-			{
-				get { return MockTestFixture.Categories; }
-			}
+            public static string AssemblyPath = AssemblyHelper.GetAssemblyPath(typeof(MockAssembly));
 		}
 
 		public class MockSuite
@@ -86,12 +81,22 @@ namespace NUnit.Tests
 		[Category("FixtureCategory")]
 		public class MockTestFixture
 		{
-			public static readonly int Tests = 7;
-			public static readonly int Ignored = 2;
+			public static readonly int Tests = 11;
+			public static readonly int Suites = 1;
+
+			public static readonly int Ignored = 1;
 			public static readonly int Explicit = 1;
-			public static readonly int NotRun = Ignored + Explicit;
-			public static readonly int Nodes = Tests + 1;
+			public static readonly int NotRunnable = 2;
+			public static readonly int NotRun = Ignored + Explicit + NotRunnable;
+		    public static readonly int TestsRun = Tests - NotRun;
+			public static readonly int ResultCount = Tests - Explicit;
+
+            public static readonly int Failures = 1;
+            public static readonly int Errors = 1;
+			public static readonly int ErrorsAndFailures = Errors + Failures;
+
 			public static readonly int Categories = 5;
+		    public static readonly int MockCategoryTests = 2;
 
 			[Test(Description="Mock Test #1")]
 			public void MockTest1()
@@ -100,20 +105,27 @@ namespace NUnit.Tests
 			[Test]
 			[Category("MockCategory")]
 			[Property("Severity","Critical")]
-			public void MockTest2()
+            [Description("This is a really, really, really, really, really, really, really, really, really, really, really, really, really, really, really, really, really, really, really, really, really, really, really, really, really long description")]
+            public void MockTest2()
 			{}
 
 			[Test]
 			[Category("MockCategory")]
 			[Category("AnotherCategory")]
 			public void MockTest3()
-			{}
+            { Assert.Pass("Succeeded!"); }
 
-			[Test]
-			protected void MockTest5()
-			{}
+            [Test]
+            protected static void MockTest5()
+            {}
+
+            [Test]
+            public void FailingTest()
+            {
+                Assert.Fail("Intentional failure");
+            }
 
-			[Test, Property("TargetMethod", "SomeClassName"), Property("Size", 5), Property("TargetType", typeof( System.Threading.Thread ))]
+		    [Test, Property("TargetMethod", "SomeClassName"), Property("Size", 5), /*Property("TargetType", typeof( System.Threading.Thread ))*/]
 			public void TestWithManyProperties()
 			{}
 
@@ -127,6 +139,28 @@ namespace NUnit.Tests
 			[Category( "Special" )]
 			public void ExplicitlyRunTest()
 			{}
+
+			[Test]
+			public void NotRunnableTest( int a, int b)
+			{
+			}
+
+            [Test]
+            public void InconclusiveTest()
+            {
+                Assert.Inconclusive("No valid data");
+            }
+
+            [Test]
+            public void TestWithException()
+            {
+                MethodThrowsException();
+            }
+
+            private void MethodThrowsException()
+            {
+                throw new ApplicationException("Intentional Exception");
+            }
 		}
 	}
 
@@ -136,7 +170,7 @@ namespace NUnit.Tests
 		public class OneTestCase
 		{
 			public static readonly int Tests = 1;
-			public static readonly int Nodes = Tests + 1;
+			public static readonly int Suites = 1;		
 
 			[Test]
 			public virtual void TestCase() 
@@ -149,8 +183,8 @@ namespace NUnit.Tests
 		[TestFixture]
 		public class MockTestFixture
 		{
-			public static int Tests = 1;
-			public static int Nodes = Tests + 1;
+			public static readonly int Tests = 1;
+			public static readonly int Suites = 1;
 
 			[Test]
 			public void MyTest()
@@ -162,8 +196,8 @@ namespace NUnit.Tests
 	[TestFixture, Ignore]
 	public class IgnoredFixture
 	{
-		public static int Tests = 3;
-		public static int Nodes = Tests + 1;
+		public static readonly int Tests = 3;
+		public static readonly int Suites = 1;
 
 		[Test]
 		public void Test1() { }
@@ -178,8 +212,9 @@ namespace NUnit.Tests
 	[TestFixture,Explicit]
 	public class ExplicitFixture
 	{
-		public static int Tests = 2;
-		public static int Nodes = Tests + 1;
+		public static readonly int Tests = 2;
+		public static readonly int Suites = 1;
+        public static readonly int Nodes = Tests + Suites;
 
 		[Test]
 		public void Test1() { }
@@ -187,4 +222,85 @@ namespace NUnit.Tests
 		[Test]
 		public void Test2() { }
 	}
+
+	[TestFixture]
+	public class BadFixture
+	{
+		public static readonly int Tests = 1;
+		public static readonly int Suites = 1;
+
+		public BadFixture(int val) { }
+
+		[Test]
+		public void SomeTest() { }
+	}
+	
+	[TestFixture]
+	public class FixtureWithTestCases
+	{
+#if NET_2_0
+		public static readonly int Tests = 4;
+		public static readonly int Suites = 3;
+#else
+		public static readonly int Tests = 2;
+		public static readonly int Suites = 2;
+#endif
+		
+		[TestCase(2, 2, Result=4)]
+		[TestCase(9, 11, Result=20)]
+		public int MethodWithParameters(int x, int y)
+		{
+			return x+y;
+		}
+
+#if NET_2_0
+		[TestCase(2, 4)]
+		[TestCase(9.2, 11.7)]
+		public void GenericMethod<T>(T x, T y)
+		{
+		}
+#endif
+	}
+	
+	[TestFixture(5)]
+	[TestFixture(42)]
+	public class ParameterizedFixture
+	{
+		public static readonly int Tests = 4;
+		public static readonly int Suites = 3;
+
+		public ParameterizedFixture(int num) { }
+		
+		[Test]
+		public void Test1() { }
+		
+		[Test]
+		public void Test2() { }
+	}
+	
+	public class GenericFixtureConstants
+	{
+#if NET_2_0
+		public static readonly int Tests = 4;
+		public static readonly int Suites = 3;
+#else
+        public static readonly int Tests = 0;
+        public static readonly int Suites = 0;
+#endif
+	}
+		
+#if NET_2_0
+	[TestFixture(5)]
+	[TestFixture(11.5)]
+	public class GenericFixture<T>
+	{
+		public GenericFixture(T num){ }
+		
+		[Test]
+		public void Test1() { }
+		
+		[Test]
+		public void Test2() { }
+	}
+#endif
 }
diff --git a/src/tests/mock-assembly/mock-assembly.build b/src/tests/mock-assembly/mock-assembly.build
index 79bebbf..7ec6c1e 100644
--- a/src/tests/mock-assembly/mock-assembly.build
+++ b/src/tests/mock-assembly/mock-assembly.build
@@ -3,23 +3,27 @@
 
   <target name="build">
     <csc target="library" 
-      output="${current.build.dir}/mock-assembly.dll" 
+      output="${current.test.dir}/mock-assembly.dll" 
       debug="${build.debug}" define="${build.defines}">
       <sources>
         <include name="MockAssembly.cs"/>
-        <include name="../../CommonAssemblyInfo.cs"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
       </sources>
-      <references basedir="${current.build.dir}">
-        <include name="nunit.framework.dll"/>
-        <include name="nunit.core.interfaces.dll"/>
-        <include name="nunit.core.dll"/>
+      <references>
+        <include name="${current.framework.dir}/nunit.framework.dll"/>
+        <include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
+        <include name="${current.lib.dir}/nunit.core.dll"/>
       </references>
     </csc>
   </target>
 
   <target name="package">
     <copy todir="${package.src.dir}/tests/mock-assembly">
-      <fileset refid="source-files" />
+      <fileset>
+        <include name="MockAssembly.cs"/>
+        <include name="mock-assembly.csproj"/>
+        <include name="mock-assembly.build"/>
+      </fileset>
     </copy>
   </target>
 
diff --git a/src/tests/mock-assembly/mock-assembly.csproj b/src/tests/mock-assembly/mock-assembly.csproj
index 4748015..7a3788f 100644
--- a/src/tests/mock-assembly/mock-assembly.csproj
+++ b/src/tests/mock-assembly/mock-assembly.csproj
@@ -1,116 +1,102 @@
-<VisualStudioProject>
-    <CSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{2E368281-3BA8-4050-B05E-0E0E43F8F446}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = ""
-                AssemblyKeyContainerName = ""
-                AssemblyName = "mock-assembly"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "Library"
-                PreBuildEvent = ""
-                PostBuildEvent = ""
-                RootNamespace = "NUnit.Tests"
-                RunPostBuildEvent = "OnBuildSuccess"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "true"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "true"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-                <Config
-                    Name = "Release"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "false"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "System"
-                    AssemblyName = "System"
-                    HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll"
-                />
-                <Reference
-                    Name = "System.Data"
-                    AssemblyName = "System.Data"
-                    HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll"
-                />
-                <Reference
-                    Name = "System.XML"
-                    AssemblyName = "System.Xml"
-                    HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll"
-                />
-                <Reference
-                    Name = "nunit.framework.dll"
-                    Project = "{83DD7E12-A705-4DBA-9D71-09C8973D9382}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.core.dll"
-                    Project = "{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.core.interfaces.dll"
-                    Project = "{435428F8-5995-4CE4-8022-93D595A8CC0F}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-            </References>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "CommonAssemblyInfo.cs"
-                    Link = "..\..\CommonAssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "MockAssembly.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-            </Include>
-        </Files>
-    </CSHARP>
-</VisualStudioProject>
-
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{2E368281-3BA8-4050-B05E-0E0E43F8F446}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>mock-assembly</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.Tests</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG;NET_2_0</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
+      <Name>nunit.core.dll</Name>
+      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
+      <Name>nunit.core.interfaces.dll</Name>
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
+      <Name>nunit.framework.dll</Name>
+      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="MockAssembly.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="mock-assembly.build" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/tests/mock-assembly/mock-assembly.dll.config b/src/tests/mock-assembly/mock-assembly.dll.config
deleted file mode 100644
index 6d29ecf..0000000
--- a/src/tests/mock-assembly/mock-assembly.dll.config
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?> 
-<configuration>
-
-   <!--
-    The following <runtime> section allows running the mock-assembyly tests
-    under .NET 1.0 by redirecting assemblies. The appliesTo attribute
-    causes the section to be ignored except under .NET 1.0.
-    
-    This section is
-   --> 
- <runtime>
-   
-    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
-			appliesTo="v1.0.3705">
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Data" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Drawing" 
-                          publicKeyToken="b03f5f7f11d50a3a" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Windows.Forms" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Xml" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture=""/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-    </assemblyBinding>
-  
-  </runtime>
-
-</configuration>
\ No newline at end of file
diff --git a/src/tests/mock-assembly/mock-assembly_VS2005.csproj b/src/tests/mock-assembly/mock-assembly_VS2005.csproj
deleted file mode 100644
index 7d996b7..0000000
--- a/src/tests/mock-assembly/mock-assembly_VS2005.csproj
+++ /dev/null
@@ -1,82 +0,0 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>8.0.50727</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{2E368281-3BA8-4050-B05E-0E0E43F8F446}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ApplicationIcon>
-    </ApplicationIcon>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>mock-assembly</AssemblyName>
-    <AssemblyOriginatorKeyFile>
-    </AssemblyOriginatorKeyFile>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.Tests</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <StartupObject>
-    </StartupObject>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release2005|AnyCPU' ">
-    <OutputPath>bin\Release2005\</OutputPath>
-    <DefineConstants>TRACE;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <Optimize>true</Optimize>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug2005|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\Debug2005\</OutputPath>
-    <DefineConstants>TRACE;DEBUG;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="MockAssembly.cs">
-      <SubType>Code</SubType>
-    </Compile>
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll_VS2005.csproj">
-      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
-      <Name>nunit.core.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll_VS2005.csproj">
-      <Project>{DCC88998-255A-4247-B658-71DD932E9873}</Project>
-      <Name>nunit.core.interfaces.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll_VS2005.csproj">
-      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
-      <Name>nunit.framework.dll_VS2005</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
-</Project>
\ No newline at end of file
diff --git a/src/tests/nonamespace-assembly/NoNamespaceTestFixture.cs b/src/tests/nonamespace-assembly/NoNamespaceTestFixture.cs
index c53ea45..d16c8b4 100644
--- a/src/tests/nonamespace-assembly/NoNamespaceTestFixture.cs
+++ b/src/tests/nonamespace-assembly/NoNamespaceTestFixture.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using NUnit.Framework;
@@ -11,6 +11,8 @@ public class NoNamespaceTestFixture
 {
 	public static readonly int Tests = 3;
 
+    public static readonly string AssemblyPath = NUnit.Core.AssemblyHelper.GetAssemblyPath(typeof(NoNamespaceTestFixture));
+
 	[Test]
 	public void Test1()
 	{
diff --git a/src/tests/nonamespace-assembly/nonamespace-assembly.build b/src/tests/nonamespace-assembly/nonamespace-assembly.build
index 6c5128d..2be92ca 100644
--- a/src/tests/nonamespace-assembly/nonamespace-assembly.build
+++ b/src/tests/nonamespace-assembly/nonamespace-assembly.build
@@ -3,21 +3,26 @@
 
   <target name="build">
     <csc target="library" 
-       output="${current.build.dir}/nonamespace-assembly.dll" 
+       output="${current.test.dir}/nonamespace-assembly.dll" 
        debug="${build.debug}" define="${build.defines}">
       <sources>
         <include name="NoNamespaceTestFixture.cs"/>
-        <include name="../../CommonAssemblyInfo.cs"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
       </sources>
       <references>
-        <include name="${current.build.dir}/nunit.framework.dll"/>
+        <include name="${current.framework.dir}/nunit.framework.dll"/>
+        <include name="${current.lib.dir}/nunit.core.dll"/>
       </references>
     </csc>
   </target>
 
   <target name="package">
     <copy todir="${package.src.dir}/tests/nonamespace-assembly">
-      <fileset refid="source-files" />
+      <fileset>
+        <include name="NoNamespaceTestFixture.cs"/>
+        <include name="nonamespace-assembly.csproj"/>
+        <include name="nonamespace-assembly.build"/>
+      </fileset>
     </copy>
   </target>
 
diff --git a/src/tests/nonamespace-assembly/nonamespace-assembly.csproj b/src/tests/nonamespace-assembly/nonamespace-assembly.csproj
index e6398dd..d79a0be 100644
--- a/src/tests/nonamespace-assembly/nonamespace-assembly.csproj
+++ b/src/tests/nonamespace-assembly/nonamespace-assembly.csproj
@@ -1,106 +1,96 @@
-<VisualStudioProject>
-    <CSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = ""
-                AssemblyKeyContainerName = ""
-                AssemblyName = "nonamespace-assembly"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "Library"
-                PreBuildEvent = ""
-                PostBuildEvent = ""
-                RootNamespace = "nonamespace_assembly"
-                RunPostBuildEvent = "OnBuildSuccess"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "true"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "true"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-                <Config
-                    Name = "Release"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "false"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "System"
-                    AssemblyName = "System"
-                    HintPath = "E:\WINNT\Microsoft.NET\Framework\v1.0.3705\System.dll"
-                />
-                <Reference
-                    Name = "System.Data"
-                    AssemblyName = "System.Data"
-                    HintPath = "E:\WINNT\Microsoft.NET\Framework\v1.0.3705\System.Data.dll"
-                />
-                <Reference
-                    Name = "System.XML"
-                    AssemblyName = "System.Xml"
-                    HintPath = "E:\WINNT\Microsoft.NET\Framework\v1.0.3705\System.XML.dll"
-                />
-                <Reference
-                    Name = "nunit.framework.dll"
-                    Project = "{83DD7E12-A705-4DBA-9D71-09C8973D9382}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-            </References>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "CommonAssemblyInfo.cs"
-                    Link = "..\..\CommonAssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "NoNamespaceTestFixture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-            </Include>
-        </Files>
-    </CSHARP>
-</VisualStudioProject>
-
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nonamespace-assembly</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>nonamespace_assembly</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
+      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
+      <Name>nunit.core.dll</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
+      <Name>nunit.framework.dll</Name>
+      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="NoNamespaceTestFixture.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nonamespace-assembly.build" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/tests/nonamespace-assembly/nonamespace-assembly_VS2005.csproj b/src/tests/nonamespace-assembly/nonamespace-assembly_VS2005.csproj
deleted file mode 100644
index 1efa264..0000000
--- a/src/tests/nonamespace-assembly/nonamespace-assembly_VS2005.csproj
+++ /dev/null
@@ -1,74 +0,0 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>8.0.50727</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ApplicationIcon>
-    </ApplicationIcon>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nonamespace-assembly</AssemblyName>
-    <AssemblyOriginatorKeyFile>
-    </AssemblyOriginatorKeyFile>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>nonamespace_assembly</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <StartupObject>
-    </StartupObject>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release2005|AnyCPU' ">
-    <OutputPath>bin\Release2005\</OutputPath>
-    <DefineConstants>TRACE;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <Optimize>true</Optimize>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug2005|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\Debug2005\</OutputPath>
-    <DefineConstants>TRACE;DEBUG;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="NoNamespaceTestFixture.cs">
-      <SubType>Code</SubType>
-    </Compile>
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll_VS2005.csproj">
-      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
-      <Name>nunit.framework.dll_VS2005</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
-</Project>
\ No newline at end of file
diff --git a/src/tests/notestfixtures-assembly/Class1.cs b/src/tests/notestfixtures-assembly/Class1.cs
deleted file mode 100644
index e65bcab..0000000
--- a/src/tests/notestfixtures-assembly/Class1.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-namespace NUnit.Tests.Assemblies
-{
-	/// <summary>
-	/// Summary description for Class1.
-	/// </summary>
-	public class Class1
-	{
-		public Class1()
-		{
-			//
-			// TODO: Add constructor logic here
-			//
-		}
-
-		public void NonTestMethod()
-		{
-		}
-
-		private void AnotherMethod()
-		{
-		}
-	}
-}
diff --git a/src/tests/notestfixtures-assembly/notestfixtures-assembly.build b/src/tests/notestfixtures-assembly/notestfixtures-assembly.build
deleted file mode 100644
index 338dea2..0000000
--- a/src/tests/notestfixtures-assembly/notestfixtures-assembly.build
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0"?>
-<project name="NoTestFixturesAssembly" default="build" basedir=".">
-
-  <target name="build">
-    <csc target="library" 
-       output="${current.build.dir}/notestfixtures-assembly.dll"
-       debug="${build.debug}" define="${build.defines}">
-      <sources>
-        <include name="Class1.cs"/>
-        <include name="../../CommonAssemblyInfo.cs"/>
-      </sources>
-    </csc>
-  </target>
-
-  <target name="package">
-    <copy todir="${package.src.dir}/tests/notestfixtures-assembly">
-      <fileset refid="source-files" />
-    </copy>
-  </target>
-
-</project>
\ No newline at end of file
diff --git a/src/tests/notestfixtures-assembly/notestfixtures-assembly.csproj b/src/tests/notestfixtures-assembly/notestfixtures-assembly.csproj
deleted file mode 100644
index 4c021a3..0000000
--- a/src/tests/notestfixtures-assembly/notestfixtures-assembly.csproj
+++ /dev/null
@@ -1,85 +0,0 @@
-<VisualStudioProject>
-    <CSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{8D330DE4-B980-4A57-9F07-E9F7A7A33F4F}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = ""
-                AssemblyKeyContainerName = ""
-                AssemblyName = "notestfixtures-assembly"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "Library"
-                PreBuildEvent = ""
-                PostBuildEvent = ""
-                RootNamespace = "notestfixtures_assembly"
-                RunPostBuildEvent = "OnBuildSuccess"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "true"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-                <Config
-                    Name = "Release"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "false"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-            </Settings>
-            <References/>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "Class1.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CommonAssemblyInfo.cs"
-                    Link = "..\..\CommonAssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-            </Include>
-        </Files>
-    </CSHARP>
-</VisualStudioProject>
-
diff --git a/src/tests/notestfixtures-assembly/notestfixtures-assembly_VS2005.csproj b/src/tests/notestfixtures-assembly/notestfixtures-assembly_VS2005.csproj
deleted file mode 100644
index 3c6e82c..0000000
--- a/src/tests/notestfixtures-assembly/notestfixtures-assembly_VS2005.csproj
+++ /dev/null
@@ -1,57 +0,0 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>8.0.50727</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{8D330DE4-B980-4A57-9F07-E9F7A7A33F4F}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ApplicationIcon>
-    </ApplicationIcon>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>notestfixtures-assembly</AssemblyName>
-    <AssemblyOriginatorKeyFile>
-    </AssemblyOriginatorKeyFile>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>notestfixtures_assembly</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <StartupObject>
-    </StartupObject>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release2005|AnyCPU' ">
-    <OutputPath>bin\Release2005\</OutputPath>
-    <DefineConstants>TRACE;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <Optimize>true</Optimize>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug2005|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\Debug2005\</OutputPath>
-    <DefineConstants>TRACE;DEBUG;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-  </PropertyGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="Class1.cs">
-      <SubType>Code</SubType>
-    </Compile>
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
-</Project>
\ No newline at end of file
diff --git a/src/tests/test-assembly/AttributeDescriptionTests.cs b/src/tests/test-assembly/AttributeDescriptionTests.cs
index fe4cac6..e7153e1 100644
--- a/src/tests/test-assembly/AttributeDescriptionTests.cs
+++ b/src/tests/test-assembly/AttributeDescriptionTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/tests/test-assembly/AttributeInheritance.cs b/src/tests/test-assembly/AttributeInheritance.cs
index 3838075..ceabbbe 100644
--- a/src/tests/test-assembly/AttributeInheritance.cs
+++ b/src/tests/test-assembly/AttributeInheritance.cs
@@ -1,3 +1,8 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using NUnit.Framework;
 
@@ -8,7 +13,7 @@ namespace NUnit.TestData
 	[AttributeUsage(AttributeTargets.Class, AllowMultiple=false)]
 	class ConcernAttribute : TestFixtureAttribute
 	{
-		private Type typeOfConcern;
+		public Type typeOfConcern;
 
 		public ConcernAttribute( Type typeOfConcern )
 		{
@@ -32,4 +37,25 @@ namespace NUnit.TestData
 		{
 		}
 	}
+
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
+    class NYIAttribute : IgnoreAttribute
+    {
+        public NYIAttribute() : base("Not yet implemented") { }
+    }
+
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
+    class WorkInProcessAttribute : ExplicitAttribute
+    {
+        public WorkInProcessAttribute() : base("Work in progress") { }
+    }
+
+    public class AttributeInheritanceFixture
+    {
+        [Test, WorkInProcess]
+        public void ShouldBeExplicit() { }
+
+        [Test, NYI]
+        public void ShouldBeIgnored() { }
+    }
 }
diff --git a/src/tests/test-assembly/CategoryAttributeTests.cs b/src/tests/test-assembly/CategoryAttributeTests.cs
index 643919c..e9c070c 100644
--- a/src/tests/test-assembly/CategoryAttributeTests.cs
+++ b/src/tests/test-assembly/CategoryAttributeTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -9,8 +9,11 @@ using NUnit.Framework;
 
 namespace NUnit.TestData.CategoryAttributeTests
 {
+	[TestFixture, InheritableCategory("MyCategory")]
+	public abstract class AbstractBase { }
+	
 	[TestFixture, Category( "DataBase" )]
-	public class FixtureWithCategories
+	public class FixtureWithCategories : AbstractBase
 	{
 		[Test, Category("Long")]
 		public void Test1() { }
@@ -18,7 +21,13 @@ namespace NUnit.TestData.CategoryAttributeTests
 		[Test, Critical]
 		public void Test2() { }
 	}
-
-	[AttributeUsage(AttributeTargets.Method, AllowMultiple=false)]
+	
+	[AttributeUsage(AttributeTargets.Method, AllowMultiple=false, Inherited=false)]
 	public class CriticalAttribute : CategoryAttribute { }
+	
+	[AttributeUsage(AttributeTargets.Class, AllowMultiple=true, Inherited=true)]
+	public class InheritableCategoryAttribute : CategoryAttribute
+	{ 
+		public InheritableCategoryAttribute(string name) : base(name) { }
+	}
 }
\ No newline at end of file
diff --git a/src/tests/test-assembly/ConsoleRunnerTest.cs b/src/tests/test-assembly/ConsoleRunnerTest.cs
index 6111230..e7a63fa 100644
--- a/src/tests/test-assembly/ConsoleRunnerTest.cs
+++ b/src/tests/test-assembly/ConsoleRunnerTest.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/tests/test-assembly/CultureAttributeTests.cs b/src/tests/test-assembly/CultureAttributeTests.cs
index 373c0f6..66b7060 100644
--- a/src/tests/test-assembly/CultureAttributeTests.cs
+++ b/src/tests/test-assembly/CultureAttributeTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/tests/test-assembly/DatapointFixture.cs b/src/tests/test-assembly/DatapointFixture.cs
new file mode 100644
index 0000000..b387106
--- /dev/null
+++ b/src/tests/test-assembly/DatapointFixture.cs
@@ -0,0 +1,90 @@
+using System;
+using NUnit.Framework;
+#if NET_2_0
+using System.Collections.Generic;
+#endif
+
+namespace NUnit.TestData.DatapointFixture
+{
+    public abstract class SquareRootTest
+    {
+        [Theory]
+        public void SqrtTimesItselfGivesOriginal(double num)
+        {
+            Assume.That(num >= 0.0 && num < double.MaxValue);
+
+            double sqrt = Math.Sqrt(num);
+
+            Assert.That(sqrt >= 0.0);
+            Assert.That(sqrt * sqrt, Is.EqualTo(num).Within(0.000001));
+        }
+    }
+
+    public class SquareRootTest_Field_Double : SquareRootTest
+    {
+        [Datapoint]
+        public double zero = 0;
+
+        [Datapoint]
+        public double positive = 1;
+
+        [Datapoint]
+        public double negative = -1;
+
+        [Datapoint]
+        public double max = double.MaxValue;
+
+        [Datapoint]
+        public double infinity = double.PositiveInfinity;
+    }
+
+    public class SquareRootTest_Field_ArrayOfDouble : SquareRootTest
+    {
+        [Datapoints]
+        public double[] values = new double[] { 0.0, 1.0, -1.0, double.MaxValue, double.PositiveInfinity };
+    }
+
+#if NET_2_0 && CS_3_0
+    public class SquareRootTest_Field_IEnumerableOfDouble : SquareRootTest
+    {
+        [Datapoints]
+        public IEnumerable<double> values = new List<double> { 0.0, 1.0, -1.0, double.MaxValue, double.PositiveInfinity };
+    }
+
+    public class SquareRootTest_Property_IEnumerableOfDouble : SquareRootTest
+    {
+        [Datapoints]
+        public IEnumerable<double> Values
+        {
+            get { return new List<double> { 0.0, 1.0, -1.0, double.MaxValue, double.PositiveInfinity }; }
+        }
+    }
+
+    public class SquareRootTest_Method_IEnumerableOfDouble : SquareRootTest
+    {
+        [Datapoints]
+        public IEnumerable<double> GetValues()
+        {
+            return new List<double> { 0.0, 1.0, -1.0, double.MaxValue, double.PositiveInfinity };
+        }
+    }
+#endif
+
+    public class SquareRootTest_Property_ArrayOfDouble : SquareRootTest
+    {
+        [Datapoints]
+        public double[] Values
+        {
+            get { return new double[] { 0.0, 1.0, -1.0, double.MaxValue, double.PositiveInfinity }; }
+        }
+    }
+
+    public class SquareRootTest_Method_ArrayOfDouble : SquareRootTest
+    {
+        [Datapoints]
+        public double[] GetValues()
+        {
+            return new double[] { 0.0, 1.0, -1.0, double.MaxValue, double.PositiveInfinity };
+        }
+    }
+}
diff --git a/src/tests/test-assembly/DirectoryChangeFixture.cs b/src/tests/test-assembly/DirectoryChangeFixture.cs
new file mode 100644
index 0000000..20a3f35
--- /dev/null
+++ b/src/tests/test-assembly/DirectoryChangeFixture.cs
@@ -0,0 +1,22 @@
+// ****************************************************************
+// Copyright 2010, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.IO;
+using NUnit.Framework;
+
+namespace NUnit.TestData
+{
+	public class DirectoryChangeFixture
+	{
+		[Test]
+		public void ChangeCurrentDirectory()
+		{
+			Environment.CurrentDirectory = Path.GetTempPath();
+		}
+	}
+}
+
diff --git a/src/tests/test-assembly/ExpectExceptionTest.cs b/src/tests/test-assembly/ExpectExceptionTest.cs
index fb9c330..cb841de 100644
--- a/src/tests/test-assembly/ExpectExceptionTest.cs
+++ b/src/tests/test-assembly/ExpectExceptionTest.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -34,14 +34,21 @@ namespace NUnit.TestData.ExpectExceptionTest
 	[TestFixture]
 	public class MismatchedException
 	{
-		[Test]
-		[ExpectedException(typeof(ArgumentException))]
-		public void MismatchedExceptionType()
-		{
-			throw new ArgumentOutOfRangeException();
-		}
-
-		[Test]
+        [Test]
+        [ExpectedException(typeof(ArgumentException))]
+        public void MismatchedExceptionType()
+        {
+            throw new ArgumentOutOfRangeException();
+        }
+
+        [Test]
+        [ExpectedException(ExpectedException=typeof(ArgumentException))]
+        public void MismatchedExceptionTypeAsNamedParameter()
+        {
+            throw new ArgumentOutOfRangeException();
+        }
+
+        [Test]
 		[ExpectedException(typeof(ArgumentException), UserMessage="custom message")]
 		public void MismatchedExceptionTypeWithUserMessage()
 		{
@@ -142,7 +149,7 @@ namespace NUnit.TestData.ExpectExceptionTest
 	public class TestThrowsExceptionWithRightMessage
 	{
 		[Test]
-		[ExpectedException(typeof(Exception), "the message")]
+		[ExpectedException(typeof(Exception), ExpectedMessage="the message")]
 		public void TestThrow()
 		{
 			throw new Exception("the message");
@@ -188,4 +195,51 @@ namespace NUnit.TestData.ExpectExceptionTest
 			Assert.Fail( "private message" );
 		}
 	}
+
+    [TestFixture]
+    public class ExceptionHandlerCalledClass : IExpectException
+    {
+        public bool HandlerCalled = false;
+        public bool AlternateHandlerCalled = false;
+
+        [Test, ExpectedException(typeof(ArgumentException))]
+        public void ThrowsArgumentException()
+        {
+            throw new ArgumentException();
+        }
+
+        [Test, ExpectedException(typeof(ArgumentException), Handler = "AlternateExceptionHandler")]
+        public void ThrowsArgumentException_AlternateHandler()
+        {
+            throw new ArgumentException();
+        }
+
+        [Test, ExpectedException(typeof(ArgumentException))]
+        public void ThrowsApplicationException()
+        {
+            throw new ApplicationException();
+        }
+
+        [Test, ExpectedException(typeof(ArgumentException), Handler = "AlternateExceptionHandler")]
+        public void ThrowsApplicationException_AlternateHandler()
+        {
+            throw new ApplicationException();
+        }
+
+        [Test, ExpectedException(typeof(ArgumentException), Handler = "DeliberatelyMissingHandler")]
+        public void MethodWithBadHandler()
+        {
+            throw new ArgumentException();
+        }
+
+        public void HandleException(Exception ex)
+        {
+            HandlerCalled = true;
+        }
+
+        public void AlternateExceptionHandler(Exception ex)
+        {
+            AlternateHandlerCalled = true;
+        }
+    }
 }
diff --git a/src/tests/test-assembly/FailFixtureTests.cs b/src/tests/test-assembly/FailFixtureTests.cs
index 7d88281..c3c715a 100644
--- a/src/tests/test-assembly/FailFixtureTests.cs
+++ b/src/tests/test-assembly/FailFixtureTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -19,12 +19,6 @@ namespace NUnit.TestData.FailFixture
 		{
 			Assert.Fail(failureMessage);
 		}
-
-		[Test]
-		public void CallAssertionFail()
-		{
-			Assertion.Fail(failureMessage);
-		}
 	}
 
 	[TestFixture]
@@ -76,7 +70,7 @@ namespace NUnit.TestData.FailFixture
 
 		private class CustomException : Exception
 		{
-			private CustomType custom;
+			public CustomType custom;
 
 			public CustomException( string msg, CustomType custom ) : base( msg )
 			{
diff --git a/src/tests/test-assembly/FixtureSetUpTearDownTests.cs b/src/tests/test-assembly/FixtureSetUpTearDownTests.cs
index 0d29c32..a21151d 100644
--- a/src/tests/test-assembly/FixtureSetUpTearDownTests.cs
+++ b/src/tests/test-assembly/FixtureSetUpTearDownTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -9,32 +9,32 @@ using NUnit.Framework;
 
 namespace NUnit.TestData.FixtureSetUpTearDown
 {
-	[TestFixture]
-	public class SetUpAndTearDownFixture
-	{
-		public int setUpCount = 0;
-		public int tearDownCount = 0;
+    [TestFixture]
+    public class SetUpAndTearDownFixture
+    {
+        public int setUpCount = 0;
+        public int tearDownCount = 0;
 
-		[TestFixtureSetUp]
-		public virtual void Init()
-		{
-			setUpCount++;
-		}
+        [TestFixtureSetUp]
+        public virtual void Init()
+        {
+            setUpCount++;
+        }
 
-		[TestFixtureTearDown]
-		public virtual void Destroy()
-		{
-			tearDownCount++;
-		}
+        [TestFixtureTearDown]
+        public virtual void Destroy()
+        {
+            tearDownCount++;
+        }
 
-		[Test]
-		public void Success(){}
+        [Test]
+        public void Success() { }
 
-		[Test]
-		public void EvenMoreSuccess(){}
-	}
+        [Test]
+        public void EvenMoreSuccess() { }
+    }
 
-	[TestFixture,Explicit]
+    [TestFixture, Explicit]
 	public class ExplicitSetUpAndTearDownFixture
 	{
 		public int setUpCount = 0;
@@ -72,29 +72,124 @@ namespace NUnit.TestData.FixtureSetUpTearDown
 	[TestFixture]
 	public class DefineInheritSetUpAndTearDown : SetUpAndTearDownFixture
 	{
-		public int derivedSetUpCount;
-		public int derivedTearDownCount;
+        public int derivedSetUpCount;
+        public int derivedTearDownCount;
 
-		[TestFixtureSetUp]
-		public override void Init()
-		{
-			derivedSetUpCount++;
-		}
+        [TestFixtureSetUp]
+        public override void Init()
+        {
+            derivedSetUpCount++;
+        }
 
-		[TestFixtureTearDown]
-		public override void Destroy()
-		{
-			derivedTearDownCount++;
-		}
+        [TestFixtureTearDown]
+        public override void Destroy()
+        {
+            derivedTearDownCount++;
+        }
 
-		[Test]
-		public void AnotherTest(){}
+        [Test]
+        public void AnotherTest() { }
 
-		[Test]
-		public void YetAnotherTest(){}
-	}
+        [Test]
+        public void YetAnotherTest() { }
+    }
 
-	[TestFixture]
+    [TestFixture]
+    public class DerivedSetUpAndTearDownFixture : SetUpAndTearDownFixture
+    {
+        public int derivedSetUpCount;
+        public int derivedTearDownCount;
+
+        public bool baseSetUpCalledFirst;
+        public bool baseTearDownCalledLast;
+
+        [TestFixtureSetUp]
+        public void Init2()
+        {
+            derivedSetUpCount++;
+            baseSetUpCalledFirst = this.setUpCount > 0;
+        }
+
+        [TestFixtureTearDown]
+        public void Destroy2()
+        {
+            derivedTearDownCount++;
+            baseTearDownCalledLast = this.tearDownCount == 0;
+        }
+
+        [Test]
+        public void AnotherTest() { }
+
+        [Test]
+        public void YetAnotherTest() { }
+    }
+
+    [TestFixture]
+    public class StaticSetUpAndTearDownFixture
+    {
+        public static int setUpCount = 0;
+        public static int tearDownCount = 0;
+
+        [TestFixtureSetUp]
+        public static void Init()
+        {
+            setUpCount++;
+        }
+
+        [TestFixtureTearDown]
+        public static void Destroy()
+        {
+            tearDownCount++;
+        }
+    }
+
+    [TestFixture]
+    public class DerivedStaticSetUpAndTearDownFixture : StaticSetUpAndTearDownFixture
+    {
+        public static int derivedSetUpCount;
+        public static int derivedTearDownCount;
+
+        public static bool baseSetUpCalledFirst;
+        public static bool baseTearDownCalledLast;
+
+
+        [TestFixtureSetUp]
+        public static void Init2()
+        {
+            derivedSetUpCount++;
+            baseSetUpCalledFirst = setUpCount > 0;
+        }
+
+        [TestFixtureTearDown]
+        public static void Destroy2()
+        {
+            derivedTearDownCount++;
+            baseTearDownCalledLast = tearDownCount == 0;
+        }
+    }
+
+#if NET_2_0
+    [TestFixture]
+    public static class StaticClassSetUpAndTearDownFixture
+    {
+        public static int setUpCount = 0;
+        public static int tearDownCount = 0;
+
+        [TestFixtureSetUp]
+        public static void Init()
+        {
+            setUpCount++;
+        }
+
+        [TestFixtureTearDown]
+        public static void Destroy()
+        {
+            tearDownCount++;
+        }
+    }
+#endif
+    
+    [TestFixture]
 	public class MisbehavingFixture 
 	{
 		public bool blowUpInSetUp = false;
diff --git a/src/tests/test-assembly/IgnoreFixtureTests.cs b/src/tests/test-assembly/IgnoreFixtureTests.cs
index 4f58c5e..f96ebd3 100644
--- a/src/tests/test-assembly/IgnoreFixtureTests.cs
+++ b/src/tests/test-assembly/IgnoreFixtureTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -12,12 +12,18 @@ namespace NUnit.TestData.IgnoreFixture
 	[TestFixture]
 	public class IgnoredTestCaseFixture
 	{
-		[Test]
-		public void CallsIgnore()
-		{
-			Assert.Ignore("Ignore me");
-		}
-	}
+        [Test]
+        public void CallsIgnore()
+        {
+            Assert.Ignore("Ignore me");
+        }
+
+        [Test, ExpectedException(typeof(InvalidOperationException))]
+        public void CallsIgnoreWithExpectedException()
+        {
+            Assert.Ignore("Ignore me");
+        }
+    }
 
 	[TestFixture]
 	public class IgnoredTestSuiteFixture
diff --git a/src/tests/test-assembly/LegacySuiteData.cs b/src/tests/test-assembly/LegacySuiteData.cs
new file mode 100644
index 0000000..047faba
--- /dev/null
+++ b/src/tests/test-assembly/LegacySuiteData.cs
@@ -0,0 +1,63 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Framework;
+using NUnit.Core;
+
+namespace NUnit.TestData.LegacySuiteData
+{
+	public class Suite
+	{
+		[Suite]
+		public static TestSuite MockSuite
+		{
+			get 
+			{
+				TestSuite testSuite = new TestSuite("TestSuite");
+				return testSuite;
+			}
+		}
+	}
+
+	class NonConformingSuite
+	{
+		[Suite]
+		public static int Integer
+		{
+			get 
+			{
+				return 5;
+			}
+		}
+	}
+
+    public class LegacySuiteReturningFixtureWithArguments
+    {
+        [Suite]
+        public static IEnumerable Suite
+        {
+            get
+            {
+                ArrayList suite = new ArrayList();
+                suite.Add(new TestClass(5));
+                return suite;
+            }
+        }
+
+        [TestFixture]
+        public class TestClass
+        {
+            public int num;
+
+            public TestClass(int num)
+            {
+                this.num = num;
+            }
+        }
+    }
+}
diff --git a/src/tests/test-assembly/MaxTimeFixture.cs b/src/tests/test-assembly/MaxTimeFixture.cs
new file mode 100644
index 0000000..43207a0
--- /dev/null
+++ b/src/tests/test-assembly/MaxTimeFixture.cs
@@ -0,0 +1,42 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using NUnit.Framework;
+
+namespace NUnit.TestData
+{
+    [TestFixture]
+    public class MaxTimeFixture
+    {
+        [Test, MaxTime(1)]
+        public void MaxTimeExceeded()
+        {
+            System.Threading.Thread.Sleep(20);
+        }
+    }
+
+    [TestFixture]
+    public class MaxTimeFixtureWithFailure
+    {
+        [Test, MaxTime(1)]
+        public void MaxTimeExceeded()
+        {
+            System.Threading.Thread.Sleep(20);
+            Assert.Fail("Intentional Failure");
+        }
+    }
+
+    [TestFixture]
+    public class MaxTimeFixtureWithError
+    {
+        [Test, MaxTime(1)]
+        public void MaxTimeExceeded()
+        {
+            System.Threading.Thread.Sleep(20);
+            throw new Exception("Exception message");
+        }
+    }
+}
diff --git a/src/tests/test-assembly/ParameterizedTestFixture.cs b/src/tests/test-assembly/ParameterizedTestFixture.cs
new file mode 100644
index 0000000..618aae1
--- /dev/null
+++ b/src/tests/test-assembly/ParameterizedTestFixture.cs
@@ -0,0 +1,30 @@
+using System;
+using NUnit.Framework;
+
+namespace NUnit.TestData
+{
+    [TestFixture(1)]
+    [TestFixture(2)]
+    public class ParameterizedTestFixture
+    {
+        [Test]
+        public void MethodWithoutParams()
+        {
+        }
+
+        [TestCase(10,20)]
+        public void MethodWithParams(int x, int y)
+        {
+        }
+    }
+
+    [TestFixture(Category = "XYZ")]
+    public class TestFixtureWithSingleCategory
+    {
+    }
+
+    [TestFixture(Category = "X,Y,Z")]
+    public class TestFixtureWithMultipleCategories
+    {
+    }
+}
diff --git a/src/tests/test-assembly/PropertyAttributeTests.cs b/src/tests/test-assembly/PropertyAttributeTests.cs
index 4991f80..807ef53 100644
--- a/src/tests/test-assembly/PropertyAttributeTests.cs
+++ b/src/tests/test-assembly/PropertyAttributeTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/tests/test-assembly/RepeatedTestFixtureTests.cs b/src/tests/test-assembly/RepeatedTestFixtureTests.cs
index 6f1d631..a2936a9 100644
--- a/src/tests/test-assembly/RepeatedTestFixtureTests.cs
+++ b/src/tests/test-assembly/RepeatedTestFixtureTests.cs
@@ -1,12 +1,11 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
 using NUnit.Framework;
-using NUnit.Framework.Extensions;
 
 namespace NUnit.TestData.RepeatedTestFixture
 {
@@ -68,7 +67,6 @@ namespace NUnit.TestData.RepeatedTestFixture
 	public class RepeatSuccessFixture : RepeatingTestsBase
 	{
 		[Test, Repeat(3)]
-		//[RepeatedTest(3)]
 		public void RepeatSuccess()
 		{
 			count++;
@@ -79,7 +77,6 @@ namespace NUnit.TestData.RepeatedTestFixture
 	public class RepeatFailOnFirstFixture : RepeatingTestsBase
 	{
 		[Test, Repeat(3)]
-		//[RepeatedTest(3)]
 		public void RepeatFailOnFirst()
 		{
 			count++;
@@ -90,7 +87,6 @@ namespace NUnit.TestData.RepeatedTestFixture
 	public class RepeatFailOnThirdFixture : RepeatingTestsBase
 	{
 		[Test, Repeat(3)]
-		//[RepeatedTest(3)]
 		public void RepeatFailOnThird()
 		{
 			count++;
@@ -100,13 +96,22 @@ namespace NUnit.TestData.RepeatedTestFixture
 		}
 	}
 
-	public class RepeatedTestWithIgnore : RepeatingTestsBase
-	{
-		[Test, Repeat(3), Ignore( "Ignore this test" )]
-		//[RepeatedTest(3), Ignore( "Ignore this test" )]
-		public void RepeatShouldIgnore()
-		{
-			Assert.Fail( "Ignored test executed" );
-		}
-	}
+    public class RepeatedTestWithIgnore : RepeatingTestsBase
+    {
+        [Test, Repeat(3), Ignore("Ignore this test")]
+        public void RepeatShouldIgnore()
+        {
+            Assert.Fail("Ignored test executed");
+        }
+    }
+
+    public class RepeatedTestWithCategory : RepeatingTestsBase
+    {
+        [Test, Repeat(3), Category("SAMPLE")]
+        public void TestWithCategory()
+        {
+            count++;
+            Assert.IsTrue(true);
+        }
+    }
 }
diff --git a/src/tests/test-assembly/SetUpTest.cs b/src/tests/test-assembly/SetUpTest.cs
index 64f3184..90c837e 100644
--- a/src/tests/test-assembly/SetUpTest.cs
+++ b/src/tests/test-assembly/SetUpTest.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -12,24 +12,24 @@ namespace NUnit.TestData.SetUpTest
 	[TestFixture]
 	public class SetUpAndTearDownFixture
 	{
-		public bool wasSetUpCalled;
-		public bool wasTearDownCalled;
+        public bool wasSetUpCalled;
+        public bool wasTearDownCalled;
 
-		[SetUp]
-		public virtual void Init()
-		{
-			wasSetUpCalled = true;
-		}
+        [SetUp]
+        public virtual void Init()
+        {
+            wasSetUpCalled = true;
+        }
 
-		[TearDown]
-		public virtual void Destroy()
-		{
-			wasTearDownCalled = true;
-		}
+        [TearDown]
+        public virtual void Destroy()
+        {
+            wasTearDownCalled = true;
+        }
 
-		[Test]
-		public void Success(){}
-	}
+        [Test]
+        public void Success() { }
+    }
 
 
 	[TestFixture]
@@ -88,4 +88,88 @@ namespace NUnit.TestData.SetUpTest
 		[Test]
 		public void AnotherTest(){}
 	}
+
+    public class MultipleSetUpTearDownFixture
+    {
+        public bool wasSetUp1Called;
+        public bool wasSetUp2Called;
+        public bool wasSetUp3Called;
+        public bool wasTearDown1Called;
+        public bool wasTearDown2Called;
+
+        [SetUp]
+        public virtual void Init1()
+        {
+            wasSetUp1Called = true;
+        }
+        [SetUp]
+        public virtual void Init2()
+        {
+            wasSetUp2Called = true;
+        }
+        [SetUp]
+        public virtual void Init3()
+        {
+            wasSetUp3Called = true;
+        }
+
+        [TearDown]
+        public virtual void TearDown1()
+        {
+            wasTearDown1Called = true;
+        }
+        [TearDown]
+        public virtual void TearDown2()
+        {
+            wasTearDown2Called = true;
+        }
+
+        [Test]
+        public void Success() { }
+    }
+
+    [TestFixture]
+    public class DerivedClassWithSeparateSetUp : SetUpAndTearDownFixture
+    {
+        public bool wasDerivedSetUpCalled;
+        public bool wasDerivedTearDownCalled;
+        public bool wasBaseSetUpCalledFirst;
+        public bool wasBaseTearDownCalledLast;
+
+        [SetUp]
+        public void DerivedInit()
+        {
+            wasDerivedSetUpCalled = true;
+            wasBaseSetUpCalledFirst = wasSetUpCalled;
+        }
+
+        [TearDown]
+        public void DerivedTearDown()
+        {
+            wasDerivedTearDownCalled = true;
+            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() {}
+    }
 }
diff --git a/src/tests/test-assembly/SetupFixtureTests.cs b/src/tests/test-assembly/SetupFixtureTests.cs
index 8e7241b..d9c7d3d 100644
--- a/src/tests/test-assembly/SetupFixtureTests.cs
+++ b/src/tests/test-assembly/SetupFixtureTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -316,7 +316,7 @@ namespace NUnit.TestData.SetupFixture
         public class NUnitNamespaceSetUpFixture
         {
             [SetUp]
-            public void DoNamespaceSetUp()
+            public static void DoNamespaceSetUp()
             {
                 TestUtilities.SimpleEventRecorder.RegisterEvent("NamespaceSetup");
             }
@@ -425,6 +425,61 @@ namespace NUnit.TestData.SetupFixture
 			public void SomeMethod() { }				
 		}
 	}
+
+    namespace Namespace5
+    {
+        #region SomeTestFixture
+        [TestFixture]
+        public class SomeTestFixture
+        {
+            [TestFixtureSetUp]
+            public void FixtureSetup()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("FixtureSetup");
+            }
+
+            [SetUp]
+            public void Setup()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("Setup");
+            }
+
+            [Test]
+            public void Test()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("Test");
+            }
+
+            [TearDown]
+            public void TearDown()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("TearDown");
+            }
+
+            [TestFixtureTearDown]
+            public void FixtureTearDown()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("FixtureTearDown");
+            }
+        }
+        #endregion SomeTestFixture
+
+        [SetUpFixture]
+        public class NUnitNamespaceSetUpFixture
+        {
+            [SetUp]
+            public static void DoNamespaceSetUp()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("NamespaceSetup");
+            }
+
+            [TearDown]
+            public static void DoNamespaceTearDown()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("NamespaceTearDown");
+            }
+        }
+    }
 }
 #region NoNamespaceSetupFixture
 [SetUpFixture]
diff --git a/src/tests/test-assembly/SuiteBuilderTests.cs b/src/tests/test-assembly/SuiteBuilderTests.cs
deleted file mode 100644
index 61cedc6..0000000
--- a/src/tests/test-assembly/SuiteBuilderTests.cs
+++ /dev/null
@@ -1,38 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-using NUnit.Core;
-
-namespace NUnit.TestData.SuiteBuilderTests
-{
-	public class Suite
-	{
-		[Suite]
-		public static TestSuite MockSuite
-		{
-			get 
-			{
-				TestSuite testSuite = new TestSuite("TestSuite");
-				return testSuite;
-			}
-		}
-	}
-
-	class NonConformingSuite
-	{
-		[Suite]
-		public static int Integer
-		{
-			get 
-			{
-				return 5;
-			}
-		}
-	}
-
-}
diff --git a/src/tests/test-assembly/TestCaseAttributeFixture.cs b/src/tests/test-assembly/TestCaseAttributeFixture.cs
new file mode 100644
index 0000000..da79520
--- /dev/null
+++ b/src/tests/test-assembly/TestCaseAttributeFixture.cs
@@ -0,0 +1,77 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using NUnit.Framework;
+
+namespace NUnit.TestData
+{
+    [TestFixture]
+    public class TestCaseAttributeFixture
+    {
+        [TestCase(2,3,4,Description="My Description")]
+        public void MethodHasDescriptionSpecified(int x, int y, int z)
+        {}
+
+		[TestCase(2,3,4,TestName="XYZ")]
+		public void MethodHasTestNameSpecified(int x, int y, int z)
+		{}
+
+        [TestCase(2, 3, 4, Category = "XYZ")]
+        public void MethodHasSingleCategory(int x, int y, int z)
+        { }
+
+        [TestCase(2, 3, 4, Category = "X,Y,Z")]
+        public void MethodHasMultipleCategories(int x, int y, int z)
+        { }
+
+        [TestCase(2, 2000000, Result = 4)]
+		public int MethodCausesConversionOverflow(short x, short y)
+		{
+			return x + y;
+		}
+
+		[TestCase("12-Octobar-1942")]
+		public void MethodHasInvalidDateFormat(DateTime dt)
+		{}
+
+        [TestCase(2, 3, 4, ExpectedException = typeof(ArgumentNullException))]
+        public void MethodThrowsExpectedException(int x, int y, int z)
+        {
+            throw new ArgumentNullException();
+        }
+
+        [TestCase(2, 3, 4, ExpectedException = typeof(ArgumentNullException))]
+        public void MethodThrowsWrongException(int x, int y, int z)
+        {
+            throw new ArgumentException();
+        }
+
+        [TestCase(2, 3, 4, ExpectedException = typeof(ArgumentNullException))]
+        public void MethodThrowsNoException(int x, int y, int z)
+        {
+        }
+
+        [TestCase(2, 3, 4, ExpectedException = typeof(ApplicationException),
+            ExpectedMessage="Test Exception")]
+        public void MethodThrowsExpectedExceptionWithWrongMessage(int x, int y, int z)
+        {
+            throw new ApplicationException("Wrong Test Exception");
+        }
+
+        [TestCase(2, 3, 4, ExpectedException = typeof(ArgumentNullException))]
+        public void MethodCallsIgnore(int x, int y, int z)
+        {
+            Assert.Ignore("Ignore this");
+        }
+
+        [TestCase(1)]
+        [TestCase(2, Ignore = true)]
+        [TestCase(3, IgnoreReason = "Don't Run Me!")]
+        public void MethodWithIgnoredTestCases(int num)
+        {
+        }
+    }
+}
diff --git a/src/tests/test-assembly/TestCaseSourceAttributeFixture.cs b/src/tests/test-assembly/TestCaseSourceAttributeFixture.cs
new file mode 100644
index 0000000..6ace9f9
--- /dev/null
+++ b/src/tests/test-assembly/TestCaseSourceAttributeFixture.cs
@@ -0,0 +1,76 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+using System;
+using System.Collections;
+using NUnit.Framework;
+
+namespace NUnit.TestData
+{
+    [TestFixture]
+    public class TestCaseSourceAttributeFixture
+    {
+        [TestCaseSource("source")]
+        public void MethodThrowsExpectedException(int x, int y, int z)
+        {
+            throw new ArgumentNullException();
+        }
+
+        [TestCaseSource("source")]
+        public void MethodThrowsWrongException(int x, int y, int z)
+        {
+            throw new ArgumentException();
+        }
+
+        [TestCaseSource("source")]
+        public void MethodThrowsNoException(int x, int y, int z)
+        {
+        }
+
+        [TestCaseSource("source")]
+        public void MethodCallsIgnore(int x, int y, int z)
+        {
+            Assert.Ignore("Ignore this");
+        }
+
+        internal static object[] source = new object[] {
+            new TestCaseData( 2, 3, 4 ).Throws(typeof(ArgumentNullException)) };
+
+        [TestCaseSource("exception_source")]
+        public void MethodWithSourceThrowingException(string lhs, string rhs)
+        {
+        }
+
+        [TestCaseSource("ignored_source")]
+        public void MethodWithIgnoredTestCases(int num)
+        {
+        }
+
+        private static IEnumerable ignored_source
+        {
+            get
+            {
+                return new object[] {
+                    new TestCaseData(1),
+                    new TestCaseData(2).Ignore(),
+                    new TestCaseData(3).Ignore("Don't Run Me!")
+                };
+            }
+        }
+
+        private static IEnumerable exception_source
+        {
+            get
+            {
+#if NET_2_0
+                yield return new TestCaseData("a", "a");
+                yield return new TestCaseData("b", "b");
+#endif
+
+                throw new System.Exception("my message");
+            }
+        }
+    }
+}
diff --git a/src/tests/test-assembly/TestCaseTest.cs b/src/tests/test-assembly/TestCaseTest.cs
index 3fbcc8a..ae72f36 100644
--- a/src/tests/test-assembly/TestCaseTest.cs
+++ b/src/tests/test-assembly/TestCaseTest.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/tests/test-assembly/TestContextData.cs b/src/tests/test-assembly/TestContextData.cs
new file mode 100644
index 0000000..5ce51c2
--- /dev/null
+++ b/src/tests/test-assembly/TestContextData.cs
@@ -0,0 +1,51 @@
+using System;
+using NUnit.Framework;
+
+namespace NUnit.TestData.TestContextData
+{
+    [TestFixture]
+    public class TestStateRecordingFixture
+    {
+        public string stateList;
+        public string statusList;
+
+        public bool testFailure;
+        public bool testInconclusive;
+        public bool setUpFailure;
+        public bool setUpIgnore;
+
+        [SetUp]
+        public void SetUp()
+        {
+            //stateList = TestContext.CurrentContext.Result.Outcome + "=>";
+            stateList = TestContext.CurrentContext.Result.State + "=>";
+            statusList = TestContext.CurrentContext.Result.Status + "=>";
+
+            if (setUpFailure)
+                Assert.Fail("Failure in SetUp");
+            if (setUpIgnore)
+                Assert.Ignore("Ignored in SetUp");
+        }
+
+        [Test]
+        public void TheTest()
+        {
+            //stateList += TestContext.CurrentContext.Result.Outcome;
+            stateList += TestContext.CurrentContext.Result.State;
+            statusList += TestContext.CurrentContext.Result.Status;
+
+            if (testFailure)
+                Assert.Fail("Deliberate failure");
+            if (testInconclusive)
+                Assert.Inconclusive("Inconclusive test");
+        }
+
+        [TearDown]
+        public void TearDown()
+        {
+            //stateList += "=>" + TestContext.CurrentContext.Result.Outcome;
+            stateList += "=>" + TestContext.CurrentContext.Result.State;
+            statusList += "=>" + TestContext.CurrentContext.Result.Status;
+        }
+    }
+}
diff --git a/src/tests/test-assembly/TestData.cs b/src/tests/test-assembly/TestData.cs
index e8717a7..bcf1032 100644
--- a/src/tests/test-assembly/TestData.cs
+++ b/src/tests/test-assembly/TestData.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
diff --git a/src/tests/test-assembly/TestFixtureBuilderTests.cs b/src/tests/test-assembly/TestFixtureBuilderTests.cs
index 73a8824..f4bd40f 100644
--- a/src/tests/test-assembly/TestFixtureBuilderTests.cs
+++ b/src/tests/test-assembly/TestFixtureBuilderTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/tests/test-assembly/TestFixtureData.cs b/src/tests/test-assembly/TestFixtureData.cs
new file mode 100644
index 0000000..2c767ac
--- /dev/null
+++ b/src/tests/test-assembly/TestFixtureData.cs
@@ -0,0 +1,379 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+
+namespace NUnit.TestData.TestFixtureData
+{
+	/// <summary>
+	/// Classes used for testing NUnit
+	/// </summary>
+
+    [TestFixture]
+    public class NoDefaultCtorFixture
+    {
+        public NoDefaultCtorFixture(int index) { }
+
+        [Test]
+        public void OneTest() { }
+    }
+
+    [TestFixture(7,3)]
+    public class FixtureWithArgsSupplied
+    {
+        public FixtureWithArgsSupplied(int x, int y) { }
+
+        [Test]
+        public void OneTest() { }
+    }
+
+    [TestFixture]
+	public class BadCtorFixture
+	{
+		BadCtorFixture()
+		{
+			throw new Exception();
+		}
+
+		[Test] public void OneTest()
+		{}
+	}
+
+    public class FixtureWithoutTestFixtureAttribute
+    {
+        [Test]
+        public void SomeTest() { }
+    }
+
+#if NET_2_0
+    public static class StaticFixtureWithoutTestFixtureAttribute
+    {
+        [Test]
+        public static void StaticTest() { }
+    }
+#endif
+
+    [TestFixture]
+	public class MultipleSetUpAttributes
+	{
+		[SetUp]
+		public void Init1()
+		{}
+
+		[SetUp]
+		public void Init2()
+		{}
+
+		[Test] public void OneTest()
+		{}
+	}
+
+	[TestFixture]
+	public class MultipleTearDownAttributes
+	{
+		[TearDown]
+		public void Destroy1()
+		{}
+
+		[TearDown]
+		public void Destroy2()
+		{}
+
+		[Test] public void OneTest()
+		{}
+	}
+
+	[TestFixture]
+	[Ignore("testing ignore a fixture")]
+	public class IgnoredFixture
+	{
+		[Test]
+		public void Success()
+		{}
+	}
+
+	[TestFixture]
+	public class OuterClass
+	{
+		[TestFixture]
+		public class NestedTestFixture
+		{
+			[TestFixture]
+				public class DoublyNestedTestFixture
+			{
+				[Test]
+				public void Test()
+				{
+				}
+			}
+		}
+	}
+
+	[TestFixture]
+	public abstract class AbstractTestFixture
+	{
+		[TearDown]
+		public void Destroy1()
+		{}
+
+        [Test]
+        public void SomeTest()
+        {}
+	}
+
+    public class DerivedFromAbstractTestFixture : AbstractTestFixture
+    {
+    }
+
+	[TestFixture]
+	public class BaseClassTestFixture
+	{
+		[Test]
+		public void Success() { }
+	}
+	
+	public abstract class AbstractDerivedTestFixture : BaseClassTestFixture
+	{
+	}
+
+    public class DerivedFromAbstractDerivedTestFixture : AbstractDerivedTestFixture
+    {
+    }
+
+    [TestFixture]
+    public abstract class AbstractBaseFixtureWithAttribute
+    {
+    }
+
+    [TestFixture]
+    public abstract class AbstractDerivedFixtureWithSecondAttribute
+        : AbstractBaseFixtureWithAttribute
+    {
+    }
+
+    public class DoubleDerivedClassWithTwoInheritedAttributes
+        : AbstractDerivedFixtureWithSecondAttribute
+    {
+    }
+
+	[TestFixture]
+	public class MultipleFixtureSetUpAttributes
+	{
+		[TestFixtureSetUp]
+		public void Init1()
+		{}
+
+		[TestFixtureSetUp]
+		public void Init2()
+		{}
+
+		[Test] public void OneTest()
+		{}
+	}
+
+	[TestFixture]
+	public class MultipleFixtureTearDownAttributes
+	{
+		[TestFixtureTearDown]
+		public void Destroy1()
+		{}
+
+		[TestFixtureTearDown]
+		public void Destroy2()
+		{}
+
+		[Test] public void OneTest()
+		{}
+	}
+
+	// Base class used to ensure following classes
+	// all have at least one test
+	public class OneTestBase
+	{
+		[Test] public void OneTest() { }
+	}
+
+	[TestFixture]
+	public class PrivateSetUp : OneTestBase
+	{
+		[SetUp]
+		private void Setup()	{}
+	}
+
+	[TestFixture]
+	public class ProtectedSetUp : OneTestBase
+	{
+		[SetUp]
+		protected void Setup()	{}
+	}
+
+	[TestFixture]
+	public class StaticSetUp : OneTestBase
+	{
+		[SetUp]
+		public static void Setup() {}
+	}
+
+	[TestFixture]
+	public class SetUpWithReturnValue : OneTestBase
+	{
+		[SetUp]
+		public int Setup() { return 0; }
+	}
+
+	[TestFixture]
+	public class SetUpWithParameters : OneTestBase
+	{
+		[SetUp]
+		public void Setup(int j) { }
+	}
+
+	[TestFixture]
+	public class PrivateTearDown : OneTestBase
+	{
+		[TearDown]
+		private void Teardown()	{}
+	}
+
+	[TestFixture]
+	public class ProtectedTearDown : OneTestBase
+	{
+		[TearDown]
+		protected void Teardown()	{}
+	}
+
+	[TestFixture]
+	public class StaticTearDown : OneTestBase
+	{
+		[SetUp]
+		public static void TearDown() {}
+	}
+
+	[TestFixture]
+	public class TearDownWithReturnValue : OneTestBase
+	{
+		[TearDown]
+		public int Teardown() { return 0; }
+	}
+
+	[TestFixture]
+	public class TearDownWithParameters : OneTestBase
+	{
+		[TearDown]
+		public void Teardown(int j) { }
+	}
+
+	[TestFixture]
+	public class PrivateFixtureSetUp : OneTestBase
+	{
+		[TestFixtureSetUp]
+		private void Setup()	{}
+	}
+
+	[TestFixture]
+	public class ProtectedFixtureSetUp : OneTestBase
+	{
+		[TestFixtureSetUp]
+		protected void Setup()	{}
+	}
+
+	[TestFixture]
+	public class StaticFixtureSetUp : OneTestBase
+	{
+		[TestFixtureSetUp]
+		public static void Setup() {}
+	}
+
+	[TestFixture]
+	public class FixtureSetUpWithReturnValue : OneTestBase
+	{
+		[TestFixtureSetUp]
+		public int Setup() { return 0; }
+	}
+
+	[TestFixture]
+	public class FixtureSetUpWithParameters : OneTestBase
+	{
+		[SetUp]
+		public void Setup(int j) { }
+	}
+
+	[TestFixture]
+	public class PrivateFixtureTearDown : OneTestBase
+	{
+		[TestFixtureTearDown]
+		private void Teardown()	{}
+	}
+
+	[TestFixture]
+	public class ProtectedFixtureTearDown : OneTestBase
+	{
+		[TestFixtureTearDown]
+		protected void Teardown()	{}
+	}
+
+	[TestFixture]
+	public class StaticFixtureTearDown : OneTestBase
+	{
+		[TestFixtureTearDown]
+		public static void Teardown() {}
+	}
+
+	[TestFixture]
+	public class FixtureTearDownWithReturnValue : OneTestBase
+	{
+		[TestFixtureTearDown]
+		public int Teardown() { return 0; }
+	}
+
+	[TestFixture]
+	public class FixtureTearDownWithParameters : OneTestBase
+	{
+		[TestFixtureTearDown]
+		public void Teardown(int j) { }
+	}
+
+#if NET_2_0
+    [TestFixture(typeof(int))]
+    [TestFixture(typeof(string))]
+    public class GenericFixtureWithProperArgsProvided<T>
+    {
+        [Test]
+        public void SomeTest() { }
+    }
+
+    public class GenericFixtureWithNoTestFixtureAttribute<T>
+    {
+        [Test]
+        public void SomeTest() { }
+    }
+
+    [TestFixture]
+    public class GenericFixtureWithNoArgsProvided<T>
+    {
+        [Test]
+        public void SomeTest() { }
+    }
+
+    [TestFixture]
+    public abstract class AbstractFixtureBase
+    {
+        [Test]
+        public void SomeTest() { }
+    }
+
+    public class GenericFixtureDerivedFromAbstractFixtureWithNoArgsProvided<T> : AbstractFixtureBase
+    {
+    }
+
+    [TestFixture(typeof(int))]
+    [TestFixture(typeof(string))]
+    public class GenericFixtureDerivedFromAbstractFixtureWithArgsProvided<T> : AbstractFixtureBase
+    {
+    }
+#endif
+}
diff --git a/src/tests/test-assembly/TestFixtureExtensionTests.cs b/src/tests/test-assembly/TestFixtureExtensionTests.cs
index 3b6efea..2eee0d7 100644
--- a/src/tests/test-assembly/TestFixtureExtensionTests.cs
+++ b/src/tests/test-assembly/TestFixtureExtensionTests.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
@@ -10,15 +10,17 @@ using NUnit.Framework;
 namespace NUnit.TestData.TestFixtureExtension
 {
 	[TestFixture]
-	public abstract class BaseTestFixture : NUnit.Framework.TestCase
+	public abstract class BaseTestFixture
 	{
 		public bool baseSetup = false;
 		public bool baseTeardown = false;
 
-		protected override void SetUp()
+        [SetUp]
+		public void SetUp()
 		{ baseSetup = true; }
 
-		protected override void TearDown()
+        [TearDown]
+		public void TearDown()
 		{ baseTeardown = true; }
 	}
 
@@ -27,7 +29,7 @@ namespace NUnit.TestData.TestFixtureExtension
 		[Test]
 		public void Success()
 		{
-			Assert(true);
+			Assert.IsTrue(true);
 		}
 	}
 
@@ -42,7 +44,7 @@ namespace NUnit.TestData.TestFixtureExtension
 		[Test]
 		public void Success()
 		{
-			Assert(true);
+			Assert.IsTrue(true);
 		}
 	}
 }
diff --git a/src/tests/test-assembly/TestFixtureTests.cs b/src/tests/test-assembly/TestFixtureTests.cs
deleted file mode 100644
index 628e5e9..0000000
--- a/src/tests/test-assembly/TestFixtureTests.cs
+++ /dev/null
@@ -1,291 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-
-namespace NUnit.TestData.TestFixtureTests
-{
-	/// <summary>
-	/// Classes used for testing NUnit
-	/// </summary>
-
-	[TestFixture]
-	public class NoDefaultCtorFixture
-	{
-		public NoDefaultCtorFixture(int index) { }
-
-		[Test] public void OneTest() { }
-	}
-
-	[TestFixture]
-	public class BadCtorFixture
-	{
-		BadCtorFixture()
-		{
-			throw new Exception();
-		}
-
-		[Test] public void OneTest()
-		{}
-	}
-
-	public class AssemblyType
-	{
-		internal bool called;
-
-		public AssemblyType()
-		{
-			called = true;
-		}
-	}
-
-	[TestFixture]
-	public class MultipleSetUpAttributes
-	{
-		[SetUp]
-		public void Init1()
-		{}
-
-		[SetUp]
-		public void Init2()
-		{}
-
-		[Test] public void OneTest()
-		{}
-	}
-
-	[TestFixture]
-	public class MultipleTearDownAttributes
-	{
-		[TearDown]
-		public void Destroy1()
-		{}
-
-		[TearDown]
-		public void Destroy2()
-		{}
-
-		[Test] public void OneTest()
-		{}
-	}
-
-	[TestFixture]
-	[Ignore("testing ignore a suite")]
-	public class IgnoredFixture
-	{
-		[Test]
-		public void Success()
-		{}
-	}
-
-	[TestFixture]
-	public class OuterClass
-	{
-		[TestFixture]
-		public class NestedTestFixture
-		{
-			[TestFixture]
-				public class DoublyNestedTestFixture
-			{
-				[Test]
-				public void Test()
-				{
-				}
-			}
-		}
-	}
-
-	[TestFixture]
-	public abstract class AbstractTestFixture
-	{
-		[TearDown]
-		public void Destroy1()
-		{}
-	}
-
-	[TestFixture]
-	public class BaseClassTestFixture
-	{
-		[Test]
-		public void Success() { }
-	}
-	
-	public abstract class AbstractDerivedTestFixture : BaseClassTestFixture
-	{
-	}
-
-	[TestFixture]
-	public class MultipleFixtureSetUpAttributes
-	{
-		[TestFixtureSetUp]
-		public void Init1()
-		{}
-
-		[TestFixtureSetUp]
-		public void Init2()
-		{}
-
-		[Test] public void OneTest()
-		{}
-	}
-
-	[TestFixture]
-	public class MultipleFixtureTearDownAttributes
-	{
-		[TestFixtureTearDown]
-		public void Destroy1()
-		{}
-
-		[TestFixtureTearDown]
-		public void Destroy2()
-		{}
-
-		[Test] public void OneTest()
-		{}
-	}
-
-	[TestFixture]
-	public class PrivateSetUp
-	{
-		[SetUp]
-		private void Setup()	{}
-	}
-
-	[TestFixture]
-	public class ProtectedSetUp
-	{
-		[SetUp]
-		protected void Setup()	{}
-	}
-
-	[TestFixture]
-	public class StaticSetUp
-	{
-		[SetUp]
-		public static void Setup() {}
-	}
-
-	[TestFixture]
-	public class SetUpWithReturnValue
-	{
-		[SetUp]
-		public int Setup() { return 0; }
-	}
-
-	[TestFixture]
-	public class SetUpWithParameters
-	{
-		[SetUp]
-		public void Setup(int j) { }
-	}
-
-	[TestFixture]
-	public class PrivateTearDown
-	{
-		[TearDown]
-		private void Teardown()	{}
-	}
-
-	[TestFixture]
-	public class ProtectedTearDown
-	{
-		[TearDown]
-		protected void Teardown()	{}
-	}
-
-	[TestFixture]
-	public class StaticTearDown
-	{
-		[SetUp]
-		public static void TearDown() {}
-	}
-
-	[TestFixture]
-	public class TearDownWithReturnValue
-	{
-		[TearDown]
-		public int Teardown() { return 0; }
-	}
-
-	[TestFixture]
-	public class TearDownWithParameters
-	{
-		[TearDown]
-		public void Teardown(int j) { }
-	}
-
-	[TestFixture]
-	public class PrivateFixtureSetUp
-	{
-		[TestFixtureSetUp]
-		private void Setup()	{}
-	}
-
-	[TestFixture]
-	public class ProtectedFixtureSetUp
-	{
-		[TestFixtureSetUp]
-		protected void Setup()	{}
-	}
-
-	[TestFixture]
-	public class StaticFixtureSetUp
-	{
-		[TestFixtureSetUp]
-		public static void Setup() {}
-	}
-
-	[TestFixture]
-	public class FixtureSetUpWithReturnValue
-	{
-		[TestFixtureSetUp]
-		public int Setup() { return 0; }
-	}
-
-	[TestFixture]
-	public class FixtureSetUpWithParameters
-	{
-		[SetUp]
-		public void Setup(int j) { }
-	}
-
-	[TestFixture]
-	public class PrivateFixtureTearDown
-	{
-		[TestFixtureTearDown]
-		private void Teardown()	{}
-	}
-
-	[TestFixture]
-	public class ProtectedFixtureTearDown
-	{
-		[TestFixtureTearDown]
-		protected void Teardown()	{}
-	}
-
-	[TestFixture]
-	public class StaticFixtureTearDown
-	{
-		[TestFixtureTearDown]
-		public static void Teardown() {}
-	}
-
-	[TestFixture]
-	public class FixtureTearDownWithReturnValue
-	{
-		[TestFixtureTearDown]
-		public int Teardown() { return 0; }
-	}
-
-	[TestFixture]
-	public class FixtureTearDownWithParameters
-	{
-		[TestFixtureTearDown]
-		public void Teardown(int j) { }
-	}
-
-}
diff --git a/src/tests/test-assembly/TestMethodSignatureFixture.cs b/src/tests/test-assembly/TestMethodSignatureFixture.cs
new file mode 100644
index 0000000..f4ee99e
--- /dev/null
+++ b/src/tests/test-assembly/TestMethodSignatureFixture.cs
@@ -0,0 +1,111 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using NUnit.Framework;
+
+namespace NUnit.TestData
+{
+	[TestFixture]
+	public class TestMethodSignatureFixture
+	{
+		public static int Tests = 20;
+		public static int Runnable = 12;
+		public static int NotRunnable = 8;
+	    public static int Errors = 3;
+	    public static int Failures = 0;
+
+		[Test]
+		public void InstanceTestMethod() { }
+
+		[Test]
+		public static void StaticTestMethod() { }
+
+        [Test]
+        public void TestMethodWithArgumentsNotProvided(int x, int y, string label) { }
+
+        [Test]
+        public static void StaticTestMethodWithArgumentsNotProvided(int x, int y, string label) { }
+
+		[TestCase(5, 2, "ABC")]
+		public void TestMethodWithoutParametersWithArgumentsProvided() { }
+
+        [TestCase(5, 2, "ABC")]
+        public void TestMethodWithArgumentsProvided(int x, int y, string label)
+        {
+            Assert.AreEqual(5, x);
+            Assert.AreEqual(2, y);
+            Assert.AreEqual("ABC", label);
+        }
+
+        [TestCase(5, 2, "ABC")]
+        public static void StaticTestMethodWithArgumentsProvided(int x, int y, string label)
+        {
+            Assert.AreEqual(5, x);
+            Assert.AreEqual(2, y);
+            Assert.AreEqual("ABC", label);
+        }
+
+        [TestCase(2, 2)]
+        public void TestMethodWithWrongNumberOfArgumentsProvided(int x, int y, string label)
+        {
+        }
+
+        [TestCase(2, 2, 3.5)]
+        public void TestMethodWithWrongArgumentTypesProvided(int x, int y, string label)
+        {
+        }
+
+        [TestCase(2, 2)]
+        public static void StaticTestMethodWithWrongNumberOfArgumentsProvided(int x, int y, string label)
+        {
+        }
+
+        [TestCase(2, 2, 3.5)]
+        public static void StaticTestMethodWithWrongArgumentTypesProvided(int x, int y, string label)
+        {
+        }
+
+        [TestCase(3.7, 2, 5.7)]
+        public void TestMethodWithConvertibleArguments(double x, double y, double sum)
+        {
+            Assert.AreEqual(sum, x + y, 0.0001);
+        }
+
+        [TestCase(3.7, 2, 5.7)]
+        public void TestMethodWithNonConvertibleArguments(int x, int y, int sum)
+        {
+            Assert.AreEqual(sum, x + y, 0.0001);
+        }
+
+        [TestCase(12, 3, 4)]
+		[TestCase( 12, 2, 6 )]
+		[TestCase( 12, 4, 3 )]
+		public void TestMethodWithMultipleTestCases( int n, int d, int q )
+		{
+			Assert.AreEqual( q, n / d );
+		}
+
+        [TestCase(new int[] {1, 2, 3})]
+        public void TestMethodWithParamsArgument(params int[] n)
+        {
+        }
+
+//		[Test]
+//		public abstract void AbstractTestMethod() { }
+
+		[Test]
+		protected void ProtectedTestMethod() { }
+
+		[Test]
+		private void PrivateTestMethod() { }
+
+		[Test]
+		public bool TestMethodWithReturnType() 
+		{
+			return true;
+		}
+	}
+}
diff --git a/src/tests/test-assembly/TheoryFixture.cs b/src/tests/test-assembly/TheoryFixture.cs
new file mode 100644
index 0000000..77974b9
--- /dev/null
+++ b/src/tests/test-assembly/TheoryFixture.cs
@@ -0,0 +1,65 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+
+namespace NUnit.TestData
+{
+    [TestFixture]
+    public class TheoryFixture
+    {
+        [Datapoint]
+        internal int i0 = 0;
+        [Datapoint]
+        internal static int i1 = 1;
+        [Datapoint]
+        public int i100 = 100;
+
+        private void Dummy()
+        {
+        }
+
+        [Theory]
+        public void TheoryWithNoArguments()
+        {
+        }
+
+        [Theory]
+        public void TheoryWithArgumentsButNoDatapoints(decimal x, decimal y)
+        {
+        }
+
+        [Theory]
+        public void TheoryWithArgumentsAndDatapoints(int x, int y)
+        {
+        }
+
+        [TestCase(5, 10)]
+        [TestCase(3, 12)]
+        public void TestWithArguments(int x, int y)
+        {
+        }
+
+        [Theory]
+        public void TestWithBooleanArguments(bool a, bool b)
+        {
+        }
+
+        [Theory]
+        public void TestWithEnumAsArgument(System.Threading.ApartmentState state)
+        {
+        }
+
+        [Theory]
+        public void TestWithAllBadValues(
+            [Values(-12.0, -4.0, -9.0)] double d)
+        {
+            Assume.That(d > 0);
+            Assert.Pass();
+        }
+    }
+}
diff --git a/src/tests/test-assembly/ThreadingFixture.cs b/src/tests/test-assembly/ThreadingFixture.cs
new file mode 100644
index 0000000..cf8d1ce
--- /dev/null
+++ b/src/tests/test-assembly/ThreadingFixture.cs
@@ -0,0 +1,39 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using NUnit.Framework;
+
+namespace NUnit.TestData
+{
+    [TestFixture]
+    public class ThreadingFixture
+    {
+        [Test, Timeout(50)]
+        public void InfiniteLoopWith50msTimeout()
+        {
+            while (true) { }
+        }
+		
+		[Test, RequiresThread]
+		public void MethodWithThreeAsserts()
+		{
+			Assert.True(true);
+			Assert.True(true);
+			Assert.True(true);
+		}
+    }
+
+    [TestFixture, Timeout(50)]
+    public class ThreadingFixtureWithTimeout
+    {
+        [Test]
+        public void Test1() { }
+        [Test]
+        public void Test2WithInfiniteLoop() { while (true) { } }
+        [Test]
+        public void Test3() { }
+    }
+}
diff --git a/src/tests/test-assembly/TypeHelperFixture.cs b/src/tests/test-assembly/TypeHelperFixture.cs
new file mode 100644
index 0000000..ff8b1b8
--- /dev/null
+++ b/src/tests/test-assembly/TypeHelperFixture.cs
@@ -0,0 +1,86 @@
+using System;
+using System.Collections;
+#if NET_2_0
+using System.Collections.Generic;
+#endif
+using NUnit.Framework;
+
+public class MyNoNamespaceClass { }
+
+namespace NUnit.TestData.TypeHelperFixture
+{
+    // NOTE: TestFixture attributes are not used by the unit tests but
+    // are provided so these class may be loaded in the NUnit gui
+    // for inspection.
+
+    [TestFixture]
+    public class SimpleClass
+    {
+    }
+
+    public class ContainerClass
+    {
+        public class NestedClass
+        {
+            [TestFixture]
+            public class DoublyNestedClass { }
+
+#if NET_2_0
+            [TestFixture(typeof(long))]
+            public class DoublyNestedGeneric<T> { }
+#endif
+        }
+
+#if NET_2_0
+        public class NestedGeneric<T>
+        {
+            [TestFixture(typeof(int))]
+            public class DoublyNestedClass { }
+
+            [TestFixture(typeof(int),typeof(string))]
+            public class DoublyNestedGeneric<U>
+            {
+            }
+        }
+#endif
+    }
+
+#if NET_2_0
+    [TestFixture(typeof(int[]))]
+    [TestFixture(typeof(List<int>))]
+    [TestFixture(typeof(List<string>))]
+    [TestFixture(typeof(List<List<int>>))]
+    public class ListTester<TList> where TList : System.Collections.IList
+    {
+    }
+
+    [TestFixture(typeof(int), typeof(decimal), typeof(string))]
+    public class GenericClass<T, U, V>
+    {
+    }
+
+    public class GenericContainerClass<T>
+    {
+        public class NestedClass
+        {
+            [TestFixture(typeof(int[]))]
+            public class DoublyNestedClass { }
+
+            [TestFixture(typeof(int), typeof(string))]
+            [TestFixture(typeof(long), typeof(string))]
+            public class DoublyNestedGeneric<U> { }
+        }
+
+        public class NestedGeneric<U>
+        {
+            [TestFixture(typeof(string), typeof(int))]
+            public class DoublyNestedClass { }
+
+            [TestFixture(typeof(string), typeof(int), typeof(bool))]
+            public class DoublyNestedGeneric<V>
+            {
+            }
+        }
+    }
+#endif
+}
diff --git a/src/tests/test-assembly/UnhandledExceptions.cs b/src/tests/test-assembly/UnhandledExceptions.cs
index 888767e..f7ef5e1 100644
--- a/src/tests/test-assembly/UnhandledExceptions.cs
+++ b/src/tests/test-assembly/UnhandledExceptions.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/tests/test-assembly/test-assembly.build b/src/tests/test-assembly/test-assembly.build
index 711b943..4730a4c 100644
--- a/src/tests/test-assembly/test-assembly.build
+++ b/src/tests/test-assembly/test-assembly.build
@@ -1,47 +1,68 @@
 <?xml version="1.0"?>
 <project name="TestAssembly" default="build" basedir=".">
 
+  <patternset id="source-files">
+    <include name="AttributeDescriptionTests.cs"/>
+    <include name="AttributeInheritance.cs"/>
+    <include name="CategoryAttributeTests.cs"/>
+    <include name="ConsoleRunnerTest.cs"/>
+    <include name="CultureAttributeTests.cs"/>
+    <include name="DatapointFixture.cs"/>
+    <include name="DirectoryChangeFixture.cs"/>
+    <include name="ExpectExceptionTest.cs"/>
+    <include name="FailFixtureTests.cs"/>
+    <include name="FixtureSetUpTearDownTests.cs"/>
+    <include name="IgnoreFixtureTests.cs"/>
+    <include name="LegacySuiteData.cs"/>
+    <include name="MaxTimeFixture.cs"/>
+    <include name="ParameterizedTestFixture.cs"/>
+    <include name="ParameterizedTestMethodFixture.cs"/>
+    <include name="PropertyAttributeTests.cs"/>
+    <include name="RepeatedTestFixtureTests.cs"/>
+    <include name="SetupFixtureTests.cs"/>
+    <include name="SetUpTest.cs"/>
+    <include name="TestCaseAttributeFixture.cs"/>
+    <include name="TestCaseSourceAttributeFixture.cs"/>
+    <include name="TestCaseTest.cs"/>
+    <include name="TestContextData.cs"/>
+    <include name="TestData.cs"/>
+    <include name="TestFixtureBuilderTests.cs"/>
+    <include name="TestFixtureData.cs"/>
+    <include name="TestFixtureExtensionTests.cs"/>
+    <include name="TestMethodSignatureFixture.cs"/>
+    <include name="TheoryFixture.cs"/>
+    <include name="ThreadingFixture.cs"/>
+    <include name="TypeHelperFixture.cs"/>
+    <include name="UnhandledExceptions.cs"/>
+  </patternset>
+
   <target name="build">
     <csc target="library" 
-        output="${current.build.dir}/test-assembly.dll" 
+        output="${current.test.dir}/test-assembly.dll" 
         debug="${build.debug}" define="${build.defines}">
       <sources>
-        <include name="AttributeDescriptionTests.cs"/>
-        <include name="CategoryAttributeTests.cs"/>
-        <include name="ConsoleRunnerTest.cs"/>
-        <include name="CultureAttributeTests.cs"/>
-        <include name="ExpectExceptionTest.cs"/>
-        <include name="FailFixtureTests.cs"/>
-        <include name="FixtureSetUpTearDownTests.cs"/>
-        <include name="IgnoreFixtureTests.cs"/>
-        <include name="PropertyAttributeTests.cs"/>
-        <include name="RepeatedTestFixtureTests.cs"/>
-        <include name="SetupFixtureTests.cs"/>
-        <include name="SetUpTest.cs"/>
-        <include name="SuiteBuilderTests.cs"/>
-        <include name="TestCaseTest.cs"/>
-        <include name="TestData.cs"/>
-        <include name="TestFixtureBuilderTests.cs"/>
-        <include name="TestFixtureExtensionTests.cs"/>
-        <include name="TestFixtureTests.cs"/>
-        <include name="UnhandledExceptions.cs"/>
-        <include name="../../CommonAssemblyInfo.cs"/>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
       </sources>
       <nowarn>
         <warning number="618,672"/>
       </nowarn>
-      <references basedir="${current.build.dir}">
-        <include name="nunit.framework.dll"/>
-        <include name="nunit.core.interfaces.dll"/>
-        <include name="nunit.core.dll"/>
-        <include name="nunit.framework.extensions.dll"/>
+      <references>
+        <include name="${current.framework.dir}/nunit.framework.dll"/>
+        <include name="${current.framework.dir}/nunit.framework.extensions.dll"/>
+        <include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
+        <include name="${current.lib.dir}/nunit.core.dll"/>
       </references>
     </csc>
   </target>
 
   <target name="package">
     <copy todir="${package.src.dir}/tests/test-assembly">
-      <fileset refid="source-files" />
+      <fileset>
+        <patternset refid="source-files" />
+        <include name="test-assembly.csproj"/>
+        <include name="test-assembly.build"/>
+      </fileset>
     </copy>
   </target>
 
diff --git a/src/tests/test-assembly/test-assembly.csproj b/src/tests/test-assembly/test-assembly.csproj
index 11daefd..937a8ba 100644
--- a/src/tests/test-assembly/test-assembly.csproj
+++ b/src/tests/test-assembly/test-assembly.csproj
@@ -1,216 +1,169 @@
-<VisualStudioProject>
-    <CSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{1960CAC4-9A82-47C5-A9B3-55BC37572C3C}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = ""
-                AssemblyKeyContainerName = ""
-                AssemblyName = "test-assembly"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "Library"
-                PreBuildEvent = ""
-                PostBuildEvent = ""
-                RootNamespace = "NUnit.TestData"
-                RunPostBuildEvent = "OnBuildSuccess"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "true"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = "618,672"
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-                <Config
-                    Name = "Release"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "false"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = "618,672"
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "System"
-                    AssemblyName = "System"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.dll"
-                />
-                <Reference
-                    Name = "System.Data"
-                    AssemblyName = "System.Data"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Data.dll"
-                />
-                <Reference
-                    Name = "System.XML"
-                    AssemblyName = "System.Xml"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.XML.dll"
-                />
-                <Reference
-                    Name = "nunit.framework.dll"
-                    Project = "{83DD7E12-A705-4DBA-9D71-09C8973D9382}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.core.dll"
-                    Project = "{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.framework.extensions.dll"
-                    Project = "{486C498D-B9F8-477F-ACA7-CED9245BBFCF}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.core.interfaces.dll"
-                    Project = "{435428F8-5995-4CE4-8022-93D595A8CC0F}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-            </References>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "AttributeDescriptionTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "AttributeInheritance.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CategoryAttributeTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CommonAssemblyInfo.cs"
-                    Link = "..\..\CommonAssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ConsoleRunnerTest.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CultureAttributeTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ExpectExceptionTest.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "FailFixtureTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "FixtureSetUpTearDownTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "IgnoreFixtureTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "PropertyAttributeTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "RepeatedTestFixtureTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SetupFixtureTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SetUpTest.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SuiteBuilderTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestCaseTest.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestData.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestFixtureBuilderTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestFixtureExtensionTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestFixtureTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "UnhandledExceptions.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-            </Include>
-        </Files>
-    </CSHARP>
-</VisualStudioProject>
-
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{1960CAC4-9A82-47C5-A9B3-55BC37572C3C}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>test-assembly</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.TestData</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <PublishUrl>http://localhost/test-assembly/</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Web</InstallFrom>
+    <UpdateEnabled>true</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>true</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG;NET_2_0;CS_3_0</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>618,672</NoWarn>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;NET_2_0</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>618,672</NoWarn>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
+      <Name>nunit.core.dll</Name>
+      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
+      <Name>nunit.core.interfaces.dll</Name>
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
+      <Name>nunit.framework.dll</Name>
+      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\nonamespace-assembly\nonamespace-assembly.csproj">
+      <Project>{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}</Project>
+      <Name>nonamespace-assembly</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="AttributeDescriptionTests.cs" />
+    <Compile Include="AttributeInheritance.cs" />
+    <Compile Include="CategoryAttributeTests.cs" />
+    <Compile Include="ConsoleRunnerTest.cs" />
+    <Compile Include="CultureAttributeTests.cs" />
+    <Compile Include="DatapointFixture.cs" />
+    <Compile Include="ExpectExceptionTest.cs" />
+    <Compile Include="FailFixtureTests.cs" />
+    <Compile Include="FixtureSetUpTearDownTests.cs" />
+    <Compile Include="IgnoreFixtureTests.cs" />
+    <Compile Include="LegacySuiteData.cs" />
+    <Compile Include="MaxTimeFixture.cs" />
+    <Compile Include="ParameterizedTestFixture.cs" />
+    <Compile Include="PropertyAttributeTests.cs" />
+    <Compile Include="RepeatedTestFixtureTests.cs" />
+    <Compile Include="SetupFixtureTests.cs" />
+    <Compile Include="SetUpTest.cs" />
+    <Compile Include="TestCaseAttributeFixture.cs" />
+    <Compile Include="TestCaseSourceAttributeFixture.cs" />
+    <Compile Include="TestCaseTest.cs" />
+    <Compile Include="TestContextData.cs" />
+    <Compile Include="TestData.cs" />
+    <Compile Include="TestFixtureBuilderTests.cs" />
+    <Compile Include="TestFixtureData.cs" />
+    <Compile Include="TestFixtureExtensionTests.cs" />
+    <Compile Include="TestMethodSignatureFixture.cs" />
+    <Compile Include="TheoryFixture.cs" />
+    <Compile Include="ThreadingFixture.cs" />
+    <Compile Include="TypeHelperFixture.cs" />
+    <Compile Include="UnhandledExceptions.cs" />
+    <Compile Include="DirectoryChangeFixture.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="test-assembly.build" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/tests/test-assembly/test-assembly_VS2005.csproj b/src/tests/test-assembly/test-assembly_VS2005.csproj
deleted file mode 100644
index 225e531..0000000
--- a/src/tests/test-assembly/test-assembly_VS2005.csproj
+++ /dev/null
@@ -1,160 +0,0 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>8.0.50727</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{1960CAC4-9A82-47C5-A9B3-55BC37572C3C}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ApplicationIcon>
-    </ApplicationIcon>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>test-assembly</AssemblyName>
-    <AssemblyOriginatorKeyFile>
-    </AssemblyOriginatorKeyFile>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.TestData</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <StartupObject>
-    </StartupObject>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug2005|AnyCPU' ">
-    <OutputPath>bin\Debug2005\</OutputPath>
-    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
-    <BaseAddress>285212672</BaseAddress>
-    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <DebugSymbols>true</DebugSymbols>
-    <FileAlignment>4096</FileAlignment>
-    <NoStdLib>false</NoStdLib>
-    <NoWarn>618,672</NoWarn>
-    <Optimize>false</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>full</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release2005|AnyCPU' ">
-    <OutputPath>bin\Release2005\</OutputPath>
-    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
-    <BaseAddress>285212672</BaseAddress>
-    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <DebugSymbols>false</DebugSymbols>
-    <FileAlignment>4096</FileAlignment>
-    <NoStdLib>false</NoStdLib>
-    <NoWarn>618,672</NoWarn>
-    <Optimize>true</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>none</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll_VS2005.csproj">
-      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
-      <Name>nunit.core.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll_VS2005.csproj">
-      <Project>{DCC88998-255A-4247-B658-71DD932E9873}</Project>
-      <Name>nunit.core.interfaces.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitExtensions\framework\nunit.framework.extensions.dll_VS2005.csproj">
-      <Project>{486C498D-B9F8-477F-ACA7-CED9245BBFCF}</Project>
-      <Name>nunit.framework.extensions.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll_VS2005.csproj">
-      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
-      <Name>nunit.framework.dll_VS2005</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="AttributeDescriptionTests.cs" />
-    <Compile Include="CategoryAttributeTests.cs" />
-    <Compile Include="ConsoleRunnerTest.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="CultureAttributeTests.cs" />
-    <Compile Include="ExpectExceptionTest.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="FailFixtureTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="FixtureSetUpTearDownTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="IgnoreFixtureTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="PropertyAttributeTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="RepeatedTestFixtureTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="SetupFixtureTests.cs" />
-    <Compile Include="SetUpTest.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="SuiteBuilderTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestCaseTest.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestData.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestFixtureBuilderTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestFixtureExtensionTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestFixtureTests.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="UnhandledExceptions.cs" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
-</Project>
\ No newline at end of file
diff --git a/src/tests/test-utilities/FormTester.cs b/src/tests/test-utilities/FormTester.cs
index 6d81d77..16d93aa 100644
--- a/src/tests/test-utilities/FormTester.cs
+++ b/src/tests/test-utilities/FormTester.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/tests/test-utilities/MockTestEventSource.cs b/src/tests/test-utilities/MockTestEventSource.cs
index dcebee0..2d0c883 100644
--- a/src/tests/test-utilities/MockTestEventSource.cs
+++ b/src/tests/test-utilities/MockTestEventSource.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // This is free software licensed under the NUnit license. You
 // may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
+// copyright ownership at http://nunit.org.
 // ****************************************************************
 
 using System;
@@ -12,58 +12,105 @@ using NUnit.Util;
 namespace NUnit.TestUtilities
 {
 	/// <summary>
-	/// Summary description for MockUiEventSource.
+	/// Summary description for MockTestEventSource.
 	/// </summary>
-	public class MockTestEventSource : TestEventDispatcher
+	public class MockTestEventSource : TestEventDispatcher, EventListener
 	{
 		//private string testFileName;
-		private TestNode test;
+		private TestSuite suite;
 
-		public MockTestEventSource( TestNode test )
+		public MockTestEventSource( TestSuite suite )
 		{
-			this.test = test;
+			this.suite = suite;
 			//this.testFileName = testFileName;
 		}
 
 		public void SimulateTestRun()
 		{
-			FireRunStarting( test.TestName.FullName, test.TestCount );
+			FireRunStarting( suite.TestName.FullName, suite.TestCount );
 
-			TestResult result = SimulateTest( test, false );
+			//TestResult result = SimulateTest( fixture, RunState.Runnable );
+            TestResult result = suite.Run(this, TestFilter.Empty);
 
 			FireRunFinished( result );
 		}
 
-		private TestResult SimulateTest( TestNode test, bool ignore )
+//		private TestResult SimulateTest( Test test, RunState parentState )
+//		{
+//			if ( test.IsSuite && test.RunState != RunState.Explicit )
+//			{
+//				FireSuiteStarting( test.TestName );
+//
+//				TestResult result = new TestResult( test );
+//
+//				foreach( TestNode childTest in test.Tests )
+//					result.AddResult( SimulateTest( childTest, test.RunState ) );
+//
+//				FireSuiteFinished( result );
+//
+//				return result;
+//			}
+//			else
+//			{
+//				FireTestStarting( test.TestName );
+//				
+//				TestResult result = new TestResult( test );
+//
+//				result.RunState = parentState == RunState.Runnable ? RunState.Executed : parentState;
+//				
+//				FireTestFinished( result );
+//
+//				return result;
+//			}
+//		}
+
+		#region EventListener Members
+
+		void EventListener.TestStarted(TestName testName)
+		{
+			this.FireTestStarting( testName );
+		}
+
+		void EventListener.RunStarted(string name, int testCount)
 		{
-			if ( test.RunState != RunState.Runnable )
-				ignore = true;
+			this.FireRunStarting( name, testCount );
+		}
 
-			if ( test.IsSuite )
-			{
-				FireSuiteStarting( test.TestName );
+		void EventListener.RunFinished(Exception exception)
+		{
+			this.FireRunFinished(exception);
+		}
 
-				TestSuiteResult result = new TestSuiteResult( test, test.TestName.Name );
+		void EventListener.RunFinished(TestResult result)
+		{
+			this.FireRunFinished(result);
+		}
 
-				foreach( TestNode childTest in test.Tests )
-					result.AddResult( SimulateTest( childTest, ignore ) );
+		void EventListener.SuiteFinished(TestResult result)
+		{
+			this.FireSuiteFinished(result);
+		}
 
-				FireSuiteFinished( result );
+		void EventListener.TestFinished(TestResult result)
+		{
+			this.FireTestFinished(result);
+		}
 
-				return result;
-			}
-			else
-			{
-				FireTestStarting( test.TestName );
-				
-				TestCaseResult result = new TestCaseResult( test );
+		void EventListener.UnhandledException(Exception exception)
+		{
+			this.FireRunFinished(exception);
+		}
 
-				result.RunState = ignore ? RunState.Ignored : RunState.Executed;
-				
-				FireTestFinished( result );
+		void EventListener.TestOutput(TestOutput testOutput)
+		{
+			this.FireTestOutput(testOutput);
+		}
 
-				return result;
-			}
+		void EventListener.SuiteStarted(TestName testName)
+		{
+			this.FireSuiteStarting(testName);
 		}
+
+		#endregion
 	}
 }
diff --git a/src/tests/test-utilities/TempResourceFile.cs b/src/tests/test-utilities/TempResourceFile.cs
index 9fd1fe6..cc4c94a 100644
--- a/src/tests/test-utilities/TempResourceFile.cs
+++ b/src/tests/test-utilities/TempResourceFile.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 namespace NUnit.TestUtilities
diff --git a/src/tests/test-utilities/TempTestAssembly.cs b/src/tests/test-utilities/TempTestAssembly.cs
deleted file mode 100644
index 4ae8d77..0000000
--- a/src/tests/test-utilities/TempTestAssembly.cs
+++ /dev/null
@@ -1,43 +0,0 @@
-using System;
-using System.IO;
-
-namespace NUnit.TestUtilities
-{
-	/// <summary>
-	/// Summary description for TempTestAssembly.
-	/// </summary>
-	public class TempTestAssembly : IDisposable
-	{
-		string code;
-		string name;
-		string path;
-
-		public TempTestAssembly( string code ) : this( code, "test.dll" ) { }
-
-		public TempTestAssembly( string code, string name ) : this( code, name, name ) { }
-
-		public TempTestAssembly( string code, string name, string path )
-		{
-			this.code = code;
-			this.name = name;
-			this.path = path;
-		}
-
-		public void Dispose()
-		{
-			File.Delete( this.path );
-
-			string path = this.path;
-			while(true)
-			{
-				path = Path.GetDirectoryName(path);
-				if(path == null || path.Length == 0 || Directory.GetFiles(path).Length > 0)
-				{
-					break;
-				}
-
-				Directory.Delete(path);
-			}
-		}
-	}
-}
diff --git a/src/tests/test-utilities/TestAssert.cs b/src/tests/test-utilities/TestAssert.cs
new file mode 100644
index 0000000..2468c1c
--- /dev/null
+++ b/src/tests/test-utilities/TestAssert.cs
@@ -0,0 +1,71 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Core;
+using NUnit.Framework;
+
+namespace NUnit.TestUtilities
+{
+    public class TestAssert
+    {
+        #region IsRunnable
+        public static void IsRunnable(Test test)
+        {
+            Assert.AreEqual(RunState.Runnable, test.RunState);
+        }
+
+        public static void IsRunnable(Type type)
+        {
+            TestSuite suite = TestBuilder.MakeFixture(type);
+            Assert.AreEqual(RunState.Runnable, suite.RunState);
+            TestResult result = suite.Run(NullListener.NULL, TestFilter.Empty);
+            Assert.AreEqual(ResultState.Success, result.ResultState);
+        }
+
+        public static void IsRunnable(Type type, string name)
+        {
+            IsRunnable(type, name, ResultState.Success);
+        }
+
+        public static void IsRunnable(Type type, string name, ResultState resultState)
+        {
+            Test test = TestBuilder.MakeTestCase(type, name);
+            Assert.That(test.RunState, Is.EqualTo(RunState.Runnable));
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            if (result.HasResults)
+                result = (TestResult)result.Results[0];
+            Assert.That(result.ResultState, Is.EqualTo(resultState));
+        }
+        #endregion
+
+        #region IsNotRunnable
+        public static void IsNotRunnable(Test test)
+        {
+            Assert.AreEqual(RunState.NotRunnable, test.RunState);
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            Assert.AreEqual(ResultState.NotRunnable, result.ResultState);
+        }
+
+        public static void IsNotRunnable(Type type)
+        {
+            IsNotRunnable(TestBuilder.MakeFixture(type));
+        }
+
+        public static void IsNotRunnable(Type type, string name)
+        {
+            IsNotRunnable(TestBuilder.MakeTestCase(type, name));
+        }
+
+        public static void ChildNotRunnable(Type type, string name)
+        {
+            IsNotRunnable((Test)TestBuilder.MakeTestCase(type, name).Tests[0]);
+        }
+        #endregion
+        
+        private TestAssert() { }
+    }
+}
diff --git a/src/tests/test-utilities/TestBuilder.cs b/src/tests/test-utilities/TestBuilder.cs
index 681c0f3..c270190 100644
--- a/src/tests/test-utilities/TestBuilder.cs
+++ b/src/tests/test-utilities/TestBuilder.cs
@@ -1,13 +1,15 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
 using System.Reflection;
+using NUnit.Framework;
 using NUnit.Core;
 using NUnit.Core.Builders;
+using NUnit.Core.Extensibility;
 
 namespace NUnit.TestUtilities
 {
@@ -16,49 +18,49 @@ namespace NUnit.TestUtilities
 	/// </summary>
 	public class TestBuilder
 	{
-		private static NUnitTestFixtureBuilder suiteBuilder = new NUnitTestFixtureBuilder();
-		private static NUnitTestCaseBuilder testBuilder = new NUnitTestCaseBuilder();
+		private static ISuiteBuilder suiteBuilder = (ISuiteBuilder)CoreExtensions.Host.GetExtensionPoint("SuiteBuilders");
+        private static ITestCaseBuilder testBuilder = (ITestCaseBuilder)CoreExtensions.Host.GetExtensionPoint("TestCaseBuilders");
 
-		public static NUnitTestFixture MakeFixture( Type type )
+		public static TestSuite MakeFixture( Type type )
 		{
-			return (NUnitTestFixture)suiteBuilder.BuildFrom( type );
+			return (TestSuite)suiteBuilder.BuildFrom( type );
 		}
 
-		public static NUnitTestFixture MakeFixture( object fixture )
+		public static TestSuite MakeFixture( object fixture )
 		{
-			NUnitTestFixture suite = (NUnitTestFixture)suiteBuilder.BuildFrom( fixture.GetType() );
+			TestSuite suite = (TestSuite)suiteBuilder.BuildFrom( fixture.GetType() );
 			suite.Fixture = fixture;
 			return suite;
 		}
 
-		public static NUnitTestMethod MakeTestCase( Type type, string methodName )
+		public static Test MakeTestCase( Type type, string methodName )
 		{
-			return (NUnitTestMethod)testBuilder.BuildFrom( Reflect.GetNamedMethod( 
-				type,
-				methodName,
-				BindingFlags.Public | BindingFlags.Instance ) );
-		}
+            MethodInfo method = Reflect.GetNamedMethod(type, methodName);
+            if (method == null)
+                Assert.Fail("Method not found: " + methodName);
+            return testBuilder.BuildFrom(method);
+        }
 
-		public static NUnitTestMethod MakeTestCase( object fixture, string methodName )
+		public static Test MakeTestCase( object fixture, string methodName )
 		{
-			NUnitTestMethod test = MakeTestCase( fixture.GetType(), methodName );
+			Test test = MakeTestCase( fixture.GetType(), methodName );
 			test.Fixture = fixture;
 			return test;
 		}
 
 		public static TestResult RunTestFixture( Type type )
 		{
-			return MakeFixture( type ).Run( NullListener.NULL );
+            return MakeFixture(type).Run(NullListener.NULL, TestFilter.Empty);
 		}
 
 		public static TestResult RunTestFixture( object fixture )
 		{
-			return MakeFixture( fixture ).Run( NullListener.NULL );
+            return MakeFixture(fixture).Run(NullListener.NULL, TestFilter.Empty);
 		}
 
 		public static TestResult RunTestCase( Type type, string methodName )
 		{
-			return MakeTestCase( type, methodName ).Run( NullListener.NULL );
+            return MakeTestCase(type, methodName).Run(NullListener.NULL, TestFilter.Empty);
 		}
 
 		private TestBuilder() { }
diff --git a/src/tests/test-utilities/TestFinder.cs b/src/tests/test-utilities/TestFinder.cs
index a82ee5c..c6be64b 100644
--- a/src/tests/test-utilities/TestFinder.cs
+++ b/src/tests/test-utilities/TestFinder.cs
@@ -1,11 +1,12 @@
 // ****************************************************************
 // Copyright 2007, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
 using NUnit.Core;
+using NUnit.Framework;
 
 namespace NUnit.TestUtilities
 {
@@ -14,43 +15,47 @@ namespace NUnit.TestUtilities
 	/// </summary>
 	public class TestFinder
 	{
-		public static Test Find(string name, Test test)
+		public static Test Find(string name, Test test, bool recursive)
 		{
-			Test result = null;
-			if (test.TestName.Name == name)
-				result = test;
-			else if (test.Tests != null)
+			if (test.Tests != null)
 			{
-				foreach(Test t in test.Tests) 
+				foreach(Test child in test.Tests) 
 				{
-					result = Find(name, t);
-					if (result != null)
-						break;
+                    if (child.TestName.Name == name)
+                        return child;
+                    if (recursive)
+                    {
+                        Test grandchild = Find(name, child, true);
+                        if (grandchild != null)
+                            return grandchild;
+                    }
 				}
 			}
 
-			return result;
+			return null;
 		}
 		
-		public static TestResult Find(string name, TestResult result) 
+		public static TestResult Find(string name, TestResult result, bool recursive) 
 		{
-			if (result.Test.TestName.Name == name)
-				return result;
-
-			TestSuiteResult suiteResult = result as TestSuiteResult;
-			if ( suiteResult != null )
+			if ( result.HasResults )
 			{
-				foreach( TestResult r in suiteResult.Results ) 
+                foreach (TestResult childResult in result.Results) 
 				{
-					TestResult myResult = Find( name, r );
-					if ( myResult != null )
-						return myResult;
+                    if (childResult.Test.TestName.Name == name)
+                        return childResult;
+
+                    if (recursive)
+                    {
+                        TestResult r = Find(name, childResult, true);
+                        if (r != null)
+                            return r;
+                    }
 				}
 			}
 
 			return null;
 		}
 
-		private TestFinder() { }
+        private TestFinder() { }
 	}
 }
diff --git a/src/tests/test-utilities/test-utilities.build b/src/tests/test-utilities/test-utilities.build
index 671ed5d..956d4e7 100644
--- a/src/tests/test-utilities/test-utilities.build
+++ b/src/tests/test-utilities/test-utilities.build
@@ -1,31 +1,40 @@
 <?xml version="1.0"?>
 <project name="TestUtilities" default="build" basedir=".">
 
-  <target name="build">
-    <csc target="library" 
-        output="${current.build.dir}/test-utilities.dll" 
-        debug="${build.debug}" define="${build.defines}">
-      <sources>
+  <patternset id="source-files">
         <include name="FormTester.cs"/>
         <include name="MockTestEventSource.cs"/>
         <include name="TempResourceFile.cs"/>
+        <include name="TestAssert.cs"/>
         <include name="TestBuilder.cs"/>
         <include name="TestFinder.cs"/>
-        <include name="../../CommonAssemblyInfo.cs"/>
+  </patternset>
+
+  <target name="build">
+    <csc target="library" 
+        output="${current.test.dir}/test-utilities.dll" 
+        debug="${build.debug}" define="${build.defines}">
+      <sources>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
       </sources>
-      <references basedir="${current.build.dir}">
+      <references>
         <include name="System.Windows.Forms.dll"/>
-        <include name="nunit.framework.dll"/>
-        <include name="nunit.core.interfaces.dll"/>
-        <include name="nunit.core.dll"/>
-        <include name="nunit.util.dll"/>
+        <include name="${current.framework.dir}/nunit.framework.dll"/>
+        <include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
+        <include name="${current.lib.dir}/nunit.core.dll"/>
+        <include name="${current.lib.dir}/nunit.util.dll"/>
       </references>
     </csc>
   </target>
 
   <target name="package">
     <copy todir="${package.src.dir}/tests/test-utilities">
-      <fileset refid="source-files" />
+      <fileset>
+        <patternset refid="source-files"/>
+        <include name="test-utilities.csproj"/>
+        <include name="test-utilities.build"/>
+      </fileset>
     </copy>
   </target>
 
diff --git a/src/tests/test-utilities/test-utilities.csproj b/src/tests/test-utilities/test-utilities.csproj
index 3599af9..7378bbf 100644
--- a/src/tests/test-utilities/test-utilities.csproj
+++ b/src/tests/test-utilities/test-utilities.csproj
@@ -1,146 +1,116 @@
-<VisualStudioProject>
-    <CSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = ""
-                AssemblyKeyContainerName = ""
-                AssemblyName = "nunit.testutilities"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "Library"
-                PreBuildEvent = ""
-                PostBuildEvent = ""
-                RootNamespace = "NUnit.TestUtilities"
-                RunPostBuildEvent = "OnBuildSuccess"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "true"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "true"
-                    NoStdLib = "false"
-                    NoWarn = "618, 672"
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-                <Config
-                    Name = "Release"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "false"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = "618, 672"
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "System"
-                    AssemblyName = "System"
-                    HintPath = "..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll"
-                />
-                <Reference
-                    Name = "nunit.framework.dll"
-                    Project = "{83DD7E12-A705-4DBA-9D71-09C8973D9382}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.util.dll"
-                    Project = "{61CE9CE5-943E-44D4-A381-814DC1406767}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "System.Windows.Forms"
-                    AssemblyName = "System.Windows.Forms"
-                    HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Windows.Forms.dll"
-                />
-                <Reference
-                    Name = "System.Data"
-                    AssemblyName = "System.Data"
-                    HintPath = "C:\WINNT\Microsoft.NET\Framework\v1.1.4322\System.Data.dll"
-                />
-                <Reference
-                    Name = "System.XML"
-                    AssemblyName = "System.Xml"
-                    HintPath = "C:\WINNT\Microsoft.NET\Framework\v1.1.4322\System.XML.dll"
-                />
-                <Reference
-                    Name = "nunit.core.dll"
-                    Project = "{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.core.interfaces.dll"
-                    Project = "{435428F8-5995-4CE4-8022-93D595A8CC0F}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-            </References>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "CommonAssemblyInfo.cs"
-                    Link = "..\..\CommonAssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "FormTester.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "MockTestEventSource.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TempResourceFile.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestBuilder.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "TestFinder.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-            </Include>
-        </Files>
-    </CSHARP>
-</VisualStudioProject>
-
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>test-utilities</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.TestUtilities</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>618, 672</NoWarn>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>618, 672</NoWarn>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Windows.Forms">
+      <Name>System.Windows.Forms</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
+      <Name>nunit.util.dll</Name>
+      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
+      <Name>nunit.core.dll</Name>
+      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
+      <Name>nunit.core.interfaces.dll</Name>
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
+      <Name>nunit.framework.dll</Name>
+      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="FormTester.cs" />
+    <Compile Include="MockTestEventSource.cs" />
+    <Compile Include="TempResourceFile.cs" />
+    <Compile Include="TestAssert.cs" />
+    <Compile Include="TestBuilder.cs" />
+    <Compile Include="TestFinder.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="test-utilities.build" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/tests/test-utilities/test-utilities_VS2005.csproj b/src/tests/test-utilities/test-utilities_VS2005.csproj
deleted file mode 100644
index 3b0ebdc..0000000
--- a/src/tests/test-utilities/test-utilities_VS2005.csproj
+++ /dev/null
@@ -1,95 +0,0 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>8.0.50727</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ApplicationIcon>
-    </ApplicationIcon>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit.testutilities</AssemblyName>
-    <AssemblyOriginatorKeyFile>
-    </AssemblyOriginatorKeyFile>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.TestUtilities</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <StartupObject>
-    </StartupObject>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release2005|AnyCPU' ">
-    <OutputPath>bin\Release2005\</OutputPath>
-    <DefineConstants>TRACE;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <Optimize>true</Optimize>
-    <NoWarn>618, 672</NoWarn>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug2005|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\Debug2005\</OutputPath>
-    <DefineConstants>TRACE;DEBUG;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <NoWarn>618, 672</NoWarn>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data" />
-    <Reference Include="System.Windows.Forms">
-      <Name>System.Windows.Forms</Name>
-    </Reference>
-    <Reference Include="System.Xml" />
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="FormTester.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="MockTestEventSource.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TempResourceFile.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="TestBuilder.cs" />
-    <Compile Include="TestFinder.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll_VS2005.csproj">
-      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
-      <Name>nunit.util.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll_VS2005.csproj">
-      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
-      <Name>nunit.core.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll_VS2005.csproj">
-      <Project>{DCC88998-255A-4247-B658-71DD932E9873}</Project>
-      <Name>nunit.core.interfaces.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll_VS2005.csproj">
-      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
-      <Name>nunit.framework.dll_VS2005</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
-</Project>
\ No newline at end of file
diff --git a/src/tests/timing-tests/AssemblyLoadTests.cs b/src/tests/timing-tests/AssemblyLoadTests.cs
index b02f7ac..9e6468e 100644
--- a/src/tests/timing-tests/AssemblyLoadTests.cs
+++ b/src/tests/timing-tests/AssemblyLoadTests.cs
@@ -1,3 +1,8 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
 using System;
 using NUnit.Core;
 using NUnit.Framework;
@@ -12,8 +17,10 @@ namespace NUnit.Tests.TimingTests
         private TestLoader loader;
 
         [TestFixtureSetUp]
-        public void InstallDomainManager()
+        public void InstallServices()
         {
+            if (Services.ProjectService == null)
+                ServiceManager.Services.AddService(new ProjectService());
             if (Services.DomainManager == null)
                 ServiceManager.Services.AddService(new DomainManager());
         }
@@ -34,8 +41,9 @@ namespace NUnit.Tests.TimingTests
             int start = Environment.TickCount;
             Assert.IsTrue(runner.Load(new TestPackage("loadtest-assembly.dll")));
             ITest test = runner.Test;
-            Assert.AreEqual(1000, test.TestCount);
+            Assert.AreEqual(2050, test.TestCount);
             int ms = Environment.TickCount - start;
+            Console.WriteLine("Loaded in {0}ms", ms);
             Assert.LessOrEqual(ms, 4000);
         }
 
@@ -46,8 +54,9 @@ namespace NUnit.Tests.TimingTests
             int start = Environment.TickCount;
             Assert.IsTrue(runner.Load(new TestPackage("loadtest-assembly.dll")));
             ITest test = runner.Test;
-            Assert.AreEqual(1000, test.TestCount);
+            Assert.AreEqual(2050, test.TestCount);
             int ms = Environment.TickCount - start;
+            Console.WriteLine("Loaded in {0}ms", ms);
             Assert.LessOrEqual(ms, 4000);
         }
 
@@ -60,8 +69,9 @@ namespace NUnit.Tests.TimingTests
             Assert.IsTrue(loader.IsProjectLoaded);
             loader.LoadTest();
             Assert.IsTrue(loader.IsTestLoaded);
-            Assert.AreEqual(1000, loader.TestCount);
+            Assert.AreEqual(2050, loader.TestCount);
             int ms = Environment.TickCount - start;
+            Console.WriteLine("Loaded in {0}ms", ms);
             Assert.LessOrEqual(ms, 4000);
         }
     }
diff --git a/src/tests/timing-tests/ClientTimeoutFixture.cs b/src/tests/timing-tests/ClientTimeoutFixture.cs
index 881a4e9..8e310d1 100644
--- a/src/tests/timing-tests/ClientTimeoutFixture.cs
+++ b/src/tests/timing-tests/ClientTimeoutFixture.cs
@@ -1,7 +1,7 @@
 // ****************************************************************
 // Copyright 2002-2003, Charlie Poole
 // This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
 using System;
diff --git a/src/tests/timing-tests/ConsoleOutputTimingFixture.cs b/src/tests/timing-tests/ConsoleOutputTimingFixture.cs
deleted file mode 100644
index 4d0e8cd..0000000
--- a/src/tests/timing-tests/ConsoleOutputTimingFixture.cs
+++ /dev/null
@@ -1,69 +0,0 @@
-using System;
-using NUnit.Framework;
-
-namespace NUnit.Tests.TimingTests
-{
-	/// <summary>
-	/// Summary description for ConsoleOutputTimingFixture.
-	/// </summary>
-	[TestFixture]
-	public class ConsoleOutputTimingFixture
-	{
-		[Test]
-		public void Write1000Lines()
-		{
-			int start = Environment.TickCount;
-			
-			for( int i = 1; i < 1000; ++ i ) 
-			{ 
-				Console.WriteLine( 
-					"Console output line number: {0}", 
-					i ); 
-			}
-
-			int elapsed = Environment.TickCount - start;
-			Console.WriteLine( "*** Elapsed Time: {0} milliseconds", elapsed );
-			Assert.IsTrue( elapsed <=500, string.Format( "Too slow: {0} milliseconds", elapsed ) );
-		}
-
-		[Test]
-		public void Write10000Lines()
-		{
-			int start = Environment.TickCount;
-			
-			for( int i = 1; i < 10000; ++ i ) 
-			{ 
-				Console.WriteLine( 
-					"Console output line number: {0}", 
-					i ); 
-			}
-
-			int elapsed = Environment.TickCount - start;
-			Console.WriteLine( "*** Elapsed Time: {0} milliseconds", elapsed );
-			Assert.IsTrue( elapsed <=5000, string.Format( "Too slow: {0} milliseconds", elapsed ) );
-		}
-
-		[Test]
-		public void Write1000LinesInPieces()
-		{
-			int start = Environment.TickCount;
-			
-			for( int i = 1; i < 1000; ++ i ) 
-			{ 
-				Console.Write( "Console" );
-				Console.Write( ' ' );
-				Console.Write( "output" );
-				Console.Write( ' ' );
-				Console.Write( "line" );
-				Console.Write( ' ' );
-				Console.Write( "number" );
-				Console.Write( ':' );
-				Console.WriteLine( "{0}", i );
-			}
-
-			int elapsed = Environment.TickCount - start;
-			Console.WriteLine( "*** Elapsed Time: {0} milliseconds", elapsed );
-			Assert.IsTrue( elapsed <=500, string.Format( "Too slow: {0} milliseconds", elapsed ) );
-		}
-	}
-}
diff --git a/src/tests/timing-tests/ServerTimeoutFixture.cs b/src/tests/timing-tests/ServerTimeoutFixture.cs
deleted file mode 100644
index a6814da..0000000
--- a/src/tests/timing-tests/ServerTimeoutFixture.cs
+++ /dev/null
@@ -1,70 +0,0 @@
-// ****************************************************************
-// Copyright 2002-2003, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-using System.IO;
-using System.Threading;
-using NUnit.Core;
-using NUnit.Framework;
-using NUnit.Util;
-using NUnit.Tests.Assemblies;
-
-namespace NUnit.Tests.TimingTests
-{
-// This no longer makes sense, since Load no
-// longer returns a reference to the Tests
-//	[TestFixture]
-//	public class ServerTimeoutFixture
-//	{
-//		private TestDomain domain; 
-//		private TestNode test;
-//
-//		// Test using timeout greater than default of five minutes
-//		private readonly TimeSpan timeout = TimeSpan.FromMinutes( 6 );
-//
-//		[SetUp]
-//		public void MakeAppDomain()
-//		{
-//			domain = new TestDomain();
-//			test = domain.Load("mock-assembly.dll");
-//		}
-//
-//		[TearDown]
-//		public void UnloadTestDomain()
-//		{
-//			domain.Unload();
-//			domain = null;
-//		}
-//			
-//		[Test]
-//		public void ServerTimeoutTest()
-//		{
-//			// Delay after loading the test
-//			Thread.Sleep( timeout );
-//
-//			// Copy all the tests from the remote domain
-//			// to verify that Test object is connected.
-//			TestNode node = new TestNode( test, true );
-//			
-//			
-//			// Run the tests, which also verifies that
-//			// RemoteTestRunner has not been disconnected
-//			TestResult result = domain.Run( NullListener.NULL );
-//
-//			// Delay again to let the results "ripen"
-//			Thread.Sleep( timeout );
-//
-//			// Visit the results of the test after another delay
-//			ResultSummarizer summarizer = new ResultSummarizer(result);
-//			Assert.AreEqual(MockAssembly.Tests - MockAssembly.NotRun, summarizer.ResultCount);
-//			Assert.AreEqual(MockAssembly.NotRun, summarizer.TestsNotRun);
-//
-//			// Make sure we can still access the tests
-//			// using the Test property of the result
-//			node = new TestNode( result.Test, true );
-//		}
-//	}
-}
diff --git a/src/tests/timing-tests/timing-tests.build b/src/tests/timing-tests/timing-tests.build
index a790237..2899914 100644
--- a/src/tests/timing-tests/timing-tests.build
+++ b/src/tests/timing-tests/timing-tests.build
@@ -1,29 +1,36 @@
 <?xml version="1.0"?>
 <project name="TimingTests" default="build" basedir=".">
 
+  <patternset id="source-files">
+        <include name="AssemblyLoadTests.cs"/>
+        <include name="ClientTimeoutFixture.cs"/>
+  </patternset>
+
   <target name="build">
     <csc target="library"
-       output="${current.build.dir}/timing-tests.dll">
+       output="${current.test.dir}/timing-tests.dll">
       <sources>
-        <include name="AssemblyInfo.cs"/>
-        <include name="ClientTimeoutFixture.cs"/>
-        <include name="AssemblyLoadTests.cs"/>
-        <include name="../../CommonAssemblyInfo.cs"/>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
       </sources>
-      <references basedir="${current.build.dir}">
-        <include name="loadtest-assembly.dll"/>
-        <include name="nunit.util.dll"/>
-        <include name="nunit.core.dll"/>
-        <include name="nunit.core.interfaces.dll"/>
-        <include name="nunit.framework.dll"/>
-        <include name="mock-assembly.dll"/>
+      <references>
+        <include name="${current.lib.dir}/nunit.util.dll"/>
+        <include name="${current.lib.dir}/nunit.core.dll"/>
+        <include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
+        <include name="${current.framework.dir}/nunit.framework.dll"/>
+        <include name="${current.test.dir}/mock-assembly.dll"/>
+        <include name="${current.test.dir}/loadtest-assembly.dll"/>
       </references>
     </csc>
   </target>
 
   <target name="package">
     <copy todir="${package.src.dir}/tests/timing-tests">
-      <fileset refid="source-files" />
+      <fileset>
+        <patternset refid="source-files"/>
+        <include name="timing-tests.csproj"/>
+        <include name="timing-tests.build"/>
+      </fileset>
     </copy>
   </target>
 
diff --git a/src/tests/timing-tests/timing-tests.csproj b/src/tests/timing-tests/timing-tests.csproj
index c6013ea..29ab2dc 100644
--- a/src/tests/timing-tests/timing-tests.csproj
+++ b/src/tests/timing-tests/timing-tests.csproj
@@ -1,131 +1,117 @@
-<VisualStudioProject>
-    <CSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{F16DED73-A2AD-4711-BC1B-5DDFC2BF8667}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = ""
-                AssemblyKeyContainerName = ""
-                AssemblyName = "timing-tests"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "Library"
-                PreBuildEvent = ""
-                PostBuildEvent = ""
-                RootNamespace = "NUnit.Tests.TimingTests"
-                RunPostBuildEvent = "OnBuildSuccess"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "true"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "true"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-                <Config
-                    Name = "Release"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "false"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "System"
-                    AssemblyName = "System"
-                    HintPath = "E:\WINNT\Microsoft.NET\Framework\v1.0.3705\System.dll"
-                />
-                <Reference
-                    Name = "mock-assembly"
-                    Project = "{2E368281-3BA8-4050-B05E-0E0E43F8F446}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "System.Data"
-                    AssemblyName = "System.Data"
-                    HintPath = "E:\WINNT\Microsoft.NET\Framework\v1.0.3705\System.Data.dll"
-                />
-                <Reference
-                    Name = "System.XML"
-                    AssemblyName = "System.Xml"
-                    HintPath = "E:\WINNT\Microsoft.NET\Framework\v1.0.3705\System.XML.dll"
-                />
-                <Reference
-                    Name = "nunit.util.dll"
-                    Project = "{61CE9CE5-943E-44D4-A381-814DC1406767}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.framework.dll"
-                    Project = "{83DD7E12-A705-4DBA-9D71-09C8973D9382}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.core.dll"
-                    Project = "{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.core.interfaces.dll"
-                    Project = "{435428F8-5995-4CE4-8022-93D595A8CC0F}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-            </References>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "AssemblyLoadTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ClientTimeoutFixture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CommonAssemblyInfo.cs"
-                    Link = "..\..\CommonAssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-            </Include>
-        </Files>
-    </CSHARP>
-</VisualStudioProject>
-
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{F16DED73-A2AD-4711-BC1B-5DDFC2BF8667}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>timing-tests</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.Tests.TimingTests</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
+      <Name>nunit.util.dll</Name>
+      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
+      <Name>nunit.core.dll</Name>
+      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Name>nunit.core.interfaces.dll</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
+      <Name>nunit.framework.dll</Name>
+      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\loadtest-assembly\loadtest-assembly.csproj">
+      <Project>{20ABDB3C-EA46-468A-A574-0552299A32DB}</Project>
+      <Name>loadtest-assembly</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\mock-assembly\mock-assembly.csproj">
+      <Name>mock-assembly</Name>
+      <Project>{2E368281-3BA8-4050-B05E-0E0E43F8F446}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="AssemblyLoadTests.cs" />
+    <Compile Include="ClientTimeoutFixture.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="timing-tests.build" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/src/tests/timing-tests/timing-tests_VS2005.csproj b/src/tests/timing-tests/timing-tests_VS2005.csproj
deleted file mode 100644
index eec83cf..0000000
--- a/src/tests/timing-tests/timing-tests_VS2005.csproj
+++ /dev/null
@@ -1,95 +0,0 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>8.0.50727</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{F16DED73-A2AD-4711-BC1B-5DDFC2BF8667}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ApplicationIcon>
-    </ApplicationIcon>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>timing-tests</AssemblyName>
-    <AssemblyOriginatorKeyFile>
-    </AssemblyOriginatorKeyFile>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.Tests.TimingTests</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <StartupObject>
-    </StartupObject>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release2005|AnyCPU' ">
-    <OutputPath>bin\Release2005\</OutputPath>
-    <DefineConstants>TRACE;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-    <Optimize>true</Optimize>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug2005|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\Debug2005\</OutputPath>
-    <DefineConstants>TRACE;DEBUG;VS2005</DefineConstants>
-    <BaseAddress>285212672</BaseAddress>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="ClientTimeoutFixture.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="AssemblyLoadTests.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll_VS2005.csproj">
-      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
-      <Name>nunit.util.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll_VS2005.csproj">
-      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
-      <Name>nunit.core.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll_VS2005.csproj">
-      <Project>{DCC88998-255A-4247-B658-71DD932E9873}</Project>
-      <Name>nunit.core.interfaces.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll_VS2005.csproj">
-      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
-      <Name>nunit.framework.dll_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\loadtest-assembly\loadtest-assembly_VS2005.csproj">
-      <Project>{34734263-6F6C-403D-AD8C-CE3F8E340EA9}</Project>
-      <Name>loadtest-assembly_VS2005</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\mock-assembly\mock-assembly_VS2005.csproj">
-      <Project>{2E368281-3BA8-4050-B05E-0E0E43F8F446}</Project>
-      <Name>mock-assembly_VS2005</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
-</Project>
\ No newline at end of file
diff --git a/src/ConsoleRunner/nunit-console-exe/App.ico b/tools/src/Gensyntax/App.ico
similarity index 100%
copy from src/ConsoleRunner/nunit-console-exe/App.ico
copy to tools/src/Gensyntax/App.ico
diff --git a/samples/Extensibility/Core/MaxTimeDecorator/AssemblyInfo.cs b/tools/src/Gensyntax/AssemblyInfo.cs
similarity index 100%
rename from samples/Extensibility/Core/MaxTimeDecorator/AssemblyInfo.cs
rename to tools/src/Gensyntax/AssemblyInfo.cs
diff --git a/tools/src/Gensyntax/CodeGenerator.cs b/tools/src/Gensyntax/CodeGenerator.cs
new file mode 100644
index 0000000..9d918ad
--- /dev/null
+++ b/tools/src/Gensyntax/CodeGenerator.cs
@@ -0,0 +1,88 @@
+using System;
+using System.IO;
+using System.Reflection;
+using System.Collections.Generic;
+using System.CodeDom.Compiler;
+
+namespace GenSyntax
+{
+    /// <summary>
+    /// Generates code for a single class
+    /// </summary>
+    class CodeGenerator
+    {
+        private string className;
+        private string fileName;
+        private StreamReader template;
+        private bool isStatic;
+
+        public CodeGenerator(string option)
+        {
+            int eq = option.IndexOf('=');
+            if (eq > 0)
+            {
+                this.className = option.Substring(0, eq);
+                this.fileName = option.Substring(eq + 1);
+            }
+            else
+            {
+                this.className = option;
+                this.fileName = className + ".cs";
+            }
+
+            Assembly assembly = GetType().Assembly;
+            Stream stream = assembly.GetManifestResourceStream("GenSyntax.Templates." + className + ".template.cs");
+            if (stream == null)
+                stream = assembly.GetManifestResourceStream("GenSyntax.Templates.Default.template.cs");
+
+            this.template = new StreamReader(stream);
+        }
+
+        public void GenerateClass()
+        {
+            IndentedTextWriter writer = new IndentedTextWriter(new StreamWriter(this.fileName));
+
+            Console.WriteLine("Generating " + this.fileName);
+
+            WriteFileHeader(writer);
+
+            foreach (Stanza stanza in SyntaxInfo.Instance)
+            {
+                stanza.Generate(writer, this.className, isStatic);
+            }
+
+            WriteFileTrailer(writer);
+
+            writer.Close();
+        }
+
+        private void WriteFileHeader(IndentedTextWriter writer)
+        {
+            string[] argList = Environment.GetCommandLineArgs();
+            argList[0] = Path.GetFileName(argList[0]);
+            string commandLine = string.Join(" ", argList);
+
+            string line = template.ReadLine();
+            while (line != null && line.IndexOf("$$GENERATE$$") < 0)
+            {
+                line = line.Replace("__CLASSNAME__", this.className)
+                           .Replace("__COMMANDLINE__", commandLine);
+                writer.WriteLine(line);
+                line = template.ReadLine();
+            }
+
+            if( line != null && line.IndexOf("$$STATIC$$") >= 0)
+                this.isStatic = true;
+
+            writer.Indent += 2;
+        }
+
+        private void WriteFileTrailer(IndentedTextWriter writer)
+        {
+            writer.Indent -= 2;
+
+            while (!template.EndOfStream)
+                writer.WriteLine(template.ReadLine());
+        }
+    }
+}
diff --git a/tools/src/Gensyntax/GenSpec.cs b/tools/src/Gensyntax/GenSpec.cs
new file mode 100644
index 0000000..59e1c80
--- /dev/null
+++ b/tools/src/Gensyntax/GenSpec.cs
@@ -0,0 +1,109 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace GenSyntax
+{
+    public class GenSpec
+    {
+        private string fullSpec;
+        bool isVoid;
+
+        private string specType;
+        private string leftPart;
+        private string className;
+        private string methodName;
+        private string attributes;
+        private string rightPart;
+
+        public GenSpec(string spec) : this(spec, false) { }
+
+        public GenSpec(string spec, bool isVoid)
+        {
+            this.fullSpec = spec;
+            this.isVoid = isVoid;
+
+            int colon = spec.IndexOf(':');
+            int arrow = spec.IndexOf("=>", colon + 1);
+            if (colon <= 0 || arrow <= 0)
+                throw new ArgumentException(string.Format("Invalid generation spec: {0}", spec), "spec");
+
+            this.specType = spec.Substring(0, colon + 1);
+            this.leftPart = spec.Substring(colon+1, arrow-colon-1).Trim();
+            this.rightPart = spec.Substring(arrow + 2).Trim();
+
+            int nest = 0; int attributeLength = 0;
+            foreach( char c in leftPart )
+            {
+                if ( c == '[' ) nest++;
+                if ( nest == 0 ) break;
+                attributeLength++;
+                if ( c == ']' ) nest--;
+            }
+
+            //this.attributes = leftPart.Substring(0, attributeLength);
+
+            int dot = leftPart.IndexOf('.', attributeLength);
+            if (dot <= 0)
+                throw new ArgumentException(string.Format("Invalid generation spec: {0}", spec), "spec");
+
+            this.className = leftPart.Substring(0, dot).Trim();
+            this.methodName = leftPart.Substring(dot + 1).Trim();
+
+            if (attributeLength > 0)
+            {
+                this.attributes = className.Substring(0, attributeLength);
+                this.className = className.Substring(attributeLength);
+            }
+        }
+
+        public string SpecType
+        {
+            get { return this.specType; }
+        }
+
+        public string LeftPart
+        {
+            get { return this.leftPart; }
+        }
+
+        public string RightPart
+        {
+            get { return this.rightPart; }
+        }
+
+        public string MethodName
+        {
+            get { return methodName; }
+        }
+
+        public string ClassName
+        {
+            get { return className; }
+        }
+
+        public string Attributes
+        {
+            get { return attributes; }
+        }
+
+        public bool IsGeneric
+        {
+            get
+            { 
+                return this.MethodName.IndexOf('<') > 0
+                    || this.MethodName.IndexOf('?') > 0;
+            }
+        }
+
+        public bool IsProperty
+        {
+            get { return !IsGeneric && !methodName.EndsWith(")"); }
+        }
+
+        public override string ToString()
+        {
+            return fullSpec;
+        }
+    }
+}
diff --git a/tools/src/Gensyntax/GenSyntax.build b/tools/src/Gensyntax/GenSyntax.build
new file mode 100644
index 0000000..82dc1c1
--- /dev/null
+++ b/tools/src/Gensyntax/GenSyntax.build
@@ -0,0 +1,50 @@
+<?xml version="1.0"?>
+<project name="GenSyntax" default="build" basedir=".">
+
+  <patternset id="source-files">
+    <include name="AssemblyInfo.cs"/>
+    <include name="GenSpec.cs"/>
+    <include name="CodeGenerator.cs"/>
+    <include name="Program.cs"/>
+    <include name="Stanza.cs"/>
+    <include name="SyntaxInfo.cs"/>
+  </patternset>
+
+  <patternset id="resource-files">
+    <include name="Templates/*.cs"/>
+  </patternset>
+
+  <target name="init">
+    <property name="debug" value="false"/>
+    <property name="defines" value="TRACE" unless="${debug}"/>
+    <property name="defines" value="TRACE;DEBUG" if="${debug}"/>
+    <property name="build.dir" value="../../bin"/>
+  </target>
+
+  <target name="clean" depends="init">
+    <delete>
+      <fileset basedir="${build.dir}">
+        <include name="GenSyntax.*"/>
+      </fileset>
+    </delete>
+  </target>
+
+  <target name="build" depends="init">
+
+    <mkdir dir="${build.dir}"/>
+
+    <csc target="exe"
+        output="${build.dir}/GenSyntax.exe"
+        debug="${debug}" 
+        define="${defines}">
+      <sources basedir=".">
+        <patternset refid="source-files"/>
+      </sources>
+      <resources prefix="GenSyntax.Templates">
+        <patternset refid="resource-files"/>
+      </resources>
+    </csc>
+
+  </target>
+
+</project>
\ No newline at end of file
diff --git a/tools/src/Gensyntax/GenSyntax.csproj b/tools/src/Gensyntax/GenSyntax.csproj
new file mode 100644
index 0000000..51953da
--- /dev/null
+++ b/tools/src/Gensyntax/GenSyntax.csproj
@@ -0,0 +1,142 @@
+<Project DefaultTargets="Build" ToolsVersion="3.5" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{8DCF8441-9BCC-46FC-B878-C65CE3C565A1}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>App.ico</ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>GenSyntax</AssemblyName>
+    <AssemblyOriginatorKeyFile>
+    </AssemblyOriginatorKeyFile>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Exe</OutputType>
+    <RootNamespace>GenSyntax</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <StartupObject>
+    </StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>0.0</OldToolsVersion>
+    <PublishUrl>http://localhost/GenSyntax/</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Web</InstallFrom>
+    <UpdateEnabled>true</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>true</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>bin\Debug\</OutputPath>
+    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoStdLib>false</NoStdLib>
+    <NoWarn>
+    </NoWarn>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>bin\Release\</OutputPath>
+    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>false</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoStdLib>false</NoStdLib>
+    <NoWarn>
+    </NoWarn>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="App.ico" />
+    <Compile Include="AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="GenSpec.cs" />
+    <Compile Include="CodeGenerator.cs" />
+    <Compile Include="Program.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Stanza.cs" />
+    <Compile Include="SyntaxInfo.cs" />
+    <EmbeddedResource Include="Templates\Assert.template.cs" />
+    <EmbeddedResource Include="Templates\Throws.template.cs" />
+    <EmbeddedResource Include="Templates\Default.template.cs" />
+    <EmbeddedResource Include="Templates\ConstraintFactory.template.cs" />
+    <EmbeddedResource Include="Templates\ConstraintExpression.template.cs" />
+    <EmbeddedResource Include="Templates\Text.template.cs" />
+    <EmbeddedResource Include="Templates\Has.template.cs" />
+    <EmbeddedResource Include="Templates\Is.template.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>xcopy "$(TargetPath)" "$(SolutionDir)..\..\bin\" /Y</PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/tools/src/Gensyntax/GenSyntax.sln b/tools/src/Gensyntax/GenSyntax.sln
new file mode 100644
index 0000000..7afee31
--- /dev/null
+++ b/tools/src/Gensyntax/GenSyntax.sln
@@ -0,0 +1,25 @@
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GenSyntax", "GenSyntax.csproj", "{8DCF8441-9BCC-46FC-B878-C65CE3C565A1}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GenSyntax.Tests", "tests\GenSyntax.Tests.csproj", "{695EDA21-AE36-414B-9F5F-EE06CECC1ED0}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{8DCF8441-9BCC-46FC-B878-C65CE3C565A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{8DCF8441-9BCC-46FC-B878-C65CE3C565A1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{8DCF8441-9BCC-46FC-B878-C65CE3C565A1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{8DCF8441-9BCC-46FC-B878-C65CE3C565A1}.Release|Any CPU.Build.0 = Release|Any CPU
+		{695EDA21-AE36-414B-9F5F-EE06CECC1ED0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{695EDA21-AE36-414B-9F5F-EE06CECC1ED0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{695EDA21-AE36-414B-9F5F-EE06CECC1ED0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{695EDA21-AE36-414B-9F5F-EE06CECC1ED0}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
diff --git a/tools/src/Gensyntax/Program.cs b/tools/src/Gensyntax/Program.cs
new file mode 100644
index 0000000..6b03ba6
--- /dev/null
+++ b/tools/src/Gensyntax/Program.cs
@@ -0,0 +1,105 @@
+using System;
+using System.IO;
+using System.Collections.Generic;
+
+namespace GenSyntax
+{
+	/// <summary>
+	/// Summary description for Program.
+	/// </summary>
+	class Program
+	{
+        static string InputFile;
+        static List<string> GenOptions = new List<string>();
+
+        static StreamReader InputReader;
+        static List<StreamWriter> OutputWriters = new List<StreamWriter>();
+
+		/// <summary>
+		/// The main entry point for the application.
+		/// </summary>
+		[STAThread]
+		static void Main(string[] args)
+		{
+            try
+            {
+                if (ProcessArgs(args))
+                {
+                    SyntaxInfo.Instance.Load(InputReader);
+
+                    if (GenOptions.Count == 0)
+                        GenOptions = SyntaxInfo.Instance.Defaults;
+
+                    foreach (string option in GenOptions)
+                    {
+                        CodeGenerator generator = new CodeGenerator(option);
+                        generator.GenerateClass();
+                    }
+                }
+                else
+                    Usage();
+            }
+            catch (CommandLineError ex)
+            {
+                Error(ex.Message);
+            }
+            catch (FileNotFoundException ex)
+            {
+                Error(ex.Message);
+            }
+		}
+
+        static bool ProcessArgs(string[] args)
+        {
+            foreach (string arg in args)
+            {
+                if (arg == "-help")
+                    return false;
+                else if (arg.StartsWith("-gen:"))
+                    GenOptions.Add(arg.Substring(5));
+                else if (InputFile == null)
+                    InputFile = arg;
+                else
+                    throw new CommandLineError(string.Format("Unknown option: {0}", arg));
+            }
+
+            if (InputFile == null) throw new CommandLineError("No input file provided");
+
+            InputReader = new StreamReader(InputFile);
+
+            return true;
+        }
+
+        static void Help()
+        {
+            Console.Error.WriteLine("Generates C# code for NUnit syntax elements");
+            Console.Error.WriteLine();
+            Usage();
+        }
+
+        static void Error(string message)
+        {
+            Console.Error.WriteLine(message);
+            Console.Error.WriteLine();
+            Usage();
+        }
+
+        static void Usage()
+        {
+            Console.Error.WriteLine("Usage: GenSyntax <input_file> [ [ [-gen:<class_name>[=<file_name>] ] ...]");
+            Console.Error.WriteLine();
+            Console.Error.WriteLine("The <input_file> is required. If any -gen options are given, only the code");
+            Console.Error.WriteLine("for the specified classes are generated. If <file_name> is not specified,");
+            Console.Error.WriteLine("it defaults to the <class_name> with a .cs extension. If no -gen options");
+            Console.Error.WriteLine("are used, Default entries specified in the input file are generated.");
+            Console.Error.WriteLine();
+            Console.Error.WriteLine("Syntax for entries in the input file are described in the file");
+            Console.Error.WriteLine("SyntaxElements.txt, which is distributed with the NUnit source.");
+        }
+	}
+
+    class CommandLineError : Exception
+    {
+        public CommandLineError(string message) : base(message) { }
+    }
+}
diff --git a/tools/src/Gensyntax/Stanza.cs b/tools/src/Gensyntax/Stanza.cs
new file mode 100644
index 0000000..4077f96
--- /dev/null
+++ b/tools/src/Gensyntax/Stanza.cs
@@ -0,0 +1,216 @@
+using System;
+using System.IO;
+using System.Collections.Generic;
+using System.CodeDom.Compiler;
+
+namespace GenSyntax
+{
+    class Stanza
+    {
+        private List<string> lines = new List<string>();
+        private string typeName = "void";
+        private List<string> comments = new List<string>();
+        private List<GenSpec> genSpecs = new List<GenSpec>();
+        private List<string> defaults = new List<string>();
+
+        private string currentRegion;
+
+        public static Stanza Read(TextReader rdr)
+        {
+            Stanza stanza = new Stanza();
+            string line = rdr.ReadLine();
+
+            while (line != null && line != "%")
+            {
+                if (!line.StartsWith("#"))
+                    stanza.AddLine(line);
+
+                line = rdr.ReadLine();
+            }
+
+            stanza.ProcessLines();
+
+            return stanza;
+        }
+
+        private void AddLine(string line)
+        {
+            int count = lines.Count;
+
+            if (char.IsWhiteSpace(line[0]) && count > 0)
+                lines[count - 1] += line.Trim();
+            else
+                lines.Add(line);
+        }
+
+        private void ProcessLines()
+        {
+            foreach (string line in lines)
+            {
+                if (line.StartsWith("Type:"))
+                    this.typeName = line.Substring(5).Trim();
+                else if (line.StartsWith("///"))
+                    this.comments.Add(line);
+                else if (line.StartsWith("Gen:") || line.StartsWith("Assert:"))
+                    AddSyntaxElement(line, typeName == "void");
+                else if (line.StartsWith("Gen3:"))
+                    AddStandardSyntaxElements(line.Substring(5).Trim());
+                //else if (line.StartsWith("Assert:"))
+                //    ProcessAssert(line.Substring(7).Trim());
+                else if (line.StartsWith("Default:"))
+                    this.defaults.Add(line.Substring(8).Trim());
+                else
+                    IssueFormatError(line);
+            }
+        }
+
+        private void AddSyntaxElement(string line, bool isVoid)
+        {
+            this.genSpecs.Add(new GenSpec(line, typeName == "void"));
+        }
+
+        private void AddStandardSyntaxElements(string element)
+        {
+            int arrow = element.IndexOf("=>");
+            if (arrow < 0) IssueFormatError(element);
+            string leftside = element.Substring(0, arrow);
+            string rightside = element.Substring(arrow + 2);
+            
+            string fullname = leftside;
+            string attributes = "";
+            int rbrack = leftside.LastIndexOf("]");
+            if (rbrack > 0)
+            {
+                attributes = leftside.Substring(0, rbrack + 1);
+                fullname = leftside.Substring(rbrack + 1);
+            }
+
+            string constraint = rightside;
+            if (constraint.StartsWith("return "))
+                constraint = constraint.Substring(7);
+            if (constraint.StartsWith("new "))
+                constraint = constraint.Substring(4);
+
+            int dot = fullname.IndexOf('.');
+            if (dot < 0) IssueFormatError(element);
+            string name = fullname.Substring(dot + 1);
+
+            this.typeName = constraint.Substring(0, constraint.IndexOf("("));
+            this.genSpecs.Add(new GenSpec(
+                "Gen: " + leftside + "=>" + rightside));
+            this.genSpecs.Add(new GenSpec(
+                "Gen: " + attributes + "ConstraintFactory." + name + "=>" + rightside));
+            this.genSpecs.Add(new GenSpec(
+                "Gen: " + attributes + "ConstraintExpression." + name + "=>(" + typeName + ")this.Append(" + rightside + ")"));
+        }
+
+        private void IssueFormatError(string line)
+        {
+            throw new ArgumentException("Invalid line in spec file" + Environment.NewLine + line);
+        }
+
+        public void Generate(IndentedTextWriter writer, string className, bool isStatic)
+        {
+            foreach (GenSpec spec in genSpecs)
+            {
+                if (spec.ClassName == className)
+                {
+                    if (currentRegion == null)
+                    {
+                        //currentRegion = spec.LeftPart;
+                        //int dot = currentRegion.IndexOf('.');
+                        //if (dot > 0) currentRegion = currentRegion.Substring(dot + 1);
+                        currentRegion = spec.MethodName;
+                        int lpar = currentRegion.IndexOf('(');
+                        if (lpar > 0) currentRegion = currentRegion.Substring(0, lpar);
+
+                        writer.WriteLine("#region " + currentRegion);
+                        writer.WriteLine();
+                    }
+
+                    if (spec.IsGeneric)
+                        writer.WriteLineNoTabs("#if NET_2_0");
+
+                    if (spec.ClassName == "Assert")
+                        GenerateAssertOverloads(writer, isStatic, spec);
+                    else
+                        GenerateMethod(writer, isStatic, spec);
+
+                    if (spec.IsGeneric)
+                        writer.WriteLineNoTabs("#endif");
+                }
+            }
+
+            if (currentRegion != null)
+            {
+                writer.WriteLine("#endregion");
+                writer.WriteLine();
+                currentRegion = null;
+            }
+        }
+
+        private void GenerateMethod(IndentedTextWriter writer, bool isStatic, GenSpec spec)
+        {
+            WriteComments(writer);
+            WriteMethodDefinition(writer, isStatic, spec);
+        }
+
+        private void WriteMethodDefinition(IndentedTextWriter writer, bool isStatic, GenSpec spec)
+        {
+            if (spec.Attributes != null)
+                writer.WriteLine(spec.Attributes);
+
+            if (isStatic)
+                writer.WriteLine("public static {0} {1}", typeName, spec.MethodName);
+            else
+                writer.WriteLine("public {0} {1}", typeName, spec.MethodName);
+            writer.WriteLine("{");
+            writer.Indent++;
+            writer.WriteLine(spec.IsProperty
+                    ? "get { return " + spec.RightPart + "; }"
+                    : typeName == "void"
+                        ? spec.RightPart + ";"
+                        : "return " + spec.RightPart + ";" );
+            writer.Indent--;
+            writer.WriteLine("}");
+            writer.WriteLine();
+        }
+
+        private void WriteComments(IndentedTextWriter writer)
+        {
+            foreach (string comment in comments)
+                writer.WriteLine(comment);
+        }
+
+        private void GenerateAssertOverloads(IndentedTextWriter writer, bool isStatic, GenSpec spec)
+        {
+            if (!spec.LeftPart.EndsWith(")") || !spec.RightPart.EndsWith(")"))
+                IssueFormatError(spec.ToString());
+            string leftPart = spec.LeftPart.Substring(0, spec.LeftPart.Length - 1);
+            string rightPart = spec.RightPart.Substring(0, spec.RightPart.Length - 1);
+
+            GenSpec spec1 = new GenSpec(
+                "Gen: " + leftPart + ", string message, params object[] args)=>" + rightPart + " ,message, args)");
+            WriteComments(writer);
+            writer.WriteLine("/// <param name=\"message\">The message to display in case of failure</param>");
+            writer.WriteLine("/// <param name=\"args\">Array of objects to be used in formatting the message</param>");
+            WriteMethodDefinition(writer, isStatic, spec1);
+
+            GenSpec spec2 = new GenSpec(
+                "Gen: " + leftPart + ", string message)=>" + rightPart + " ,message, null)");
+            WriteComments(writer);
+            writer.WriteLine("/// <param name=\"message\">The message to display in case of failure</param>");
+            WriteMethodDefinition(writer, isStatic, spec2);
+
+            GenSpec spec3 = new GenSpec(
+                "Gen: " + leftPart + ")=>" + rightPart + " ,null, null)");
+            WriteComments(writer);
+            WriteMethodDefinition(writer, isStatic, spec3);
+        }
+
+        public List<string> Defaults
+        {
+            get { return defaults; }
+        }
+    }
+}
diff --git a/tools/src/Gensyntax/SyntaxInfo.cs b/tools/src/Gensyntax/SyntaxInfo.cs
new file mode 100644
index 0000000..e6d983c
--- /dev/null
+++ b/tools/src/Gensyntax/SyntaxInfo.cs
@@ -0,0 +1,45 @@
+using System;
+using System.IO;
+using System.Collections.Generic;
+using System.Text;
+
+namespace GenSyntax
+{
+    class SyntaxInfo : List<Stanza>
+    {
+        private static SyntaxInfo instance = new SyntaxInfo();
+
+        public static SyntaxInfo Instance
+        {
+            get { return instance; }
+        }
+
+        public void Load(StreamReader input)
+        {
+            this.Clear();
+
+            while (!input.EndOfStream)
+            {
+                Stanza stanza = Stanza.Read(input);
+                this.Add(stanza);
+            }
+        }
+
+        private List<string> defaults;
+        public List<string> Defaults
+        {
+            get
+            {
+                if (defaults == null)
+                {
+                    defaults = new List<string>();
+                    foreach (Stanza stanza in this)
+                        foreach (string option in stanza.Defaults)
+                            defaults.Add(option);
+                }
+
+                return defaults;
+            }
+        }
+    }
+}
diff --git a/tools/src/Gensyntax/Templates/Assert.template.cs b/tools/src/Gensyntax/Templates/Assert.template.cs
new file mode 100644
index 0000000..c987fda
--- /dev/null
+++ b/tools/src/Gensyntax/Templates/Assert.template.cs
@@ -0,0 +1,789 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+// ****************************************************************
+//              Generated by the NUnit Syntax Generator
+//
+// Command Line: __COMMANDLINE__
+// 
+//                  DO NOT MODIFY THIS FILE DIRECTLY
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.ComponentModel;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// Delegate used by tests that execute code and
+    /// capture any thrown exception.
+    /// </summary>
+    public delegate void TestDelegate();
+
+    /// <summary>
+    /// The Assert class contains a collection of static methods that
+    /// implement the most common assertions used in NUnit.
+    /// </summary>
+    public class Assert
+    {
+        #region Constructor
+
+        /// <summary>
+        /// We don't actually want any instances of this object, but some people
+        /// like to inherit from it to add other static methods. Hence, the
+        /// protected constructor disallows any instances of this object. 
+        /// </summary>
+        protected Assert() { }
+
+        #endregion
+
+        #region Assert Counting
+
+        private static int counter = 0;
+
+        /// <summary>
+        /// Gets the number of assertions executed so far and 
+        /// resets the counter to zero.
+        /// </summary>
+        public static int Counter
+        {
+            get
+            {
+                int cnt = counter;
+                counter = 0;
+                return cnt;
+            }
+        }
+
+        private static void IncrementAssertCount()
+        {
+            ++counter;
+        }
+
+        #endregion
+
+        #region Equals and ReferenceEquals
+
+        /// <summary>
+        /// The Equals method throws an AssertionException. This is done 
+        /// to make sure there is no mistake by calling this function.
+        /// </summary>
+        /// <param name="a"></param>
+        /// <param name="b"></param>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public static new bool Equals(object a, object b)
+        {
+            // TODO: This should probably be InvalidOperationException
+            throw new AssertionException("Assert.Equals should not be used for Assertions");
+        }
+
+        /// <summary>
+        /// override the default ReferenceEquals to throw an AssertionException. This 
+        /// implementation makes sure there is no mistake in calling this function 
+        /// as part of Assert. 
+        /// </summary>
+        /// <param name="a"></param>
+        /// <param name="b"></param>
+        public static new void ReferenceEquals(object a, object b)
+        {
+            throw new AssertionException("Assert.ReferenceEquals should not be used for Assertions");
+        }
+
+        #endregion
+
+        #region Helper Methods
+        /// <summary>
+        /// Helper for Assert.AreEqual(double expected, double actual, ...)
+        /// allowing code generation to work consistently.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="delta">The maximum acceptable difference between the
+        /// the expected and the actual</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        protected static void AssertDoublesAreEqual(double expected, double actual, double delta, string message, object[] args)
+        {
+            if (double.IsNaN(expected) || double.IsInfinity(expected))
+                Assert.That(actual, Is.EqualTo(expected), message, args);
+            else
+                Assert.That(actual, Is.EqualTo(expected).Within(delta), message, args);
+        }
+        #endregion
+
+        #region Utility Asserts
+
+        #region Pass
+
+        /// <summary>
+        /// Throws a <see cref="SuccessException"/> with the message and arguments 
+        /// that are passed in. This allows a test to be cut short, with a result
+        /// of success returned to NUnit.
+        /// </summary>
+        /// <param name="message">The message to initialize the <see cref="AssertionException"/> with.</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void Pass(string message, params object[] args)
+        {
+            if (message == null) message = string.Empty;
+            else if (args != null && args.Length > 0)
+                message = string.Format(message, args);
+
+            throw new SuccessException(message);
+        }
+
+        /// <summary>
+        /// Throws a <see cref="SuccessException"/> with the message and arguments 
+        /// that are passed in. This allows a test to be cut short, with a result
+        /// of success returned to NUnit.
+        /// </summary>
+        /// <param name="message">The message to initialize the <see cref="AssertionException"/> with.</param>
+        static public void Pass(string message)
+        {
+            Assert.Pass(message, null);
+        }
+
+        /// <summary>
+        /// Throws a <see cref="SuccessException"/> with the message and arguments 
+        /// that are passed in. This allows a test to be cut short, with a result
+        /// of success returned to NUnit.
+        /// </summary>
+        static public void Pass()
+        {
+            Assert.Pass(string.Empty, null);
+        }
+
+        #endregion
+
+        #region Fail
+
+        /// <summary>
+        /// Throws an <see cref="AssertionException"/> with the message and arguments 
+        /// that are passed in. This is used by the other Assert functions. 
+        /// </summary>
+        /// <param name="message">The message to initialize the <see cref="AssertionException"/> with.</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void Fail(string message, params object[] args)
+        {
+            if (message == null) message = string.Empty;
+            else if (args != null && args.Length > 0)
+                message = string.Format(message, args);
+
+            throw new AssertionException(message);
+        }
+
+        /// <summary>
+        /// Throws an <see cref="AssertionException"/> with the message that is 
+        /// passed in. This is used by the other Assert functions. 
+        /// </summary>
+        /// <param name="message">The message to initialize the <see cref="AssertionException"/> with.</param>
+        static public void Fail(string message)
+        {
+            Assert.Fail(message, null);
+        }
+
+        /// <summary>
+        /// Throws an <see cref="AssertionException"/>. 
+        /// This is used by the other Assert functions. 
+        /// </summary>
+        static public void Fail()
+        {
+            Assert.Fail(string.Empty, null);
+        }
+
+        #endregion
+
+        #region Ignore
+
+        /// <summary>
+        /// Throws an <see cref="IgnoreException"/> with the message and arguments 
+        /// that are passed in.  This causes the test to be reported as ignored.
+        /// </summary>
+        /// <param name="message">The message to initialize the <see cref="AssertionException"/> with.</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void Ignore(string message, params object[] args)
+        {
+            if (message == null) message = string.Empty;
+            else if (args != null && args.Length > 0)
+                message = string.Format(message, args);
+
+            throw new IgnoreException(message);
+        }
+
+        /// <summary>
+        /// Throws an <see cref="IgnoreException"/> with the message that is 
+        /// passed in. This causes the test to be reported as ignored. 
+        /// </summary>
+        /// <param name="message">The message to initialize the <see cref="AssertionException"/> with.</param>
+        static public void Ignore(string message)
+        {
+            Assert.Ignore(message, null);
+        }
+
+        /// <summary>
+        /// Throws an <see cref="IgnoreException"/>. 
+        /// This causes the test to be reported as ignored. 
+        /// </summary>
+        static public void Ignore()
+        {
+            Assert.Ignore(string.Empty, null);
+        }
+
+        #endregion
+
+        #region InConclusive
+        /// <summary>
+        /// Throws an <see cref="InconclusiveException"/> with the message and arguments 
+        /// that are passed in.  This causes the test to be reported as inconclusive.
+        /// </summary>
+        /// <param name="message">The message to initialize the <see cref="InconclusiveException"/> with.</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void Inconclusive(string message, params object[] args)
+        {
+            if (message == null) message = string.Empty;
+            else if (args != null && args.Length > 0)
+                message = string.Format(message, args);
+
+            throw new InconclusiveException(message);
+        }
+
+        /// <summary>
+        /// Throws an <see cref="InconclusiveException"/> with the message that is 
+        /// passed in. This causes the test to be reported as inconclusive. 
+        /// </summary>
+        /// <param name="message">The message to initialize the <see cref="InconclusiveException"/> with.</param>
+        static public void Inconclusive(string message)
+        {
+            Assert.Inconclusive(message, null);
+        }
+
+        /// <summary>
+        /// Throws an <see cref="InconclusiveException"/>. 
+        /// This causes the test to be reported as Inconclusive. 
+        /// </summary>
+        static public void Inconclusive()
+        {
+            Assert.Inconclusive(string.Empty, null);
+        }
+
+        #endregion
+
+        #endregion
+
+        #region Assert.That
+
+        #region Object
+        /// <summary>
+        /// Apply a constraint to an actual value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
+        /// </summary>
+        /// <param name="expression">A Constraint to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        static public void That(object actual, IResolveConstraint expression)
+        {
+            Assert.That(actual, expression, null, null);
+        }
+
+        /// <summary>
+        /// Apply a constraint to an actual value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
+        /// </summary>
+        /// <param name="expression">A Constraint to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        static public void That(object actual, IResolveConstraint expression, string message)
+        {
+            Assert.That(actual, expression, message, null);
+        }
+
+        /// <summary>
+        /// Apply a constraint to an actual value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
+        /// </summary>
+        /// <param name="expression">A Constraint expression to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void That(object actual, IResolveConstraint expression, string message, params object[] args)
+        {
+            Constraint constraint = expression.Resolve();
+
+            Assert.IncrementAssertCount();
+            if (!constraint.Matches(actual))
+            {
+                MessageWriter writer = new TextMessageWriter(message, args);
+                constraint.WriteMessageTo(writer);
+                throw new AssertionException(writer.ToString());
+            }
+        }
+        #endregion
+
+        #region ActualValueDelegate
+        /// <summary>
+        /// Apply a constraint to an actual value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
+        /// </summary>
+        /// <param name="expr">A Constraint expression to be applied</param>
+        /// <param name="del">An ActualValueDelegate returning the value to be tested</param>
+        static public void That(ActualValueDelegate del, IResolveConstraint expr)
+        {
+            Assert.That(del, expr.Resolve(), null, null);
+        }
+
+        /// <summary>
+        /// Apply a constraint to an actual value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
+        /// </summary>
+        /// <param name="expr">A Constraint expression to be applied</param>
+        /// <param name="del">An ActualValueDelegate returning the value to be tested</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        static public void That(ActualValueDelegate del, IResolveConstraint expr, string message)
+        {
+            Assert.That(del, expr.Resolve(), message, null);
+        }
+
+        /// <summary>
+        /// Apply a constraint to an actual value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
+        /// </summary>
+        /// <param name="del">An ActualValueDelegate returning the value to be tested</param>
+        /// <param name="expr">A Constraint expression to be applied</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void That(ActualValueDelegate del, IResolveConstraint expr, string message, params object[] args)
+        {
+            Constraint constraint = expr.Resolve();
+
+            Assert.IncrementAssertCount();
+            if (!constraint.Matches(del))
+            {
+                MessageWriter writer = new TextMessageWriter(message, args);
+                constraint.WriteMessageTo(writer);
+                throw new AssertionException(writer.ToString());
+            }
+        }
+        #endregion
+
+        #region ref Object
+#if NET_2_0
+        /// <summary>
+        /// Apply a constraint to a referenced value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
+        /// </summary>
+        /// <param name="expression">A Constraint to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        static public void That<T>(ref T actual, IResolveConstraint expression)
+        {
+            Assert.That(ref actual, expression.Resolve(), null, null);
+        }
+
+        /// <summary>
+        /// Apply a constraint to a referenced value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
+        /// </summary>
+        /// <param name="expression">A Constraint to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        static public void That<T>(ref T actual, IResolveConstraint expression, string message)
+        {
+            Assert.That(ref actual, expression.Resolve(), message, null);
+        }
+
+        /// <summary>
+        /// Apply a constraint to a referenced value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
+        /// </summary>
+        /// <param name="expression">A Constraint to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void That<T>(ref T actual, IResolveConstraint expression, string message, params object[] args)
+        {
+            Constraint constraint = expression.Resolve();
+
+            Assert.IncrementAssertCount();
+            if (!constraint.Matches(ref actual))
+            {
+                MessageWriter writer = new TextMessageWriter(message, args);
+                constraint.WriteMessageTo(writer);
+                throw new AssertionException(writer.ToString());
+            }
+        }
+#else
+        /// <summary>
+        /// Apply a constraint to a referenced boolean, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
+        /// </summary>
+        /// <param name="constraint">A Constraint to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        static public void That(ref bool actual, IResolveConstraint constraint)
+        {
+            Assert.That(ref actual, constraint.Resolve(), null, null);
+        }
+
+        /// <summary>
+        /// Apply a constraint to a referenced value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
+        /// </summary>
+        /// <param name="constraint">A Constraint to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        static public void That(ref bool actual, IResolveConstraint constraint, string message)
+        {
+            Assert.That(ref actual, constraint.Resolve(), message, null);
+        }
+
+        /// <summary>
+        /// Apply a constraint to a referenced value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
+        /// </summary>
+        /// <param name="constraint">A Constraint to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void That(ref bool actual, IResolveConstraint expression, string message, params object[] args)
+        {
+            Constraint constraint = expression.Resolve();
+
+            Assert.IncrementAssertCount();
+            if (!constraint.Matches(ref actual))
+            {
+                MessageWriter writer = new TextMessageWriter(message, args);
+                constraint.WriteMessageTo(writer);
+                throw new AssertionException(writer.ToString());
+            }
+        }
+#endif
+        #endregion
+
+        #region Boolean
+        /// <summary>
+        /// Asserts that a condition is true. If the condition is false the method throws
+        /// an <see cref="AssertionException"/>.
+        /// </summary> 
+        /// <param name="condition">The evaluated condition</param>
+        /// <param name="message">The message to display if the condition is false</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void That(bool condition, string message, params object[] args)
+        {
+            Assert.That(condition, Is.True, message, args);
+        }
+
+        /// <summary>
+        /// Asserts that a condition is true. If the condition is false the method throws
+        /// an <see cref="AssertionException"/>.
+        /// </summary>
+        /// <param name="condition">The evaluated condition</param>
+        /// <param name="message">The message to display if the condition is false</param>
+        static public void That(bool condition, string message)
+        {
+            Assert.That(condition, Is.True, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that a condition is true. If the condition is false the method throws
+        /// an <see cref="AssertionException"/>.
+        /// </summary>
+        /// <param name="condition">The evaluated condition</param>
+        static public void That(bool condition)
+        {
+            Assert.That(condition, Is.True, null, null);
+        }
+        #endregion
+
+        /// <summary>
+        /// Asserts that the code represented by a delegate throws an exception
+        /// that satisfies the constraint provided.
+        /// </summary>
+        /// <param name="code">A TestDelegate to be executed</param>
+        /// <param name="constraint">A ThrowsConstraint used in the test</param>
+        static public void That(TestDelegate code, IResolveConstraint constraint)
+        {
+            Assert.That((object)code, constraint);
+        }
+        #endregion
+
+        #region Throws, Catch and DoesNotThrow
+
+        #region Throws
+        /// <summary>
+        /// Verifies that a delegate throws a particular exception when called.
+        /// </summary>
+        /// <param name="expression">A constraint to be satisfied by the exception</param>
+        /// <param name="code">A TestSnippet delegate</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        public static Exception Throws(IResolveConstraint expression, TestDelegate code, string message, params object[] args)
+        {
+            Exception caughtException = null;
+
+            try
+            {
+                code();
+            }
+            catch(Exception ex)
+            {
+                caughtException = ex;
+            }
+
+            Assert.That(caughtException, expression, message, args);
+
+            return caughtException;
+        }
+
+        /// <summary>
+        /// Verifies that a delegate throws a particular exception when called.
+        /// </summary>
+        /// <param name="expression">A constraint to be satisfied by the exception</param>
+        /// <param name="code">A TestSnippet delegate</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        public static Exception Throws(IResolveConstraint expression, TestDelegate code, string message)
+        {
+            return Throws(expression, code, message, null);
+        }
+
+        /// <summary>
+        /// Verifies that a delegate throws a particular exception when called.
+        /// </summary>
+        /// <param name="expression">A constraint to be satisfied by the exception</param>
+        /// <param name="code">A TestSnippet delegate</param>
+        public static Exception Throws(IResolveConstraint expression, TestDelegate code)
+        {
+            return Throws(expression, code, string.Empty, null);
+        }
+
+        /// <summary>
+        /// Verifies that a delegate throws a particular exception when called.
+        /// </summary>
+        /// <param name="expectedExceptionType">The exception Type expected</param>
+        /// <param name="code">A TestSnippet delegate</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        public static Exception Throws(Type expectedExceptionType, TestDelegate code, string message, params object[] args)
+        {
+            return Throws(new ExactTypeConstraint(expectedExceptionType), code, message, args);
+        }
+
+        /// <summary>
+        /// Verifies that a delegate throws a particular exception when called.
+        /// </summary>
+        /// <param name="expectedExceptionType">The exception Type expected</param>
+        /// <param name="code">A TestSnippet delegate</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        public static Exception Throws(Type expectedExceptionType, TestDelegate code, string message)
+        {
+            return Throws(new ExactTypeConstraint(expectedExceptionType), code, message, null);
+        }
+
+        /// <summary>
+        /// Verifies that a delegate throws a particular exception when called.
+        /// </summary>
+        /// <param name="expectedExceptionType">The exception Type expected</param>
+        /// <param name="code">A TestSnippet delegate</param>
+        public static Exception Throws(Type expectedExceptionType, TestDelegate code)
+        {
+            return Throws(new ExactTypeConstraint(expectedExceptionType), code, string.Empty, null);
+        }
+
+        #endregion
+
+        #region Throws<T>
+#if NET_2_0
+        /// <summary>
+        /// Verifies that a delegate throws a particular exception when called.
+        /// </summary>
+        /// <typeparam name="T">Type of the expected exception</typeparam>
+        /// <param name="code">A TestSnippet delegate</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        public static T Throws<T>(TestDelegate code, string message, params object[] args) where T : Exception
+        {
+            return (T)Throws(typeof(T), code, message, args);
+        }
+
+        /// <summary>
+        /// Verifies that a delegate throws a particular exception when called.
+        /// </summary>
+        /// <typeparam name="T">Type of the expected exception</typeparam>
+        /// <param name="code">A TestSnippet delegate</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        public static T Throws<T>(TestDelegate code, string message) where T : Exception
+        {
+            return Throws<T>(code, message, null);
+        }
+
+        /// <summary>
+        /// Verifies that a delegate throws a particular exception when called.
+        /// </summary>
+        /// <typeparam name="T">Type of the expected exception</typeparam>
+        /// <param name="code">A TestSnippet delegate</param>
+        public static T Throws<T>(TestDelegate code) where T : Exception
+        {
+            return Throws<T>(code, string.Empty, null);
+        }
+#endif
+        #endregion
+
+        #region Catch
+        /// <summary>
+        /// Verifies that a delegate throws an exception when called
+        /// and returns it.
+        /// </summary>
+        /// <param name="code">A TestDelegate</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        public static Exception Catch(TestDelegate code, string message, params object[] args)
+        {
+            return Throws(new InstanceOfTypeConstraint(typeof(Exception)), code, message, args);
+        }
+
+        /// <summary>
+        /// Verifies that a delegate throws an exception when called
+        /// and returns it.
+        /// </summary>
+        /// <param name="code">A TestDelegate</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        public static Exception Catch(TestDelegate code, string message)
+        {
+            return Throws(new InstanceOfTypeConstraint(typeof(Exception)), code, message);
+        }
+
+        /// <summary>
+        /// Verifies that a delegate throws an exception when called
+        /// and returns it.
+        /// </summary>
+        /// <param name="code">A TestDelegate</param>
+        public static Exception Catch(TestDelegate code)
+        {
+            return Throws(new InstanceOfTypeConstraint(typeof(Exception)), code);
+        }
+
+        /// <summary>
+        /// Verifies that a delegate throws an exception of a certain Type
+        /// or one derived from it when called and returns it.
+        /// </summary>
+        /// <param name="expectedExceptionType">The expected Exception Type</param>
+        /// <param name="code">A TestDelegate</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        public static Exception Catch(Type expectedExceptionType, TestDelegate code, string message, params object[] args)
+        {
+            return Throws(new InstanceOfTypeConstraint(expectedExceptionType), code, message, args);
+        }
+
+        /// <summary>
+        /// Verifies that a delegate throws an exception of a certain Type
+        /// or one derived from it when called and returns it.
+        /// </summary>
+        /// <param name="expectedExceptionType">The expected Exception Type</param>
+        /// <param name="code">A TestDelegate</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        public static Exception Catch(Type expectedExceptionType, TestDelegate code, string message)
+        {
+            return Throws(new InstanceOfTypeConstraint(expectedExceptionType), code, message);
+        }
+
+        /// <summary>
+        /// Verifies that a delegate throws an exception of a certain Type
+        /// or one derived from it when called and returns it.
+        /// </summary>
+        /// <param name="expectedExceptionType">The expected Exception Type</param>
+        /// <param name="code">A TestDelegate</param>
+        public static Exception Catch(Type expectedExceptionType, TestDelegate code)
+        {
+            return Throws(new InstanceOfTypeConstraint(expectedExceptionType), code);
+        }       
+        #endregion
+
+        #region Catch<T>
+#if NET_2_0
+        /// <summary>
+        /// Verifies that a delegate throws an exception of a certain Type
+        /// or one derived from it when called and returns it.
+        /// </summary>
+        /// <typeparam name="T">The expected Exception Type</typeparam>
+        /// <param name="code">A TestDelegate</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        public static T Catch<T>(TestDelegate code, string message, params object[] args) where T : System.Exception
+        {
+            return (T)Throws(new InstanceOfTypeConstraint(typeof(T)), code, message, args);
+        }
+
+        /// <summary>
+        /// Verifies that a delegate throws an exception of a certain Type
+        /// or one derived from it when called and returns it.
+        /// </summary>
+        /// <typeparam name="T">The expected Exception Type</typeparam>
+        /// <param name="code">A TestDelegate</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        public static T Catch<T>(TestDelegate code, string message) where T : System.Exception
+        {
+            return (T)Throws(new InstanceOfTypeConstraint(typeof(T)), code, message);
+        }
+
+        /// <summary>
+        /// Verifies that a delegate throws an exception of a certain Type
+        /// or one derived from it when called and returns it.
+        /// </summary>
+        /// <typeparam name="T">The expected Exception Type</typeparam>
+        /// <param name="code">A TestDelegate</param>
+        public static T Catch<T>(TestDelegate code) where T : System.Exception
+        {
+            return (T)Throws(new InstanceOfTypeConstraint(typeof(T)), code);
+        }
+#endif
+        #endregion
+
+        #region DoesNotThrow
+
+        /// <summary>
+        /// Verifies that a delegate does not throw an exception
+        /// </summary>
+        /// <param name="code">A TestSnippet delegate</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        public static void DoesNotThrow(TestDelegate code, string message, params object[] args)
+        {
+            try
+            {
+                code();
+            }
+            catch (Exception ex)
+            {
+                TextMessageWriter writer = new TextMessageWriter(message, args);
+                writer.WriteLine("Unexpected exception: {0}", ex.GetType());
+                Assert.Fail(writer.ToString());
+            }
+        }
+
+        /// <summary>
+        /// Verifies that a delegate does not throw an exception.
+        /// </summary>
+        /// <param name="code">A TestSnippet delegate</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        public static void DoesNotThrow(TestDelegate code, string message)
+        {
+            DoesNotThrow(code, message, null);
+        }
+
+        /// <summary>
+        /// Verifies that a delegate does not throw an exception.
+        /// </summary>
+        /// <param name="code">A TestSnippet delegate</param>
+        public static void DoesNotThrow(TestDelegate code)
+        {
+            DoesNotThrow(code, string.Empty, null);
+        }
+
+        #endregion
+
+        #endregion
+
+        // $$GENERATE$$ $$STATIC$$
+    }
+}
diff --git a/tools/src/Gensyntax/Templates/ConstraintExpression.template.cs b/tools/src/Gensyntax/Templates/ConstraintExpression.template.cs
new file mode 100644
index 0000000..0625809
--- /dev/null
+++ b/tools/src/Gensyntax/Templates/ConstraintExpression.template.cs
@@ -0,0 +1,45 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+// ****************************************************************
+//              Generated by the NUnit Syntax Generator
+//
+// Command Line: __COMMANDLINE__
+// 
+//                  DO NOT MODIFY THIS FILE DIRECTLY
+// ****************************************************************
+
+using System;
+using System.Collections;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// ConstraintExpression represents a compound constraint in the 
+    /// process of being constructed from a series of syntactic elements.
+    /// 
+    /// Individual elements are appended to the expression as they are
+    /// reognized. Once an actual Constraint is appended, the expression
+    /// returns a resolvable Constraint.
+    /// </summary>
+    public class ConstraintExpression : ConstraintExpressionBase
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:ConstraintExpression"/> class.
+        /// </summary>
+        public ConstraintExpression() { }
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:ConstraintExpression"/> 
+        /// class passing in a ConstraintBuilder, which may be pre-populated.
+        /// </summary>
+        /// <param name="builder">The builder.</param>
+        public ConstraintExpression(ConstraintBuilder builder)
+            : base( builder ) { }
+
+        // $$GENERATE$$
+    }
+}
diff --git a/tools/src/Gensyntax/Templates/ConstraintFactory.template.cs b/tools/src/Gensyntax/Templates/ConstraintFactory.template.cs
new file mode 100644
index 0000000..c376d1c
--- /dev/null
+++ b/tools/src/Gensyntax/Templates/ConstraintFactory.template.cs
@@ -0,0 +1,28 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+// ****************************************************************
+//              Generated by the NUnit Syntax Generator
+//
+// Command Line: __COMMANDLINE__
+// 
+//                  DO NOT MODIFY THIS FILE DIRECTLY
+// ****************************************************************
+
+using System;
+using System.Collections;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// Helper class with properties and methods that supply
+    /// a number of constraints used in Asserts.
+    /// </summary>
+    public class ConstraintFactory
+    {
+        // $$GENERATE$$
+    }
+}
diff --git a/tools/src/Gensyntax/Templates/Default.template.cs b/tools/src/Gensyntax/Templates/Default.template.cs
new file mode 100644
index 0000000..3b6b02b
--- /dev/null
+++ b/tools/src/Gensyntax/Templates/Default.template.cs
@@ -0,0 +1,28 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+// ****************************************************************
+//              Generated by the NUnit Syntax Generator
+//
+// Command Line: __COMMANDLINE__
+// 
+//                  DO NOT MODIFY THIS FILE DIRECTLY
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// Summary info for __CLASSNAME__
+    /// </summary>
+    public class __CLASSNAME__
+    {
+        // $$GENERATE$$
+    }
+}
diff --git a/tools/src/Gensyntax/Templates/Has.template.cs b/tools/src/Gensyntax/Templates/Has.template.cs
new file mode 100644
index 0000000..3f59435
--- /dev/null
+++ b/tools/src/Gensyntax/Templates/Has.template.cs
@@ -0,0 +1,29 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+// ****************************************************************
+//              Generated by the NUnit Syntax Generator
+//
+// Command Line: __COMMANDLINE__
+// 
+//                  DO NOT MODIFY THIS FILE DIRECTLY
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// Helper class with properties and methods that supply
+    /// a number of constraints used in Asserts.
+    /// </summary>
+    public class Has
+    {
+        // $$GENERATE$$ $$STATIC$$
+    }
+}
diff --git a/tools/src/Gensyntax/Templates/Is.template.cs b/tools/src/Gensyntax/Templates/Is.template.cs
new file mode 100644
index 0000000..83763b0
--- /dev/null
+++ b/tools/src/Gensyntax/Templates/Is.template.cs
@@ -0,0 +1,29 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+// ****************************************************************
+//              Generated by the NUnit Syntax Generator
+//
+// Command Line: __COMMANDLINE__
+// 
+//                  DO NOT MODIFY THIS FILE DIRECTLY
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// Helper class with properties and methods that supply
+    /// a number of constraints used in Asserts.
+    /// </summary>
+    public class Is
+    {
+        // $$GENERATE$$ $$STATIC$$
+    }
+}
diff --git a/tools/src/Gensyntax/Templates/Text.template.cs b/tools/src/Gensyntax/Templates/Text.template.cs
new file mode 100644
index 0000000..e02d0be
--- /dev/null
+++ b/tools/src/Gensyntax/Templates/Text.template.cs
@@ -0,0 +1,30 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+// ****************************************************************
+//              Generated by the NUnit Syntax Generator
+//
+// Command Line: __COMMANDLINE__
+// 
+//                  DO NOT MODIFY THIS FILE DIRECTLY
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// Helper class with static methods used to supply constraints
+    /// that operate on strings.
+    /// </summary>
+    [Obsolete("Use Is class for string constraints")]
+    public class Text
+    {
+        // $$GENERATE$$ $$STATIC$$
+    }
+}
diff --git a/tools/src/Gensyntax/Templates/Throws.template.cs b/tools/src/Gensyntax/Templates/Throws.template.cs
new file mode 100644
index 0000000..c358830
--- /dev/null
+++ b/tools/src/Gensyntax/Templates/Throws.template.cs
@@ -0,0 +1,29 @@
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+// ****************************************************************
+//              Generated by the NUnit Syntax Generator
+//
+// Command Line: __COMMANDLINE__
+// 
+//                  DO NOT MODIFY THIS FILE DIRECTLY
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// Helper class with properties and methods that supply
+    /// constraints that operate on exceptions.
+    /// </summary>
+    public class Throws
+    {
+        // $$GENERATE$$ $$STATIC$$
+    }
+}

-- 
nunit



More information about the Pkg-cli-libs-commits mailing list